Move libcds 1.6.0 from SVN
authorkhizmax <khizmax@gmail.com>
Thu, 18 Sep 2014 10:38:14 +0000 (14:38 +0400)
committerkhizmax <khizmax@gmail.com>
Thu, 18 Sep 2014 10:38:14 +0000 (14:38 +0400)
1072 files changed:
brush_cds.pl [new file with mode: 0644]
build/Makefile [new file with mode: 0644]
build/build.sh [new file with mode: 0644]
build/sample/build-freebsd-amd64.sh [new file with mode: 0644]
build/sample/build-hpux1123.sh [new file with mode: 0644]
build/sample/build-hpux1131.sh [new file with mode: 0644]
build/sample/build-linux-amd64.sh [new file with mode: 0644]
build/sample/build-linux-ia64.sh [new file with mode: 0644]
build/sample/build-linux-sparc.sh [new file with mode: 0644]
build/sample/build-linux-x86.sh [new file with mode: 0644]
build/sample/build-mingw-amd64.bat [new file with mode: 0644]
build/sample/build-osx-clang-libc++.sh [new file with mode: 0644]
build/sample/build-osx-gcc.sh [new file with mode: 0644]
build/sample/build-sun-sparc.sh [new file with mode: 0644]
cds/algo/base.h [new file with mode: 0644]
cds/algo/elimination.h [new file with mode: 0644]
cds/algo/elimination_opt.h [new file with mode: 0644]
cds/algo/elimination_tls.h [new file with mode: 0644]
cds/algo/flat_combining.h [new file with mode: 0644]
cds/backoff_strategy.h [new file with mode: 0644]
cds/bitop.h [new file with mode: 0644]
cds/compiler/backoff.h [new file with mode: 0644]
cds/compiler/bitop.h [new file with mode: 0644]
cds/compiler/clang/cxx11_atomic_prepatches.h [new file with mode: 0644]
cds/compiler/clang/defs.h [new file with mode: 0644]
cds/compiler/cstdint_boost.h [new file with mode: 0644]
cds/compiler/cstdint_std.h [new file with mode: 0644]
cds/compiler/cxx11_atomic.h [new file with mode: 0644]
cds/compiler/cxx11_atomic_patches.h [new file with mode: 0644]
cds/compiler/cxx11_atomic_prepatches.h [new file with mode: 0644]
cds/compiler/defs.h [new file with mode: 0644]
cds/compiler/gcc/amd64/backoff.h [new file with mode: 0644]
cds/compiler/gcc/amd64/bitop.h [new file with mode: 0644]
cds/compiler/gcc/amd64/cxx11_atomic.h [new file with mode: 0644]
cds/compiler/gcc/compiler_barriers.h [new file with mode: 0644]
cds/compiler/gcc/compiler_macro.h [new file with mode: 0644]
cds/compiler/gcc/cxx11_atomic_patches.h [new file with mode: 0644]
cds/compiler/gcc/defs.h [new file with mode: 0644]
cds/compiler/gcc/ia64/backoff.h [new file with mode: 0644]
cds/compiler/gcc/ia64/bitop.h [new file with mode: 0644]
cds/compiler/gcc/ia64/cxx11_atomic.h [new file with mode: 0644]
cds/compiler/gcc/ppc64/backoff.h [new file with mode: 0644]
cds/compiler/gcc/ppc64/bitop.h [new file with mode: 0644]
cds/compiler/gcc/sparc/backoff.h [new file with mode: 0644]
cds/compiler/gcc/sparc/bitop.h [new file with mode: 0644]
cds/compiler/gcc/sparc/cxx11_atomic.h [new file with mode: 0644]
cds/compiler/gcc/x86/backoff.h [new file with mode: 0644]
cds/compiler/gcc/x86/bitop.h [new file with mode: 0644]
cds/compiler/gcc/x86/cxx11_atomic.h [new file with mode: 0644]
cds/compiler/gcc/x86/cxx11_atomic32.h [new file with mode: 0644]
cds/compiler/icl/compiler_barriers.h [new file with mode: 0644]
cds/compiler/icl/cxx11_atomic_patches_win.h [new file with mode: 0644]
cds/compiler/icl/defs.h [new file with mode: 0644]
cds/compiler/vc/amd64/backoff.h [new file with mode: 0644]
cds/compiler/vc/amd64/bitop.h [new file with mode: 0644]
cds/compiler/vc/amd64/cxx11_atomic.h [new file with mode: 0644]
cds/compiler/vc/compiler_barriers.h [new file with mode: 0644]
cds/compiler/vc/defs.h [new file with mode: 0644]
cds/compiler/vc/x86/backoff.h [new file with mode: 0644]
cds/compiler/vc/x86/bitop.h [new file with mode: 0644]
cds/compiler/vc/x86/cxx11_atomic.h [new file with mode: 0644]
cds/container/base.h [new file with mode: 0644]
cds/container/basket_queue.h [new file with mode: 0644]
cds/container/cuckoo_base.h [new file with mode: 0644]
cds/container/cuckoo_map.h [new file with mode: 0644]
cds/container/cuckoo_set.h [new file with mode: 0644]
cds/container/details/guarded_ptr_cast.h [new file with mode: 0644]
cds/container/details/make_lazy_kvlist.h [new file with mode: 0644]
cds/container/details/make_lazy_list.h [new file with mode: 0644]
cds/container/details/make_michael_kvlist.h [new file with mode: 0644]
cds/container/details/make_michael_list.h [new file with mode: 0644]
cds/container/details/make_skip_list_map.h [new file with mode: 0644]
cds/container/details/make_skip_list_set.h [new file with mode: 0644]
cds/container/details/make_split_list_set.h [new file with mode: 0644]
cds/container/ellen_bintree_base.h [new file with mode: 0644]
cds/container/ellen_bintree_map_hp.h [new file with mode: 0644]
cds/container/ellen_bintree_map_impl.h [new file with mode: 0644]
cds/container/ellen_bintree_map_ptb.h [new file with mode: 0644]
cds/container/ellen_bintree_map_rcu.h [new file with mode: 0644]
cds/container/ellen_bintree_set_hp.h [new file with mode: 0644]
cds/container/ellen_bintree_set_impl.h [new file with mode: 0644]
cds/container/ellen_bintree_set_ptb.h [new file with mode: 0644]
cds/container/ellen_bintree_set_rcu.h [new file with mode: 0644]
cds/container/fcdeque.h [new file with mode: 0644]
cds/container/fcpriority_queue.h [new file with mode: 0644]
cds/container/fcqueue.h [new file with mode: 0644]
cds/container/fcstack.h [new file with mode: 0644]
cds/container/lazy_kvlist_hp.h [new file with mode: 0644]
cds/container/lazy_kvlist_hrc.h [new file with mode: 0644]
cds/container/lazy_kvlist_impl.h [new file with mode: 0644]
cds/container/lazy_kvlist_nogc.h [new file with mode: 0644]
cds/container/lazy_kvlist_ptb.h [new file with mode: 0644]
cds/container/lazy_kvlist_rcu.h [new file with mode: 0644]
cds/container/lazy_list_base.h [new file with mode: 0644]
cds/container/lazy_list_hp.h [new file with mode: 0644]
cds/container/lazy_list_hrc.h [new file with mode: 0644]
cds/container/lazy_list_impl.h [new file with mode: 0644]
cds/container/lazy_list_nogc.h [new file with mode: 0644]
cds/container/lazy_list_ptb.h [new file with mode: 0644]
cds/container/lazy_list_rcu.h [new file with mode: 0644]
cds/container/michael_deque.h [new file with mode: 0644]
cds/container/michael_kvlist_hp.h [new file with mode: 0644]
cds/container/michael_kvlist_hrc.h [new file with mode: 0644]
cds/container/michael_kvlist_impl.h [new file with mode: 0644]
cds/container/michael_kvlist_nogc.h [new file with mode: 0644]
cds/container/michael_kvlist_ptb.h [new file with mode: 0644]
cds/container/michael_kvlist_rcu.h [new file with mode: 0644]
cds/container/michael_list_base.h [new file with mode: 0644]
cds/container/michael_list_hp.h [new file with mode: 0644]
cds/container/michael_list_hrc.h [new file with mode: 0644]
cds/container/michael_list_impl.h [new file with mode: 0644]
cds/container/michael_list_nogc.h [new file with mode: 0644]
cds/container/michael_list_ptb.h [new file with mode: 0644]
cds/container/michael_list_rcu.h [new file with mode: 0644]
cds/container/michael_map.h [new file with mode: 0644]
cds/container/michael_map_base.h [new file with mode: 0644]
cds/container/michael_map_nogc.h [new file with mode: 0644]
cds/container/michael_map_rcu.h [new file with mode: 0644]
cds/container/michael_set.h [new file with mode: 0644]
cds/container/michael_set_base.h [new file with mode: 0644]
cds/container/michael_set_nogc.h [new file with mode: 0644]
cds/container/michael_set_rcu.h [new file with mode: 0644]
cds/container/moir_queue.h [new file with mode: 0644]
cds/container/mspriority_queue.h [new file with mode: 0644]
cds/container/msqueue.h [new file with mode: 0644]
cds/container/optimistic_queue.h [new file with mode: 0644]
cds/container/rwqueue.h [new file with mode: 0644]
cds/container/segmented_queue.h [new file with mode: 0644]
cds/container/skip_list_base.h [new file with mode: 0644]
cds/container/skip_list_map_hp.h [new file with mode: 0644]
cds/container/skip_list_map_hrc.h [new file with mode: 0644]
cds/container/skip_list_map_impl.h [new file with mode: 0644]
cds/container/skip_list_map_nogc.h [new file with mode: 0644]
cds/container/skip_list_map_ptb.h [new file with mode: 0644]
cds/container/skip_list_map_rcu.h [new file with mode: 0644]
cds/container/skip_list_set_hp.h [new file with mode: 0644]
cds/container/skip_list_set_hrc.h [new file with mode: 0644]
cds/container/skip_list_set_impl.h [new file with mode: 0644]
cds/container/skip_list_set_nogc.h [new file with mode: 0644]
cds/container/skip_list_set_ptb.h [new file with mode: 0644]
cds/container/skip_list_set_rcu.h [new file with mode: 0644]
cds/container/split_list_base.h [new file with mode: 0644]
cds/container/split_list_map.h [new file with mode: 0644]
cds/container/split_list_map_nogc.h [new file with mode: 0644]
cds/container/split_list_map_rcu.h [new file with mode: 0644]
cds/container/split_list_set.h [new file with mode: 0644]
cds/container/split_list_set_nogc.h [new file with mode: 0644]
cds/container/split_list_set_rcu.h [new file with mode: 0644]
cds/container/striped_map.h [new file with mode: 0644]
cds/container/striped_map/boost_flat_map.h [new file with mode: 0644]
cds/container/striped_map/boost_list.h [new file with mode: 0644]
cds/container/striped_map/boost_map.h [new file with mode: 0644]
cds/container/striped_map/boost_slist.h [new file with mode: 0644]
cds/container/striped_map/boost_unordered_map.h [new file with mode: 0644]
cds/container/striped_map/std_hash_map.h [new file with mode: 0644]
cds/container/striped_map/std_hash_map_std.h [new file with mode: 0644]
cds/container/striped_map/std_hash_map_vc.h [new file with mode: 0644]
cds/container/striped_map/std_list.h [new file with mode: 0644]
cds/container/striped_map/std_map.h [new file with mode: 0644]
cds/container/striped_set.h [new file with mode: 0644]
cds/container/striped_set/adapter.h [new file with mode: 0644]
cds/container/striped_set/boost_flat_set.h [new file with mode: 0644]
cds/container/striped_set/boost_list.h [new file with mode: 0644]
cds/container/striped_set/boost_set.h [new file with mode: 0644]
cds/container/striped_set/boost_slist.h [new file with mode: 0644]
cds/container/striped_set/boost_stable_vector.h [new file with mode: 0644]
cds/container/striped_set/boost_unordered_set.h [new file with mode: 0644]
cds/container/striped_set/boost_vector.h [new file with mode: 0644]
cds/container/striped_set/std_hash_set.h [new file with mode: 0644]
cds/container/striped_set/std_hash_set_std.h [new file with mode: 0644]
cds/container/striped_set/std_hash_set_vc.h [new file with mode: 0644]
cds/container/striped_set/std_list.h [new file with mode: 0644]
cds/container/striped_set/std_set.h [new file with mode: 0644]
cds/container/striped_set/std_vector.h [new file with mode: 0644]
cds/container/treiber_stack.h [new file with mode: 0644]
cds/container/tsigas_cycle_queue.h [new file with mode: 0644]
cds/container/vyukov_mpmc_cycle_queue.h [new file with mode: 0644]
cds/cxx11_atomic.h [new file with mode: 0644]
cds/details/aligned_allocator.h [new file with mode: 0644]
cds/details/aligned_type.h [new file with mode: 0644]
cds/details/allocator.h [new file with mode: 0644]
cds/details/binary_functor_wrapper.h [new file with mode: 0644]
cds/details/bit_reverse_counter.h [new file with mode: 0644]
cds/details/bitop_generic.h [new file with mode: 0644]
cds/details/bounded_array.h [new file with mode: 0644]
cds/details/bounded_container.h [new file with mode: 0644]
cds/details/comparator.h [new file with mode: 0644]
cds/details/cxx11_features.h [new file with mode: 0644]
cds/details/defs.h [new file with mode: 0644]
cds/details/functor_wrapper.h [new file with mode: 0644]
cds/details/hash_functor_selector.h [new file with mode: 0644]
cds/details/is_aligned.h [new file with mode: 0644]
cds/details/lib.h [new file with mode: 0644]
cds/details/make_const_type.h [new file with mode: 0644]
cds/details/marked_ptr.h [new file with mode: 0644]
cds/details/noncopyable.h [new file with mode: 0644]
cds/details/static_functor.h [new file with mode: 0644]
cds/details/std/chrono.h [new file with mode: 0644]
cds/details/std/condition_variable.h [new file with mode: 0644]
cds/details/std/memory.h [new file with mode: 0644]
cds/details/std/mutex.h [new file with mode: 0644]
cds/details/std/thread.h [new file with mode: 0644]
cds/details/std/tuple.h [new file with mode: 0644]
cds/details/std/type_traits.h [new file with mode: 0644]
cds/details/trivial_assign.h [new file with mode: 0644]
cds/details/type_padding.h [new file with mode: 0644]
cds/details/void_selector.h [new file with mode: 0644]
cds/gc/all.h [new file with mode: 0644]
cds/gc/default_gc.h [new file with mode: 0644]
cds/gc/details/retired_ptr.h [new file with mode: 0644]
cds/gc/exception.h [new file with mode: 0644]
cds/gc/gc_fwd.h [new file with mode: 0644]
cds/gc/guarded_ptr.h [new file with mode: 0644]
cds/gc/hp.h [new file with mode: 0644]
cds/gc/hp_decl.h [new file with mode: 0644]
cds/gc/hp_impl.h [new file with mode: 0644]
cds/gc/hrc.h [new file with mode: 0644]
cds/gc/hrc/details/hrc_fwd.h [new file with mode: 0644]
cds/gc/hrc/details/hrc_inline.h [new file with mode: 0644]
cds/gc/hrc/details/hrc_retired.h [new file with mode: 0644]
cds/gc/hrc/gc_fwd.h [new file with mode: 0644]
cds/gc/hrc/hrc.h [new file with mode: 0644]
cds/gc/hrc_decl.h [new file with mode: 0644]
cds/gc/hrc_impl.h [new file with mode: 0644]
cds/gc/hzp/details/hp_alloc.h [new file with mode: 0644]
cds/gc/hzp/details/hp_fwd.h [new file with mode: 0644]
cds/gc/hzp/details/hp_inline.h [new file with mode: 0644]
cds/gc/hzp/details/hp_retired.h [new file with mode: 0644]
cds/gc/hzp/details/hp_type.h [new file with mode: 0644]
cds/gc/hzp/hzp.h [new file with mode: 0644]
cds/gc/nogc.h [new file with mode: 0644]
cds/gc/ptb.h [new file with mode: 0644]
cds/gc/ptb/ptb.h [new file with mode: 0644]
cds/gc/ptb_decl.h [new file with mode: 0644]
cds/gc/ptb_impl.h [new file with mode: 0644]
cds/init.h [new file with mode: 0644]
cds/int_algo.h [new file with mode: 0644]
cds/intrusive/base.h [new file with mode: 0644]
cds/intrusive/basket_queue.h [new file with mode: 0644]
cds/intrusive/cuckoo_set.h [new file with mode: 0644]
cds/intrusive/deque_stat.h [new file with mode: 0644]
cds/intrusive/details/dummy_node_holder.h [new file with mode: 0644]
cds/intrusive/details/ellen_bintree_base.h [new file with mode: 0644]
cds/intrusive/ellen_bintree_hp.h [new file with mode: 0644]
cds/intrusive/ellen_bintree_impl.h [new file with mode: 0644]
cds/intrusive/ellen_bintree_ptb.h [new file with mode: 0644]
cds/intrusive/ellen_bintree_rcu.h [new file with mode: 0644]
cds/intrusive/fcqueue.h [new file with mode: 0644]
cds/intrusive/fcstack.h [new file with mode: 0644]
cds/intrusive/lazy_list_base.h [new file with mode: 0644]
cds/intrusive/lazy_list_hp.h [new file with mode: 0644]
cds/intrusive/lazy_list_hrc.h [new file with mode: 0644]
cds/intrusive/lazy_list_impl.h [new file with mode: 0644]
cds/intrusive/lazy_list_nogc.h [new file with mode: 0644]
cds/intrusive/lazy_list_ptb.h [new file with mode: 0644]
cds/intrusive/lazy_list_rcu.h [new file with mode: 0644]
cds/intrusive/michael_deque.h [new file with mode: 0644]
cds/intrusive/michael_list_base.h [new file with mode: 0644]
cds/intrusive/michael_list_hp.h [new file with mode: 0644]
cds/intrusive/michael_list_hrc.h [new file with mode: 0644]
cds/intrusive/michael_list_impl.h [new file with mode: 0644]
cds/intrusive/michael_list_nogc.h [new file with mode: 0644]
cds/intrusive/michael_list_ptb.h [new file with mode: 0644]
cds/intrusive/michael_list_rcu.h [new file with mode: 0644]
cds/intrusive/michael_set.h [new file with mode: 0644]
cds/intrusive/michael_set_base.h [new file with mode: 0644]
cds/intrusive/michael_set_nogc.h [new file with mode: 0644]
cds/intrusive/michael_set_rcu.h [new file with mode: 0644]
cds/intrusive/moir_queue.h [new file with mode: 0644]
cds/intrusive/mspriority_queue.h [new file with mode: 0644]
cds/intrusive/msqueue.h [new file with mode: 0644]
cds/intrusive/node_traits.h [new file with mode: 0644]
cds/intrusive/optimistic_queue.h [new file with mode: 0644]
cds/intrusive/options.h [new file with mode: 0644]
cds/intrusive/queue_stat.h [new file with mode: 0644]
cds/intrusive/segmented_queue.h [new file with mode: 0644]
cds/intrusive/single_link_struct.h [new file with mode: 0644]
cds/intrusive/skip_list_base.h [new file with mode: 0644]
cds/intrusive/skip_list_hp.h [new file with mode: 0644]
cds/intrusive/skip_list_hrc.h [new file with mode: 0644]
cds/intrusive/skip_list_impl.h [new file with mode: 0644]
cds/intrusive/skip_list_nogc.h [new file with mode: 0644]
cds/intrusive/skip_list_ptb.h [new file with mode: 0644]
cds/intrusive/skip_list_rcu.h [new file with mode: 0644]
cds/intrusive/split_list.h [new file with mode: 0644]
cds/intrusive/split_list_base.h [new file with mode: 0644]
cds/intrusive/split_list_nogc.h [new file with mode: 0644]
cds/intrusive/split_list_rcu.h [new file with mode: 0644]
cds/intrusive/striped_set.h [new file with mode: 0644]
cds/intrusive/striped_set/adapter.h [new file with mode: 0644]
cds/intrusive/striped_set/boost_avl_set.h [new file with mode: 0644]
cds/intrusive/striped_set/boost_list.h [new file with mode: 0644]
cds/intrusive/striped_set/boost_set.h [new file with mode: 0644]
cds/intrusive/striped_set/boost_sg_set.h [new file with mode: 0644]
cds/intrusive/striped_set/boost_slist.h [new file with mode: 0644]
cds/intrusive/striped_set/boost_splay_set.h [new file with mode: 0644]
cds/intrusive/striped_set/boost_treap_set.h [new file with mode: 0644]
cds/intrusive/striped_set/boost_unordered_set.h [new file with mode: 0644]
cds/intrusive/striped_set/resizing_policy.h [new file with mode: 0644]
cds/intrusive/striped_set/striping_policy.h [new file with mode: 0644]
cds/intrusive/treiber_stack.h [new file with mode: 0644]
cds/intrusive/tsigas_cycle_queue.h [new file with mode: 0644]
cds/intrusive/vyukov_mpmc_cycle_queue.h [new file with mode: 0644]
cds/lock/array.h [new file with mode: 0644]
cds/lock/scoped_lock.h [new file with mode: 0644]
cds/lock/spinlock.h [new file with mode: 0644]
cds/memory/michael/allocator.h [new file with mode: 0644]
cds/memory/michael/bound_check.h [new file with mode: 0644]
cds/memory/michael/options.h [new file with mode: 0644]
cds/memory/michael/osalloc_stat.h [new file with mode: 0644]
cds/memory/michael/procheap_stat.h [new file with mode: 0644]
cds/memory/pool_allocator.h [new file with mode: 0644]
cds/memory/vyukov_queue_pool.h [new file with mode: 0644]
cds/numtraits.h [new file with mode: 0644]
cds/opt/buffer.h [new file with mode: 0644]
cds/opt/compare.h [new file with mode: 0644]
cds/opt/hash.h [new file with mode: 0644]
cds/opt/make_options_std.h [new file with mode: 0644]
cds/opt/make_options_var.h [new file with mode: 0644]
cds/opt/options.h [new file with mode: 0644]
cds/opt/permutation.h [new file with mode: 0644]
cds/opt/value_cleaner.h [new file with mode: 0644]
cds/os/aix/alloc_aligned.h [new file with mode: 0644]
cds/os/aix/timer.h [new file with mode: 0644]
cds/os/aix/topology.h [new file with mode: 0644]
cds/os/alloc_aligned.h [new file with mode: 0644]
cds/os/details/fake_topology.h [new file with mode: 0644]
cds/os/free_bsd/alloc_aligned.h [new file with mode: 0644]
cds/os/free_bsd/timer.h [new file with mode: 0644]
cds/os/free_bsd/topology.h [new file with mode: 0644]
cds/os/hpux/alloc_aligned.h [new file with mode: 0644]
cds/os/hpux/timer.h [new file with mode: 0644]
cds/os/hpux/topology.h [new file with mode: 0644]
cds/os/libc/alloc_aligned.h [new file with mode: 0644]
cds/os/linux/alloc_aligned.h [new file with mode: 0644]
cds/os/linux/timer.h [new file with mode: 0644]
cds/os/linux/topology.h [new file with mode: 0644]
cds/os/osx/timer.h [new file with mode: 0644]
cds/os/osx/topology.h [new file with mode: 0644]
cds/os/posix/alloc_aligned.h [new file with mode: 0644]
cds/os/posix/fake_topology.h [new file with mode: 0644]
cds/os/posix/syserror.h [new file with mode: 0644]
cds/os/posix/thread.h [new file with mode: 0644]
cds/os/posix/timer.h [new file with mode: 0644]
cds/os/sunos/alloc_aligned.h [new file with mode: 0644]
cds/os/sunos/timer.h [new file with mode: 0644]
cds/os/sunos/topology.h [new file with mode: 0644]
cds/os/syserror.h [new file with mode: 0644]
cds/os/thread.h [new file with mode: 0644]
cds/os/timer.h [new file with mode: 0644]
cds/os/topology.h [new file with mode: 0644]
cds/os/win/alloc_aligned.h [new file with mode: 0644]
cds/os/win/syserror.h [new file with mode: 0644]
cds/os/win/thread.h [new file with mode: 0644]
cds/os/win/timer.h [new file with mode: 0644]
cds/os/win/topology.h [new file with mode: 0644]
cds/ref.h [new file with mode: 0644]
cds/refcounter.h [new file with mode: 0644]
cds/threading/details/_common.h [new file with mode: 0644]
cds/threading/details/auto_detect.h [new file with mode: 0644]
cds/threading/details/cxx11.h [new file with mode: 0644]
cds/threading/details/cxx11_manager.h [new file with mode: 0644]
cds/threading/details/gcc.h [new file with mode: 0644]
cds/threading/details/gcc_manager.h [new file with mode: 0644]
cds/threading/details/msvc.h [new file with mode: 0644]
cds/threading/details/msvc_manager.h [new file with mode: 0644]
cds/threading/details/pthread.h [new file with mode: 0644]
cds/threading/details/pthread_manager.h [new file with mode: 0644]
cds/threading/details/wintls.h [new file with mode: 0644]
cds/threading/details/wintls_manager.h [new file with mode: 0644]
cds/threading/model.h [new file with mode: 0644]
cds/urcu/details/base.h [new file with mode: 0644]
cds/urcu/details/check_deadlock.h [new file with mode: 0644]
cds/urcu/details/gp.h [new file with mode: 0644]
cds/urcu/details/gp_decl.h [new file with mode: 0644]
cds/urcu/details/gpb.h [new file with mode: 0644]
cds/urcu/details/gpi.h [new file with mode: 0644]
cds/urcu/details/gpt.h [new file with mode: 0644]
cds/urcu/details/sh.h [new file with mode: 0644]
cds/urcu/details/sh_decl.h [new file with mode: 0644]
cds/urcu/details/sig_buffered.h [new file with mode: 0644]
cds/urcu/details/sig_threaded.h [new file with mode: 0644]
cds/urcu/dispose_thread.h [new file with mode: 0644]
cds/urcu/exempt_ptr.h [new file with mode: 0644]
cds/urcu/general_buffered.h [new file with mode: 0644]
cds/urcu/general_instant.h [new file with mode: 0644]
cds/urcu/general_threaded.h [new file with mode: 0644]
cds/urcu/options.h [new file with mode: 0644]
cds/urcu/signal_buffered.h [new file with mode: 0644]
cds/urcu/signal_threaded.h [new file with mode: 0644]
cds/user_setup/allocator.h [new file with mode: 0644]
cds/user_setup/cache_line.h [new file with mode: 0644]
cds/user_setup/threading.h [new file with mode: 0644]
cds/version.h [new file with mode: 0644]
change.log [new file with mode: 0644]
doxygen/cds.doxy [new file with mode: 0644]
doxygen/doxygen.log [new file with mode: 0644]
doxygen/footer.html [new file with mode: 0644]
doxygen/index.html [new file with mode: 0644]
license.txt [new file with mode: 0644]
make_distrib.pl [new file with mode: 0644]
make_docs.bat [new file with mode: 0644]
projects/Win/build-msbuild.cmd [new file with mode: 0644]
projects/Win/build-vc10.cmd [new file with mode: 0644]
projects/Win/build-vc11.cmd [new file with mode: 0644]
projects/Win/build-vc12.cmd [new file with mode: 0644]
projects/Win/build-vc9.cmd [new file with mode: 0644]
projects/Win/vc10/cds.sln [new file with mode: 0644]
projects/Win/vc10/cds.vcxproj [new file with mode: 0644]
projects/Win/vc10/cds.vcxproj.filters [new file with mode: 0644]
projects/Win/vc10/hdr-test-deque.vcxproj [new file with mode: 0644]
projects/Win/vc10/hdr-test-map.vcxproj [new file with mode: 0644]
projects/Win/vc10/hdr-test-map.vcxproj.filters [new file with mode: 0644]
projects/Win/vc10/hdr-test-misc.vcxproj [new file with mode: 0644]
projects/Win/vc10/hdr-test-ordered-list.vcxproj [new file with mode: 0644]
projects/Win/vc10/hdr-test-ordered-list.vcxproj.filters [new file with mode: 0644]
projects/Win/vc10/hdr-test-priority_queue.vcxproj [new file with mode: 0644]
projects/Win/vc10/hdr-test-priority_queue.vcxproj.filters [new file with mode: 0644]
projects/Win/vc10/hdr-test-queue.vcxproj [new file with mode: 0644]
projects/Win/vc10/hdr-test-queue.vcxproj.filters [new file with mode: 0644]
projects/Win/vc10/hdr-test-set.vcxproj [new file with mode: 0644]
projects/Win/vc10/hdr-test-set.vcxproj.filters [new file with mode: 0644]
projects/Win/vc10/hdr-test-stack.vcxproj [new file with mode: 0644]
projects/Win/vc10/hdr-test-striped-set.vcxproj [new file with mode: 0644]
projects/Win/vc10/hdr-test-striped-set.vcxproj.filters [new file with mode: 0644]
projects/Win/vc10/hdr-test-tree.vcxproj [new file with mode: 0644]
projects/Win/vc10/hdr-test-tree.vcxproj.filters [new file with mode: 0644]
projects/Win/vc10/unit-map-delodd.vcxproj [new file with mode: 0644]
projects/Win/vc10/unit-map-find.vcxproj [new file with mode: 0644]
projects/Win/vc10/unit-map-insdel.vcxproj [new file with mode: 0644]
projects/Win/vc10/unit-misc.vcxproj [new file with mode: 0644]
projects/Win/vc10/unit-misc.vcxproj.filters [new file with mode: 0644]
projects/Win/vc10/unit-pqueue.vcxproj [new file with mode: 0644]
projects/Win/vc10/unit-prerequisites.vcxproj [new file with mode: 0644]
projects/Win/vc10/unit-queue.vcxproj [new file with mode: 0644]
projects/Win/vc10/unit-set-delodd.vcxproj [new file with mode: 0644]
projects/Win/vc10/unit-set-insdel.vcxproj [new file with mode: 0644]
projects/Win/vc10/unit-stack.vcxproj [new file with mode: 0644]
projects/Win/vc11/cds.sln [new file with mode: 0644]
projects/Win/vc11/cds.vcxproj [new file with mode: 0644]
projects/Win/vc11/cds.vcxproj.filters [new file with mode: 0644]
projects/Win/vc11/hdr-test-deque.vcxproj [new file with mode: 0644]
projects/Win/vc11/hdr-test-map.vcxproj [new file with mode: 0644]
projects/Win/vc11/hdr-test-map.vcxproj.filters [new file with mode: 0644]
projects/Win/vc11/hdr-test-misc.vcxproj [new file with mode: 0644]
projects/Win/vc11/hdr-test-ordered-list.vcxproj [new file with mode: 0644]
projects/Win/vc11/hdr-test-ordered-list.vcxproj.filters [new file with mode: 0644]
projects/Win/vc11/hdr-test-priority_queue.vcxproj [new file with mode: 0644]
projects/Win/vc11/hdr-test-priority_queue.vcxproj.filters [new file with mode: 0644]
projects/Win/vc11/hdr-test-queue.vcxproj [new file with mode: 0644]
projects/Win/vc11/hdr-test-queue.vcxproj.filters [new file with mode: 0644]
projects/Win/vc11/hdr-test-set.vcxproj [new file with mode: 0644]
projects/Win/vc11/hdr-test-set.vcxproj.filters [new file with mode: 0644]
projects/Win/vc11/hdr-test-stack.vcxproj [new file with mode: 0644]
projects/Win/vc11/hdr-test-striped-set.vcxproj [new file with mode: 0644]
projects/Win/vc11/hdr-test-striped-set.vcxproj.filters [new file with mode: 0644]
projects/Win/vc11/hdr-test-tree.vcxproj [new file with mode: 0644]
projects/Win/vc11/hdr-test-tree.vcxproj.filters [new file with mode: 0644]
projects/Win/vc11/unit-map-delodd.vcxproj [new file with mode: 0644]
projects/Win/vc11/unit-map-find.vcxproj [new file with mode: 0644]
projects/Win/vc11/unit-map-insdel.vcxproj [new file with mode: 0644]
projects/Win/vc11/unit-misc.vcxproj [new file with mode: 0644]
projects/Win/vc11/unit-misc.vcxproj.filters [new file with mode: 0644]
projects/Win/vc11/unit-pqueue.vcxproj [new file with mode: 0644]
projects/Win/vc11/unit-prerequisites.vcxproj [new file with mode: 0644]
projects/Win/vc11/unit-queue.vcxproj [new file with mode: 0644]
projects/Win/vc11/unit-set-delodd.vcxproj [new file with mode: 0644]
projects/Win/vc11/unit-set-insdel.vcxproj [new file with mode: 0644]
projects/Win/vc11/unit-stack.vcxproj [new file with mode: 0644]
projects/Win/vc12/cds.sln [new file with mode: 0644]
projects/Win/vc12/cds.vcxproj [new file with mode: 0644]
projects/Win/vc12/cds.vcxproj.filters [new file with mode: 0644]
projects/Win/vc12/hdr-test-deque.vcxproj [new file with mode: 0644]
projects/Win/vc12/hdr-test-map.vcxproj [new file with mode: 0644]
projects/Win/vc12/hdr-test-map.vcxproj.filters [new file with mode: 0644]
projects/Win/vc12/hdr-test-misc.vcxproj [new file with mode: 0644]
projects/Win/vc12/hdr-test-ordered-list.vcxproj [new file with mode: 0644]
projects/Win/vc12/hdr-test-ordered-list.vcxproj.filters [new file with mode: 0644]
projects/Win/vc12/hdr-test-priority_queue.vcxproj [new file with mode: 0644]
projects/Win/vc12/hdr-test-priority_queue.vcxproj.filters [new file with mode: 0644]
projects/Win/vc12/hdr-test-queue.vcxproj [new file with mode: 0644]
projects/Win/vc12/hdr-test-queue.vcxproj.filters [new file with mode: 0644]
projects/Win/vc12/hdr-test-set.vcxproj [new file with mode: 0644]
projects/Win/vc12/hdr-test-set.vcxproj.filters [new file with mode: 0644]
projects/Win/vc12/hdr-test-stack.vcxproj [new file with mode: 0644]
projects/Win/vc12/hdr-test-striped-set.vcxproj [new file with mode: 0644]
projects/Win/vc12/hdr-test-striped-set.vcxproj.filters [new file with mode: 0644]
projects/Win/vc12/hdr-test-tree.vcxproj [new file with mode: 0644]
projects/Win/vc12/hdr-test-tree.vcxproj.filters [new file with mode: 0644]
projects/Win/vc12/unit-map-delodd.vcxproj [new file with mode: 0644]
projects/Win/vc12/unit-map-find.vcxproj [new file with mode: 0644]
projects/Win/vc12/unit-map-insdel.vcxproj [new file with mode: 0644]
projects/Win/vc12/unit-misc.vcxproj [new file with mode: 0644]
projects/Win/vc12/unit-misc.vcxproj.filters [new file with mode: 0644]
projects/Win/vc12/unit-pqueue.vcxproj [new file with mode: 0644]
projects/Win/vc12/unit-prerequisites.vcxproj [new file with mode: 0644]
projects/Win/vc12/unit-queue.vcxproj [new file with mode: 0644]
projects/Win/vc12/unit-set-delodd.vcxproj [new file with mode: 0644]
projects/Win/vc12/unit-set-insdel.vcxproj [new file with mode: 0644]
projects/Win/vc12/unit-stack.vcxproj [new file with mode: 0644]
projects/Win/vc9/cds.ncb [new file with mode: 0644]
projects/Win/vc9/cds.sln [new file with mode: 0644]
projects/Win/vc9/cds.suo [new file with mode: 0644]
projects/Win/vc9/cds.vcproj [new file with mode: 0644]
projects/Win/vc9/cds.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/hdr-test-deque.vcproj [new file with mode: 0644]
projects/Win/vc9/hdr-test-deque.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/hdr-test-map.vcproj [new file with mode: 0644]
projects/Win/vc9/hdr-test-map.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/hdr-test-misc.vcproj [new file with mode: 0644]
projects/Win/vc9/hdr-test-misc.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/hdr-test-ordered-list.vcproj [new file with mode: 0644]
projects/Win/vc9/hdr-test-ordered-list.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/hdr-test-priority_queue.vcproj [new file with mode: 0644]
projects/Win/vc9/hdr-test-priority_queue.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/hdr-test-project-template.vcproj [new file with mode: 0644]
projects/Win/vc9/hdr-test-queue.vcproj [new file with mode: 0644]
projects/Win/vc9/hdr-test-queue.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/hdr-test-set.vcproj [new file with mode: 0644]
projects/Win/vc9/hdr-test-set.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/hdr-test-stack.vcproj [new file with mode: 0644]
projects/Win/vc9/hdr-test-stack.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/hdr-test-striped-set.vcproj [new file with mode: 0644]
projects/Win/vc9/hdr-test-striped-set.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/hdr-test-tree.vcproj [new file with mode: 0644]
projects/Win/vc9/hdr-test-tree.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/unit-map-delodd.vcproj [new file with mode: 0644]
projects/Win/vc9/unit-map-delodd.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/unit-map-find.vcproj [new file with mode: 0644]
projects/Win/vc9/unit-map-find.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/unit-map-insdel.vcproj [new file with mode: 0644]
projects/Win/vc9/unit-map-insdel.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/unit-misc.vcproj [new file with mode: 0644]
projects/Win/vc9/unit-misc.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/unit-pqueue.vcproj [new file with mode: 0644]
projects/Win/vc9/unit-pqueue.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/unit-prerequisites.vcproj [new file with mode: 0644]
projects/Win/vc9/unit-prerequisites.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/unit-project-template.vcproj [new file with mode: 0644]
projects/Win/vc9/unit-queue.vcproj [new file with mode: 0644]
projects/Win/vc9/unit-queue.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/unit-set-delodd.vcproj [new file with mode: 0644]
projects/Win/vc9/unit-set-delodd.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/unit-set-insdel.vcproj [new file with mode: 0644]
projects/Win/vc9/unit-set-insdel.vcproj.user.u.user [new file with mode: 0644]
projects/Win/vc9/unit-stack.vcproj [new file with mode: 0644]
projects/Win/vc9/unit-stack.vcproj.user.u.user [new file with mode: 0644]
projects/android/jni/Android.mk [new file with mode: 0644]
projects/android/jni/Application.mk [new file with mode: 0644]
projects/android/jni/build.sh [new file with mode: 0644]
projects/source.libcds.mk [new file with mode: 0644]
projects/source.test-common.mk [new file with mode: 0644]
projects/source.test-hdr.mk [new file with mode: 0644]
projects/source.test-hdr.offsetof.mk [new file with mode: 0644]
projects/source.unit.map.mk [new file with mode: 0644]
projects/source.unit.misc.mk [new file with mode: 0644]
projects/source.unit.pqueue.mk [new file with mode: 0644]
projects/source.unit.queue.mk [new file with mode: 0644]
projects/source.unit.set.mk [new file with mode: 0644]
projects/source.unit.stack.mk [new file with mode: 0644]
readme [new file with mode: 0644]
scripts/tab2space.pl [new file with mode: 0644]
src/dllmain.cpp [new file with mode: 0644]
src/hrc_gc.cpp [new file with mode: 0644]
src/hzp_const.h [new file with mode: 0644]
src/hzp_gc.cpp [new file with mode: 0644]
src/init.cpp [new file with mode: 0644]
src/michael_heap.cpp [new file with mode: 0644]
src/ptb_gc.cpp [new file with mode: 0644]
src/topology_hpux.cpp [new file with mode: 0644]
src/topology_linux.cpp [new file with mode: 0644]
src/topology_osx.cpp [new file with mode: 0644]
src/urcu_gp.cpp [new file with mode: 0644]
src/urcu_sh.cpp [new file with mode: 0644]
tests/cppunit/cppunit_mini.h [new file with mode: 0644]
tests/cppunit/cppunit_proxy.h [new file with mode: 0644]
tests/cppunit/file_reporter.h [new file with mode: 0644]
tests/cppunit/test_beans.h [new file with mode: 0644]
tests/cppunit/test_main.cpp [new file with mode: 0644]
tests/cppunit/thread.cpp [new file with mode: 0644]
tests/cppunit/thread.h [new file with mode: 0644]
tests/data/split.pl [new file with mode: 0644]
tests/data/test-debug.conf [new file with mode: 0644]
tests/data/test-express.conf [new file with mode: 0644]
tests/data/test.conf [new file with mode: 0644]
tests/data/text.txt [new file with mode: 0644]
tests/test-hdr/deque/hdr_deque.h [new file with mode: 0644]
tests/test-hdr/deque/hdr_fcdeque.cpp [new file with mode: 0644]
tests/test-hdr/deque/hdr_intrusive_deque.h [new file with mode: 0644]
tests/test-hdr/deque/hdr_intrusive_michael_deque_hp.cpp [new file with mode: 0644]
tests/test-hdr/deque/hdr_intrusive_michael_deque_ptb.cpp [new file with mode: 0644]
tests/test-hdr/deque/hdr_michael_deque_hp.cpp [new file with mode: 0644]
tests/test-hdr/deque/hdr_michael_deque_ptb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_cuckoo_map.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_cuckoo_map.h [new file with mode: 0644]
tests/test-hdr/map/hdr_map.h [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_hp.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_hrc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_lazy_hp.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_lazy_hrc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_lazy_nogc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_lazy_ptb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_lazy_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_lazy_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_nogc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_ptb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_michael_map_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_refinable_hashmap_boost_flat_map.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_refinable_hashmap_boost_list.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_refinable_hashmap_boost_map.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_refinable_hashmap_boost_unordered_map.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_refinable_hashmap_hashmap_std.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_refinable_hashmap_hashmap_vc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_refinable_hashmap_list.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_refinable_hashmap_map.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_refinable_hashmap_slist.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_skiplist_map.h [new file with mode: 0644]
tests/test-hdr/map/hdr_skiplist_map_hp.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_skiplist_map_hrc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_skiplist_map_nogc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_skiplist_map_ptb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_skiplist_map_rcu.h [new file with mode: 0644]
tests/test-hdr/map/hdr_skiplist_map_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_skiplist_map_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_skiplist_map_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_skiplist_map_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_skiplist_map_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_hp.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_hrc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_lazy_hp.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_lazy_hrc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_lazy_nogc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_lazy_ptb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_nogc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_ptb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_splitlist_map_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_striped_hashmap_boost_flat_map.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_striped_hashmap_boost_list.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_striped_hashmap_boost_map.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_striped_hashmap_boost_unordered_map.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_striped_hashmap_hashmap_std.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_striped_hashmap_hashmap_vc.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_striped_hashmap_list.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_striped_hashmap_map.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_striped_hashmap_slist.cpp [new file with mode: 0644]
tests/test-hdr/map/hdr_striped_map.h [new file with mode: 0644]
tests/test-hdr/map/hdr_striped_map_reg.cpp [new file with mode: 0644]
tests/test-hdr/map/print_skiplist_stat.h [new file with mode: 0644]
tests/test-hdr/misc/allocator_test.cpp [new file with mode: 0644]
tests/test-hdr/misc/bitop_st.cpp [new file with mode: 0644]
tests/test-hdr/misc/cxx11_atomic_class.cpp [new file with mode: 0644]
tests/test-hdr/misc/cxx11_atomic_func.cpp [new file with mode: 0644]
tests/test-hdr/misc/cxx11_convert_memory_order.h [new file with mode: 0644]
tests/test-hdr/misc/find_option.cpp [new file with mode: 0644]
tests/test-hdr/misc/hash_tuple.cpp [new file with mode: 0644]
tests/test-hdr/misc/michael_allocator.cpp [new file with mode: 0644]
tests/test-hdr/misc/michael_allocator.h [new file with mode: 0644]
tests/test-hdr/misc/permutation_generator.cpp [new file with mode: 0644]
tests/test-hdr/misc/thread_init_fini.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_lazy.h [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_lazy_hp.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_lazy_hrc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_lazy_nogc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_lazy_ptb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_michael.h [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_michael_hp.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_michael_hrc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_michael_nogc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_intrusive_michael_ptb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy.h [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_hp.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_hrc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_kv.h [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_kv_hp.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_kv_hrc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_kv_nogc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_kv_ptb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_nogc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_ptb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_lazy_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael.h [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_hp.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_hrc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_kv.h [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_kv_hp.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_kv_hrc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_kv_nogc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_kv_ptb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_kv_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_kv_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_nogc.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_ptb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/ordered_list/hdr_michael_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/priority_queue/hdr_fcpqueue_boost_stable_vector.cpp [new file with mode: 0644]
tests/test-hdr/priority_queue/hdr_fcpqueue_deque.cpp [new file with mode: 0644]
tests/test-hdr/priority_queue/hdr_fcpqueue_vector.cpp [new file with mode: 0644]
tests/test-hdr/priority_queue/hdr_intrusive_mspqueue_dyn.cpp [new file with mode: 0644]
tests/test-hdr/priority_queue/hdr_intrusive_mspqueue_static.cpp [new file with mode: 0644]
tests/test-hdr/priority_queue/hdr_intrusive_pqueue.h [new file with mode: 0644]
tests/test-hdr/priority_queue/hdr_mspqueue_dyn.cpp [new file with mode: 0644]
tests/test-hdr/priority_queue/hdr_mspqueue_static.cpp [new file with mode: 0644]
tests/test-hdr/priority_queue/hdr_pqueue.h [new file with mode: 0644]
tests/test-hdr/priority_queue/hdr_priority_queue_reg.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_basketqueue_hrc.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_basketqueue_hzp.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_basketqueue_ptb.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_fcqueue.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_basketqueue_hrc.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_basketqueue_node.h [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_basketqueue_ptb.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_fcqueue.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_moirqueue_hp.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_moirqueue_hrc.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_moirqueue_ptb.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_msqueue.h [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_msqueue_hp.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_msqueue_hrc.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_msqueue_ptb.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_optimisticqueue_hp.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_optimisticqueue_ptb.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_segmented_queue.h [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_segmented_queue_hp.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_segmented_queue_ptb.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_singlelink_node.h [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_tsigas_cycle_queue.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_intrusive_vyukovmpmc_cycle_queue.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_moirqueue_hrc.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_moirqueue_hzp.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_moirqueue_ptb.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_msqueue_hrc.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_msqueue_hzp.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_msqueue_ptb.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_optimistic_hzp.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_optimistic_ptb.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_rwqueue.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_segmented_queue.h [new file with mode: 0644]
tests/test-hdr/queue/hdr_segmented_queue_hp.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_segmented_queue_ptb.cpp [new file with mode: 0644]
tests/test-hdr/queue/hdr_vyukov_mpmc_cyclic.cpp [new file with mode: 0644]
tests/test-hdr/queue/queue_test_header.cpp [new file with mode: 0644]
tests/test-hdr/queue/queue_test_header.h [new file with mode: 0644]
tests/test-hdr/set/hdr_cuckoo_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_cuckoo_set.h [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_cuckoo_refinable_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_cuckoo_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_cuckoo_set.h [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_hp.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_hp_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_hrc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_hrc_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_nogc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_nogc_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_ptb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_ptb_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpb_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpi_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpt_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_rcu_shb_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_michael_set_rcu_sht_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_refinable_hashset_avlset.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_refinable_hashset_list.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_refinable_hashset_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_refinable_hashset_sgset.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_refinable_hashset_slist.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_refinable_hashset_splayset.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_refinable_hashset_treapset.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_refinable_hashset_uset.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_set.h [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_hp.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_hp_member.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_hrc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_nogc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_nogc_member.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_ptb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_ptb_member.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpb_member.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpi_member.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpt_member.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_rcu_shb_member.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_rcu_sht_member.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_set.h [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_skiplist_set_rcu.h [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_hp.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_hp_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_hrc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_hrc_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_nogc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_nogc_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_ptb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_ptb_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_striped_hashset_avlset.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_striped_hashset_list.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_striped_hashset_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_striped_hashset_sgset.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_striped_hashset_slist.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_striped_hashset_splayset.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_striped_hashset_treapset.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_striped_hashset_uset.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_striped_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_intrusive_striped_set.h [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_hp.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_hrc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_lazy_hp.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_lazy_hrc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_lazy_nogc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_lazy_ptb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_lazy_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_lazy_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_nogc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_ptb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_michael_set_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_boost_flat_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_boost_list.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_boost_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_boost_stable_vector.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_boost_unordered_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_boost_vector.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_hashset_std.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_hashset_vc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_list.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_slist.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_refinable_hashset_vector.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_set.h [new file with mode: 0644]
tests/test-hdr/set/hdr_skiplist_set.h [new file with mode: 0644]
tests/test-hdr/set/hdr_skiplist_set_hp.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_skiplist_set_hrc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_skiplist_set_nogc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_skiplist_set_ptb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_skiplist_set_rcu.h [new file with mode: 0644]
tests/test-hdr/set/hdr_skiplist_set_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_skiplist_set_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_skiplist_set_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_skiplist_set_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_skiplist_set_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_hp.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_hrc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_lazy_hp.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_lazy_hrc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_lazy_nogc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_lazy_ptb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_nogc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_ptb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_splitlist_set_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_boost_flat_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_boost_list.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_boost_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_boost_stable_vector.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_boost_unordered_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_boost_vector.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_hashset_std.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_hashset_vc.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_list.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_set.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_slist.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_hashset_vector.cpp [new file with mode: 0644]
tests/test-hdr/set/hdr_striped_set.h [new file with mode: 0644]
tests/test-hdr/set/intrusive_cuckoo_set_common.h [new file with mode: 0644]
tests/test-hdr/size_check.h [new file with mode: 0644]
tests/test-hdr/stack/hdr_elimination_stack_hp.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_elimination_stack_hrc.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_elimination_stack_ptb.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_fcstack.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_intrusive_elimination_stack_hp.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_intrusive_elimination_stack_hrc.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_intrusive_elimination_stack_ptb.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_intrusive_fcstack.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_intrusive_treiber_stack.h [new file with mode: 0644]
tests/test-hdr/stack/hdr_intrusive_treiber_stack_hp.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_intrusive_treiber_stack_hrc.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_intrusive_treiber_stack_ptb.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_treiber_stack.h [new file with mode: 0644]
tests/test-hdr/stack/hdr_treiber_stack_hp.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_treiber_stack_hrc.cpp [new file with mode: 0644]
tests/test-hdr/stack/hdr_treiber_stack_ptb.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_map.h [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_map_hp.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_map_ptb.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_map_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_map_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_set.h [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_set_hp.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_set_ptb.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_set_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_ellenbintree_set_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_bintree.h [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_hp.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_hp_member.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_pool_hp.h [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_pool_ptb.h [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_pool_rcu.h [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_ptb.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_ptb_member.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpb.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpb_member.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpi.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpi_member.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpt.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpt_member.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_shb.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_shb_member.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_sht.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_sht_member.cpp [new file with mode: 0644]
tests/test-hdr/tree/hdr_tree_reg.cpp [new file with mode: 0644]
tests/unit/_template.cpp [new file with mode: 0644]
tests/unit/alloc/hoard_threadtest.cpp [new file with mode: 0644]
tests/unit/alloc/larson.cpp [new file with mode: 0644]
tests/unit/alloc/linux_scale.cpp [new file with mode: 0644]
tests/unit/alloc/michael_allocator.cpp [new file with mode: 0644]
tests/unit/alloc/michael_allocator.h [new file with mode: 0644]
tests/unit/alloc/random.cpp [new file with mode: 0644]
tests/unit/alloc/random_gen.h [new file with mode: 0644]
tests/unit/ellen_bintree_update_desc_pool.cpp [new file with mode: 0644]
tests/unit/ellen_bintree_update_desc_pool.h [new file with mode: 0644]
tests/unit/lock/nolock.h [new file with mode: 0644]
tests/unit/lock/spinlock.cpp [new file with mode: 0644]
tests/unit/lock/win32_lock.h [new file with mode: 0644]
tests/unit/map2/map_defs.h [new file with mode: 0644]
tests/unit/map2/map_delodd.cpp [new file with mode: 0644]
tests/unit/map2/map_find_int.cpp [new file with mode: 0644]
tests/unit/map2/map_find_string.cpp [new file with mode: 0644]
tests/unit/map2/map_insdel_func.cpp [new file with mode: 0644]
tests/unit/map2/map_insdel_int.cpp [new file with mode: 0644]
tests/unit/map2/map_insdel_item_int.cpp [new file with mode: 0644]
tests/unit/map2/map_insdel_item_string.cpp [new file with mode: 0644]
tests/unit/map2/map_insdel_string.cpp [new file with mode: 0644]
tests/unit/map2/map_insdelfind.cpp [new file with mode: 0644]
tests/unit/map2/map_insfind_int.cpp [new file with mode: 0644]
tests/unit/map2/map_types.h [new file with mode: 0644]
tests/unit/map2/std_hash_map.h [new file with mode: 0644]
tests/unit/map2/std_hash_map_gcc.h [new file with mode: 0644]
tests/unit/map2/std_hash_map_vc.h [new file with mode: 0644]
tests/unit/map2/std_map.h [new file with mode: 0644]
tests/unit/map2/std_map_gcc.h [new file with mode: 0644]
tests/unit/map2/std_map_vc.h [new file with mode: 0644]
tests/unit/michael_alloc.cpp [new file with mode: 0644]
tests/unit/michael_alloc.h [new file with mode: 0644]
tests/unit/nonconcurrent_iterator_sequence.h [new file with mode: 0644]
tests/unit/pqueue/ellen_bintree_pqueue.h [new file with mode: 0644]
tests/unit/pqueue/pop.cpp [new file with mode: 0644]
tests/unit/pqueue/pqueue_defs.h [new file with mode: 0644]
tests/unit/pqueue/pqueue_item.h [new file with mode: 0644]
tests/unit/pqueue/pqueue_type.h [new file with mode: 0644]
tests/unit/pqueue/push.cpp [new file with mode: 0644]
tests/unit/pqueue/push_pop.cpp [new file with mode: 0644]
tests/unit/pqueue/skiplist_pqueue.h [new file with mode: 0644]
tests/unit/pqueue/std_pqueue.h [new file with mode: 0644]
tests/unit/print_cuckoo_stat.h [new file with mode: 0644]
tests/unit/print_deque_stat.h [new file with mode: 0644]
tests/unit/print_ellenbintree_stat.h [new file with mode: 0644]
tests/unit/print_mspriorityqueue_stat.h [new file with mode: 0644]
tests/unit/print_segmentedqueue_stat.h [new file with mode: 0644]
tests/unit/print_skip_list_stat.h [new file with mode: 0644]
tests/unit/queue/intrusive_queue_defs.h [new file with mode: 0644]
tests/unit/queue/intrusive_queue_reader_writer.cpp [new file with mode: 0644]
tests/unit/queue/intrusive_queue_type.h [new file with mode: 0644]
tests/unit/queue/queue_defs.h [new file with mode: 0644]
tests/unit/queue/queue_pop.cpp [new file with mode: 0644]
tests/unit/queue/queue_push.cpp [new file with mode: 0644]
tests/unit/queue/queue_random.cpp [new file with mode: 0644]
tests/unit/queue/queue_reader_writer.cpp [new file with mode: 0644]
tests/unit/queue/queue_type.h [new file with mode: 0644]
tests/unit/queue/std_queue.h [new file with mode: 0644]
tests/unit/set2/set_defs.h [new file with mode: 0644]
tests/unit/set2/set_delodd.cpp [new file with mode: 0644]
tests/unit/set2/set_insdel_func.cpp [new file with mode: 0644]
tests/unit/set2/set_insdel_func.h [new file with mode: 0644]
tests/unit/set2/set_insdel_func2.cpp [new file with mode: 0644]
tests/unit/set2/set_insdel_func3.cpp [new file with mode: 0644]
tests/unit/set2/set_insdel_func4.cpp [new file with mode: 0644]
tests/unit/set2/set_insdel_func5.cpp [new file with mode: 0644]
tests/unit/set2/set_insdel_func6.cpp [new file with mode: 0644]
tests/unit/set2/set_insdel_func7.cpp [new file with mode: 0644]
tests/unit/set2/set_insdel_string.cpp [new file with mode: 0644]
tests/unit/set2/set_insdelfind.cpp [new file with mode: 0644]
tests/unit/set2/set_types.h [new file with mode: 0644]
tests/unit/set2/std_hash_set.h [new file with mode: 0644]
tests/unit/set2/std_hash_set_std.h [new file with mode: 0644]
tests/unit/set2/std_hash_set_vc9.h [new file with mode: 0644]
tests/unit/set2/std_set.h [new file with mode: 0644]
tests/unit/stack/intrusive_stack_defs.h [new file with mode: 0644]
tests/unit/stack/intrusive_stack_type.h [new file with mode: 0644]
tests/unit/stack/stack_defs.h [new file with mode: 0644]
tests/unit/stack/stack_intrusive_pushpop.cpp [new file with mode: 0644]
tests/unit/stack/stack_push.cpp [new file with mode: 0644]
tests/unit/stack/stack_pushpop.cpp [new file with mode: 0644]
tests/unit/stack/stack_type.h [new file with mode: 0644]

diff --git a/brush_cds.pl b/brush_cds.pl
new file mode 100644 (file)
index 0000000..bd98cc0
--- /dev/null
@@ -0,0 +1,66 @@
+#!/usr/bin/perl\r
+\r
+my $nTabsFound = 0;\r
+\r
+brush()        ;\r
+\r
+print "Tabs found: $nTabsFound\n" ;\r
+print "Done\n" ;\r
+\r
+exit ;\r
+\r
+sub brush() \r
+{\r
+       processDir( "./cds" ) ;\r
+       processDir( "./src" ) ;\r
+       processDir( "./tests/test-hdr" ) ;\r
+       processDir( "./tests/unit" ) ;\r
+       processDir( "./tests/cppunit" ) ;\r
+}\r
+\r
+sub processDir( $ )\r
+{\r
+       my $dirName = shift ;\r
+       print "Process $dirName directory...\n";\r
+       \r
+       opendir(my $dh, $dirName) || die "can't opendir $dirName: $!";\r
+    my @files = grep { /^[^\.]/ } readdir($dh);\r
+    closedir $dh;\r
+       \r
+       foreach my $file ( @files ) {\r
+               if ( -d "$dirName/$file" ) {\r
+                       processDir("$dirName/$file")    ;\r
+               }\r
+               elsif ( $file =~ /\.(h|cpp)$/ ) {\r
+                       processFile( "$dirName/$file" ) ;\r
+               }\r
+       }\r
+}\r
+\r
+sub processFile( $ ) \r
+{\r
+       my $file = shift        ;\r
+\r
+       \r
+       if ( open( my $fh, $file )) {\r
+               binmode $fh     ;\r
+               my $str = ''            ;\r
+               while (<$fh>) {\r
+                       $nTabsFound += $_ =~ s/\t/    /g;\r
+                       $_ =~ s/\s+$//  ;\r
+                       $_ =~ s/\s+;$/;/;\r
+                       $str .= $_      ;\r
+                       $str .= "\n"    ;\r
+               }\r
+               close $fh       ;\r
+               \r
+               if ( open( my $fh, ">$file" )) {\r
+                       binmode $fh     ;\r
+                       print $fh $str  ;\r
+                       close $fh               ;\r
+               }\r
+       }\r
+}\r
+\r
+\r
+\r
diff --git a/build/Makefile b/build/Makefile
new file mode 100644 (file)
index 0000000..313afc0
--- /dev/null
@@ -0,0 +1,272 @@
+# Makefile 
+# 
+
+.PHONY: all
+.SUFFIXES:.cpp .c .ro
+
+# make_distrib.pl substitutes the correct version
+VERSION=1.6.0
+
+# boost_thread lib used by test application. 
+# You may change the library name
+LD_BOOST_THREAD_LIB=-lboost_thread -lboost_system 
+
+ifeq ($(platform),mingw)
+    LD_TEST_COMMON_LIBS=-lcds -lrtm
+    LD_TEST_COMMON_DEBUG_LIBS=-lcds-debug -lrtm
+    BASE_OPT = -D_REENTRANT -D_FILE_OFFSET_BITS=64 -I..
+    # -Wa,--hash-size=2048
+    CPP_BUILD_CDS_OPT=-DCDS_BUILD_LIB
+else
+ifeq ($(platform),darwin)
+    LD_TEST_COMMON_LIBS=-lcds
+    LD_TEST_COMMON_DEBUG_LIBS=-lcds-debug
+else
+    LD_TEST_COMMON_LIBS=-lcds -lpthread -lrt
+    LD_TEST_COMMON_DEBUG_LIBS=-lcds-debug -lpthread -lrt
+endif
+    BASE_OPT = -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -D_FILE_OFFSET_BITS=64 -I..
+    CPP_BUILD_CDS_OPT=
+endif
+
+COMP_OPT = -c $(CFLAGS) $(BASE_OPT)
+CPP_COMP_OPT = -std=c++0x -c $(CXXFLAGS) $(BASE_OPT)
+
+COMPILER_ROOT = $(shell dirname `dirname \`which       $(CXX)\``)
+
+LD_OPTS = $(LDFLAGS)
+
+
+
+####################################
+# cds library
+
+include ../projects/source.libcds.mk
+CDS_OBJS := $(addprefix $(OBJ_PATH)/,$(notdir $(CDS_SOURCES)))
+CDS_OBJS :=$(CDS_OBJS:%.cpp=%.o)
+CDS_SOURCES := $(CDS_SOURCES:%.cpp=../%.cpp)
+
+ifeq ($(platform),mingw)
+    CDS_DEBUG_LIB=libcds-debug.dll
+    CDS_RELEASE_LIB=libcds.dll
+else
+ifeq ($(platform),darwin)
+    CDS_DEBUG_LIB=libcds-debug.dylib
+    CDS_RELEASE_LIB=libcds.dylib
+else
+    CDS_DEBUG_LIB=libcds-debug.so
+    CDS_RELEASE_LIB=libcds.so
+endif
+endif
+
+$(CDS_OBJS): $(OBJ_PATH)/%.o: ../src/%.cpp
+       $(CXX) $(CPP_COMP_OPT) $(CPP_BUILD_CDS_OPT) -o $@ $<
+
+ifeq ($(platform),mingw)
+$(CDS_DEBUG_LIB): $(BIN_PATH)/$(CDS_DEBUG_LIB)
+
+$(BIN_PATH)/$(CDS_DEBUG_LIB) : $(CDS_OBJS)
+       $(CXX) $(LD_OPTS) -Wl,--out-implib,$(BIN_PATH)/$(CDS_DEBUG_LIB).a $(CDS_OBJS) -o $@ 
+
+$(CDS_RELEASE_LIB) : $(BIN_PATH)/$(CDS_RELEASE_LIB)
+
+$(BIN_PATH)/$(CDS_RELEASE_LIB) : $(CDS_OBJS)
+       $(CXX) $(LD_OPTS) $(CDS_OBJS) -Wl,--out-implib,$(BIN_PATH)/$(CDS_RELEASE_LIB).a -o $@ 
+    
+debug : $(CDS_DEBUG_LIB)
+release : $(CDS_RELEASE_LIB)
+else
+$(CDS_DEBUG_LIB).$(VERSION) : $(CDS_OBJS)
+       $(CXX) $(LD_OPTS) $(CDS_PLATFORM_RELEASE_LDFLAGS) $(CDS_OBJS) -o $@ 
+       mv ./$(CDS_DEBUG_LIB).$(VERSION) $(BIN_PATH)/$(CDS_DEBUG_LIB).$(VERSION)
+       ln -sf $(CDS_DEBUG_LIB).$(VERSION) $(BIN_PATH)/$(CDS_DEBUG_LIB)
+
+$(CDS_RELEASE_LIB).$(VERSION) : $(CDS_OBJS)
+       $(CXX) $(LD_OPTS) $(CDS_OBJS) $(CDS_PLATFORM_DEBUG_LDFLAGS) -o $@ 
+       mv ./$(CDS_RELEASE_LIB).$(VERSION) $(BIN_PATH)/$(CDS_RELEASE_LIB).$(VERSION)
+       ln -sf $(CDS_RELEASE_LIB).$(VERSION) $(BIN_PATH)/$(CDS_RELEASE_LIB)
+    
+debug : $(CDS_DEBUG_LIB).$(VERSION)
+release : $(CDS_RELEASE_LIB).$(VERSION)
+    
+endif
+    
+all: debug release
+
+##########################################
+# Make tests
+
+OBJ_TEST_PATH=$(OBJ_PATH)
+
+include ../projects/source.test-common.mk
+CDS_TESTCOMMON_SOURCES := $(CDS_TESTCOMMON_SOURCES:%.cpp=../%.cpp)
+TEST_COMMON_OBJS := $(CDS_TESTCOMMON_SOURCES:%.cpp=%.o)
+
+TEST_COMMONHDR_SRC_DIR=../tests
+$(TEST_COMMON_OBJS) : %.o : %.cpp
+       $(CXX) $(CPP_COMP_OPT) -I$(TEST_COMMONHDR_SRC_DIR) $< -o $@
+
+
+include ../projects/source.test-hdr.mk
+CDS_TESTHDR_SOURCES := $(CDS_TESTHDR_SOURCES:%.cpp=../%.cpp)
+TESTHDR_OBJS := $(CDS_TESTHDR_SOURCES:%.cpp=%.o)
+
+TESTHDR_SRC_DIR=../tests/test-hdr
+$(TESTHDR_OBJS): %.o: %.cpp
+       $(CXX) $(CPP_COMP_OPT) -I$(TESTHDR_SRC_DIR) -I$(TEST_COMMONHDR_SRC_DIR) $< -o $@
+
+include ../projects/source.test-hdr.offsetof.mk
+CDS_TESTHDR_OFFSETOF_SOURCES := $(CDS_TESTHDR_OFFSETOF_SOURCES:%.cpp=../%.cpp)
+TESTHDR_OBJS_NO_OFFSETOF_WARN := $(CDS_TESTHDR_OFFSETOF_SOURCES:%.cpp=%.o)
+
+$(TESTHDR_OBJS_NO_OFFSETOF_WARN): %.o: %.cpp
+       $(CXX) $(CPP_COMP_OPT) -I$(TESTHDR_SRC_DIR) -I$(TEST_COMMONHDR_SRC_DIR) -Wno-invalid-offsetof $< -o $@
+
+
+TEST_SRC_DIR=../tests/unit
+TEST_DATA_DIR=`pwd`/../tests/data
+
+CDSUNIT_COMMON_FILE=
+
+include ../projects/source.unit.map.mk
+CDSUNIT_MAP_SOURCES := $(CDSUNIT_MAP_SOURCES:%.cpp=../%.cpp)
+CDSUNIT_MAP_FILE := $(CDSUNIT_MAP_SOURCES:%.cpp=%.o)
+
+include ../projects/source.unit.set.mk
+CDSUNIT_SET_SOURCES := $(CDSUNIT_SET_SOURCES:%.cpp=../%.cpp)
+CDSUNIT_SET_FILE := $(CDSUNIT_SET_SOURCES:%.cpp=%.o)
+
+include ../projects/source.unit.queue.mk
+CDSUNIT_QUEUE_SOURCES := $(CDSUNIT_QUEUE_SOURCES:%.cpp=../%.cpp)
+CDSUNIT_QUEUE_FILE := $(CDSUNIT_QUEUE_SOURCES:%.cpp=%.o)
+
+include ../projects/source.unit.pqueue.mk
+CDSUNIT_PQUEUE_SOURCES := $(CDSUNIT_PQUEUE_SOURCES:%.cpp=../%.cpp)
+CDSUNIT_PQUEUE_FILE := $(CDSUNIT_PQUEUE_SOURCES:%.cpp=%.o)
+
+include ../projects/source.unit.stack.mk
+CDSUNIT_STACK_SOURCES := $(CDSUNIT_STACK_SOURCES:%.cpp=../%.cpp)
+CDSUNIT_STACK_FILE := $(CDSUNIT_STACK_SOURCES:%.cpp=%.o)
+
+include ../projects/source.unit.misc.mk
+CDSUNIT_MISC_SOURCES := $(CDSUNIT_MISC_SOURCES:%.cpp=../%.cpp)
+CDSUNIT_MISC_FILE := $(CDSUNIT_MISC_SOURCES:%.cpp=%.o)
+
+TEST_OBJ_FILE= $(CDSUNIT_COMMON_FILE) $(CDSUNIT_MAP_FILE) $(CDSUNIT_SET_FILE) $(CDSUNIT_QUEUE_FILE) $(CDSUNIT_PQUEUE_FILE) \
+       $(CDSUNIT_STACK_FILE) $(CDSUNIT_MISC_FILE)
+
+$(TEST_OBJ_FILE): %.o: %.cpp
+       $(CXX) $(CPP_COMP_OPT) -I$(TEST_SRC_DIR) -I$(TEST_COMMONHDR_SRC_DIR) $< -o $@
+
+CDSUNIT_MAP_EXE=$(BIN_PATH)/cdsu-map
+CDSUNIT_SET_EXE=$(BIN_PATH)/cdsu-set
+CDSUNIT_QUEUE_EXE=$(BIN_PATH)/cdsu-queue
+CDSUNIT_PQUEUE_EXE=$(BIN_PATH)/cdsu-pqueue
+CDSUNIT_STACK_EXE=$(BIN_PATH)/cdsu-stack
+CDSUNIT_MISC_EXE=$(BIN_PATH)/cdsu-misc
+CDSUNIT_EXE_FILES= $(CDSUNIT_MAP_EXE) $(CDSUNIT_SET_EXE) $(CDSUNIT_QUEUE_EXE) $(CDSUNIT_PQUEUE_EXE) $(CDSUNIT_STACK_EXE) $(CDSUNIT_MISC_EXE)
+
+unit-map: $(CDSUNIT_MAP_EXE)
+unit-set: $(CDSUNIT_SET_EXE)
+unit-queue: $(CDSUNIT_QUEUE_EXE)
+unit-pqueue: $(CDSUNIT_PQUEUE_EXE)
+unit-stack: $(CDSUNIT_STACK_EXE)
+
+ifeq ($(platform),mingw)
+make_test : $(BIN_PATH)/test-hdr $(CDSUNIT_EXE_FILES)
+       cd $(TEST_DATA_DIR); perl -X split.pl
+       cp -f $(TEST_DATA_DIR)/test.conf $(TEST_DATA_DIR)/test-debug.conf $(TEST_DATA_DIR)/dictionary.txt $(BIN_PATH)
+else
+make_test : $(BIN_PATH)/test-hdr $(CDSUNIT_EXE_FILES)
+       cd $(TEST_DATA_DIR); perl -X split.pl
+       ln -sf $(TEST_DATA_DIR)/test.conf $(TEST_DATA_DIR)/test-debug.conf $(TEST_DATA_DIR)/dictionary.txt $(BIN_PATH)
+endif
+
+$(BIN_PATH)/test-hdr : $(TEST_COMMON_OBJS) $(TESTHDR_OBJS) $(TESTHDR_OBJS_NO_OFFSETOF_WARN)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) \
+       $(TESTHDR_OBJS) $(TESTHDR_OBJS_NO_OFFSETOF_WARN) $(TEST_COMMON_OBJS) \
+       $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_LIBS) -o $@
+
+$(CDSUNIT_MAP_EXE) : $(CDSUNIT_MAP_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_MAP_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_LIBS) -o $@
+
+$(CDSUNIT_SET_EXE) : $(CDSUNIT_SET_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_SET_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_LIBS) -o $@
+
+$(CDSUNIT_QUEUE_EXE) : $(CDSUNIT_QUEUE_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_QUEUE_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_LIBS) -o $@
+
+$(CDSUNIT_PQUEUE_EXE) : $(CDSUNIT_PQUEUE_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_PQUEUE_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_LIBS) -o $@
+
+$(CDSUNIT_STACK_EXE) : $(CDSUNIT_STACK_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_STACK_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_LIBS) -o $@
+
+$(CDSUNIT_MISC_EXE) : $(CDSUNIT_MISC_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_MISC_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_LIBS) -o $@
+
+
+CDSUNIT_MAP_EXE_DBG=$(CDSUNIT_MAP_EXE)-d
+CDSUNIT_SET_EXE_DBG=$(CDSUNIT_SET_EXE)-d
+CDSUNIT_QUEUE_EXE_DBG=$(CDSUNIT_QUEUE_EXE)-d
+CDSUNIT_PQUEUE_EXE_DBG=$(CDSUNIT_PQUEUE_EXE)-d
+CDSUNIT_STACK_EXE_DBG=$(CDSUNIT_STACK_EXE)-d
+CDSUNIT_MISC_EXE_DBG=$(CDSUNIT_MISC_EXE)-d
+CDSUNIT_EXE_DBG_FILES= $(CDSUNIT_MAP_EXE_DBG) $(CDSUNIT_SET_EXE_DBG) $(CDSUNIT_QUEUE_EXE_DBG) $(CDSUNIT_PQUEUE_EXE_DBG) \
+       $(CDSUNIT_STACK_EXE_DBG) $(CDSUNIT_MISC_EXE_DBG)
+
+unit-map-dbg: $(CDSUNIT_MAP_EXE_DBG)
+unit-set-dbg: $(CDSUNIT_SET_EXE_DBG)
+unit-queue-dbg: $(CDSUNIT_QUEUE_EXE_DBG)
+unit-pqueue-dbg: $(CDSUNIT_PQUEUE_EXE_DBG)
+unit-stack-dbg: $(CDSUNIT_STACK_EXE_DBG)
+
+ifeq ($(platform),mingw)
+make_debug_test : $(BIN_PATH)/test-hdr-debug $(CDSUNIT_EXE_DBG_FILES)
+       cd $(TEST_DATA_DIR); perl -X split.pl
+       cp -f $(TEST_DATA_DIR)/test.conf $(TEST_DATA_DIR)/test-debug.conf $(TEST_DATA_DIR)/dictionary.txt $(BIN_PATH)
+else
+make_debug_test : $(BIN_PATH)/test-hdr-debug $(CDSUNIT_EXE_DBG_FILES)
+       cd $(TEST_DATA_DIR); perl -X split.pl
+       ln -sf $(TEST_DATA_DIR)/test.conf $(TEST_DATA_DIR)/test-debug.conf $(TEST_DATA_DIR)/dictionary.txt $(BIN_PATH)
+endif
+
+$(BIN_PATH)/test-hdr-debug : $(TESTHDR_OBJS) $(TESTHDR_OBJS_NO_OFFSETOF_WARN) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) \
+       $(TESTHDR_OBJS) $(TESTHDR_OBJS_NO_OFFSETOF_WARN) $(TEST_COMMON_OBJS) \
+       $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_DEBUG_LIBS) -o $@
+
+$(CDSUNIT_MAP_EXE_DBG) : $(CDSUNIT_MAP_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_MAP_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_DEBUG_LIBS) -o $@
+
+$(CDSUNIT_SET_EXE_DBG) : $(CDSUNIT_SET_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_SET_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_DEBUG_LIBS) -o $@
+
+$(CDSUNIT_QUEUE_EXE_DBG) : $(CDSUNIT_QUEUE_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_QUEUE_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_DEBUG_LIBS) -o $@
+
+$(CDSUNIT_PQUEUE_EXE_DBG) : $(CDSUNIT_PQUEUE_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_PQUEUE_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_DEBUG_LIBS) -o $@
+
+$(CDSUNIT_STACK_EXE_DBG) : $(CDSUNIT_STACK_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_STACK_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_DEBUG_LIBS) -o $@
+
+$(CDSUNIT_MISC_EXE_DBG) : $(CDSUNIT_MISC_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS)
+       $(CXX) $(LD_OPTS) -L$(BIN_PATH) $(CDSUNIT_MISC_FILE) $(CDSUNIT_COMMON_FILE) $(TEST_COMMON_OBJS) $(LD_BOOST_THREAD_LIB) $(LD_TEST_COMMON_DEBUG_LIBS) -o $@
+
+test: make_test 
+test_debug: make_debug_test
+
+test_hdr: $(BIN_PATH)/test-hdr
+test_hdr_debug: $(BIN_PATH)/test-hdr-debug
+
+##########################################
+#
+clean: 
+       rm -f $(OBJ_PATH)/debug/*
+       rm -f $(OBJ_PATH)/release/*
+       rm -f $(TEST_COMMON_OBJS) $(TESTHDR_OBJS) $(TESTHDR_OBJS_NO_OFFSETOF_WARN) $(TEST_OBJ_FILE)
+       rm -f $(BIN_PATH)/libcds*
+       rm -f $(BIN_PATH)/cdsu-*
+       rm -f $(BIN_PATH)/test-hdr
+
diff --git a/build/build.sh b/build/build.sh
new file mode 100644 (file)
index 0000000..8c14e71
--- /dev/null
@@ -0,0 +1,555 @@
+#!/bin/sh
+
+# cds library build script
+# Maxim Khiszinsky 04.01.2009
+
+# The following variables are defined and exported at the end of this script.
+#
+# LDFLAGS
+# CFLAGS
+# CXXFLAGS
+# CXX
+# CC
+# BITSTOBUILD
+
+usage()
+{
+    echo "Build helper script for one of the supported platforms"
+    echo "Usage: build.sh \"options\""
+    echo "       where options may be any of the following:"
+    echo "       -t make target"
+    echo "       -c <C compiler name> Possible values are: gcc,clang"
+    echo "       -x <C++ compiler name> (e.g. g++, CC)"
+    echo "       -p <Processor architecture> Possible values are:"
+    echo "             x86, amd64 (x86_64), sparc, ia64"
+    echo "       -o <OS family> Possible values are:"
+    echo "             linux, sunos (solaris), hpux, darwin"
+    echo "       -D <define> define"
+    echo "       -b <bitsToBuild> (accepts '64', '32')"
+    echo "       -l <extra linker options>"
+    echo "       -z <extra compiler options>"
+    echo "       -j <number of make jobs. default 2>"
+    echo "       -h (to get help on the above commands)"
+    echo "       --with-boost <path to boost include>"
+    echo "       --debug-cxx-options <extra compiler options for debug target>"
+    echo "       --debug-ld-options <extra linker options for debug target>"
+    echo "       --release-cxx-options <extra compiler options for release target>"
+    echo "       --release-ld-options <extra linker options for release target>"
+    echo "       --clean clean all before building"
+    echo "       --debug-test make unit test in debug mode"
+    echo "       --amd64-use-128bit use 128bit (16byte) CAS on amd64"
+    echo "       --arch-tune march flag (only for x86/amd64), default = native"
+    echo "       --nodefaultlibs - no default libs (pthread, stdc++)"
+    echo "       --optimize-flags - optimization level flags for release target, default -O3"
+}
+
+ERROR_EXIT_CODE=1
+
+MAKE=make
+
+# Set up the default values for each parameter
+debug=off                # by default debug is off
+bitsToBuild=0            # unknown
+makejobs=2
+cppcompiler=g++
+ccompiler=gcc
+processor_arch=unknown
+OS_FAMILY=unknown
+ArchFlag=native
+ld_nodefaultlibs=off
+
+BOOST_INCLUDE_PATH=
+makeclean=off
+
+MAKE_DEBUG_TEST=0
+ld_libs="-lpthread -ldl -lstdc++"
+
+cxx_debug_options=
+ld_debug_options=
+
+cxx_release_options=
+ld_release_options=
+
+cxx_test_release_options=
+ls_test_release_options=
+
+cxx_release_optimization="-fno-strict-aliasing"
+cxx_release_optimization_level="-O3"
+
+amd64_cxx_options=
+
+OS_VERSION=
+TOOLSET_SUFFIX=
+
+target=test
+
+while [ $# -gt 0 ]
+   do
+   case $1 in
+   -t)
+               target=$2
+               shift 2
+               ;;
+   -c)
+        ccompiler=$2
+               shift 2
+               ;;
+   -x)
+        cppcompiler=$2
+               shift 2
+               ;;
+   -o)
+               OS_FAMILY=$2
+               shift 2
+               ;;
+   -p)
+        processor_arch=$2; shift 2
+               ;;
+   -b)
+        bitsToBuild=$2
+               shift 2
+               ;;
+   -l)
+        linkeroptions="$linkeroptions $2"
+               shift 2
+               ;;
+   -z)
+        compileroptions="$compileroptions $2"
+               shift 2
+               ;;
+   -j)
+        makejobs=$2
+               shift 2
+               ;;
+   -h)
+        usage
+        exit $ERROR_EXIT_CODE;; 
+       
+    --clean)
+       makeclean=on
+       shift
+       ;;              
+    --with-boost)
+       BOOST_INCLUDE_PATH=$2
+       shift 2
+       ;;      
+    --debug-cxx-options)
+       cxx_debug_options=$2
+       shift 2
+       ;;
+    --debug-ld-options)
+       ld_debug_options=$2
+       shift 2
+       ;;
+    --release-cxx-options)
+       cxx_release_options=$2
+       shift 2
+       ;;
+    --optimize-flags)
+       cxx_release_optimization_level=$2
+       shift 2
+       ;;
+    --release-ld-options)
+       ld_release_options=$2
+       shift 2
+       ;;
+    --nodefaultlibs)
+       ld_libs=" "
+       shift
+       ;;
+    --with-make)
+        MAKE=$2
+       shift 2
+       ;;
+    --platform-suffix)
+        OS_VERSION=$2
+       shift 2
+       ;;
+    --toolset-suffix)
+       TOOLSET_SUFFIX=$2
+       shift 2
+       ;;
+    --debug-test)
+       MAKE_DEBUG_TEST=1
+       if test $target = 'test'; then
+               target=test_debug
+       fi
+       shift 1
+       ;;
+   --amd64-use-128bit)
+       amd64_cxx_options='-mcx16'
+       shift 1
+       ;;
+   --arch-tune)
+       ArchFlag=$2
+       shift 2
+       ;;
+   --)
+       shift; break;; 
+
+   *)
+       echo "unknown option $1"
+       usage
+       exit $ERROR_EXIT_CODE;;
+   esac
+done
+
+cxx_release_optimization="$cxx_release_optimization_level $cxx_release_optimization"
+
+# Determine compiler
+case $ccompiler in
+       gcc)
+               if test $cppcompiler = ''; then
+                       cppcompiler=g++
+               fi
+               ;;
+       clang)
+               if test $cppcompiler = ''; then
+                       cppcompiler=clang++
+               fi
+               ;;
+       *)
+               echo "ERROR: Unknown compiler: $ccompiler"
+               exit $ERROR_EXIT_CODE
+               ;;
+esac
+
+# Determine OS family
+if test $OS_FAMILY = 'unknown'; then
+       OS_FAMILY=`uname |tr [A-Z] [a-z]|sed "s/-//"`
+fi
+case $OS_FAMILY in
+    hp-ux)
+       OS_FAMILY=hpux
+       ;;
+    solaris)
+       OS_FAMILY=sunos
+       ;;
+    mingw*)
+       OS_FAMILY=mingw
+       ;;
+    linux|sunos|hpux|aix|freebsd|mingw|darwin)
+       ;;
+    *)
+       echo "Warning: Unknown operation system: $OS_FAMILY"
+       #exit $ERROR_EXIT_CODE
+       ;;
+esac
+
+
+# Determine processor architecture
+if test $processor_arch = 'unknown'; then
+       processor_arch=`uname -m|tr [A-Z] [a-z]`
+fi
+case $processor_arch in
+       x86_64)
+           if test $bitsToBuild = 64; then
+               processor_arch='amd64'
+           else
+               processor_arch='x86'
+           fi;
+           ;;
+       x86|i686)
+               if test $bitsToBuild = 64; then
+                       processor_arch='amd64'
+               else
+                       processor_arch='x86'
+               fi
+               ;;
+       sparc64)
+               processor_arch='sparc'
+               ;;
+       amd64|x86|ia64|sparc)
+               ;;
+       *)
+               processor_arch=`uname -p|tr [A-Z] [a-z]`
+               case $processor_arch in
+                   sparc|powerpc)
+                       ;;
+                   *)
+                       echo "Warning: Unknown processor architecture: $processor_arch"
+                       #exit ${ERROR_EXIT_CODE}
+                       ;;
+               esac                    
+               1;;
+esac   
+
+# Determine compiler flags
+case $ccompiler in
+    gcc|clang)
+       case $processor_arch in
+       amd64)
+           case $OS_FAMILY in
+           linux|freebsd|darwin)
+               buildCXXflags="-m64 -fPIC -march=$ArchFlag $amd64_cxx_options"
+               buildCflags="-m64 -fPIC -march=$ArchFlag $amd64_cxx_options"
+               buildLDflags="-m64 -fPIC"
+               buildTestLDflags="-m64 -fPIC"
+               ;;
+           mingw)
+               buildCXXflags="-m64 -march=$ArchFlag $amd64_cxx_options"
+               buildCflags="-m64 -march=$ArchFlag $amd64_cxx_options"
+               buildLDflags="-m64"
+               buildTestLDflags="-m64"
+                ld_libs=""
+               ;;
+           *)
+               echo "Warning: cannot determine compiler flags for processor $processor_arch, OS $OS_FAMILY, and compiler $ccompiler"
+               #exit ${ERROR_EXIT_CODE}
+               ;;
+           esac
+           ;;
+       x86)
+           case $OS_FAMILY in
+               linux|freebsd|darwin)
+                   buildCXXflags="-m32 -fPIC -march=$ArchFlag"
+                   buildCflags="-m32 -fPIC -march=$ArchFlag"
+                   buildLDflags="-m32 -fPIC"
+                   buildTestLDflags="-m32 -fPIC"
+                   ;;
+               mingw)
+                   buildCXXflags="-m32 -march=$ArchFlag"
+                   buildCflags="-m32 -march=$ArchFlag"
+                   buildLDflags="-m32"
+                   buildTestLDflags="-m32"
+                   ld_libs=""
+                   ;;
+               *)
+                   echo "Warning: cannot determine compiler flags for processor $processor_arch, OS $OS_FAMILY, and compiler $ccompiler"
+                   #exit ${ERROR_EXIT_CODE}
+                   ;;
+           esac
+           ;;
+       ia64)
+           bitsToBuild=64
+           case $OS_FAMILY in
+               linux|freebsd)
+                   buildCXXflags="-mtune=itanium2 -fPIC"
+                   buildCflags="-mtune=itanium2 -fPIC"
+                   buildLDflags="-mtune=itanium2 -fPIC"
+                   buildTestLDflags="-mtune=itanium2 -fPIC"
+                   ;;
+               hpux)
+                   buildCXXflags="-mlp64 -mtune=itanium2 -fPIC"
+                   buildCflags="-mlp64 -mtune=itanium2 -fPIC"
+                   buildLDflags="-mlp64 -mtune=itanium2 -fPIC"
+                   buildTestLDflags="-mlp64 -mtune=itanium2 -fPIC"
+                   ;;
+               *)
+                   echo "Warning: cannot determine compiler flags for processor $processor_arch, OS $OS_FAMILY, and compiler $ccompiler"
+                   #exit ${ERROR_EXIT_CODE}
+                   ;;
+           esac
+           ;;
+       sparc)
+           bitsToBuild=64
+           case $OS_FAMILY in
+               sunos)
+                   buildCXXflags="-mcpu=v9 -mtune=ultrasparc3 -m64 -fPIC -pthreads"
+                   buildCflags="-mcpu=v9 -mtune=ultrasparc3 -m64 -fPIC -pthreads"
+                   buildLDflags="-mcpu=v9 -mtune=ultrasparc3 -m64 -fPIC -pthreads"
+                   buildTestLDflags="-mcpu=v9 -mtune=ultrasparc3 -m64 -fPIC -pthreads"
+                   cxx_test_release_options="-fPIC"
+                   ld_test_release_options="-fPIC"
+                   ;;
+               linux)
+                   buildCXXflags="-mcpu=v9 -mtune=ultrasparc3 -m64 -fPIC"
+                   buildCflags="-mcpu=v9 -mtune=ultrasparc3 -m64 -fPIC"
+                   buildLDflags="-mcpu=v9 -mtune=ultrasparc3 -m64 -fPIC"
+                   buildTestLDflags="-mcpu=v9 -mtune=ultrasparc3 -m64 -fPIC"
+                   cxx_test_release_options="-fPIC"
+                   ld_test_release_options="-fPIC"
+                   ;;
+               *)
+                   echo "Warning: cannot determine compiler flags for processor $processor_arch, OS $OS_FAMILY, and compiler $ccompiler"
+                   #exit ${ERROR_EXIT_CODE}
+                   ;;
+           esac
+           ;;
+       powerpc)
+           bitsToBuild=64
+           case $OS_FAMILY in
+               aix)
+                   buildCXXflags="-maix64 -pthread -fPIC"
+                   buildCflags="-maix64 -pthread -fPIC"
+                   buildLDflags="-maix64 -pthread -fPIC"
+                   buildTestLDflags="-maix64 -pthread -fPIC"
+                   cxx_test_release_options="-fPIC"
+                   ld_test_release_options="-fPIC"
+                   ;;
+               *)
+                   echo "Warning: cannot determine compiler flags for processor $processor_arch, OS $OS_FAMILY, and compiler $ccompiler"
+                   #exit ${ERROR_EXIT_CODE}
+                   ;;
+           esac
+           ;;
+       *)
+           echo "Warning: cannot determine compiler flags for processor $processor_arch and compiler $ccompiler"
+           #exit ${ERROR_EXIT_CODE}
+           ;;
+       esac
+
+       cppcompiler_version=`$cppcompiler -dumpversion`
+       echo g++ version=$gcc_version
+
+       # Setup target options
+       # buildCXXflags="-std=gnu++0x $buildCXXflags"
+       cxx_debug_options="-D_DEBUG -O0 -g $cxx_debug_options"
+       cxx_release_options="-DNDEBUG $cxx_release_optimization $cxx_release_options"
+       ;;
+    *)
+       echo "ERROR: Unknown compiler: $ccompiler"
+       exit ${ERROR_EXIT_CODE}
+       ;;
+esac
+
+if test $BOOST_INCLUDE_PATH != ''; then
+       buildCXXflags="$buildCXXflags -I$BOOST_INCLUDE_PATH"
+fi
+
+if test 'x$buildTestLDflags' = 'x'; then
+       buildTestLDflags=$buildLDflags
+fi
+
+
+EXTRA_CXXFLAGS="$buildCXXflags $EXTRA_CXXFLAGS"
+EXTRA_CFLAGS="$buildCflags $EXTRA_CFLAGS"
+EXTRA_LDFLAGS="$buildLDflags $EXTRA_LDFLAGS"
+
+EXTRA_TEST_LDFLAGS="$buildTestLDflags $EXTRA_TEST_LDFLAGS"
+
+
+echo "Building with the following options ..."
+echo "Processor: $processor_arch"
+echo "Platform: $OS_FAMILY"
+echo "C Compiler: $ccompiler"
+echo "C++ Compiler: $cppcompiler"
+echo "C++ Compiler version: $cppcompiler_version"
+echo "Bits to build: $bitsToBuild"
+echo "Compile options: $compileroptions $EXTRA_CXXFLAGS"
+echo "Link options: $linkeroptions $EXTRA_LDFLAGS"
+echo "Link options (for test cds-unit app): $linkeroptions $EXTRA_TEST_LDFLAGS"
+
+BITSTOBUILD=$bitsToBuild
+export BITSTOBUILD
+
+#
+# Set the C compiler and C++ compiler environment variables
+#
+
+CC="$ccompiler"
+export CC
+
+CXX="$cppcompiler"
+export CXX
+
+ROOT_DIR=..
+
+GOAL_DIR=$ccompiler$TOOLSET_SUFFIX-$processor_arch-$OS_FAMILY$OS_VERSION-$bitsToBuild
+BIN_PATH=$ROOT_DIR/bin/$GOAL_DIR
+mkdir -p $BIN_PATH
+
+OBJ_PATH=$ROOT_DIR/obj/$GOAL_DIR
+mkdir -p $OBJ_PATH
+
+echo PATH=$PATH
+echo LD_LIBRARY_PATH=$LD_LIBRARY_PATH
+echo BIN_PATH=$BIN_PATH
+echo OBJ_PATH=$OBJ_PATH
+echo `${CXX} --version | head -1`
+echo Build started
+
+makegoals=
+if test $makeclean = 'on'; then
+   echo Clean all
+   $MAKE -f Makefile clean platform=$OS_FAMILY BIN_PATH=$BIN_PATH OBJ_PATH=$OBJ_PATH
+fi
+
+echo ---------------------------------
+echo Make debug library
+CXXFLAGS="$compileroptions $cxx_debug_options $EXTRA_CXXFLAGS"
+export CXXFLAGS
+CFLAGS="$compileroptions $cxx_debug_options $EXTRA_CFLAGS $debugflag "
+export CFLAGS
+LDFLAGS="$linkeroptions -shared $ld_debug_options $ld_libs $EXTRA_LDFLAGS "
+export LDFLAGS
+
+mkdir -p $OBJ_PATH/debug
+
+$MAKE -f Makefile \
+     platform=$OS_FAMILY \
+     BIN_PATH=$BIN_PATH \
+     OBJ_PATH=$OBJ_PATH/debug \
+     debug
+
+if test $? -gt 0; then
+   exit $?
+fi
+
+echo ---------------------------------
+echo Make release library
+
+CXXFLAGS="$compileroptions $cxx_release_options $EXTRA_CXXFLAGS "
+export CXXFLAGS
+CFLAGS="$compileroptions $cxx_release_options $EXTRA_CFLAGS "
+export CFLAGS
+LDFLAGS="$linkeroptions -shared $ld_resease_options $ld_libs $EXTRA_LDFLAGS "
+export LDFLAGS
+
+mkdir -p $OBJ_PATH/release
+
+$MAKE -f Makefile \
+     platform=$OS_FAMILY \
+     BIN_PATH=$BIN_PATH \
+     OBJ_PATH=$OBJ_PATH/release \
+     release
+     
+if test $? -gt 0; then
+   exit $?
+fi
+
+
+echo ---------------------------------
+echo Make tests
+
+if test $MAKE_DEBUG_TEST = '0'; then
+    CXXFLAGS="$compileroptions $cxx_release_options $cxx_test_release_options $EXTRA_CXXFLAGS "
+    export CXXFLAGS
+    CFLAGS="$compileroptions $cxx_release_options $EXTRA_CFLAGS "
+    export CFLAGS
+    LDFLAGS="$linkeroptions $ld_release_options $ld_test_release_options $ld_libs $EXTRA_TEST_LDFLAGS "
+    export LDFLAGS
+
+    $MAKE -f Makefile -j $makejobs \
+        platform=$OS_FAMILY \
+        BIN_PATH=$BIN_PATH \
+        OBJ_PATH=$OBJ_PATH/test \
+        $target
+        
+    if test $? -gt 0; then
+        exit $?
+    fi
+fi    
+
+echo ---------------------------------
+echo Make tests debug
+
+if test $MAKE_DEBUG_TEST = '1'; then
+    CXXFLAGS="$compileroptions $cxx_debug_options $cxx_test_release_options $EXTRA_CXXFLAGS "
+    export CXXFLAGS
+    CFLAGS="$compileroptions $cxx_debug_options $EXTRA_CFLAGS "
+    export CFLAGS
+    LDFLAGS="$linkeroptions $ld_debug_options $ld_test_release_options $ld_libs $EXTRA_TEST_LDFLAGS "
+    export LDFLAGS
+
+    $MAKE -f Makefile -j $makejobs \
+        platform=$OS_FAMILY \
+        BIN_PATH=$BIN_PATH \
+        OBJ_PATH=$OBJ_PATH/test-debug \
+        $target
+        
+    if test $? -gt 0; then
+        exit $?
+    fi
+fi   
\ No newline at end of file
diff --git a/build/sample/build-freebsd-amd64.sh b/build/sample/build-freebsd-amd64.sh
new file mode 100644 (file)
index 0000000..4fd2c7e
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+PATH=/usr/local/bin:$PATH
+export PATH
+
+./build.sh \
+--clean \
+--with-make gmake \
+--with-boost /usr/local/include \
+-x g++43 \
+-z '-std=c++0x -Wall -pedantic' \
+-l "-L/usr/local/lib" \
+2>&1 | tee build-freebsd-amd64.log
diff --git a/build/sample/build-hpux1123.sh b/build/sample/build-hpux1123.sh
new file mode 100644 (file)
index 0000000..dde0165
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+clear
+
+export BOOST_ROOT=~/boost
+
+GCC_ROOT=/usr/local/gcc-433
+export PATH=${GCC_ROOT}/bin:${PATH}
+export LD_LIBRARY_PATH=${GCC_ROOT}/lib:${LD_LIBRARY_PATH}
+
+./build.sh -b 64 \
+--clean \
+-x 'g++' \
+-z '-std=c++0x -Wall -pedantic' \
+-l '-L${BOOST_ROOT}/bin/hpux1123-ia64' \
+--with-boost ${BOOST_ROOT} \
+--with-make gmake \
+--platform-suffix 11.23 \
+2>&1 | tee build-hpux11.23-ia64.log
+
diff --git a/build/sample/build-hpux1131.sh b/build/sample/build-hpux1131.sh
new file mode 100644 (file)
index 0000000..386387a
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+clear
+
+export BOOST_ROOT=~/boost
+
+GCC_ROOT=/usr/local/gcc-433
+export PATH=${GCC_ROOT}/bin:${PATH}
+export LD_LIBRARY_PATH=${GCC_ROOT}/lib:${LD_LIBRARY_PATH}
+
+./build.sh -b 64 \
+--clean \
+-x 'g++' \
+-z '-std=c++0x -Wall -pedantic' \
+-l '-L${BOOST_ROOT}/bin/hpux1131-ia64' \
+--with-boost ${BOOST_ROOT} \
+--with-make gmake \
+--platform-suffix 11.31 \
+2>&1 | tee build-hpux11.31-ia64.log
+
diff --git a/build/sample/build-linux-amd64.sh b/build/sample/build-linux-amd64.sh
new file mode 100644 (file)
index 0000000..3d83246
--- /dev/null
@@ -0,0 +1,18 @@
+#!/bin/sh
+clear
+
+export BOOST_ROOT=~/boost
+
+GCC_ROOT=/usr/local/gcc-4.3.3
+export PATH=${GCC_ROOT}/bin:${PATH}
+export LD_LIBRARY_PATH=${GCC_ROOT}/lib:${LD_LIBRARY_PATH}
+
+./build.sh -b 64 \
+--clean \
+-x 'g++' \
+-z '-std=c++0x -Wall -pedantic' \
+-l '-L${BOOST_ROOT}/bin/linux-amd64' \
+--with-boost ${BOOST_ROOT} \
+--amd64-use-128bit \
+2>&1 | tee build-linux-amd64.log
+
diff --git a/build/sample/build-linux-ia64.sh b/build/sample/build-linux-ia64.sh
new file mode 100644 (file)
index 0000000..7ca441e
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/sh
+clear
+
+export BOOST_ROOT=~/boost
+
+GCC_ROOT=/usr/local/gcc-4.3.3
+export PATH=${GCC_ROOT}/bin:${PATH}
+export LD_LIBRARY_PATH=${GCC_ROOT}/lib:${LD_LIBRARY_PATH}
+
+./build.sh -b 64 \
+--clean \
+-x 'g++' \
+-z '-std=c++0x -Wall -pedantic' \
+-l '-L${BOOST_ROOT}/bin/linux-ia64' \
+--with-boost ${BOOST_ROOT} \
+2>&1 | tee build-linux-ia64.log
+
diff --git a/build/sample/build-linux-sparc.sh b/build/sample/build-linux-sparc.sh
new file mode 100644 (file)
index 0000000..084b675
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh
+clear
+
+BOOST_ROOT=~/boost/boost_1_49_0
+export BOOST_ROOT
+
+./build.sh -b 64 -j 2 \
+-x 'g++' \
+-z '-std=c++0x -Wall -pedantic' \
+-l '-L/opt/cfarm/release/4.4.1-64/lib64 -L${BOOST_ROOT}/stage64/lib' \
+--with-boost ${BOOST_ROOT} \
+2>&1 | tee build-linux-sparc.log
+
+
diff --git a/build/sample/build-linux-x86.sh b/build/sample/build-linux-x86.sh
new file mode 100644 (file)
index 0000000..a2e638e
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/sh
+clear
+
+export BOOST_ROOT=~/boost
+
+GCC_ROOT=/usr/local/gcc-4.3.3
+export PATH=${GCC_ROOT}/bin:${PATH}
+export LD_LIBRARY_PATH=${GCC_ROOT}/lib:${LD_LIBRARY_PATH}
+
+./build.sh -b 32 \
+--clean \
+-x 'g++' \
+-z '-std=c++0x -Wall -pedantic' \
+-l '-L${BOOST_ROOT}/bin/linux-x86' \
+--with-boost ${BOOST_ROOT} \
+2>&1 | tee build-linux-x86.log
+
diff --git a/build/sample/build-mingw-amd64.bat b/build/sample/build-mingw-amd64.bat
new file mode 100644 (file)
index 0000000..62f393c
--- /dev/null
@@ -0,0 +1,14 @@
+
+:: This sample demonstrates how to build libcds in MinGW (clearly, with TDM-GCC).
+:: Run TDM-GCC console, change dir to libcds build directory and run this batch file
+::
+:: BOOST_PATH - environment variable that contains full path to boost root directory
+::              for example: set BOOST_PATH=d:\libs\boost_1_49_0
+::
+
+set BOOST_PATH=d:/Language/Lib/C/boost/boost_1_49_0
+
+:: We use -DBOOST_THREAD_USE_LIB flag since static libboost_thread is used
+
+build.sh -b 64 -x 'g++' -z '-std=c++0x -Wall -pedantic -DBOOST_THREAD_USE_LIB -D_WIN32_WINNT=0x0500' -l "-L%BOOST_PATH%/stage-mingw64/lib" --with-boost "%BOOST_PATH%" --with-make mingw32-make 2>&1 | tee build-mingw-amd64.log
+
diff --git a/build/sample/build-osx-clang-libc++.sh b/build/sample/build-osx-clang-libc++.sh
new file mode 100644 (file)
index 0000000..8c2aad2
--- /dev/null
@@ -0,0 +1,16 @@
+#! /bin/sh
+
+BOOST_ROOT=~/works/libs/boost_1_55_0
+./build.sh \
+    --clean \
+    -c clang \
+    -x clang \
+    -b 64 \
+    -z "--std=c++11 -DCDS_USE_LIBCDS_ATOMIC -I/usr/lib/c++/v1 -I$BOOST_ROOT" \
+    -l "-L$BOOST_ROOT/stage64-clang/lib -lc++ -lc++abi -lpthread -ldl" \
+    --nodefaultlibs \
+    --with-boost $BOOST_ROOT \
+    --arch-tune core2 \
+    2>&1 |tee build.log
+    
+#     -z "--std=c++11 -DCDS_USE_LIBCDS_ATOMIC -I/usr/lib/c++/v1 -I/usr/include -I$BOOST_ROOT"
diff --git a/build/sample/build-osx-gcc.sh b/build/sample/build-osx-gcc.sh
new file mode 100644 (file)
index 0000000..ee0d73d
--- /dev/null
@@ -0,0 +1,16 @@
+#! /bin/sh
+
+BOOST_ROOT=~/works/libs/boost_1_55_0
+MACOS_SDK_INCLUDE=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include
+
+./build.sh \
+    --clean \
+    -c gcc \
+    -x gcc-4.8 \
+    -b 64 \
+    -z "--std=c++11 -I$BOOST_ROOT -I$MACOS_SDK_INCLUDE" \
+    -l "-L$BOOST_ROOT/stage64/lib" \
+    --with-boost $BOOST_ROOT \
+    --arch-tune core2 \
+    2>&1 |tee build.log
+    
diff --git a/build/sample/build-sun-sparc.sh b/build/sample/build-sun-sparc.sh
new file mode 100644 (file)
index 0000000..7fa3f45
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/sh
+clear
+
+BOOST_ROOT=~/boost
+export BOOST_ROOT
+
+GCC_ROOT=/usr/local/gcc433
+PATH=${GCC_ROOT}/bin:${PATH}
+export PATH
+LD_LIBRARY_PATH=${GCC_ROOT}/lib:/usr/local/lib/mpfr-2.4.1/lib:/usr/local/lib/gmp-4.2.4/lib:${LD_LIBRARY_PATH}
+export LD_LIBRARY_PATH
+
+./build.sh -b 64 \
+--clean \
+-x 'g++' \
+-z '-std=c++0x -Wall -pedantic' \
+-l '-L${BOOST_ROOT}/bin/sun-sparc64' \
+--with-boost ${BOOST_ROOT} \
+2>&1 | tee build-sun-sparc.log
+
+
diff --git a/cds/algo/base.h b/cds/algo/base.h
new file mode 100644 (file)
index 0000000..d07ffcb
--- /dev/null
@@ -0,0 +1,15 @@
+//$$CDS-header$$
+
+#ifndef __CDS_ALGO_BASE_H
+#define __CDS_ALGO_BASE_H
+
+#include <cds/details/defs.h>
+
+namespace cds {
+
+    /// Different approaches and techniques for supporting high-concurrent data structure
+    namespace algo {}
+
+} // namespace cds
+
+#endif // #ifndef __CDS_ALGO_BASE_H
diff --git a/cds/algo/elimination.h b/cds/algo/elimination.h
new file mode 100644 (file)
index 0000000..52595d9
--- /dev/null
@@ -0,0 +1,58 @@
+//$$CDS-header$$
+
+#ifndef __CDS_ALGO_ELIMINATION_H
+#define __CDS_ALGO_ELIMINATION_H
+
+#include <cds/algo/elimination_tls.h>
+#include <cds/algo/elimination_opt.h>
+#include <cds/cxx11_atomic.h>
+#include <cds/threading/model.h>
+
+namespace cds { namespace algo {
+
+    /// Elimination technique
+    /** @anchor cds_elimination_description
+        Elimination technique allows highly distributed coupling and execution of operations with reverse
+        semantics like the pushes and pops on a stack. If a push followed by a pop are performed
+        on a stack, the data structure's state does not change (similarly for a pop followed by a push).
+        This means that if one can cause pairs of pushes and pops to meet and pair up in
+        separate locations, the threads can exchange values without having to touch a centralized structure
+        since they have anyhow "eliminated" each other's effect on it. Elimination can be implemented
+        by using a collision array in which threads pick random locations in order to try and collide.
+        Pairs of threads that "collide" in some location run through a synchronization protocol,
+        and all such disjoint collisions can be performed in parallel. If a thread has not met another
+        in the selected location or if it met a thread with an operation that cannot be eliminated
+        (such as two push operations), an alternative scheme must be used.
+    */
+    namespace elimination {
+
+        /// Base class describing an operation for eliminating
+        /**
+            This class contains some debugng info.
+            Actual operation descriptor depends on real container and its interface.
+        */
+        struct operation_desc
+        {
+            record * pOwner;    ///< Owner of the descriptor
+        };
+
+        /// Acquires elimination record for the current thread
+        template <typename OperationDesc>
+        static inline record * init_record( OperationDesc& op )
+        {
+            record& rec = cds::threading::elimination_record();
+            assert( rec.is_free());
+            op.pOwner = &rec;
+            rec.pOp = static_cast<operation_desc *>( &op );
+            return &rec;
+        }
+
+        /// Releases elimination record for the current thread
+        static inline void clear_record()
+        {
+            cds::threading::elimination_record().pOp = null_ptr<operation_desc*>();
+        }
+    } // namespace elimination
+}} // namespace cds::algo
+
+#endif // __CDS_ALGO_ELIMINATION_H
diff --git a/cds/algo/elimination_opt.h b/cds/algo/elimination_opt.h
new file mode 100644 (file)
index 0000000..bca3bcc
--- /dev/null
@@ -0,0 +1,37 @@
+//$$CDS-header$$
+
+#ifndef __CDS_ALGO_ELIMINATION_OPT_H
+#define __CDS_ALGO_ELIMINATION_OPT_H
+
+#include <cds/details/defs.h>
+
+namespace cds { namespace opt {
+
+    /// Enable \ref cds_elimination_description "elimination back-off" for the container
+    template <bool Enable>
+    struct enable_elimination {
+        //@cond
+        template <class Base> struct pack: public Base
+        {
+            static CDS_CONSTEXPR_CONST bool enable_elimination = Enable;
+        };
+        //@endcond
+    };
+
+    /// \ref cds_elimination_description "Elimination back-off strategy" option setter
+    /**
+        Back-off strategy for elimination.
+        Usually, elimination back-off strategy is \p cds::backoff::delay.
+    */
+    template <typename Type>
+    struct elimination_backoff {
+        //@cond
+        template <class Base> struct pack: public Base
+        {
+            typedef Type elimination_backoff;
+        };
+        //@endcond
+    };
+}} // namespace cds::opt
+
+#endif // #ifndef __CDS_ALGO_ELIMINATION_OPT_H
diff --git a/cds/algo/elimination_tls.h b/cds/algo/elimination_tls.h
new file mode 100644 (file)
index 0000000..2b0091f
--- /dev/null
@@ -0,0 +1,34 @@
+//$$CDS-header$$
+
+#ifndef __CDS_ALGO_ELIMINATION_TLS_H
+#define __CDS_ALGO_ELIMINATION_TLS_H
+
+#include <cds/algo/base.h>
+
+namespace cds { namespace algo { namespace elimination {
+
+    // Forwards
+    struct operation_desc;
+
+    /// Per-thread elimination record
+    /** @headerfile cds/algo/elimination.h
+    */
+    struct record
+    {
+        operation_desc *    pOp ;   ///< Operation descriptor
+
+        /// Initialization
+        record()
+            : pOp( null_ptr<operation_desc *>() )
+        {}
+
+        /// Checks if the record is free
+        bool is_free() const
+        {
+            return pOp == null_ptr<operation_desc *>();
+        }
+    };
+
+}}} // cds::algo::elimination
+
+#endif // #ifndef __CDS_ALGO_ELIMINATION_TLS_H
diff --git a/cds/algo/flat_combining.h b/cds/algo/flat_combining.h
new file mode 100644 (file)
index 0000000..30a8961
--- /dev/null
@@ -0,0 +1,808 @@
+//$$CDS-header$$
+
+#ifndef __CDS_ALGO_FLAT_COMBINING_H
+#define __CDS_ALGO_FLAT_COMBINING_H
+
+#include <cds/cxx11_atomic.h>
+#include <cds/details/allocator.h>
+#include <cds/backoff_strategy.h>
+#include <cds/lock/spinlock.h>
+#include <cds/details/std/mutex.h>  // lock_guard
+#include <cds/opt/options.h>
+#include <cds/int_algo.h>
+#include <boost/thread/tss.hpp>     // thread_specific_ptr
+
+namespace cds { namespace algo {
+
+    /// @defgroup cds_flat_combining_intrusive Intrusive flat combining containers
+    /// @defgroup cds_flat_combining_container Non-intrusive flat combining containers
+
+    /// Flat combining
+    /**
+        @anchor cds_flat_combining_description
+        Flat combining (FC) technique is invented by Hendler, Incze, Shavit and Tzafrir in their paper
+        [2010] <i>"Flat Combining and the Synchronization-Parallelism Tradeoff"</i>.
+        The technique converts a sequential data structure to its concurrent implementation.
+        A few structures are added to the sequential implementation: a <i>global lock</i>,
+        a <i>count</i> of the number of combining passes, and a pointer to the <i>head</i>
+        of a <i>publication list</i>. The publication list is a list of thread-local records
+        of a size proportional to the number of threads that are concurrently accessing the shared object.
+
+        Each thread \p t accessing the structure to perform an invocation of some method \p m
+        on the shared object executes the following sequence of steps:
+        <ol>
+        <li>Write the invocation opcode and parameters (if any) of the method \p m to be applied
+        sequentially to the shared object in the <i>request</i> field of your thread local publication
+        record (there is no need to use a load-store memory barrier). The <i>request</i> field will later
+        be used to receive the response. If your thread local publication record is marked as active
+        continue to step 2, otherwise continue to step 5.</li>
+        <li>Check if the global lock is taken. If so (another thread is an active combiner), spin on the <i>request</i>
+        field waiting for a response to the invocation (one can add a yield at this point to allow other threads
+        on the same core to run). Once in a while while spinning check if the lock is still taken and that your
+        record is active. If your record is inactive proceed to step 5. Once the response is available,
+        reset the request field to null and return the response.</li>
+        <li>If the lock is not taken, attempt to acquire it and become a combiner. If you fail,
+        return to spinning in step 2.</li>
+        <li>Otherwise, you hold the lock and are a combiner.
+        <ul>
+            <li>Increment the combining pass count by one.</li>
+            <li>Execute a \p fc_apply() by traversing the publication list from the head,
+            combining all nonnull method call invocations, setting the <i>age</i> of each of these records
+            to the current <i>count</i>, applying the combined method calls to the structure D, and returning
+            responses to all the invocations. This traversal is guaranteed to be wait-free.</li>
+            <li>If the <i>count</i> is such that a cleanup needs to be performed, traverse the publication
+            list from the <i>head</i>. Starting from the second item (we always leave the item pointed to
+            by the head in the list), remove from the publication list all records whose <i>age</i> is
+            much smaller than the current <i>count</i>. This is done by removing the node and marking it
+            as inactive.</li>
+            <li>Release the lock.</li>
+        </ul>
+        <li>If you have no thread local publication record allocate one, marked as active. If you already
+        have one marked as inactive, mark it as active. Execute a store-load memory barrier. Proceed to insert
+        the record into the list with a successful CAS to the <i>head</i>. Then proceed to step 1.</li>
+        </ol>
+
+        As the test results show, the flat combining technique is suitable for non-intrusive containers
+        like stack, queue, deque. For intrusive concurrent containers the flat combining demonstrates
+        less impressive results.
+
+        \ref cds_flat_combining_container "List of FC-based containers" in libcds.
+
+        \ref cds_flat_combining_intrusive "List of intrusive FC-based containers" in libcds.
+    */
+    namespace flat_combining {
+
+        /// Special values of publication_record::nRequest
+        enum request_value
+        {
+            req_EmptyRecord,    ///< Publication record is empty
+            req_Response,       ///< Operation is done
+
+            req_Operation       ///< First operation id for derived classes
+        };
+
+        /// publication_record state
+        enum record_state {
+            inactive,       ///< Record is inactive
+            active,         ///< Record is active
+            removed         ///< Record should be removed
+        };
+
+        /// Record of publication list
+        /**
+            Each data structure based on flat combining contains a class derived from \p %publication_record
+        */
+        struct publication_record {
+            CDS_ATOMIC::atomic<unsigned int>    nRequest;   ///< Request field (depends on data structure)
+            CDS_ATOMIC::atomic<unsigned int>    nState;     ///< Record state: inactive, active, removed
+            unsigned int                        nAge;       ///< Age of the record
+            CDS_ATOMIC::atomic<publication_record *> pNext; ///< Next record in publication list
+            void *                              pOwner;    ///< [internal data] Pointer to \ref kernel object that manages the publication list
+
+            /// Initializes publication record
+            publication_record()
+                : nRequest( req_EmptyRecord )
+                , nState( inactive )
+                , nAge(0)
+                , pNext( null_ptr<publication_record *>() )
+                , pOwner( null_ptr<void *>() )
+            {}
+
+            /// Returns the value of \p nRequest field
+            unsigned int op() const
+            {
+                return nRequest.load( CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Checks if the operation is done
+            bool is_done() const
+            {
+                return nRequest.load( CDS_ATOMIC::memory_order_relaxed ) == req_Response;
+            }
+        };
+
+        /// Flat combining internal statistics
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat
+        {
+            typedef Counter counter_type;   ///< Event counter type
+
+            counter_type    m_nOperationCount   ;   ///< How many operations have been performed
+            counter_type    m_nCombiningCount   ;   ///< Combining call count
+            counter_type    m_nCompactPublicationList; ///< Count of publication list compacting
+            counter_type    m_nDeactivatePubRecord; ///< How many publication records were deactivated during compacting
+            counter_type    m_nActivatePubRecord;   ///< Count of publication record activating
+            counter_type    m_nPubRecordCreated ;   ///< Count of created publication records
+            counter_type    m_nPubRecordDeteted ;   ///< Count of deleted publication records
+            counter_type    m_nAcquirePubRecCount;  ///< Count of acquiring publication record
+            counter_type    m_nReleasePubRecCount;  ///< Count on releasing publication record
+
+            /// Returns current combining factor
+            /**
+                Combining factor is how many operations perform in one combine pass:
+                <tt>combining_factor := m_nOperationCount / m_nCombiningCount</tt>
+            */
+            double combining_factor() const
+            {
+                return m_nCombiningCount.get() ? double( m_nOperationCount.get()) / m_nCombiningCount.get() : 0.0;
+            }
+
+            //@cond
+            void    onOperation()               { ++m_nOperationCount; }
+            void    onCombining()               { ++m_nCombiningCount; }
+            void    onCompactPublicationList()  { ++m_nCompactPublicationList; }
+            void    onDeactivatePubRecord()     { ++m_nDeactivatePubRecord; }
+            void    onActivatPubRecord()        { ++m_nActivatePubRecord; }
+            void    onCreatePubRecord()         { ++m_nPubRecordCreated; }
+            void    onDeletePubRecord()         { ++m_nPubRecordDeteted; }
+            void    onAcquirePubRecord()        { ++m_nAcquirePubRecCount; }
+            void    onReleasePubRecord()        { ++m_nReleasePubRecCount; }
+            //@endcond
+        };
+
+        /// Flat combining dummy internal statistics
+        struct empty_stat
+        {
+            //@cond
+            void    onOperation()               {}
+            void    onCombining()               {}
+            void    onCompactPublicationList()  {}
+            void    onDeactivatePubRecord()     {}
+            void    onActivatPubRecord()        {}
+            void    onCreatePubRecord()         {}
+            void    onDeletePubRecord()         {}
+            void    onAcquirePubRecord()        {}
+            void    onReleasePubRecord()        {}
+            //@endcond
+        };
+
+        /// Type traits of \ref kernel class
+        /**
+            You can define different type traits for \ref kernel
+            by specifying your struct based on \p %type_traits
+            or by using \ref make_traits metafunction.
+        */
+        struct type_traits
+        {
+            typedef cds::lock::Spin             lock_type;  ///< Lock type
+            typedef cds::backoff::delay_of<2>   back_off;   ///< Back-off strategy
+            typedef CDS_DEFAULT_ALLOCATOR       allocator;  ///< Allocator used for TLS data (allocating publication_record derivatives)
+            typedef empty_stat                  stat;       ///< Internal statistics
+            typedef opt::v::relaxed_ordering  memory_model; ///< /// C++ memory ordering model
+        };
+
+        /// Metafunction converting option list to traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options are:
+            - \p opt::lock_type - mutex type, default is \p cds::lock::Spin
+            - \p opt::back_off - back-off strategy, defalt is \p cds::backoff::delay_of<2>
+            - \p opt::allocator - allocator type, default is \ref CDS_DEFAULT_ALLOCATOR
+            - \p opt::stat - internal statistics, possible type: \ref stat, \ref empty_stat (the default)
+            - \p opt::memory_model - C++ memory ordering model.
+                List of all available memory ordering see opt::memory_model.
+                Default if cds::opt::v:relaxed_ordering
+        */
+        template <CDS_DECL_OPTIONS6>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS6 >::type
+                ,CDS_OPTIONS6
+            >::type   type;
+#   endif
+        };
+
+        /// The kernel of flat combining
+        /**
+            Template parameters:
+            - \p PublicationRecord - a type derived from \ref publication_record
+            - \p Traits - a type traits of flat combining, default is flat_combining::type_traits.
+                \ref make_traits metafunction can be used to create type traits
+
+            The kernel object should be a member of a container class. The container cooperates with flat combining
+            kernel object. There are two ways to interact with the kernel:
+            - One-by-one processing the active records of the publication list. This mode provides \ref combine function:
+              the container acquires its publication record by \ref acquire_record, fills its fields and calls
+              \p combine function of its kernel object. If the current thread becomes a combiner, the kernel
+              calls \p fc_apply function of the container for each active non-empty record. Then, the container
+              should release its publication record by \ref release_record. Only one pass through the publication
+              list is possible.
+            - Batch processing (\ref batch_combine function). It this mode the container obtains access
+              to entire publication list. This mode allows the container to perform an elimination, for example,
+              the stack can collide \p push and \p pop requests. The sequence of invocations is the following:
+              the container acquires its publication record by \ref acquire_record, fills its field and call
+              \p batch_combine function of its kernel object. If the current thread becomes a combiner,
+              the kernel calls \p fc_process function of the container passing two iterators pointing to
+              begin and end of publication list (see \ref iterator class). The iterators allows
+              multiple pass through active records of publication list. For each processed record the container
+              should call \ref operation_done function. On the end, the container should release
+              its record by \ref release_record.
+        */
+        template <
+            typename PublicationRecord
+            ,typename Traits = type_traits
+        >
+        class kernel
+        {
+        public:
+            typedef PublicationRecord   publication_record_type;        ///< publication record type
+            typedef Traits              type_traits;                    ///< Type traits
+            typedef typename type_traits::lock_type global_lock_type;   ///< Global lock type
+            typedef typename type_traits::back_off  back_off;           ///< back-off strategy type
+            typedef typename type_traits::allocator allocator;          ///< Allocator type (used for allocating publication_record_type data)
+            typedef typename type_traits::stat      stat;               ///< Internal statistics
+            typedef typename type_traits::memory_model memory_model;    ///< C++ memory model
+
+        protected:
+            //@cond
+            typedef cds::details::Allocator< publication_record_type, allocator >   cxx11_allocator; ///< internal helper cds::details::Allocator
+            typedef cds_std::lock_guard<global_lock_type> lock_guard;
+            //@endcond
+
+        protected:
+            unsigned int                m_nCount;   ///< Count of combining passes
+            publication_record_type *   m_pHead;    ///< Head of publication list
+            boost::thread_specific_ptr< publication_record_type >   m_pThreadRec;   ///< Thread-local publication record
+            mutable global_lock_type    m_Mutex;    ///< Global mutex
+            mutable stat                m_Stat;     ///< Internal statistics
+            unsigned int const          m_nCompactFactor; ///< Publication list compacting factor (the list will be compacted through \p %m_nCompactFactor combining passes)
+            unsigned int const          m_nCombinePassCount; ///< Number of combining passes
+
+        public:
+            /// Initializes the object
+            /**
+                Compact factor = 64
+
+                Combiner pass count = 8
+            */
+            kernel()
+                : m_nCount(0)
+                , m_pHead( null_ptr< publication_record_type *>())
+                , m_pThreadRec( tls_cleanup )
+                , m_nCompactFactor( 64 - 1 ) // binary mask
+                , m_nCombinePassCount( 8 )
+            {
+                init();
+            }
+
+            /// Initializes the object
+            kernel(
+                unsigned int nCompactFactor  ///< Publication list compacting factor (the list will be compacted through \p nCompactFactor combining passes)
+                ,unsigned int nCombinePassCount ///< Number of combining passes for combiner thread
+                )
+                : m_nCount(0)
+                , m_pHead( null_ptr< publication_record_type *>())
+                , m_pThreadRec( tls_cleanup )
+                , m_nCompactFactor( (unsigned int)( cds::beans::ceil2( nCompactFactor ) - 1 ))   // binary mask
+                , m_nCombinePassCount( nCombinePassCount )
+            {
+                init();
+            }
+
+            /// Destroys the objects and mark all publication records as inactive
+            ~kernel()
+            {
+                // mark all publication record as detached
+                for ( publication_record * p = m_pHead; p; p = p->pNext.load( memory_model::memory_order_relaxed ))
+                    p->pOwner = null_ptr<void *>();
+            }
+
+            /// Gets publication list record for the current thread
+            /**
+                If there is no publication record for the current thread
+                the function allocates it.
+            */
+            publication_record_type * acquire_record()
+            {
+                publication_record_type * pRec = m_pThreadRec.get();
+                if ( !pRec ) {
+                    // Allocate new publication record
+                    pRec = cxx11_allocator().New();
+                    pRec->pOwner = reinterpret_cast<void *>( this );
+                    m_pThreadRec.reset( pRec );
+                    m_Stat.onCreatePubRecord();
+                }
+
+                if ( pRec->nState.load( memory_model::memory_order_acquire ) != active )
+                    publish( pRec );
+
+                assert( pRec->nRequest.load( memory_model::memory_order_relaxed ) == req_EmptyRecord );
+
+                m_Stat.onAcquirePubRecord();
+                return pRec;
+            }
+
+            /// Marks publication record for the current thread as empty
+            void release_record( publication_record_type * pRec )
+            {
+                assert( pRec->is_done() );
+                pRec->nRequest.store( req_EmptyRecord, memory_model::memory_order_relaxed );
+                m_Stat.onReleasePubRecord();
+            }
+
+            /// Trying to execute operation \p nOpId
+            /**
+                \p pRec is the publication record acquiring by \ref acquire_record earlier.
+                \p owner is a container that is owner of flat combining kernel object.
+                As a result the current thread can become a combiner or can wait for
+                another combiner performs \p pRec operation.
+
+                If the thread becomes a combiner, the kernel calls \p owner.fc_apply
+                for each active non-empty publication record.
+            */
+            template <class Container>
+            void combine( unsigned int nOpId, publication_record_type * pRec, Container& owner )
+            {
+                assert( nOpId >= req_Operation );
+                assert( pRec );
+                //assert( pRec->nState.load( memory_model::memory_order_relaxed ) == active );
+                pRec->nRequest.store( nOpId, memory_model::memory_order_release );
+
+                m_Stat.onOperation();
+
+                try_combining( owner, pRec );
+            }
+
+            /// Trying to execute operation \p nOpId in batch-combine mode
+            /**
+                \p pRec is the publication record acquiring by \ref acquire_record earlier.
+                \p owner is a container that owns flat combining kernel object.
+                As a result the current thread can become a combiner or can wait for
+                another combiner performs \p pRec operation.
+
+                If the thread becomes a combiner, the kernel calls \p owner.fc_process
+                giving the container the full access over publication list. This function
+                is useful for an elimination technique if the container supports any kind of
+                that. The container can perform multiple pass through publication list.
+
+                \p owner.fc_process has two arguments - forward iterators on begin and end of
+                publication list, see \ref iterator class. For each processed record the container
+                should call \ref operation_done function to mark the record as processed.
+
+                On the end of \p %batch_combine the \ref combine function is called
+                to process rest of publication records.
+            */
+            template <class Container>
+            void batch_combine( unsigned int nOpId, publication_record_type * pRec, Container& owner )
+            {
+                assert( nOpId >= req_Operation );
+                assert( pRec );
+                //assert( pRec->nState.load( memory_model::memory_order_relaxed ) == active );
+                pRec->nRequest.store( nOpId, memory_model::memory_order_release );
+
+                m_Stat.onOperation();
+
+                try_batch_combining( owner, pRec );
+            }
+
+            /// Waits for end of combining
+            void wait_while_combining() const
+            {
+                lock_guard l( m_Mutex );
+            }
+
+            /// Marks \p rec as executed
+            /**
+                This function should be called by container if batch_combine mode is used.
+                For usual combining (see \ref combine) this function is excess.
+            */
+            void operation_done( publication_record& rec )
+            {
+                rec.nRequest.store( req_Response, memory_model::memory_order_release );
+            }
+
+            /// Internal statistics
+            stat const& statistics() const
+            {
+                return m_Stat;
+            }
+
+            //@cond
+            // For container classes based on flat combining
+            stat& internal_statistics() const
+            {
+                return m_Stat;
+            }
+            //@endcond
+
+            /// Returns the compact factor
+            unsigned int compact_factor() const
+            {
+                return m_nCompactFactor + 1;
+            }
+
+            /// Returns number of combining passes for combiner thread
+            unsigned int combine_pass_count() const
+            {
+                return m_nCombinePassCount;
+            }
+
+        public:
+            /// Publication list iterator
+            /**
+                Iterators are intended for batch processing by container's
+                \p fc_process function.
+                The iterator allows iterate through active publication list.
+            */
+            class iterator
+            {
+                //@cond
+                friend class kernel;
+                publication_record_type * m_pRec;
+                //@endcond
+
+            protected:
+                //@cond
+                iterator( publication_record_type * pRec )
+                    : m_pRec( pRec )
+                {
+                    skip_inactive();
+                }
+
+                void skip_inactive()
+                {
+                    while ( m_pRec && (m_pRec->nState.load( memory_model::memory_order_acquire ) != active
+                                    || m_pRec->nRequest.load( memory_model::memory_order_relaxed) < req_Operation ))
+                    {
+                        m_pRec = static_cast<publication_record_type *>(m_pRec->pNext.load( memory_model::memory_order_acquire ));
+                    }
+                }
+                //@endcond
+
+            public:
+                /// Initializes an empty iterator object
+                iterator()
+                    : m_pRec( null_ptr<publication_record_type *>())
+                {}
+
+                /// Copy ctor
+                iterator( iterator const& src )
+                    : m_pRec( src.m_pRec )
+                {}
+
+                /// Pre-increment
+                iterator& operator++()
+                {
+                    assert( m_pRec );
+                    m_pRec = static_cast<publication_record_type *>( m_pRec->pNext.load( memory_model::memory_order_acquire ));
+                    skip_inactive();
+                    return *this;
+                }
+
+                /// Post-increment
+                iterator operator++(int)
+                {
+                    assert( m_pRec );
+                    iterator it(*this);
+                    ++(*this);
+                    return it;
+                }
+
+                /// Dereference operator, can return \p nullptr
+                publication_record_type * operator ->()
+                {
+                    return m_pRec;
+                }
+
+                /// Dereference operator, the iterator should not be an end iterator
+                publication_record_type& operator*()
+                {
+                    assert( m_pRec );
+                    return *m_pRec;
+                }
+
+                /// Iterator equality
+                friend bool operator==( iterator it1, iterator it2 )
+                {
+                    return it1.m_pRec == it2.m_pRec;
+                }
+
+                /// Iterator inequality
+                friend bool operator!=( iterator it1, iterator it2 )
+                {
+                    return !( it1 == it2 );
+                }
+            };
+
+            /// Returns an iterator to the first active publication record
+            iterator begin()    { return iterator(m_pHead); }
+
+            /// Returns an iterator to the end of publication list. Should not be dereferenced.
+            iterator end()      { return iterator(); }
+
+        private:
+            //@cond
+            static void tls_cleanup( publication_record_type * pRec )
+            {
+                // Thread done
+                // pRec that is TLS data should be excluded from publication list
+                if ( pRec ) {
+                    if ( pRec->nState.load(memory_model::memory_order_relaxed) == active && pRec->pOwner ) {
+                        // record is active and kernel is alive
+                        unsigned int nState = active;
+                        pRec->nState.compare_exchange_strong( nState, removed, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+                    }
+                    else {
+                        // record is not in publication list or kernel already deleted
+                        cxx11_allocator().Delete( pRec );
+                    }
+                }
+            }
+
+            void init()
+            {
+                assert( m_pThreadRec.get() == null_ptr<publication_record_type *>() );
+                publication_record_type * pRec = cxx11_allocator().New();
+                m_pHead = pRec;
+                pRec->pOwner = this;
+                m_pThreadRec.reset( pRec );
+                m_Stat.onCreatePubRecord();
+            }
+
+            void publish( publication_record_type * pRec )
+            {
+                assert( pRec->nState.load( memory_model::memory_order_relaxed ) == inactive );
+
+                pRec->nAge = m_nCount;
+                pRec->nState.store( active, memory_model::memory_order_release );
+
+                // Insert record to publication list
+                if ( m_pHead != static_cast<publication_record *>(pRec) ) {
+                    publication_record * p = m_pHead->pNext.load(memory_model::memory_order_relaxed);
+                    if ( p != static_cast<publication_record *>( pRec )) {
+                        do {
+                            pRec->pNext = p;
+                            // Failed CAS changes p
+                        } while ( !m_pHead->pNext.compare_exchange_weak( p, static_cast<publication_record *>(pRec),
+                            memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+                        m_Stat.onActivatPubRecord();
+                    }
+                }
+            }
+
+            void republish( publication_record_type * pRec )
+            {
+                if ( pRec->nState.load( memory_model::memory_order_relaxed ) != active ) {
+                    // The record has been excluded from publication list. Reinsert it
+                    publish( pRec );
+                }
+            }
+
+            template <class Container>
+            void try_combining( Container& owner, publication_record_type * pRec )
+            {
+                if ( m_Mutex.try_lock() ) {
+                    // The thread becomes a combiner
+                    lock_guard l( m_Mutex, cds_std::adopt_lock_t() );
+
+                    // The record pRec can be excluded from publication list. Re-publish it
+                    republish( pRec );
+
+                    combining( owner );
+                    assert( pRec->nRequest.load( memory_model::memory_order_relaxed ) == req_Response );
+                }
+                else {
+                    // There is another combiner, wait while it executes our request
+                    if ( !wait_for_combining( pRec ) ) {
+                        // The thread becomes a combiner
+                        lock_guard l( m_Mutex, cds_std::adopt_lock_t() );
+
+                        // The record pRec can be excluded from publication list. Re-publish it
+                        republish( pRec );
+
+                        combining( owner );
+                        assert( pRec->nRequest.load( memory_model::memory_order_relaxed ) == req_Response );
+                    }
+                }
+            }
+
+            template <class Container>
+            void try_batch_combining( Container& owner, publication_record_type * pRec )
+            {
+                if ( m_Mutex.try_lock() ) {
+                    // The thread becomes a combiner
+                    lock_guard l( m_Mutex, cds_std::adopt_lock_t() );
+
+                    // The record pRec can be excluded from publication list. Re-publish it
+                    republish( pRec );
+
+                    batch_combining( owner );
+                    assert( pRec->nRequest.load( memory_model::memory_order_relaxed ) == req_Response );
+                }
+                else {
+                    // There is another combiner, wait while it executes our request
+                    if ( !wait_for_combining( pRec ) ) {
+                        // The thread becomes a combiner
+                        lock_guard l( m_Mutex, cds_std::adopt_lock_t() );
+
+                        // The record pRec can be excluded from publication list. Re-publish it
+                        republish( pRec );
+
+                        batch_combining( owner );
+                        assert( pRec->nRequest.load( memory_model::memory_order_relaxed ) == req_Response );
+                    }
+                }
+            }
+
+            template <class Container>
+            void combining( Container& owner )
+            {
+                // The thread is a combiner
+                assert( !m_Mutex.try_lock() );
+
+                unsigned int const nCurAge = ++m_nCount;
+
+                for ( unsigned int nPass = 0; nPass < m_nCombinePassCount; ++nPass )
+                    if ( !combining_pass( owner, nCurAge ))
+                        break;
+
+                m_Stat.onCombining();
+                if ( (nCurAge & m_nCompactFactor) == 0 )
+                    compact_list( nCurAge );
+            }
+
+            template <class Container>
+            bool combining_pass( Container& owner, unsigned int nCurAge )
+            {
+                publication_record * pPrev = null_ptr<publication_record *>();
+                publication_record * p = m_pHead;
+                bool bOpDone = false;
+                while ( p ) {
+                    switch ( p->nState.load( memory_model::memory_order_acquire )) {
+                        case active:
+                            if ( p->op() >= req_Operation ) {
+                                p->nAge = nCurAge;
+                                owner.fc_apply( static_cast<publication_record_type *>(p) );
+                                operation_done( *p );
+                                bOpDone = true;
+                            }
+                            break;
+                        case inactive:
+                            // Only m_pHead can be inactive in the publication list
+                            assert( p == m_pHead );
+                            break;
+                        case removed:
+                            // The record should be removed
+                            p = unlink_and_delete_record( pPrev, p );
+                            continue;
+                        default:
+                            /// ??? That is impossible
+                            assert(false);
+                    }
+                    pPrev = p;
+                    p = p->pNext.load( memory_model::memory_order_acquire );
+                }
+                return bOpDone;
+            }
+
+            template <class Container>
+            void batch_combining( Container& owner )
+            {
+                // The thread is a combiner
+                assert( !m_Mutex.try_lock() );
+
+                unsigned int const nCurAge = ++m_nCount;
+
+                for ( unsigned int nPass = 0; nPass < m_nCombinePassCount; ++nPass )
+                    owner.fc_process( begin(), end() );
+
+                combining_pass( owner, nCurAge );
+                m_Stat.onCombining();
+                if ( (nCurAge & m_nCompactFactor) == 0 )
+                    compact_list( nCurAge );
+            }
+
+            bool wait_for_combining( publication_record_type * pRec )
+            {
+                back_off bkoff;
+                while ( pRec->nRequest.load( memory_model::memory_order_acquire ) != req_Response ) {
+
+                    // The record can be excluded from publication list. Reinsert it
+                    republish( pRec );
+
+                    bkoff();
+
+                    if ( m_Mutex.try_lock() ) {
+                        if ( pRec->nRequest.load( memory_model::memory_order_acquire ) == req_Response ) {
+                            m_Mutex.unlock();
+                            break;
+                        }
+                        // The thread becomes a combiner
+                        return false;
+                    }
+                }
+                return true;
+            }
+
+            void compact_list( unsigned int const nCurAge )
+            {
+                // Thinning publication list
+                publication_record * pPrev = null_ptr<publication_record *>();
+                for ( publication_record * p = m_pHead; p; ) {
+                    if ( p->nState.load( memory_model::memory_order_acquire ) == active && p->nAge + m_nCompactFactor < nCurAge ) {
+                        if ( pPrev ) {
+                            publication_record * pNext = p->pNext.load( memory_model::memory_order_acquire );
+                            if ( pPrev->pNext.compare_exchange_strong( p, pNext,
+                                memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                            {
+                                p->nState.store( inactive, memory_model::memory_order_release );
+                                p = pNext;
+                                m_Stat.onDeactivatePubRecord();
+                                continue;
+                            }
+                        }
+                    }
+                    pPrev = p;
+                    p = p->pNext.load( memory_model::memory_order_acquire );
+                }
+
+                m_Stat.onCompactPublicationList();
+            }
+
+            publication_record * unlink_and_delete_record( publication_record * pPrev, publication_record * p )
+            {
+                if ( pPrev ) {
+                    publication_record * pNext = p->pNext.load( memory_model::memory_order_acquire );
+                    if ( pPrev->pNext.compare_exchange_strong( p, pNext,
+                        memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                    {
+                        cxx11_allocator().Delete( static_cast<publication_record_type *>( p ));
+                        m_Stat.onDeletePubRecord();
+                    }
+                    return pNext;
+                }
+                else {
+                    m_pHead = static_cast<publication_record_type *>( p->pNext.load( memory_model::memory_order_acquire ));
+                    cxx11_allocator().Delete( static_cast<publication_record_type *>( p ));
+                    m_Stat.onDeletePubRecord();
+                    return m_pHead;
+                }
+            }
+            //@endcond
+        };
+
+        //@cond
+        class container
+        {
+        public:
+            template <typename PubRecord>
+            void fc_apply( PubRecord * )
+            {
+                assert( false );
+            }
+
+            template <typename Iterator>
+            void fc_process( Iterator, Iterator )
+            {
+                assert( false );
+            }
+        };
+        //@endcond
+
+    } // namespace flat_combining
+}} // namespace cds::algo
+
+#endif // #ifndef __CDS_ALGO_FLAT_COMBINING_H
diff --git a/cds/backoff_strategy.h b/cds/backoff_strategy.h
new file mode 100644 (file)
index 0000000..b36df53
--- /dev/null
@@ -0,0 +1,426 @@
+//$$CDS-header$$
+
+#ifndef __CDS_BACKOFF_STRATEGY_H
+#define __CDS_BACKOFF_STRATEGY_H
+
+/*
+    Filename: backoff_strategy.h
+    Created 2007.03.01 by Maxim Khiszinsky
+
+    Description:
+         Generic back-off strategies
+
+    Editions:
+    2007.03.01  Maxim Khiszinsky    Created
+    2008.10.02  Maxim Khiszinsky    Backoff action transfers from contructor to operator() for all backoff schemas
+    2009.09.10  Maxim Khiszinsky    reset() function added
+*/
+
+#include <cds/compiler/backoff.h>
+#include <cds/details/std/thread.h>
+#include <cds/details/std/chrono.h>
+
+namespace cds {
+    /// Different backoff schemes
+    /**
+        Back-off schema may be used in lock-free algorithms when the algorithm cannot perform some action because a conflict
+        with the other concurrent operation is encountered. In this case current thread can do another work or can call
+        processor's performance hint.
+
+        The interface of back-off strategy is following:
+        \code
+            struct backoff_strategy {
+                void operator()();
+                template <typename Predicate> bool operator()( Predicate pr );
+                void reset();
+            };
+        \endcode
+
+        \p operator() operator calls back-off strategy's action. It is main part of back-off strategy.
+
+        Interruptible back-off <tt>template < typename Predicate > bool operator()( Predicate pr )</tt>
+        allows to interrupt back-off spinning if \p pr predicate returns \p true.
+        \p Predicate is a functor with the following interface:
+        \code
+        struct predicate {
+            bool operator()();
+        };
+        \endcode
+
+        \p reset() function resets internal state of back-off strategy to initial state. It is required for some
+        back-off strategies, for example, exponential back-off.
+    */
+    namespace backoff {
+
+        /// Empty backoff strategy. Do nothing
+        struct empty {
+            //@cond
+            void operator ()()
+            {}
+
+            template <typename Predicate>
+            bool operator()( Predicate pr )
+            {
+                return pr();
+            }
+
+            void reset()
+            {}
+            //@endcond
+        };
+
+        /// Switch to another thread (yield). Good for thread preemption architecture.
+        struct yield {
+            //@cond
+            void operator ()()
+            {
+                cds_std::this_thread::yield();
+                //OS::yield();
+            }
+
+            template <typename Predicate>
+            bool operator()( Predicate pr )
+            {
+                if ( pr() )
+                    return true;
+                operator()();
+                return false;
+            }
+
+            void reset()
+            {}
+            //@endcond
+        };
+
+        /// Random pause
+        /**
+            This back-off strategy calls processor-specific pause hint instruction
+            if one is available for the processor architecture.
+        */
+        struct pause {
+            //@cond
+            void operator ()()
+            {
+#            ifdef CDS_backoff_pause_defined
+                platform::backoff_pause();
+#            endif
+            }
+
+            template <typename Predicate>
+            bool operator()( Predicate pr )
+            {
+                if ( pr() )
+                    return true;
+                operator()();
+                return false;
+            }
+
+            void reset()
+            {}
+            //@endcond
+        };
+
+        /// Processor hint back-off
+        /**
+            This back-off schema calls performance hint instruction if it is available for current processor.
+            Otherwise, it calls \p nop.
+        */
+        struct hint
+        {
+        //@cond
+            void operator ()()
+            {
+#           if defined(CDS_backoff_hint_defined)
+                platform::backoff_hint();
+#           elif defined(CDS_backoff_nop_defined)
+                platform::backoff_nop();
+#           endif
+            }
+
+            template <typename Predicate>
+            bool operator()( Predicate pr )
+            {
+                if ( pr() )
+                    return true;
+                operator()();
+                return false;
+            }
+
+            void reset()
+            {}
+        //@endcond
+        };
+
+        /// Exponential back-off
+        /**
+            This back-off strategy is composite. It consists of \p SpinBkoff and \p YieldBkoff
+            back-off strategy. In first, the strategy tries to apply repeatedly \p SpinBkoff
+            (spinning phase) until internal counter of failed attempts reaches its maximum
+            spinning value. Then, the strategy transits to high-contention phase
+            where it applies \p YieldBkoff until \p reset() is called.
+            On each spinning iteration the internal spinning counter is doubled.
+
+            Choosing the best value for maximum spinning bound is platform and task specific.
+            In this implementation, the default values for maximum and minimum spinning is statically
+            declared so you can set its value globally for your platform.
+            The third template argument, \p Tag, is used to separate implementation. For
+            example, you may define two \p exponential back-offs that is the best for your task A and B:
+            \code
+
+            #include <cds/backoff_strategy.h>
+            namespace bkoff = cds::backoff;
+
+            struct tagA ;   // tag to select task A implementation
+            struct tagB ;   // tag to select task B implementation
+
+            // // define your back-off specialization
+            typedef bkoff::exponential<bkoff::hint, bkoff::yield, tagA> expBackOffA;
+            typedef bkoff::exponential<bkoff::hint, bkoff::yield, tagB> expBackOffB;
+
+            // // set up the best bounds for task A
+            expBackOffA::s_nExpMin = 32;
+            expBackOffA::s_nExpMax = 1024;
+
+            // // set up the best bounds for task B
+            expBackOffB::s_nExpMin = 2;
+            expBackOffB::s_nExpMax = 512;
+
+            \endcode
+
+            Another way of solving this problem is subclassing \p exponential back-off class:
+            \code
+            #include <cds/backoff_strategy.h>
+            namespace bkoff = cds::backoff;
+            typedef bkoff::exponential<bkoff::hint, bkoff::yield>   base_bkoff;
+
+            class expBackOffA: public base_bkoff
+            {
+            public:
+                expBackOffA()
+                    : base_bkoff( 32, 1024 )
+                    {}
+            };
+
+            class expBackOffB: public base_bkoff
+            {
+            public:
+                expBackOffB()
+                    : base_bkoff( 2, 512 )
+                    {}
+            };
+            \endcode
+        */
+        template <typename SpinBkoff, typename YieldBkoff, typename Tag=void>
+        class exponential
+        {
+        public:
+            typedef SpinBkoff  spin_backoff    ;   ///< spin back-off strategy
+            typedef YieldBkoff yield_backoff   ;   ///< yield back-off strategy
+            typedef Tag         impl_tag        ;   ///< implementation separation tag
+
+            static size_t s_nExpMin ;   ///< Default minimum spinning bound (16)
+            static size_t s_nExpMax ;   ///< Default maximum spinning bound (16384)
+
+        protected:
+            size_t  m_nExpCur   ;   ///< Current spinning
+            size_t  m_nExpMin   ;   ///< Minimum spinning bound
+            size_t  m_nExpMax   ;   ///< Maximum spinning bound
+
+            spin_backoff    m_bkSpin    ;   ///< Spinning (fast-path) phase back-off strategy
+            yield_backoff   m_bkYield   ;   ///< Yield phase back-off strategy
+
+        public:
+            /// Initializes m_nExpMin and m_nExpMax from default s_nExpMin and s_nExpMax respectively
+            exponential()
+                : m_nExpMin( s_nExpMin )
+                , m_nExpMax( s_nExpMax )
+            {
+                m_nExpCur = m_nExpMin;
+            }
+
+            /// Explicitly defined bounds of spinning
+            /**
+                The \p libcds library never calls this ctor.
+            */
+            exponential(
+                size_t nExpMin,     ///< Minimum spinning
+                size_t nExpMax      ///< Maximum spinning
+                )
+                : m_nExpMin( nExpMin )
+                , m_nExpMax( nExpMax )
+            {
+                m_nExpCur = m_nExpMin;
+            }
+
+            //@cond
+            void operator ()()
+            {
+                if ( m_nExpCur <= m_nExpMax ) {
+                    for ( size_t n = 0; n < m_nExpCur; ++n )
+                        m_bkSpin();
+                    m_nExpCur *= 2;
+                }
+                else
+                    m_bkYield();
+            }
+
+            template <typename Predicate>
+            bool operator()( Predicate pr )
+            {
+                if ( m_nExpCur <= m_nExpMax ) {
+                    for ( size_t n = 0; n < m_nExpCur; ++n ) {
+                        if ( m_bkSpin(pr) )
+                            return true;
+                    }
+                    m_nExpCur *= 2;
+                }
+                else
+                    return m_bkYield(pr);
+                return false;
+            }
+
+            void reset()
+            {
+                m_nExpCur = m_nExpMin;
+                m_bkSpin.reset();
+                m_bkYield.reset();
+            }
+            //@endcond
+        };
+
+        //@cond
+        template <typename SpinBkoff, typename YieldBkoff, typename Tag>
+        size_t exponential<SpinBkoff, YieldBkoff, Tag>::s_nExpMin = 16;
+
+        template <typename SpinBkoff, typename YieldBkoff, typename Tag>
+        size_t exponential<SpinBkoff, YieldBkoff, Tag>::s_nExpMax = 16 * 1024;
+        //@endcond
+
+        /// Delay back-off strategy
+        /**
+            Template arguments:
+            - \p Duration - duration type, default is \p std::chrono::milliseconds
+            - \p Tag - a selector tag
+
+            Choosing the best value for th timeout is platform and task specific.
+            In this implementation, the default values for timeout is statically
+            declared so you can set its value globally for your platform.
+            The second template argument, \p Tag, is used to separate implementation. For
+            example, you may define two \p delay back-offs for 5 and 10 ms timeout:
+            \code
+
+            #include <cds/backoff_strategy.h>
+            namespace bkoff = cds::backoff;
+
+            struct ms5  ;   // tag to select 5ms
+            struct ms10 ;   // tag to select 10ms
+
+            // // define your back-off specialization
+            typedef bkoff::delay<std::chrono::milliseconds, ms5> delay5;
+            typedef bkoff::delay<std::chrono::milliseconds, ms10> delay10;
+
+            // // set up the timeouts
+            delay5::s_nTimeout = 5;
+            delay10::s_nTimeout = 10;
+            \endcode
+
+            Another way of solving this problem is subclassing \p delay back-off class:
+            \code
+            #include <cds/backoff_strategy.h>
+            namespace bkoff = cds::backoff;
+            typedef bkoff::delay<> delay_bkoff;
+
+            class delay5: public delay_bkoff {
+            public:
+                delay5(): delay_bkoff( 5 ) {}
+            };
+
+            class delay10: public delay_bkoff {
+            public:
+                delay10(): delay_bkoff( 10 ) {}
+            };
+            \endcode
+
+        */
+        template <class Duration = cds_std::chrono::milliseconds, typename Tag=void >
+        class delay
+        {
+        public:
+            typedef Duration duration_type; ///< Duration type (default \p std::chrono::milliseconds)
+            static unsigned int s_nTimeout; ///< default timeout, =5
+
+        protected:
+            ///@cond
+            unsigned int const m_nTimeout;
+            ///@endcond
+
+        public:
+            /// Default ctor takes the timeout from s_nTimeout
+            delay()
+                : m_nTimeout( s_nTimeout )
+            {}
+
+            /// Initializes timeout from \p nTimeout
+            CDS_CONSTEXPR delay( unsigned int nTimeout )
+                : m_nTimeout( nTimeout )
+            {}
+
+            //@cond
+            void operator()() const
+            {
+                cds_std::this_thread::sleep_for( duration_type( m_nTimeout ));
+            }
+
+            template <typename Predicate>
+            bool operator()( Predicate pr ) const
+            {
+                for ( unsigned int i = 0; i < m_nTimeout; i += 2 ) {
+                    if ( pr() )
+                        return true;
+                    cds_std::this_thread::sleep_for( duration_type( 2 ));
+                }
+                return false;
+            }
+
+            void reset() const
+            {}
+            //@endcond
+        };
+
+        //@cond
+        template <class Duration, typename Tag>
+        unsigned int delay<Duration, Tag>::s_nTimeout = 5;
+        //@endcond
+
+
+        /// Delay back-off strategy, template version
+        /**
+            This is a template version of backoff::delay class.
+            Template parameter \p Timeout sets a delay timeout.
+            The declaration <tt>cds::backoff::delay_of< 5 > bkoff</tt> is equal for
+            <tt>cds::backoff::delay<> bkoff(5)</tt>.
+        */
+        template <unsigned int Timeout, class Duration = cds_std::chrono::milliseconds >
+        class delay_of: public delay<Duration>
+        {
+        //@cond
+            typedef delay<Duration> base_class;
+        public:
+            delay_of()
+                : base_class( Timeout )
+            {}
+        //@endcond
+        };
+
+
+        /// Default backoff strategy
+        typedef exponential<hint, yield>    Default;
+
+        /// Default back-off strategy for lock primitives
+        typedef exponential<hint, yield>    LockDefault;
+
+    } // namespace backoff
+} // namespace cds
+
+
+#endif // #ifndef __CDS_BACKOFF_STRATEGY_H
diff --git a/cds/bitop.h b/cds/bitop.h
new file mode 100644 (file)
index 0000000..2ab7a5e
--- /dev/null
@@ -0,0 +1,140 @@
+//$$CDS-header$$
+
+#ifndef __CDS_BITOP_H
+#define __CDS_BITOP_H
+
+/*
+    Different bit algorithms:
+        LSB        get least significant bit number
+        MSB        get most significant bit number
+        bswap    swap byte order of word
+        RBO        reverse bit order of word
+
+    Editions:
+        2007.10.08    Maxim.Khiszinsky    Created
+*/
+
+#include <cds/details/defs.h>
+#include <cds/compiler/bitop.h>
+
+namespace cds {
+    /// Bit operations
+    namespace bitop {
+
+        ///@cond none
+        namespace details {
+            template <int> struct BitOps;
+
+            // 32-bit bit ops
+            template <> struct BitOps<4> {
+                typedef atomic32u_t        TUInt;
+
+                static int      MSB( TUInt x )      { return bitop::platform::msb32( x );   }
+                static int      LSB( TUInt x )      { return bitop::platform::lsb32( x );   }
+                static int      MSBnz( TUInt x )    { return bitop::platform::msb32nz( x ); }
+                static int      LSBnz( TUInt x )    { return bitop::platform::lsb32nz( x ); }
+                static int      SBC( TUInt x )      { return bitop::platform::sbc32( x ) ;  }
+                static int      ZBC( TUInt x )      { return bitop::platform::zbc32( x ) ;  }
+
+                static TUInt    RBO( TUInt x )      { return bitop::platform::rbo32( x );   }
+                static bool     complement( TUInt& x, int nBit ) { return bitop::platform::complement32( &x, nBit ); }
+
+                static TUInt    RandXorShift(TUInt x) { return bitop::platform::RandXorShift32(x); }
+            };
+
+            // 64-bit bit ops
+            template <> struct BitOps<8> {
+                typedef atomic64u_unaligned        TUInt;
+
+                static int      MSB( TUInt x )        { return bitop::platform::msb64( x );     }
+                static int      LSB( TUInt x )        { return bitop::platform::lsb64( x );     }
+                static int      MSBnz( TUInt x )      { return bitop::platform::msb64nz( x );   }
+                static int      LSBnz( TUInt x )      { return bitop::platform::lsb64nz( x );   }
+                static  int     SBC( TUInt x )        { return bitop::platform::sbc64( x ) ;    }
+                static  int     ZBC( TUInt x )        { return bitop::platform::zbc64( x ) ;    }
+
+                static TUInt    RBO( TUInt x )        { return bitop::platform::rbo64( x );     }
+                static bool     complement( TUInt& x, int nBit ) { return bitop::platform::complement64( &x, nBit ); }
+
+                static TUInt    RandXorShift(TUInt x) { return bitop::platform::RandXorShift64(x); }
+            };
+        }    // namespace details
+        //@endcond
+
+
+        /// Get least significant bit (LSB) number (1..32/64), 0 if nArg == 0
+        template <typename T>
+        static inline int LSB( T nArg )
+        {
+            return details::BitOps< sizeof(T) >::LSB( (typename details::BitOps<sizeof(T)>::TUInt) nArg );
+        }
+
+        /// Get least significant bit (LSB) number (0..31/63)
+        /**
+            Precondition: nArg != 0
+        */
+        template <typename T>
+        static inline int LSBnz( T nArg )
+        {
+            assert( nArg != 0 );
+            return details::BitOps< sizeof(T) >::LSBnz( (typename details::BitOps<sizeof(T)>::TUInt) nArg );
+        }
+
+        /// Get most significant bit (MSB) number (1..32/64), 0 if nArg == 0
+        template <typename T>
+        static inline int MSB( T nArg )
+        {
+            return details::BitOps< sizeof(T) >::MSB( (typename details::BitOps<sizeof(T)>::TUInt) nArg );
+        }
+
+        /// Get most significant bit (MSB) number (0..31/63)
+        /**
+            Precondition: nArg != 0
+        */
+        template <typename T>
+        static inline int MSBnz( T nArg )
+        {
+            assert( nArg != 0 );
+            return details::BitOps< sizeof(T) >::MSBnz( (typename details::BitOps<sizeof(T)>::TUInt) nArg );
+        }
+
+        /// Get non-zero bit count of a word
+        template <typename T>
+        static inline int SBC( T nArg )
+        {
+            return details::BitOps< sizeof(T) >::SBC( (typename details::BitOps<sizeof(T)>::TUInt) nArg );
+        }
+
+        /// Get zero bit count of a word
+        template <typename T>
+        static inline int ZBC( T nArg )
+        {
+            return details::BitOps< sizeof(T) >::ZBC( (typename details::BitOps<sizeof(T)>::TUInt) nArg );
+        }
+
+        /// Reverse bit order of \p nArg
+        template <typename T>
+        static inline T RBO( T nArg )
+        {
+            return (T) details::BitOps< sizeof(T) >::RBO( (typename details::BitOps<sizeof(T)>::TUInt) nArg );
+        }
+
+        /// Complement bit \p nBit in \p nArg
+        template <typename T>
+        static inline bool complement( T& nArg, int nBit )
+        {
+            return details::BitOps< sizeof(T) >::complement( reinterpret_cast< typename details::BitOps<sizeof(T)>::TUInt& >( nArg ), nBit );
+        }
+
+        /// Simple random number generator
+        template <typename T>
+        static inline T RandXorShift( T x)
+        {
+            return (T) details::BitOps< sizeof(T) >::RandXorShift(x);
+        }
+
+    } // namespace bitop
+} //namespace cds
+
+#endif    // #ifndef __CDS_BITOP_H
+
diff --git a/cds/compiler/backoff.h b/cds/compiler/backoff.h
new file mode 100644 (file)
index 0000000..f8ec9e7
--- /dev/null
@@ -0,0 +1,32 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_BACKOFF_IMPL_H
+#define __CDS_COMPILER_BACKOFF_IMPL_H
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC || (CDS_COMPILER == CDS_COMPILER_INTEL && CDS_OS_INTERFACE == CDS_OSI_WINDOWS)
+#   if CDS_PROCESSOR_ARCH == CDS_PROCESSOR_X86
+#       include <cds/compiler/vc/x86/backoff.h>
+#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_AMD64
+#       include <cds/compiler/vc/amd64/backoff.h>
+#   else
+#       error "MS VC++ compiler: unsupported processor architecture"
+#   endif
+#elif CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG || CDS_COMPILER == CDS_COMPILER_INTEL
+#   if CDS_PROCESSOR_ARCH == CDS_PROCESSOR_X86
+#       include <cds/compiler/gcc/x86/backoff.h>
+#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_AMD64
+#       include <cds/compiler/gcc/amd64/backoff.h>
+#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_IA64
+#       include <cds/compiler/gcc/ia64/backoff.h>
+#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_SPARC
+#       include <cds/compiler/gcc/sparc/backoff.h>
+#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_PPC64
+#       include <cds/compiler/gcc/ppc64/backoff.h>
+//#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_ARM7
+//#       include <cds/compiler/gcc/arm7/backoff.h>
+#   endif
+#else
+#   error "Undefined compiler"
+#endif
+
+#endif  // #ifndef __CDS_COMPILER_BACKOFF_IMPL_H
diff --git a/cds/compiler/bitop.h b/cds/compiler/bitop.h
new file mode 100644 (file)
index 0000000..42ced24
--- /dev/null
@@ -0,0 +1,40 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_BITOP_H
+#define __CDS_COMPILER_BITOP_H
+
+// Choose appropriate header for current architecture and compiler
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC || (CDS_COMPILER == CDS_COMPILER_INTEL && CDS_OS_INTERFACE == CDS_OSI_WINDOWS)
+/************************************************************************/
+/* MS Visual C++                                                        */
+/************************************************************************/
+
+#    if CDS_PROCESSOR_ARCH == CDS_PROCESSOR_X86
+#        include <cds/compiler/vc/x86/bitop.h>
+#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_AMD64
+#        include <cds/compiler/vc/amd64/bitop.h>
+#    endif
+
+#elif CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG || CDS_COMPILER == CDS_COMPILER_INTEL
+/************************************************************************/
+/* GCC                                                                  */
+/************************************************************************/
+
+#    if CDS_PROCESSOR_ARCH == CDS_PROCESSOR_X86
+#       include <cds/compiler/gcc/x86/bitop.h>
+#    elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_AMD64
+#       include <cds/compiler/gcc/amd64/bitop.h>
+#    elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_SPARC
+#       include <cds/compiler/gcc/sparc/bitop.h>
+#    elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_IA64
+#       include <cds/compiler/gcc/ia64/bitop.h>
+#    elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_PPC64
+#       include <cds/compiler/gcc/ppc64/bitop.h>
+#   endif
+#endif  // Compiler choice
+
+// Generic (C) implementation
+#include <cds/details/bitop_generic.h>
+
+#endif    // #ifndef __CDS_COMPILER_BITOP_H
diff --git a/cds/compiler/clang/cxx11_atomic_prepatches.h b/cds/compiler/clang/cxx11_atomic_prepatches.h
new file mode 100644 (file)
index 0000000..fb86722
--- /dev/null
@@ -0,0 +1,54 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_CLANG_CXX11_ATOMIC_PREPATCHES_H
+#define __CDS_COMPILER_CLANG_CXX11_ATOMIC_PREPATCHES_H
+
+#if CDS_CXX11_ATOMIC_SUPPORT == 1
+#   if CDS_COMPILER_VERSION == 30100
+        // Clang 3.1 workaround
+        // Clang 3.1 does not support __atomic_is_lock_free intrinsic function from GCC
+        template <typename T>
+        static inline bool __atomic_is_lock_free( size_t, T* ) CDS_NOEXCEPT
+        {
+            return sizeof(T) <= 8;
+        }
+
+        // clang does not implement GCC 4.7 low-level __atomic_xxx intrinsics
+        // See http://comments.gmane.org/gmane.comp.compilers.clang.devel/20093
+
+        // In Clang 3.1 the following workaround results in
+        //      Assertion `Proto && "Functions without a prototype cannot be overloaded"' failed
+        // and clang crashed
+        // So, we cannot use Clang with GCC 4.7 atomics
+/*
+        template <typename T>
+        static inline void __atomic_load(T *ptr, T *ret, int memmodel)
+        {
+            *ret = __atomic_load( ptr, memmodel );
+        }
+
+        template <typename T>
+        static inline  void __atomic_store(T *ptr, T *val, int memmodel)
+        {
+            __atomic_store( ptr, *val, memmodel );
+        }
+
+        template <typename T>
+        static inline  void __atomic_exchange(T *ptr, T *val, T *ret, int memmodel)
+        {
+            *ret =  __atomic_exchange( ptr, *val, memmodel );
+        }
+
+        template <typename T>
+        static inline  bool __atomic_compare_exchange(T *ptr, T *expected, T *desired, bool weak, int success_memmodel, int failure_memmodel)
+        {
+            if ( weak )
+                return __atomic_compare_exchange_weak( ptr, expected, *desired, success_memmodel, failure_memmodel );
+            else
+                return __atomic_compare_exchange_strong( ptr, expected, *desired, success_memmodel, failure_memmodel );
+        }
+*/
+#   endif
+#endif
+
+#endif // #ifndef __CDS_COMPILER_CLANG_CXX11_ATOMIC_PREPATCHES_H
diff --git a/cds/compiler/clang/defs.h b/cds/compiler/clang/defs.h
new file mode 100644 (file)
index 0000000..0c2fe85
--- /dev/null
@@ -0,0 +1,128 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_CLANG_DEFS_H
+#define __CDS_COMPILER_CLANG_DEFS_H
+
+// Compiler version
+#define CDS_COMPILER_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
+
+// Compiler name
+#define  CDS_COMPILER__NAME    ("clang " __clang_version__)
+#define  CDS_COMPILER__NICK    "clang"
+
+// C++11 atomic support - only for libc++
+// Note: Clang libc++ atomic leads to program crash.
+// So, we use libcds atomic implementation
+//#if __has_feature(cxx_atomic) && defined(_LIBCPP_VERSION)
+//#   define CDS_CXX11_ATOMIC_SUPPORT     1
+//#endif
+
+
+#include <cds/compiler/gcc/compiler_macro.h>
+
+
+#define alignof __alignof__
+
+// Variadic template support (only if -std=c++0x compile-line option provided)
+#if __has_feature(cxx_variadic_templates)
+#   define CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+#endif
+
+// Default template arguments for function templates
+#if __has_feature(cxx_default_function_template_args)
+#   define CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+#endif
+
+#if __has_feature(cxx_deleted_functions)
+// C++11 delete definition ( function declaration = delete)
+#   define CDS_CXX11_DELETE_DEFINITION_SUPPORT
+#endif
+
+#if __has_feature(cxx_defaulted_functions)
+// C++11 explicitly-defaulted function (= default) [std 8.4.2 [dcl.fct.def.default]]
+#   define CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+#endif
+
+// Explicit conversion operators
+#if __has_feature(cxx_explicit_conversions)
+#   define CDS_CXX11_EXPLICIT_CONVERSION_OPERATOR_SUPPORT
+#endif
+
+// C++11 template alias
+#if __has_feature(cxx_alias_templates)
+#   define CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
+#endif
+
+// C++11 inline namespace
+#if __has_feature(cxx_inline_namespaces)
+#   define CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+#endif
+
+// Lambda
+#if __has_feature(cxx_lambdas)
+#   define CDS_CXX11_LAMBDA_SUPPORT
+#endif
+
+// RValue
+#if __has_feature(cxx_rvalue_references)
+#   define CDS_RVALUE_SUPPORT
+#   define CDS_MOVE_SEMANTICS_SUPPORT
+#endif
+
+#if __has_feature(cxx_constexpr)
+#   define CDS_CONSTEXPR    constexpr
+#   define CDS_CONSTEXPR_CONST constexpr const
+#else
+#   define CDS_CONSTEXPR
+#   define CDS_CONSTEXPR_CONST const
+#endif
+
+#if __has_feature(cxx_noexcept)
+#   define CDS_NOEXCEPT_SUPPORT        noexcept
+#   define CDS_NOEXCEPT_SUPPORT_(expr) noexcept(expr)
+#else
+#   define CDS_NOEXCEPT_SUPPORT
+#   define CDS_NOEXCEPT_SUPPORT_(expr)
+#endif
+
+// C++11 thread_local keyword
+#if __has_feature(cxx_thread_local)         // CLang 3.3
+#   define CDS_CXX11_THREAD_LOCAL_SUPPORT
+#endif
+
+
+#include <cds/compiler/cstdint_std.h>
+
+// Thread support library (thread, mutex, condition variable, chrono)
+#if CDS_COMPILER_VERSION >= 30100
+#   if __has_include(<thread>)
+#       define CDS_CXX11_STDLIB_THREAD
+#   endif
+
+#   if __has_include(<chrono>)
+#       define CDS_CXX11_STDLIB_CHRONO
+#   endif
+
+#   if __has_include(<mutex>)
+#       define CDS_CXX11_STDLIB_MUTEX
+#   endif
+
+#   if __has_include(<condition_variable>)
+#       define CDS_CXX11_STDLIB_CONDITION_VARIABLE
+#   endif
+#endif
+
+// Full SFINAE support
+#define CDS_CXX11_SFINAE
+
+// *************************************************
+// Alignment macro
+
+#define CDS_TYPE_ALIGNMENT(n)   __attribute__ ((aligned (n)))
+#define CDS_CLASS_ALIGNMENT(n)  __attribute__ ((aligned (n)))
+#define CDS_DATA_ALIGNMENT(n)   __attribute__ ((aligned (n)))
+
+
+#include <cds/compiler/gcc/compiler_barriers.h>
+
+#endif // #ifndef __CDS_COMPILER_GCC_DEFS_H
diff --git a/cds/compiler/cstdint_boost.h b/cds/compiler/cstdint_boost.h
new file mode 100644 (file)
index 0000000..cbaae29
--- /dev/null
@@ -0,0 +1,44 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_CSTDINT_BOOST_H
+#define __CDS_COMPILER_CSTDINT_BOOST_H
+//@cond
+
+#include <boost/cstdint.hpp>
+
+namespace cds {
+    using boost::int_least8_t;
+    using boost::uint_least8_t;
+    using boost::int_least16_t;
+    using boost::uint_least16_t;
+    using boost::int_least32_t;
+    using boost::uint_least32_t;
+    using boost::int_least64_t;
+    using boost::uint_least64_t;
+    using boost::int_fast8_t;
+    using boost::uint_fast8_t;
+    using boost::int_fast16_t;
+    using boost::uint_fast16_t;
+    using boost::int_fast32_t;
+    using boost::uint_fast32_t;
+    using boost::int_fast64_t;
+    using boost::uint_fast64_t;
+
+    using boost::intmax_t;
+    using boost::uintmax_t;
+
+    using boost::int8_t;
+    using boost::uint8_t;
+    using boost::int16_t;
+    using boost::uint16_t;
+    using boost::int32_t;
+    using boost::uint32_t;
+    using boost::int64_t;
+    using boost::uint64_t;
+
+    using ::intptr_t;
+    using ::uintptr_t;
+} // namespace cds
+
+//@endcond
+#endif // #ifndef __CDS_COMPILER_CSTDINT_BOOST_H
diff --git a/cds/compiler/cstdint_std.h b/cds/compiler/cstdint_std.h
new file mode 100644 (file)
index 0000000..c3919c6
--- /dev/null
@@ -0,0 +1,43 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_CSTDINT_STD_H
+#define __CDS_COMPILER_CSTDINT_STD_H
+//@cond
+
+#include <cstdint>
+namespace cds {
+    using std::int_least8_t;
+    using std::uint_least8_t;
+    using std::int_least16_t;
+    using std::uint_least16_t;
+    using std::int_least32_t;
+    using std::uint_least32_t;
+    using std::int_least64_t;
+    using std::uint_least64_t;
+    using std::int_fast8_t;
+    using std::uint_fast8_t;
+    using std::int_fast16_t;
+    using std::uint_fast16_t;
+    using std::int_fast32_t;
+    using std::uint_fast32_t;
+    using std::int_fast64_t;
+    using std::uint_fast64_t;
+
+    using std::intmax_t;
+    using std::uintmax_t;
+
+    using std::int8_t;
+    using std::uint8_t;
+    using std::int16_t;
+    using std::uint16_t;
+    using std::int32_t;
+    using std::uint32_t;
+    using std::int64_t;
+    using std::uint64_t;
+    using std::intptr_t;
+    using std::uintptr_t;
+} // namespace cds
+
+
+//@endcond
+#endif // #ifndef __CDS_COMPILER_CSTDINT_STD_H
diff --git a/cds/compiler/cxx11_atomic.h b/cds/compiler/cxx11_atomic.h
new file mode 100644 (file)
index 0000000..1adbb3e
--- /dev/null
@@ -0,0 +1,2277 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_CXX11_ATOMIC_H
+#define __CDS_COMPILER_CXX11_ATOMIC_H
+//@cond
+
+#include <cds/details/defs.h>
+#include <cds/details/aligned_type.h>
+
+namespace cds { namespace cxx11_atomics {
+    typedef enum memory_order {
+        memory_order_relaxed,
+        memory_order_consume,
+        memory_order_acquire,
+        memory_order_release,
+        memory_order_acq_rel,
+        memory_order_seq_cst
+    } memory_order;
+
+}}  // namespace cds::cxx11_atomics
+
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC || (CDS_COMPILER == CDS_COMPILER_INTEL && CDS_OS_INTERFACE == CDS_OSI_WINDOWS)
+#   if CDS_PROCESSOR_ARCH == CDS_PROCESSOR_X86
+#       include <cds/compiler/vc/x86/cxx11_atomic.h>
+#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_AMD64
+#       include <cds/compiler/vc/amd64/cxx11_atomic.h>
+#   else
+#       error "MS VC++ compiler: unsupported processor architecture"
+#   endif
+#elif CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG || CDS_COMPILER == CDS_COMPILER_INTEL
+#   if CDS_PROCESSOR_ARCH == CDS_PROCESSOR_X86
+#       include <cds/compiler/gcc/x86/cxx11_atomic.h>
+#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_AMD64
+#       include <cds/compiler/gcc/amd64/cxx11_atomic.h>
+#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_IA64
+#       include <cds/compiler/gcc/ia64/cxx11_atomic.h>
+#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_SPARC
+#       include <cds/compiler/gcc/sparc/cxx11_atomic.h>
+#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_PPC64
+#       include <cds/compiler/gcc/ppc64/cxx11_atomic.h>
+//#   elif CDS_PROCESSOR_ARCH == CDS_PROCESSOR_ARM7
+//#       include <cds/compiler/gcc/arm7/cxx11_atomic.h>
+#   else
+#       error "GCC compiler: unsupported processor architecture. Try to use native C++11 atomic or boost.atomic"
+#   endif
+#else
+#   error "Undefined compiler"
+#endif
+
+// In C++11, make_unsigned is declared in <type_traits>
+#include <boost/type_traits/make_unsigned.hpp>  // for make_unsigned
+
+namespace cds { namespace cxx11_atomics {
+
+    // forward declarations
+    template <class T>
+    struct atomic;
+
+    namespace details {
+
+        template <typename T, size_t Size, typename Primary = T >
+        struct atomic_generic_ops;
+
+        template <typename T, size_t Size>
+        struct atomic_integral_ops;
+
+        template <size_t TypeSize>
+        struct primary_type;
+
+        template <>
+        struct primary_type<1>
+        {
+            typedef cds::uint8_t type;
+        };
+        template <>
+        struct primary_type<2>
+        {
+            typedef cds::uint16_t type;
+        };
+        template <>
+        struct primary_type<4>
+        {
+            typedef cds::uint32_t type;
+        };
+        template <>
+        struct primary_type<8>
+        {
+            typedef cds::uint64_t type;
+        };
+
+        template <typename T, typename Primary>
+        struct make_atomic_primary
+        {
+            typedef T       source_type;
+            typedef Primary primary_type;
+
+            static primary_type volatile * ptr( source_type volatile * p ) CDS_NOEXCEPT
+            {
+                return reinterpret_cast<primary_type volatile *>(p);
+            }
+            static primary_type const volatile * ptr( source_type const volatile * p ) CDS_NOEXCEPT
+            {
+                return reinterpret_cast<primary_type const volatile *>(p);
+            }
+
+            static primary_type val( source_type v ) CDS_NOEXCEPT
+            {
+                return *reinterpret_cast<primary_type*>(&v);
+            }
+
+            static primary_type& ref( source_type& v ) CDS_NOEXCEPT
+            {
+                return reinterpret_cast<primary_type&>(v);
+            }
+
+            static primary_type const& ref( source_type const& v ) CDS_NOEXCEPT
+            {
+                return reinterpret_cast<primary_type const&>(v);
+            }
+
+            static source_type ret( primary_type r ) CDS_NOEXCEPT
+            {
+                return *reinterpret_cast<source_type *>(&r);
+            }
+        };
+
+        template <typename T>
+        struct make_atomic_primary<T, T>
+        {
+            typedef T source_type;
+            typedef T primary_type;
+
+            static primary_type volatile * ptr( source_type volatile * p ) CDS_NOEXCEPT
+            {
+                return p;
+            }
+            static primary_type const volatile * ptr( source_type const volatile * p ) CDS_NOEXCEPT
+            {
+                return p;
+            }
+
+            static primary_type val( source_type v ) CDS_NOEXCEPT
+            {
+                return v;
+            }
+
+            static primary_type& ref( source_type& v ) CDS_NOEXCEPT
+            {
+                return v;
+            }
+
+            static source_type ret( primary_type r ) CDS_NOEXCEPT
+            {
+                return r;
+            }
+        };
+
+        template <typename T>
+        struct atomic_integral_bitwise_ops
+        {
+        public:
+            typedef typename boost::make_unsigned<T>::type unsigned_type;
+            typedef atomic_generic_ops<unsigned_type, sizeof(unsigned_type)> atomic_ops;
+
+            static T fetch_and(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+                unsigned_type cur = atomic_ops::atomic_load_explicit( reinterpret_cast<unsigned_type volatile *>(pDest), memory_order_relaxed );
+                do {} while ( !atomic_ops::atomic_compare_exchange_weak_explicit(
+                    reinterpret_cast<unsigned_type volatile *>(pDest), &cur, cur & unsigned_type(val), order, memory_order_relaxed ));
+                return T(cur);
+            }
+
+            static T fetch_or(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+                unsigned_type cur = atomic_ops::atomic_load_explicit( reinterpret_cast<unsigned_type volatile *>(pDest), memory_order_relaxed );
+                do {} while ( !atomic_ops::atomic_compare_exchange_weak_explicit(
+                    reinterpret_cast<unsigned_type volatile *>(pDest), &cur, cur | unsigned_type(val), order, memory_order_relaxed ));
+                return T(cur);
+            }
+
+            static T fetch_xor(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+                unsigned_type cur = atomic_ops::atomic_load_explicit( reinterpret_cast<unsigned_type volatile *>(pDest), memory_order_relaxed );
+                do {} while ( !atomic_ops::atomic_compare_exchange_weak_explicit(
+                    reinterpret_cast<unsigned_type volatile *>(pDest), &cur, cur ^ unsigned_type(val), order, memory_order_relaxed ));
+                return T(cur);
+            }
+        };
+
+
+        // 8-bit atomic operations
+
+        template <typename T, typename Primary>
+        struct atomic_generic_ops< T, 1, Primary >
+        {
+            typedef make_atomic_primary<T, Primary> primary;
+
+            // store
+            static void atomic_store_explicit( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+            {
+                platform::store8( primary::ptr(pDest), primary::val(v), order );
+            }
+            static void atomic_store_explicit( T * pDest, T v, memory_order order ) CDS_NOEXCEPT
+            {
+                platform::store8( primary::ptr(pDest), primary::val(v), order );
+            }
+            static void atomic_store( T volatile * pDest, T v ) CDS_NOEXCEPT
+            {
+                atomic_store_explicit( pDest, v, memory_order_seq_cst );
+            }
+            static void atomic_store( T * pDest, T v ) CDS_NOEXCEPT
+            {
+                atomic_store_explicit( pDest, v, memory_order_seq_cst );
+            }
+
+            // load
+            static T atomic_load_explicit( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::load8( primary::ptr(pSrc), order ));
+            }
+            static T atomic_load_explicit( T const * pSrc, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::load8( primary::ptr(pSrc), order ));
+            }
+            static T atomic_load( T volatile const * pSrc ) CDS_NOEXCEPT
+            {
+                return atomic_load_explicit( pSrc, memory_order_seq_cst );
+            }
+            static T atomic_load( T const * pSrc ) CDS_NOEXCEPT
+            {
+                return atomic_load_explicit( pSrc, memory_order_seq_cst );
+            }
+
+            // exchange
+            static T atomic_exchange_explicit( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::exchange8( primary::ptr(pDest), primary::val(val), order ));
+            }
+            static T atomic_exchange_explicit( T * pDest, T val, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::exchange8( primary::ptr(pDest), primary::val(val), order ));
+            }
+            static T atomic_exchange( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_exchange_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_exchange( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_exchange_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // cas
+            static bool atomic_compare_exchange_weak_explicit( T volatile * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas8_weak( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_weak_explicit( T * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas8_weak( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_weak( T volatile * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_weak_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_weak( T * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_weak_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_strong_explicit( T volatile * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas8_strong( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_strong_explicit( T * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas8_strong( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_strong( T volatile * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_strong_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_strong( T * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_strong_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+        };
+
+        template <typename T>
+        struct atomic_integral_ops< T, 1 >
+            : atomic_generic_ops<T, 1, T >
+            , atomic_integral_bitwise_ops<T>
+        {
+            typedef atomic_integral_bitwise_ops<T> bitwise_ops;
+
+            // fetch_add
+            static T atomic_fetch_add_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch8_add_defined
+                return platform::fetch8_add( pDest, val, order );
+#           else
+                T cur = atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !atomic_compare_exchange_weak_explicit( pDest, &cur, cur + val, order, memory_order_relaxed ));
+                return cur;
+#           endif
+            }
+            static T atomic_fetch_add_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_add( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_add( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_sub
+            static T atomic_fetch_sub_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch8_sub_defined
+                return platform::fetch8_sub( pDest, val, order );
+#           else
+                T cur = atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !atomic_compare_exchange_weak_explicit( pDest, &cur, cur - val, order, memory_order_relaxed ));
+                return cur;
+#           endif
+            }
+            static T atomic_fetch_sub_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_sub( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_sub( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_and
+            static T atomic_fetch_and_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch8_and_defined
+                return platform::fetch8_and( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_and( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_and_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_and( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_and( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_or
+            static T atomic_fetch_or_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch8_or_defined
+                return platform::fetch8_or( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_or( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_or_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_or( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_or( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_xor
+            static T atomic_fetch_xor_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch8_xor_defined
+                return platform::fetch8_xor( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_xor( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_xor_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_xor( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_xor( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( pDest, val, memory_order_seq_cst );
+            }
+        };
+
+        // 16-bit atomic operations
+
+        template <typename T, typename Primary>
+        struct atomic_generic_ops< T, 2, Primary >
+        {
+            typedef make_atomic_primary<T, Primary> primary;
+
+            // store
+            static void atomic_store_explicit( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+            {
+                platform::store16( primary::ptr(pDest), primary::val(v), order );
+            }
+            static void atomic_store_explicit( T * pDest, T v, memory_order order ) CDS_NOEXCEPT
+            {
+                platform::store16( primary::ptr(pDest), primary::val(v), order );
+            }
+            static void atomic_store( T volatile * pDest, T v ) CDS_NOEXCEPT
+            {
+                atomic_store_explicit( pDest, v, memory_order_seq_cst );
+            }
+            static void atomic_store( T * pDest, T v ) CDS_NOEXCEPT
+            {
+                atomic_store_explicit( pDest, v, memory_order_seq_cst );
+            }
+
+            // load
+            static T atomic_load_explicit( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::load16( primary::ptr(pSrc), order ));
+            }
+            static T atomic_load_explicit( T const * pSrc, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::load16( primary::ptr(pSrc), order ));
+            }
+            static T atomic_load( T volatile const * pSrc ) CDS_NOEXCEPT
+            {
+                return atomic_load_explicit( pSrc, memory_order_seq_cst );
+            }
+            static T atomic_load( T const * pSrc ) CDS_NOEXCEPT
+            {
+                return atomic_load_explicit( pSrc, memory_order_seq_cst );
+            }
+
+            // exchange
+            static T atomic_exchange_explicit( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::exchange16( primary::ptr(pDest), primary::val(val), order ));
+            }
+            static T atomic_exchange_explicit( T * pDest, T val, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::exchange16( primary::ptr(pDest), primary::val(val), order ));
+            }
+            static T atomic_exchange( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_exchange_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_exchange( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_exchange_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // cas
+            static bool atomic_compare_exchange_weak_explicit( T volatile * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas16_weak( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_weak_explicit( T * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas16_weak( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_weak( T volatile * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_weak_explicit( pDest, expected, primary::val(desired), memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_weak( T * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_weak_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_strong_explicit( T volatile * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas16_strong( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_strong_explicit( T * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas16_strong( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_strong( T volatile * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_strong_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_strong( T * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_strong_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+        };
+
+        template <typename T>
+        struct atomic_integral_ops< T, 2 >
+            : atomic_generic_ops< T, 2, T >
+            , atomic_integral_bitwise_ops<T>
+        {
+            typedef atomic_integral_bitwise_ops<T> bitwise_ops;
+
+            // fetch_add
+            static T atomic_fetch_add_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch16_add_defined
+                return platform::fetch16_add( pDest, val, order );
+#           else
+                T cur = atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !atomic_compare_exchange_weak_explicit( pDest, &cur, cur + val, order, memory_order_relaxed ));
+                return cur;
+#           endif
+            }
+            static T atomic_fetch_add_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_add( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_add( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_sub
+            static T atomic_fetch_sub_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch16_sub_defined
+                return platform::fetch16_sub( pDest, val, order );
+#           else
+                T cur = atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !atomic_compare_exchange_weak_explicit( pDest, &cur, cur - val, order, memory_order_relaxed ));
+                return cur;
+#           endif
+            }
+            static T atomic_fetch_sub_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_sub( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_sub( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_and
+            static T atomic_fetch_and_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch16_and_defined
+                return platform::fetch16_and( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_and( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_and_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_and( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_and( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_or
+            static T atomic_fetch_or_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch16_or_defined
+                return platform::fetch16_or( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_or( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_or_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_or( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_or( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_xor
+            static T atomic_fetch_xor_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch16_xor_defined
+                return platform::fetch16_xor( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_xor( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_xor_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_xor( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_xor( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( pDest, val, memory_order_seq_cst );
+            }
+        };
+
+        // 32-bit atomic operations
+
+        template <typename T, typename Primary>
+        struct atomic_generic_ops< T, 4, Primary >
+        {
+            typedef make_atomic_primary<T, Primary> primary;
+
+            // store
+            static void atomic_store_explicit( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+            {
+                platform::store32( primary::ptr(pDest), primary::val(v), order );
+            }
+            static void atomic_store_explicit( T * pDest, T v, memory_order order ) CDS_NOEXCEPT
+            {
+                platform::store32( primary::ptr(pDest), primary::val(v), order );
+            }
+            static void atomic_store( T volatile * pDest, T v ) CDS_NOEXCEPT
+            {
+                atomic_store_explicit( pDest, v, memory_order_seq_cst );
+            }
+            static void atomic_store( T * pDest, T v ) CDS_NOEXCEPT
+            {
+                atomic_store_explicit( pDest, v, memory_order_seq_cst );
+            }
+
+            // load
+            static T atomic_load_explicit( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::load32( primary::ptr(pSrc), order ));
+            }
+            static T atomic_load_explicit( T const * pSrc, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::load32( primary::ptr(pSrc), order ));
+            }
+            static T atomic_load( T volatile const * pSrc ) CDS_NOEXCEPT
+            {
+                return atomic_load_explicit( pSrc, memory_order_seq_cst );
+            }
+            static T atomic_load( T const * pSrc ) CDS_NOEXCEPT
+            {
+                return atomic_load_explicit( pSrc, memory_order_seq_cst );
+            }
+
+            // exchange
+            static T atomic_exchange_explicit( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::exchange32( primary::ptr(pDest), primary::val(val), order ));
+            }
+            static T atomic_exchange_explicit( T * pDest, T val, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::exchange32( primary::ptr(pDest), primary::val(val), order ));
+            }
+            static T atomic_exchange( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_exchange_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_exchange( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_exchange_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // cas
+            static bool atomic_compare_exchange_weak_explicit( T volatile * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas32_weak( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_weak_explicit( T * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas32_weak( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_weak( T volatile * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_weak_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_weak( T * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_weak_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_strong_explicit( T volatile * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas32_strong( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_strong_explicit( T * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas32_strong( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_strong( T volatile * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_strong_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_strong( T * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_strong_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+        };
+
+        template <typename T>
+        struct atomic_integral_ops< T, 4 >
+            : atomic_generic_ops< T, 4, T >
+            , atomic_integral_bitwise_ops<T>
+        {
+            typedef atomic_integral_bitwise_ops<T> bitwise_ops;
+            // fetch_add
+            static T atomic_fetch_add_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch32_add_defined
+                return platform::fetch32_add( pDest, val, order );
+#           else
+                T cur = atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !atomic_compare_exchange_weak_explicit( pDest, &cur, cur + val, order, memory_order_relaxed ));
+                return cur;
+#           endif
+            }
+            static T atomic_fetch_add_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_add( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_add( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_sub
+            static T atomic_fetch_sub_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch32_sub_defined
+                return platform::fetch32_sub( pDest, val, order );
+#           else
+                T cur = atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !atomic_compare_exchange_weak_explicit( pDest, &cur, cur - val, order, memory_order_relaxed ));
+                return cur;
+#           endif
+            }
+            static T atomic_fetch_sub_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_sub( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_sub( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_and
+            static T atomic_fetch_and_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch32_and_defined
+                return platform::fetch32_and( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_and( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_and_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_and( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_and( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_or
+            static T atomic_fetch_or_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch32_or_defined
+                return platform::fetch32_or( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_or( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_or_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_or( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_or( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_xor
+            static T atomic_fetch_xor_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch32_xor_defined
+                return platform::fetch32_xor( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_xor( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_xor_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_xor( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_xor( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( pDest, val, memory_order_seq_cst );
+            }
+        };
+
+
+        // 64-bit atomic operations
+
+        template <typename T, typename Primary>
+        struct atomic_generic_ops< T, 8, Primary >
+        {
+            typedef make_atomic_primary<T, Primary> primary;
+
+            // store
+            static void atomic_store_explicit( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+            {
+                platform::store64( primary::ptr(pDest), primary::val(v), order );
+            }
+            static void atomic_store_explicit( T * pDest, T v, memory_order order ) CDS_NOEXCEPT
+            {
+                platform::store64( primary::ptr(pDest), primary::val(v), order );
+            }
+            static void atomic_store( T volatile * pDest, T v ) CDS_NOEXCEPT
+            {
+                atomic_store_explicit( pDest, v, memory_order_seq_cst );
+            }
+            static void atomic_store( T * pDest, T v ) CDS_NOEXCEPT
+            {
+                atomic_store_explicit( pDest, v, memory_order_seq_cst );
+            }
+
+            // load
+            static T atomic_load_explicit( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::load64( primary::ptr(pSrc), order ));
+            }
+            static T atomic_load_explicit( T const * pSrc, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::load64( primary::ptr(pSrc), order ));
+            }
+            static T atomic_load( T volatile const * pSrc ) CDS_NOEXCEPT
+            {
+                return atomic_load_explicit( pSrc, memory_order_seq_cst );
+            }
+            static T atomic_load( T const * pSrc ) CDS_NOEXCEPT
+            {
+                return atomic_load_explicit( pSrc, memory_order_seq_cst );
+            }
+
+            // exchange
+            static T atomic_exchange_explicit( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::exchange64( primary::ptr(pDest), primary::val(val), order ));
+            }
+            static T atomic_exchange_explicit( T * pDest, T val, memory_order order ) CDS_NOEXCEPT
+            {
+                return primary::ret( platform::exchange64( primary::ptr(pDest), primary::val(val), order ));
+            }
+            static T atomic_exchange( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_exchange_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_exchange( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_exchange_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // cas
+            static bool atomic_compare_exchange_weak_explicit( T volatile * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas64_weak( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_weak_explicit( T * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas64_weak( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_weak( T volatile * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_weak_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_weak( T * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_weak_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_strong_explicit( T volatile * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas64_strong( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_strong_explicit( T * pDest, T * expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas64_strong( primary::ptr(pDest), primary::ref(*expected), primary::val(desired), mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_strong( T volatile * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_strong_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_strong( T * pDest, T * expected, T desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_strong_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+        };
+
+
+        template <typename T>
+        struct atomic_integral_ops< T, 8 >
+            : atomic_generic_ops< T, 8, T >
+            , atomic_integral_bitwise_ops<T>
+        {
+            typedef atomic_integral_bitwise_ops<T>  bitwise_ops;
+            typedef atomic_generic_ops<T, 8, T>     general_ops;
+
+            // fetch_add
+            static T atomic_fetch_add_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch64_add_defined
+                return platform::fetch64_add( pDest, val, order );
+#           else
+                T cur = general_ops::atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !general_ops::atomic_compare_exchange_weak_explicit( pDest, &cur, cur + val, order, memory_order_relaxed ));
+                return cur;
+#           endif
+            }
+            static T atomic_fetch_add_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_add( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_add( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_sub
+            static T atomic_fetch_sub_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch64_sub_defined
+                return platform::fetch64_sub( pDest, val, order );
+#           else
+                T cur = general_ops::atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !general_ops::atomic_compare_exchange_weak_explicit( pDest, &cur, cur - val, order, memory_order_relaxed ));
+                return cur;
+#           endif
+            }
+            static T atomic_fetch_sub_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_sub( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_sub( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_and
+            static T atomic_fetch_and_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch64_and_defined
+                return platform::fetch64_and( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_and( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_and_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_and( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_and( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_and_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_or
+            static T atomic_fetch_or_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch64_or_defined
+                return platform::fetch64_or( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_or( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_or_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_or( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_or( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_or_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_xor
+            static T atomic_fetch_xor_explicit(T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch64_xor_defined
+                return platform::fetch64_xor( pDest, val, order );
+#           else
+                return bitwise_ops::fetch_xor( pDest, val, order );
+#           endif
+            }
+            static T atomic_fetch_xor_explicit(T * pDest, T val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T atomic_fetch_xor( T volatile * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T atomic_fetch_xor( T * pDest, T val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_xor_explicit( pDest, val, memory_order_seq_cst );
+            }
+        };
+
+
+        // atomic pointer operations
+        template <typename T>
+        struct atomic_pointer_base
+        {
+            // store
+            static void atomic_store_explicit( T * volatile * pDest, T * v, memory_order order ) CDS_NOEXCEPT
+            {
+                platform::store_ptr( pDest, v, order );
+            }
+            static void atomic_store_explicit( T * * pDest, T * v, memory_order order ) CDS_NOEXCEPT
+            {
+                platform::store_ptr( pDest, v, order );
+            }
+            static void atomic_store( T * volatile * pDest, T * v ) CDS_NOEXCEPT
+            {
+                atomic_store_explicit( pDest, v, memory_order_seq_cst );
+            }
+            static void atomic_store( T * * pDest, T * v ) CDS_NOEXCEPT
+            {
+                atomic_store_explicit( pDest, v, memory_order_seq_cst );
+            }
+
+            // load
+            static T * atomic_load_explicit( T * volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+            {
+                return platform::load_ptr( pSrc, order );
+            }
+            static T * atomic_load_explicit( T * const * pSrc, memory_order order ) CDS_NOEXCEPT
+            {
+                return platform::load_ptr( pSrc, order );
+            }
+            static T * atomic_load( T * volatile const * pSrc ) CDS_NOEXCEPT
+            {
+                return atomic_load_explicit( pSrc, memory_order_seq_cst );
+            }
+            static T * atomic_load( T * const * pSrc ) CDS_NOEXCEPT
+            {
+                return atomic_load_explicit( pSrc, memory_order_seq_cst );
+            }
+
+            // exchange
+            static T * atomic_exchange_explicit( T * volatile * pDest, T * val, memory_order order ) CDS_NOEXCEPT
+            {
+                return platform::exchange_ptr( pDest, val, order );
+            }
+            static T * atomic_exchange_explicit( T * * pDest, T * val, memory_order order ) CDS_NOEXCEPT
+            {
+                return platform::exchange_ptr( pDest, val, order );
+            }
+            static T * atomic_exchange( T * volatile * pDest, T * val ) CDS_NOEXCEPT
+            {
+                return atomic_exchange_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T * atomic_exchange( T * * pDest, T * val ) CDS_NOEXCEPT
+            {
+                return atomic_exchange_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // cas
+            static bool atomic_compare_exchange_weak_explicit( T * volatile * pDest, T * * expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas_ptr_weak( pDest, *expected, desired, mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_weak_explicit( T * * pDest, T * * expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas_ptr_weak( pDest, *expected, desired, mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_weak( T * volatile * pDest, T ** expected, T * desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_weak_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_weak( T ** pDest, T ** expected, T * desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_weak_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_strong_explicit( T * volatile * pDest, T ** expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas_ptr_strong( pDest, *expected, desired, mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_strong_explicit( T ** pDest, T ** expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                assert( expected != NULL );
+                return platform::cas_ptr_strong( pDest, *expected, desired, mo_success, mo_fail );
+            }
+            static bool atomic_compare_exchange_strong( T * volatile * pDest, T ** expected, T * desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_strong_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+            static bool atomic_compare_exchange_strong( T ** pDest, T ** expected, T * desired ) CDS_NOEXCEPT
+            {
+                return atomic_compare_exchange_strong_explicit( pDest, expected, desired, memory_order_seq_cst, memory_order_relaxed );
+            }
+        };
+
+        template <typename T>
+        struct atomic_pointer: public atomic_pointer_base<T>
+        {
+            typedef atomic_pointer_base<T> base_class;
+            // fetch_add
+            static T * atomic_fetch_add_explicit(T * volatile * pDest, ptrdiff_t val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch_ptr_add_defined
+                platform::fetch_ptr_add( pDest, val, order );
+#           else
+                T * cur = base_class::atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !base_class::atomic_compare_exchange_weak_explicit( pDest, &cur, cur + val, order, memory_order_relaxed ));
+                return cur;
+#           endif
+            }
+            static T * atomic_fetch_add_explicit(T * * pDest, ptrdiff_t val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T * atomic_fetch_add( T * volatile * pDest, ptrdiff_t val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T * atomic_fetch_add( T ** pDest, ptrdiff_t val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_sub
+            static T * atomic_fetch_sub_explicit(T * volatile * pDest, ptrdiff_t val, memory_order order) CDS_NOEXCEPT
+            {
+#           ifdef CDS_ATOMIC_fetch_ptr_sub_defined
+                platform::fetch_ptr_sub( pDest, val, order );
+#           else
+                T * cur = base_class::atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !base_class::atomic_compare_exchange_weak_explicit( pDest, &cur, cur - val, order, memory_order_relaxed ));
+                return cur;
+#           endif
+            }
+            static T * atomic_fetch_sub_explicit(T ** pDest, ptrdiff_t val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( reinterpret_cast<T volatile *>( pDest ), val, order );
+            }
+            static T * atomic_fetch_sub( T volatile * pDest, ptrdiff_t val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static T * atomic_fetch_sub( T * pDest, ptrdiff_t val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+        };
+
+        template <>
+        struct atomic_pointer<void>: public atomic_pointer_base<void>
+        {
+            typedef atomic_pointer_base<void>   base_class;
+
+            // fetch_add
+            static void * atomic_fetch_add_explicit(void * volatile * pDest, ptrdiff_t val, memory_order order) CDS_NOEXCEPT
+            {
+                void * cur = base_class::atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !base_class::atomic_compare_exchange_weak_explicit( pDest, &cur, reinterpret_cast<char *>(cur) + val, order, memory_order_relaxed ));
+                return cur;
+            }
+            static void * atomic_fetch_add_explicit(void * * pDest, ptrdiff_t val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( reinterpret_cast<void * volatile *>( pDest ), val, order );
+            }
+            static void * atomic_fetch_add( void * volatile * pDest, ptrdiff_t val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static void * atomic_fetch_add( void ** pDest, ptrdiff_t val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_add_explicit( pDest, val, memory_order_seq_cst );
+            }
+
+            // fetch_sub
+            static void * atomic_fetch_sub_explicit(void * volatile * pDest, ptrdiff_t val, memory_order order) CDS_NOEXCEPT
+            {
+                void * cur = base_class::atomic_load_explicit( pDest, memory_order_relaxed );
+                do {} while ( !base_class::atomic_compare_exchange_weak_explicit( pDest, &cur, reinterpret_cast<char *>(cur) - val, order, memory_order_relaxed ));
+                return cur;
+            }
+            static void * atomic_fetch_sub_explicit(void ** pDest, ptrdiff_t val , memory_order order) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( reinterpret_cast<void * volatile *>( pDest ), val, order );
+            }
+            static void * atomic_fetch_sub( void * volatile * pDest, ptrdiff_t val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+            static void * atomic_fetch_sub( void ** pDest, ptrdiff_t val ) CDS_NOEXCEPT
+            {
+                return atomic_fetch_sub_explicit( pDest, val, memory_order_seq_cst );
+            }
+        };
+
+#ifndef CDS_CXX11_DELETE_DEFINITION_SUPPORT
+        class atomic_noncopyable
+        {
+        private:
+            atomic_noncopyable(const atomic_noncopyable&);
+            atomic_noncopyable& operator=(const atomic_noncopyable&);
+            //atomic_noncopyable& operator=(const atomic_noncopyable&) volatile;
+        protected:
+#   ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            atomic_noncopyable() = default;
+#   else
+            atomic_noncopyable()
+            {}
+#   endif
+        };
+#endif
+
+        template <typename T>
+        struct atomic_integral
+#ifndef CDS_CXX11_DELETE_DEFINITION_SUPPORT
+            : atomic_noncopyable
+#endif
+        {
+        private:
+            typename cds::details::aligned_type<T, sizeof(T)>::type volatile m_val;
+            //T volatile  m_val;
+            typedef atomic_integral_ops<T, sizeof(T)>   atomic_ops;
+        public:
+            typedef T   atomic_type;
+        public:
+            bool is_lock_free() const volatile CDS_NOEXCEPT
+            {
+                return true;
+            }
+            bool is_lock_free() const CDS_NOEXCEPT
+            {
+                return true;
+            }
+            void store(T val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+            {
+                atomic_ops::atomic_store_explicit( &m_val, val, order );
+            }
+            void store(T val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+            {
+                atomic_ops::atomic_store_explicit( &m_val, val, order );
+            }
+
+            T load(memory_order order = memory_order_seq_cst) const volatile CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_load_explicit( &m_val, order );
+            }
+            T load(memory_order order  = memory_order_seq_cst) const CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_load_explicit( &m_val, order );
+            }
+
+            operator T() const volatile CDS_NOEXCEPT
+            {
+                return load();
+            }
+            operator T() const CDS_NOEXCEPT
+            {
+                return load();
+            }
+
+            T exchange(T val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_exchange_explicit( &m_val, val, order );
+            }
+            T exchange(T val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_exchange_explicit( &m_val, val, order );
+            }
+
+            bool compare_exchange_weak(T& expected, T desired , memory_order success_order, memory_order failure_order) volatile CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_compare_exchange_weak_explicit( &m_val, &expected, desired, success_order, failure_order );
+            }
+            bool compare_exchange_weak(T& expected, T desired , memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_compare_exchange_weak_explicit( &m_val, &expected, desired, success_order, failure_order );
+            }
+            bool compare_exchange_strong(T& expected, T desired , memory_order success_order, memory_order failure_order) volatile CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_compare_exchange_strong_explicit( &m_val, &expected, desired, success_order, failure_order );
+            }
+            bool compare_exchange_strong(T& expected, T desired , memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_compare_exchange_strong_explicit( &m_val, &expected, desired, success_order, failure_order );
+            }
+            bool compare_exchange_weak(T& expected, T desired , memory_order success_order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+            {
+                return compare_exchange_weak( expected, desired, success_order, memory_order_relaxed );
+            }
+            bool compare_exchange_weak(T& expected, T desired , memory_order success_order = memory_order_seq_cst) CDS_NOEXCEPT
+            {
+                return compare_exchange_weak( expected, desired, success_order, memory_order_relaxed );
+            }
+            bool compare_exchange_strong(T& expected, T desired , memory_order success_order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+            {
+                return compare_exchange_strong( expected, desired, success_order, memory_order_relaxed );
+            }
+            bool compare_exchange_strong(T& expected, T desired , memory_order success_order = memory_order_seq_cst) CDS_NOEXCEPT
+            {
+                return compare_exchange_strong( expected, desired, success_order, memory_order_relaxed );
+            }
+
+            T fetch_add(T val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_fetch_add_explicit( &m_val, val, order );
+            }
+            T fetch_add(T val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_fetch_add_explicit( &m_val, val, order );
+            }
+            T fetch_sub(T val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_fetch_sub_explicit( &m_val, val, order );
+            }
+            T fetch_sub(T val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_fetch_sub_explicit( &m_val, val, order );
+            }
+            T fetch_and(T val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_fetch_and_explicit( &m_val, val, order );
+            }
+            T fetch_and(T val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_fetch_and_explicit( &m_val, val, order );
+            }
+
+            T fetch_or(T val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_fetch_or_explicit( &m_val, val, order );
+            }
+            T fetch_or(T val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_fetch_or_explicit( &m_val, val, order );
+            }
+            T fetch_xor(T val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_fetch_xor_explicit( &m_val, val, order );
+            }
+            T fetch_xor(T val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+            {
+                return atomic_ops::atomic_fetch_xor_explicit( &m_val, val, order );
+            }
+
+#ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            atomic_integral() = default;
+#else
+            atomic_integral() CDS_NOEXCEPT
+            {}
+#endif
+            CDS_CONSTEXPR atomic_integral(T val) CDS_NOEXCEPT
+                : m_val(val)
+                {}
+
+#ifdef CDS_CXX11_DELETE_DEFINITION_SUPPORT
+            atomic_integral(const atomic_integral&) = delete;
+            atomic_integral& operator=(const atomic_integral&) = delete;
+            atomic_integral& operator=(const atomic_integral&) volatile = delete;
+#endif
+            T operator=(T val) volatile CDS_NOEXCEPT
+            {
+                store(val);
+                return val;
+            }
+            T operator=(T val) CDS_NOEXCEPT
+            {
+                store(val);
+                return val;
+            }
+
+            // Post inc/dec
+            T operator++(int) volatile CDS_NOEXCEPT
+            {
+                return fetch_add( 1 );
+            }
+            T operator++(int) CDS_NOEXCEPT
+            {
+                return fetch_add( 1 );
+            }
+            T operator--(int) volatile CDS_NOEXCEPT
+            {
+                return fetch_sub( 1 );
+            }
+            T operator--(int) CDS_NOEXCEPT
+            {
+                return fetch_sub( 1 );
+            }
+
+            // Pre inc/dec
+            T operator++() volatile CDS_NOEXCEPT
+            {
+                return fetch_add( 1 ) + 1;
+            }
+            T operator++() CDS_NOEXCEPT
+            {
+                return fetch_add( 1 ) + 1;
+            }
+            T operator--() volatile CDS_NOEXCEPT
+            {
+                return fetch_sub( 1 ) - 1;
+            }
+            T operator--() CDS_NOEXCEPT
+            {
+                return fetch_sub( 1 ) - 1;
+            }
+
+            // op=
+            T operator+=(T val) volatile CDS_NOEXCEPT
+            {
+                return fetch_add( val ) + val;
+            }
+            T operator+=(T val) CDS_NOEXCEPT
+            {
+                return fetch_add( val ) + val;
+            }
+            T operator-=(T val) volatile CDS_NOEXCEPT
+            {
+                return fetch_sub( val ) - val;
+            }
+            T operator-=(T val) CDS_NOEXCEPT
+            {
+                return fetch_sub( val ) - val;
+            }
+            T operator&=(T val) volatile CDS_NOEXCEPT
+            {
+                return fetch_and( val ) & val;
+            }
+            T operator&=(T val) CDS_NOEXCEPT
+            {
+                return fetch_and( val ) & val;
+            }
+            T operator|=(T val) volatile CDS_NOEXCEPT
+            {
+                return fetch_or( val ) | val;
+            }
+            T operator|=(T val) CDS_NOEXCEPT
+            {
+                return fetch_or( val ) | val;
+            }
+            T operator^=(T val) volatile CDS_NOEXCEPT
+            {
+                return fetch_xor( val ) ^ val;
+            }
+            T operator^=(T val) CDS_NOEXCEPT
+            {
+                return fetch_xor( val ) ^ val;
+            }
+        };
+
+        template <typename Type>
+        struct select_primary_type {
+            typedef typename details::primary_type<sizeof(Type)>::type type;
+        };
+        template <>
+        struct select_primary_type<bool> {
+            typedef bool type;
+        };
+
+    }   // namespace details
+
+    template <class T>
+    struct atomic
+#ifndef CDS_CXX11_DELETE_DEFINITION_SUPPORT
+        : details::atomic_noncopyable
+#endif
+    {
+    private:
+        typedef details::atomic_generic_ops<T, sizeof(T), typename details::select_primary_type<T>::type >  atomic_ops;
+
+        T volatile m_data;
+    public:
+        bool is_lock_free() const volatile CDS_NOEXCEPT
+        {
+            return true;
+        }
+        bool is_lock_free() const CDS_NOEXCEPT
+        {
+            return true;
+        }
+
+        void store(T val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            atomic_ops::atomic_store_explicit( &m_data, val, order );
+        }
+        void store(T val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            atomic_ops::atomic_store_explicit( &m_data, val, order );
+        }
+
+        T load(memory_order order = memory_order_seq_cst) const volatile CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_load_explicit( &m_data, order );
+        }
+        T load(memory_order order = memory_order_seq_cst) const CDS_NOEXCEPT
+        {
+           return atomic_ops::atomic_load_explicit( &m_data, order );
+        }
+
+        operator T() const volatile CDS_NOEXCEPT
+        {
+            return load();
+        }
+        operator T() const CDS_NOEXCEPT
+        {
+            return load();
+        }
+
+        T exchange(T val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_exchange_explicit( &m_data, val, order );
+        }
+        T exchange(T val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_exchange_explicit( &m_data, val, order );
+        }
+
+        bool compare_exchange_weak(T& expected, T desired, memory_order success_order, memory_order failure_order) volatile CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_compare_exchange_weak_explicit( &m_data, &expected, desired, success_order, failure_order );
+        }
+        bool compare_exchange_weak(T& expected, T desired, memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_compare_exchange_weak_explicit( &m_data, &expected, desired, success_order, failure_order );
+        }
+        bool compare_exchange_strong(T& expected, T desired, memory_order success_order, memory_order failure_order) volatile CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_compare_exchange_strong_explicit( &m_data, &expected, desired, success_order, failure_order );
+        }
+        bool compare_exchange_strong(T& expected, T desired, memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_compare_exchange_strong_explicit( &m_data, &expected, desired, success_order, failure_order );
+        }
+        bool compare_exchange_weak(T& expected, T desired, memory_order success_order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            return compare_exchange_weak( expected, desired, success_order, memory_order_relaxed );
+        }
+        bool compare_exchange_weak(T& expected, T desired, memory_order success_order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            return compare_exchange_weak( expected, desired, success_order, memory_order_relaxed );
+        }
+        bool compare_exchange_strong(T& expected, T desired, memory_order success_order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            return compare_exchange_strong( expected, desired, success_order, memory_order_relaxed );
+        }
+        bool compare_exchange_strong(T& expected, T desired, memory_order success_order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            return compare_exchange_strong( expected, desired, success_order, memory_order_relaxed );
+        }
+
+#ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+        atomic() = default;
+#else
+        atomic()
+        {}
+#endif
+        CDS_CONSTEXPR atomic(T val)
+            : m_data( val )
+            {}
+
+#ifdef CDS_CXX11_DELETE_DEFINITION_SUPPORT
+        atomic(const atomic&) = delete;
+        atomic& operator=(const atomic&) = delete;
+        atomic& operator=(const atomic&) volatile = delete;
+#endif
+
+        T operator=(T val) volatile CDS_NOEXCEPT
+        {
+            store( val );
+            return val;
+        }
+        T operator=(T val) CDS_NOEXCEPT
+        {
+            store( val );
+            return val;
+        }
+    };
+
+#if defined(CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT) && defined(CDS_CXX11_DELETE_DEFINITION_SUPPORT)
+#   define CDS_DECLARE_ATOMIC_INTEGRAL( _type ) \
+    template <> \
+    struct atomic<_type>: public details::atomic_integral<_type> \
+    { \
+    private: \
+        typedef details::atomic_integral<_type>   base_class  ; \
+    public: \
+        atomic() = default; \
+        atomic(_type val) CDS_NOEXCEPT : base_class(val) {} \
+        atomic(const atomic&) = delete; \
+        atomic& operator=(const atomic&) = delete; \
+        atomic& operator=(const atomic&) volatile = delete; \
+        _type operator=(_type val) volatile CDS_NOEXCEPT { return base_class::operator=(val); } \
+        _type operator=(_type val) CDS_NOEXCEPT { return base_class::operator=(val); } \
+    };
+#else
+#   define CDS_DECLARE_ATOMIC_INTEGRAL( _type ) \
+    template <> \
+    struct atomic<_type>: public details::atomic_integral<_type> \
+    { \
+    private: \
+        typedef details::atomic_integral<_type>   base_class  ; \
+    public: \
+        atomic() {} \
+        atomic(_type val) CDS_NOEXCEPT : base_class(val) {} \
+        _type operator=(_type val) volatile CDS_NOEXCEPT { return base_class::operator=(val); } \
+        _type operator=(_type val) CDS_NOEXCEPT { return base_class::operator=(val); } \
+    };
+#endif
+
+    CDS_DECLARE_ATOMIC_INTEGRAL(char)
+    CDS_DECLARE_ATOMIC_INTEGRAL(signed char)
+    CDS_DECLARE_ATOMIC_INTEGRAL(unsigned char)
+    CDS_DECLARE_ATOMIC_INTEGRAL(short)
+    CDS_DECLARE_ATOMIC_INTEGRAL(unsigned short)
+    CDS_DECLARE_ATOMIC_INTEGRAL(int)
+    CDS_DECLARE_ATOMIC_INTEGRAL(unsigned int)
+    CDS_DECLARE_ATOMIC_INTEGRAL(long)
+    CDS_DECLARE_ATOMIC_INTEGRAL(unsigned long)
+    CDS_DECLARE_ATOMIC_INTEGRAL(long long)
+    CDS_DECLARE_ATOMIC_INTEGRAL(unsigned long long)
+//#if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40400
+//    CDS_DECLARE_ATOMIC_INTEGRAL(char16_t)
+//    CDS_DECLARE_ATOMIC_INTEGRAL(char32_t)
+//#endif
+//    CDS_DECLARE_ATOMIC_INTEGRAL(wchar_t)
+
+#   undef CDS_DECLARE_ATOMIC_INTEGRAL
+
+
+    template <typename T>
+    class atomic<T *>
+#ifndef CDS_CXX11_DELETE_DEFINITION_SUPPORT
+        : details::atomic_noncopyable
+#endif
+    {
+    private:
+        T * volatile m_ptr;
+        typedef details::atomic_pointer<T>  atomic_ops;
+    public:
+        bool is_lock_free() const volatile CDS_NOEXCEPT
+        {
+            return true;
+        }
+        bool is_lock_free() const CDS_NOEXCEPT
+        {
+            return true;
+        }
+
+        void store(T * val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            atomic_ops::atomic_store_explicit( &m_ptr, val, order );
+        }
+        void store(T * val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            atomic_ops::atomic_store_explicit( &m_ptr, val, order );
+        }
+
+        T * load(memory_order order = memory_order_seq_cst) const volatile CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_load_explicit( &m_ptr, order );
+        }
+        T * load(memory_order order = memory_order_seq_cst) const CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_load_explicit( &m_ptr, order );
+        }
+
+        operator T *() const volatile CDS_NOEXCEPT
+        {
+            return load();
+        }
+        operator T *() const CDS_NOEXCEPT
+        {
+            return load();
+        }
+
+        T * exchange(T * val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_exchange_explicit( &m_ptr, val, order );
+        }
+        T * exchange(T * val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_exchange_explicit( &m_ptr, val, order );
+        }
+
+        bool compare_exchange_weak(T *& expected, T * desired, memory_order success_order, memory_order failure_order) volatile CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_compare_exchange_weak_explicit( &m_ptr, &expected, desired, success_order, failure_order );
+        }
+        bool compare_exchange_weak(T *& expected, T * desired, memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_compare_exchange_weak_explicit( &m_ptr, &expected, desired, success_order, failure_order );
+        }
+        bool compare_exchange_strong(T *& expected, T * desired, memory_order success_order, memory_order failure_order) volatile CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_compare_exchange_strong_explicit( &m_ptr, &expected, desired, success_order, failure_order );
+        }
+        bool compare_exchange_strong(T *& expected, T * desired, memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_compare_exchange_strong_explicit( &m_ptr, &expected, desired, success_order, failure_order );
+        }
+        bool compare_exchange_weak(T *& expected, T * desired, memory_order success_order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            return compare_exchange_weak( expected, desired, success_order, memory_order_relaxed );
+        }
+        bool compare_exchange_weak(T *& expected, T * desired, memory_order success_order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            return compare_exchange_weak( expected, desired, success_order, memory_order_relaxed );
+        }
+        bool compare_exchange_strong(T *& expected, T * desired, memory_order success_order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            return compare_exchange_strong( expected, desired, success_order, memory_order_relaxed );
+        }
+        bool compare_exchange_strong(T *& expected, T * desired, memory_order success_order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            return compare_exchange_strong( expected, desired, success_order, memory_order_relaxed );
+        }
+
+        T * fetch_add(ptrdiff_t offset, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_fetch_add_explicit( &m_ptr, offset, order );
+        }
+        T * fetch_add(ptrdiff_t offset, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_fetch_add_explicit( &m_ptr, offset, order );
+        }
+
+        T * fetch_sub(ptrdiff_t offset, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_fetch_sub_explicit( &m_ptr, offset, order );
+        }
+        T * fetch_sub(ptrdiff_t offset, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            return atomic_ops::atomic_fetch_sub_explicit( &m_ptr, offset, order );
+        }
+
+#ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+        atomic() = default;
+#else
+        atomic() CDS_NOEXCEPT
+        {}
+#endif
+        CDS_CONSTEXPR atomic(T * val) CDS_NOEXCEPT
+            : m_ptr( val )
+        {}
+
+#ifdef CDS_CXX11_DELETE_DEFINITION_SUPPORT
+        atomic(const atomic&) = delete;
+        atomic& operator=(const atomic&) = delete;
+        atomic& operator=(const atomic&) volatile = delete;
+#endif
+
+        T * operator=(T * val) volatile CDS_NOEXCEPT
+        {
+            store( val );
+            return val;
+        }
+        T * operator=(T * val) CDS_NOEXCEPT
+        {
+            store( val );
+            return val;
+        }
+    };
+
+    // Atomic typedefs
+    typedef atomic<bool>            atomic_bool;
+    typedef atomic<char>            atomic_char;
+    typedef atomic<signed char>     atomic_schar;
+    typedef atomic<unsigned char>   atomic_uchar;
+    typedef atomic<short>           atomic_short;
+    typedef atomic<unsigned short>  atomic_ushort;
+    typedef atomic<int>             atomic_int;
+    typedef atomic<unsigned int>    atomic_uint;
+    typedef atomic<long>            atomic_long;
+    typedef atomic<unsigned long>   atomic_ulong;
+    typedef atomic<long long>       atomic_llong;
+    typedef atomic<unsigned long long> atomic_ullong;
+#if ( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40400 ) || CDS_COMPILER == CDS_COMPILER_CLANG
+    typedef atomic<char16_t>        atomic_char16_t;
+    typedef atomic<char32_t>        atomic_char32_t;
+#endif
+    typedef atomic<wchar_t>         atomic_wchar_t;
+
+
+    typedef atomic<cds::int_least8_t>    atomic_int_least8_t;
+    typedef atomic<cds::uint_least8_t>   atomic_uint_least8_t;
+    typedef atomic<cds::int_least16_t>   atomic_int_least16_t;
+    typedef atomic<cds::uint_least16_t>  atomic_uint_least16_t;
+    typedef atomic<cds::int_least32_t>   atomic_int_least32_t;
+    typedef atomic<cds::uint_least32_t>  atomic_uint_least32_t;
+    typedef atomic<cds::int_least64_t>   atomic_int_least64_t;
+    typedef atomic<cds::uint_least64_t>  atomic_uint_least64_t;
+    typedef atomic<cds::int_fast8_t>     atomic_int_fast8_t;
+    typedef atomic<cds::uint_fast8_t>    atomic_uint_fast8_t;
+    typedef atomic<cds::int_fast16_t>    atomic_int_fast16_t;
+    typedef atomic<cds::uint_fast16_t>   atomic_uint_fast16_t;
+    typedef atomic<cds::int_fast32_t>    atomic_int_fast32_t;
+    typedef atomic<cds::uint_fast32_t>   atomic_uint_fast32_t;
+    typedef atomic<cds::int_fast64_t>    atomic_int_fast64_t;
+    typedef atomic<cds::uint_fast64_t>   atomic_uint_fast64_t;
+    typedef atomic<intptr_t>             atomic_intptr_t;
+    typedef atomic<uintptr_t>            atomic_uintptr_t;
+    typedef atomic<size_t>               atomic_size_t;
+    typedef atomic<ptrdiff_t>            atomic_ptrdiff_t;
+    typedef atomic<cds::intmax_t>        atomic_intmax_t;
+    typedef atomic<cds::uintmax_t>       atomic_uintmax_t;
+
+    template <class T>
+    static inline bool atomic_is_lock_free(const volatile atomic<T> * p) CDS_NOEXCEPT
+    {
+        return p->is_lock_free();
+    }
+
+    template <class T>
+    static inline bool atomic_is_lock_free(const atomic<T> * p ) CDS_NOEXCEPT
+    {
+        return p->is_lock_free();
+    }
+
+    /*
+    template <class T>
+    static inline void atomic_init(volatile atomic<T> * p, T val) CDS_NOEXCEPT
+    {
+        p->init( val );
+    }
+
+    template <class T>
+    static inline void atomic_init( atomic<T> * p, T val) CDS_NOEXCEPT
+    {
+        p->init( val );
+    }
+    */
+
+    template <class T>
+    static inline void atomic_store(volatile atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        p->store(val);
+    }
+    template <class T>
+    static inline void atomic_store(atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        p->store( val );
+    }
+
+    template <class T>
+    static inline void atomic_store_explicit(volatile atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        p->store( val, order );
+    }
+    template <class T>
+    static inline void atomic_store_explicit(atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        p->store( val, order );
+    }
+
+    template <class T>
+    static inline T atomic_load(const volatile atomic<T>* p) CDS_NOEXCEPT
+    {
+        return p->load();
+    }
+    template <class T>
+    static inline T atomic_load(const atomic<T>* p) CDS_NOEXCEPT
+    {
+        return p->load();
+    }
+
+    template <class T>
+    static inline T atomic_load_explicit(const volatile atomic<T>* p, memory_order order) CDS_NOEXCEPT
+    {
+        return p->load( order );
+    }
+    template <class T>
+    static inline T atomic_load_explicit(const atomic<T>* p, memory_order order) CDS_NOEXCEPT
+    {
+        return p->load( order );
+    }
+
+    template <class T>
+    static inline T atomic_exchange(volatile atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        return p->exchange( val );
+    }
+    template <class T>
+    static inline T atomic_exchange(atomic<T>* p, T val ) CDS_NOEXCEPT
+    {
+        return p->exchange( val );
+    }
+
+    template <class T>
+    static inline T atomic_exchange_explicit(volatile atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->exchange( val, order );
+    }
+    template <class T>
+    static inline T atomic_exchange_explicit(atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->exchange( val, order );
+    }
+
+    template <class T>
+    static inline bool atomic_compare_exchange_weak(volatile atomic<T>* p, T* expected, T desired) CDS_NOEXCEPT
+    {
+        return p->compare_exchange_weak( *expected, desired );
+    }
+    template <class T>
+    static inline bool atomic_compare_exchange_weak(atomic<T>* p, T* expected, T desired) CDS_NOEXCEPT
+    {
+        return p->compare_exchange_weak( *expected, desired );
+    }
+
+    template <class T>
+    static inline bool atomic_compare_exchange_strong(volatile atomic<T>* p, T* expected, T desired) CDS_NOEXCEPT
+    {
+        return p->compare_exchange_strong( *expected, desired );
+    }
+    template <class T>
+    static inline bool atomic_compare_exchange_strong(atomic<T>* p, T* expected, T desired) CDS_NOEXCEPT
+    {
+        return p->compare_exchange_strong( *expected, desired );
+    }
+
+    template <class T>
+    static inline bool atomic_compare_exchange_weak_explicit(volatile atomic<T>* p, T* expected, T desired, memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+    {
+        return p->compare_exchange_weak( *expected, desired, success_order, failure_order );
+    }
+    template <class T>
+    static inline bool atomic_compare_exchange_weak_explicit(atomic<T>* p, T* expected, T desired, memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+    {
+        return p->compare_exchange_weak( *expected, desired, success_order, failure_order );
+    }
+
+    template <class T>
+    static inline bool atomic_compare_exchange_strong_explicit(volatile atomic<T>* p, T* expected, T desired, memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+    {
+        return p->compare_exchange_strong( *expected, desired, success_order, failure_order );
+    }
+    template <class T>
+    static inline bool atomic_compare_exchange_strong_explicit(atomic<T>* p, T* expected, T desired, memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+    {
+        return p->compare_exchange_strong( *expected, desired, success_order, failure_order );
+    }
+
+    template <class T>
+    static inline T atomic_fetch_add(volatile atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        return p->fetch_add( val );
+    }
+    template <class T>
+    static inline T atomic_fetch_add(atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        return p->fetch_add( val );
+    }
+    template <class T>
+    static inline T * atomic_fetch_add(volatile atomic<T *>* p, ptrdiff_t offset) CDS_NOEXCEPT
+    {
+        return p->fetch_add( offset );
+    }
+    template <class T>
+    static inline T * atomic_fetch_add(atomic<T *>* p, ptrdiff_t offset) CDS_NOEXCEPT
+    {
+        return p->fetch_add( offset );
+    }
+
+    template <class T>
+    static inline T atomic_fetch_add_explicit(volatile atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_add( val, order );
+    }
+    template <class T>
+    static inline T atomic_fetch_add_explicit(atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_add( val, order );
+    }
+    template <class T>
+    static inline T * atomic_fetch_add_explicit(volatile atomic<T *>* p, ptrdiff_t offset, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_add( offset, order );
+    }
+    template <class T>
+    static inline T * atomic_fetch_add_explicit(atomic<T *>* p, ptrdiff_t offset, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_add( offset, order );
+    }
+
+    template <class T>
+    static inline T atomic_fetch_sub(volatile atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        return p->fetch_sub( val );
+    }
+    template <class T>
+    static inline T atomic_fetch_sub(atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        return p->fetch_sub( val );
+    }
+    template <class T>
+    static inline T * atomic_fetch_sub(volatile atomic<T *>* p, ptrdiff_t offset) CDS_NOEXCEPT
+    {
+        return p->fetch_sub( offset );
+    }
+    template <class T>
+    static inline T * atomic_fetch_sub(atomic<T *>* p, ptrdiff_t offset) CDS_NOEXCEPT
+    {
+        return p->fetch_sub( offset );
+    }
+
+    template <class T>
+    static inline T atomic_fetch_sub_explicit(volatile atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_sub( val, order );
+    }
+    template <class T>
+    static inline T atomic_fetch_sub_explicit(atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_sub( val, order );
+    }
+    template <class T>
+    static inline T * atomic_fetch_sub_explicit(volatile atomic<T *>* p, ptrdiff_t offset, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_sub( offset, order );
+    }
+    template <class T>
+    static inline T * atomic_fetch_sub_explicit(atomic<T *>* p, ptrdiff_t offset, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_sub( offset, order );
+    }
+
+    template <class T>
+    static inline T atomic_fetch_and(volatile atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        return p->fetch_and( val );
+    }
+    template <class T>
+    static inline T atomic_fetch_and(atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        return p->fetch_and( val );
+    }
+
+    template <class T>
+    static inline T atomic_fetch_and_explicit(volatile atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_and( val, order );
+    }
+    template <class T>
+    static inline T atomic_fetch_and_explicit(atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_and( val, order );
+    }
+
+    template <class T>
+    static inline T atomic_fetch_or(volatile atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        return p->fetch_or( val );
+    }
+    template <class T>
+    static inline T atomic_fetch_or(atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        return p->fetch_or( val );
+    }
+
+    template <class T>
+    static inline T atomic_fetch_or_explicit(volatile atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_or( val, order );
+    }
+    template <class T>
+    static inline T atomic_fetch_or_explicit(atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_or( val, order );
+    }
+
+    template <class T>
+    static inline T atomic_fetch_xor(volatile atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        return p->fetch_xor( val );
+    }
+    template <class T>
+    static inline T atomic_fetch_xor(atomic<T>* p, T val) CDS_NOEXCEPT
+    {
+        return p->fetch_xor( val );
+    }
+
+    template <class T>
+    static inline T atomic_fetch_xor_explicit(volatile atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_xor( val, order );
+    }
+    template <class T>
+    static inline T atomic_fetch_xor_explicit(atomic<T>* p, T val, memory_order order) CDS_NOEXCEPT
+    {
+        return p->fetch_xor( val, order );
+    }
+
+    // Atomic flag type
+    typedef struct atomic_flag
+    {
+        void clear( memory_order order = memory_order_seq_cst ) volatile CDS_NOEXCEPT
+        {
+            assert( order != memory_order_acquire
+                && order != memory_order_acq_rel
+                && order != memory_order_consume
+                );
+            platform::atomic_flag_clear( &m_Flag, order );
+        }
+        void clear( memory_order order = memory_order_seq_cst ) CDS_NOEXCEPT
+        {
+            assert( order != memory_order_acquire
+                && order != memory_order_acq_rel
+                && order != memory_order_consume
+                );
+            platform::atomic_flag_clear( &m_Flag, order );
+        }
+
+        bool test_and_set( memory_order order = memory_order_seq_cst ) volatile CDS_NOEXCEPT
+        {
+            return platform::atomic_flag_tas( &m_Flag, order );
+        }
+        bool test_and_set( memory_order order = memory_order_seq_cst ) CDS_NOEXCEPT
+        {
+            return platform::atomic_flag_tas( &m_Flag, order );
+        }
+
+#ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+        atomic_flag() = default;
+#elif CDS_COMPILER != CDS_COMPILER_MSVC
+        // MS VC generate error C2552 "non-aggregates cannot be initialized with initializer list"
+        // when atomic_flag initializes with ATOMIC_FLAG_INIT
+        atomic_flag()
+        {}
+#endif
+
+#ifdef CDS_CXX11_DELETE_DEFINITION_SUPPORT
+        atomic_flag(const atomic_flag&) = delete;
+        atomic_flag& operator=(const atomic_flag&) = delete;
+        atomic_flag& operator=(const atomic_flag&) volatile = delete;
+#elif CDS_COMPILER != CDS_COMPILER_MSVC
+    // MS VC generate error C2552 "non-aggregates cannot be initialized with initializer list"
+    // when atomic_flag initializes with ATOMIC_FLAG_INIT
+    private:
+        atomic_flag(const atomic_flag&);
+        atomic_flag& operator=(const atomic_flag&);
+        atomic_flag& operator=(const atomic_flag&) volatile;
+    public:
+#endif
+
+        platform::atomic_flag_type volatile m_Flag;
+    } atomic_flag;
+
+    static inline bool atomic_flag_test_and_set(volatile atomic_flag* p) CDS_NOEXCEPT
+    {
+        return p->test_and_set();
+    }
+    static inline bool atomic_flag_test_and_set(atomic_flag * p) CDS_NOEXCEPT
+    {
+        return p->test_and_set();
+    }
+    static inline bool atomic_flag_test_and_set_explicit(volatile atomic_flag* p, memory_order order) CDS_NOEXCEPT
+    {
+        return p->test_and_set( order );
+    }
+    static inline bool atomic_flag_test_and_set_explicit(atomic_flag* p, memory_order order) CDS_NOEXCEPT
+    {
+        return p->test_and_set( order );
+    }
+    static inline void atomic_flag_clear(volatile atomic_flag* p) CDS_NOEXCEPT
+    {
+        return p->clear();
+    }
+    static inline void atomic_flag_clear(atomic_flag* p) CDS_NOEXCEPT
+    {
+        return p->clear();
+    }
+    static inline void atomic_flag_clear_explicit(volatile atomic_flag* p, memory_order order) CDS_NOEXCEPT
+    {
+        return p->clear( order );
+    }
+    static inline void atomic_flag_clear_explicit(atomic_flag* p, memory_order order) CDS_NOEXCEPT
+    {
+        return p->clear( order );
+    }
+
+    // Fences
+    static inline void atomic_thread_fence(memory_order order) CDS_NOEXCEPT
+    {
+        platform::thread_fence( order );
+        CDS_COMPILER_RW_BARRIER;
+    }
+    static inline void atomic_signal_fence(memory_order order) CDS_NOEXCEPT
+    {
+        platform::signal_fence( order );
+    }
+
+}}  // namespace cds::cxx11_atomics
+
+//@endcond
+#endif // #ifndef __CDS_COMPILER_CXX11_ATOMIC_H
diff --git a/cds/compiler/cxx11_atomic_patches.h b/cds/compiler/cxx11_atomic_patches.h
new file mode 100644 (file)
index 0000000..56db30c
--- /dev/null
@@ -0,0 +1,13 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_CXX11_ATOMIC_PATCHES_H
+#define __CDS_COMPILER_CXX11_ATOMIC_PATCHES_H
+
+#if CDS_COMPILER == CDS_COMPILER_GCC
+#   include <cds/compiler/gcc/cxx11_atomic_patches.h>
+#elif CDS_COMPILER == CDS_COMPILER_INTEL && CDS_OS_INTERFACE == CDS_OSI_WINDOWS
+#   include <cds/compiler/icl/cxx11_atomic_patches_win.h>
+#endif
+
+
+#endif // #ifndef __CDS_COMPILER_CXX11_ATOMIC_PATCHES_H
diff --git a/cds/compiler/cxx11_atomic_prepatches.h b/cds/compiler/cxx11_atomic_prepatches.h
new file mode 100644 (file)
index 0000000..3729a07
--- /dev/null
@@ -0,0 +1,10 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_CXX11_ATOMIC_PREPATCHES_H
+#define __CDS_COMPILER_CXX11_ATOMIC_PREPATCHES_H
+
+#if CDS_COMPILER == CDS_COMPILER_CLANG
+#   include <cds/compiler/clang/cxx11_atomic_prepatches.h>
+#endif
+
+#endif // #ifndef __CDS_COMPILER_CXX11_ATOMIC_PREPATCHES_H
diff --git a/cds/compiler/defs.h b/cds/compiler/defs.h
new file mode 100644 (file)
index 0000000..059cc4a
--- /dev/null
@@ -0,0 +1,28 @@
+//$$CDS-header$$
+
+#ifndef __CDS_ARH_COMPILER_DEFS_H
+#define __CDS_ARH_COMPILER_DEFS_H
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   include <cds/compiler/vc/defs.h>
+#elif CDS_COMPILER == CDS_COMPILER_GCC
+#   include <cds/compiler/gcc/defs.h>
+#elif CDS_COMPILER == CDS_COMPILER_INTEL
+#   include <cds/compiler/icl/defs.h>
+#elif CDS_COMPILER == CDS_COMPILER_CLANG
+#   include <cds/compiler/clang/defs.h>
+#elif CDS_COMPILER == CDS_COMPILER_UNKNOWN
+#   error Unknown compiler. Compilation aborted
+#else
+#   error Unknown value of CDS_COMPILER macro
+#endif
+
+#ifndef CDS_STDCALL
+#   define CDS_STDCALL
+#endif
+
+#ifndef CDS_EXPORT_API
+#   define CDS_EXPORT_API
+#endif
+
+#endif  // #ifndef __CDS_ARH_COMPILER_DEFS_H
diff --git a/cds/compiler/gcc/amd64/backoff.h b/cds/compiler/gcc/amd64/backoff.h
new file mode 100644 (file)
index 0000000..4023f1f
--- /dev/null
@@ -0,0 +1,39 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_AMD64_BACKOFF_H
+#define __CDS_COMPILER_GCC_AMD64_BACKOFF_H
+
+//@cond none
+
+namespace cds { namespace backoff {
+    namespace gcc { namespace amd64 {
+
+#       define CDS_backoff_pause_defined
+        static inline void backoff_pause( unsigned int nLoop = 0x000003FF )
+        {
+            asm volatile (
+                "andl %[nLoop], %%ecx;      \n\t"
+                "cmovzl %[nLoop], %%ecx;    \n\t"
+                "rep; "
+                "nop;   \n\t"
+                : /*no output*/
+                : [nLoop] "r" (nLoop)
+                : "ecx", "cc"
+                );
+        }
+
+#       define CDS_backoff_nop_defined
+        static inline void backoff_nop()
+        {
+            asm volatile ( "nop;" );
+        }
+
+    }} // namespace gcc::amd64
+
+    namespace platform {
+        using namespace gcc::amd64;
+    }
+}}  // namespace cds::backoff
+
+//@endcond
+#endif  // #ifndef __CDS_COMPILER_GCC_AMD64_BACKOFF_H
diff --git a/cds/compiler/gcc/amd64/bitop.h b/cds/compiler/gcc/amd64/bitop.h
new file mode 100644 (file)
index 0000000..b83384c
--- /dev/null
@@ -0,0 +1,157 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_AMD64_BITOP_H
+#define __CDS_COMPILER_GCC_AMD64_BITOP_H
+
+//@cond none
+namespace cds {
+    namespace bitop { namespace platform { namespace gcc { namespace amd64 {
+        // MSB - return index (1..32) of most significant bit in nArg. If nArg == 0 return 0
+#        define cds_bitop_msb32_DEFINED
+        static inline int msb32( atomic32u_t nArg )
+        {
+            int        nRet;
+            __asm__ __volatile__ (
+                "bsrl        %[nArg], %[nRet]     ;\n\t"
+                "jnz        1f                    ;\n\t"
+                "xorl        %[nRet], %[nRet]    ;\n\t"
+                "subl        $1, %[nRet]         ;\n\t"
+                "1:"
+                "addl        $1, %[nRet]         ;\n\t"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+                );
+            return nRet;
+        }
+
+#        define cds_bitop_msb32nz_DEFINED
+        static inline int msb32nz( atomic32u_t nArg )
+        {
+            assert( nArg != 0 );
+            int        nRet;
+            __asm__ __volatile__ (
+                "bsrl        %[nArg], %[nRet]    ;"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+                );
+            return nRet;
+        }
+
+        // LSB - return index (0..31) of least significant bit in nArg. If nArg == 0 return -1U
+#        define cds_bitop_lsb32_DEFINED
+        static inline int lsb32( atomic32u_t nArg )
+        {
+
+            int        nRet;
+            __asm__ __volatile__ (
+                "bsfl        %[nArg], %[nRet]     ;"
+                "jnz        1f        ;"
+                "xorl        %[nRet], %[nRet]    ;"
+                "subl        $1, %[nRet]         ;"
+                "1:"
+                "addl        $1, %[nRet]         ;"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+                );
+            return nRet;
+
+        }
+
+        // LSB - return index (0..31) of least significant bit in nArg.
+        // Condition: nArg != 0
+#        define cds_bitop_lsb32nz_DEFINED
+        static inline int lsb32nz( atomic32u_t nArg )
+        {
+            assert( nArg != 0 );
+            int        nRet;
+            __asm__ __volatile__ (
+                "bsfl        %[nArg], %[nRet]    ;"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+                );
+            return nRet;
+        }
+
+#        define cds_bitop_msb64_DEFINED
+        static inline int msb64( atomic64u_unaligned nArg )
+        {
+            atomic64u_unaligned        nRet;
+            asm volatile (
+                "bsrq        %[nArg], %[nRet]     ;\n\t"
+                "jnz        1f                    ;\n\t"
+                "xorq        %[nRet], %[nRet]    ;\n\t"
+                "subq        $1, %[nRet]         ;\n\t"
+                "1:"
+                "addq        $1, %[nRet]         ;\n\t"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+                );
+            return (int) nRet;
+        }
+
+#        define cds_bitop_msb64nz_DEFINED
+        static inline int msb64nz( atomic64u_unaligned nArg )
+        {
+            assert( nArg != 0 );
+            atomic64u_unaligned        nRet;
+            __asm__ __volatile__ (
+                "bsrq        %[nArg], %[nRet]    ;"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+                );
+            return (int) nRet;
+        }
+
+        // LSB - return index (0..31) of least significant bit in nArg. If nArg == 0 return -1U
+#        define cds_bitop_lsb64_DEFINED
+        static inline int lsb64( atomic64u_unaligned nArg )
+        {
+
+            atomic64u_unaligned        nRet;
+            __asm__ __volatile__ (
+                "bsfq        %[nArg], %[nRet]     ;"
+                "jnz        1f        ;"
+                "xorq        %[nRet], %[nRet]    ;"
+                "subq        $1, %[nRet]         ;"
+                "1:"
+                "addq        $1, %[nRet]         ;"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+                );
+            return (int) nRet;
+
+        }
+
+        // LSB - return index (0..31) of least significant bit in nArg.
+        // Condition: nArg != 0
+#        define cds_bitop_lsb64nz_DEFINED
+        static inline int lsb64nz( atomic64u_unaligned nArg )
+        {
+            assert( nArg != 0 );
+            atomic64u_unaligned        nRet;
+            __asm__ __volatile__ (
+                "bsfq        %[nArg], %[nRet]    ;"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+                );
+            return (int) nRet;
+        }
+
+
+    }} // namespace gcc::amd64
+
+    using namespace gcc::amd64;
+
+    }}}    // namespace cds::bitop::platform
+
+//@endcond
+
+#endif // #ifndef __CDS_COMPILER_GCC_AMD64_BITOP_H
diff --git a/cds/compiler/gcc/amd64/cxx11_atomic.h b/cds/compiler/gcc/amd64/cxx11_atomic.h
new file mode 100644 (file)
index 0000000..afb9a74
--- /dev/null
@@ -0,0 +1,207 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_AMD64_CXX11_ATOMIC_H
+#define __CDS_COMPILER_GCC_AMD64_CXX11_ATOMIC_H
+
+#include <cstdint>
+#include <cds/compiler/gcc/x86/cxx11_atomic32.h>
+
+//@cond
+namespace cds { namespace cxx11_atomics {
+    namespace platform { CDS_CXX11_INLINE_NAMESPACE namespace gcc { CDS_CXX11_INLINE_NAMESPACE namespace amd64 {
+#   ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+        // primitives up to 32bit + fences
+        using namespace cds::cxx11_atomics::platform::gcc::x86;
+#   endif
+
+        //-----------------------------------------------------------------------------
+        // 64bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline bool cas64_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            T prev = expected;
+            fence_before(mo_success);
+            __asm__ __volatile__ (
+                "lock ; cmpxchgq %[desired], %[pDest]"
+                : [prev] "+a" (prev), [pDest] "+m" (*pDest)
+                : [desired] "r" (desired)
+                );
+            bool success = (prev == expected);
+            expected = prev;
+            if (success)
+                fence_after(mo_success);
+            else
+                fence_after(mo_fail);
+            return success;
+        }
+
+        template <typename T>
+        static inline bool cas64_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas64_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline T load64( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+            assert( cds::details::is_aligned( pSrc, 8 ));
+
+            T v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+
+        template <typename T>
+        static inline T exchange64( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            fence_before(order);
+            __asm__ __volatile__ (
+                "xchgq %[v], %[pDest]"
+                : [v] "+r" (v), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return v;
+        }
+
+        template <typename T>
+        static inline void store64( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            if (order != memory_order_seq_cst) {
+                fence_before(order);
+                *pDest = val;
+            }
+            else {
+                exchange64( pDest, val, order);
+            }
+        }
+
+#       define CDS_ATOMIC_fetch64_add_defined
+        template <typename T>
+        static inline T fetch64_add( T volatile * pDest, T v, memory_order order) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            fence_before(order);
+            __asm__ __volatile__ (
+                "lock ; xaddq %[v], %[pDest]"
+                : [v] "+r" (v), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return v;
+        }
+
+#       define CDS_ATOMIC_fetch64_sub_defined
+        template <typename T>
+        static inline T fetch64_sub( T volatile * pDest, T v, memory_order order) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            fence_before(order);
+            __asm__ __volatile__ (
+                "negq   %[v] ; \n"
+                "lock ; xaddq %[v], %[pDest]"
+                : [v] "+r" (v), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return v;
+        }
+
+
+        //-----------------------------------------------------------------------------
+        // pointer primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline T * exchange_ptr( T * volatile * pDest, T * v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+
+            return (T *) exchange64( (uint64_t volatile *) pDest, (uint64_t) v, order );
+        }
+
+        template <typename T>
+        static inline void store_ptr( T * volatile * pDest, T * src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange_ptr( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T * load_ptr( T * volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            T * v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_strong( T * volatile * pDest, T *& expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+
+            return cas64_strong( (uint64_t volatile *) pDest, *reinterpret_cast<uint64_t *>( &expected ), (uint64_t) desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_weak( T * volatile * pDest, T *& expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas_ptr_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+    }} // namespace gcc::amd64
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using namespace gcc::amd64;
+#endif
+    }   // namespace platform
+
+}}  // namespace cds::cxx11_atomics
+//@endcond
+
+#endif // #ifndef __CDS_COMPILER_GCC_AMD64_CXX11_ATOMIC_H
diff --git a/cds/compiler/gcc/compiler_barriers.h b/cds/compiler/gcc/compiler_barriers.h
new file mode 100644 (file)
index 0000000..eb41faa
--- /dev/null
@@ -0,0 +1,10 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_COMPILER_BARRIERS_H
+#define __CDS_COMPILER_GCC_COMPILER_BARRIERS_H
+
+#define CDS_COMPILER_RW_BARRIER  __asm__ __volatile__ ( "" ::: "memory" )
+#define CDS_COMPILER_R_BARRIER   CDS_COMPILER_RW_BARRIER
+#define CDS_COMPILER_W_BARRIER   CDS_COMPILER_RW_BARRIER
+
+#endif  // #ifndef __CDS_COMPILER_GCC_COMPILER_BARRIERS_H
diff --git a/cds/compiler/gcc/compiler_macro.h b/cds/compiler/gcc/compiler_macro.h
new file mode 100644 (file)
index 0000000..c9e89bc
--- /dev/null
@@ -0,0 +1,136 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_COMPILER_MACRO_H
+#define __CDS_COMPILER_GCC_COMPILER_MACRO_H
+
+// OS interface && OS name
+#if defined( __linux__ )
+#   define CDS_OS_INTERFACE     CDS_OSI_UNIX
+#   define CDS_OS_TYPE          CDS_OS_LINUX
+#   define CDS_OS__NAME         "linux"
+#   define CDS_OS__NICK         "linux"
+#elif defined( __sun__ )
+#   define CDS_OS_INTERFACE     CDS_OSI_UNIX
+#   define CDS_OS_TYPE          CDS_OS_SUN_SOLARIS
+#   define CDS_OS__NAME         "Sun Solaris"
+#   define CDS_OS__NICK         "sun"
+#elif defined( __hpux__ )
+#   define CDS_OS_INTERFACE     CDS_OSI_UNIX
+#   define CDS_OS_TYPE          CDS_OS_HPUX
+#   define CDS_OS__NAME         "HP-UX"
+#   define CDS_OS__NICK         "hpux"
+#elif defined( _AIX )
+#   define CDS_OS_INTERFACE     CDS_OSI_UNIX
+#   define CDS_OS_TYPE          CDS_OS_AIX
+#   define CDS_OS__NAME         "AIX"
+#   define CDS_OS__NICK         "aix"
+#elif defined( __FreeBSD__ )
+#   define CDS_OS_INTERFACE     CDS_OSI_UNIX
+#   define CDS_OS_TYPE          CDS_OS_FREE_BSD
+#   define CDS_OS__NAME         "FreeBSD"
+#   define CDS_OS__NICK         "freebsd"
+#elif defined( __OpenBSD__ )
+#   define CDS_OS_INTERFACE     CDS_OSI_UNIX
+#   define CDS_OS_TYPE          CDS_OS_OPEN_BSD
+#   define CDS_OS__NAME         "OpenBSD"
+#   define CDS_OS__NICK         "openbsd"
+#elif defined( __NetBSD__ )
+#   define CDS_OS_INTERFACE     CDS_OSI_UNIX
+#   define CDS_OS_TYPE          CDS_OS_NET_BSD
+#   define CDS_OS__NAME         "NetBSD"
+#   define CDS_OS__NICK         "netbsd"
+#elif defined(__MINGW32__) || defined( __MINGW64__)
+#   define CDS_OS_INTERFACE     CDS_OSI_WINDOWS
+#   define CDS_OS_TYPE          CDS_OS_MINGW
+#   define CDS_OS__NAME         "MinGW"
+#   define CDS_OS__NICK         "mingw"
+#elif defined(__MACH__)
+#   define CDS_OS_INTERFACE     CDS_OSI_UNIX
+#   define CDS_OS_TYPE          CDS_OS_OSX
+#   define CDS_OS__NAME         "OS X"
+#   define CDS_OS__NICK         "osx"
+#else
+#   define CDS_OS_INTERFACE     CDS_OSI_UNIX
+#   define CDS_OS_TYPE          CDS_OS_PTHREAD
+#   define CDS_OS__NAME         "pthread"
+#   define CDS_OS__NICK         "pthread"
+#endif
+
+// Processor architecture
+
+#if defined(__arm__) && !defined(__ARM_ARCH)
+    // GCC 4.6 does not defined __ARM_ARCH
+#   if defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__)
+#       define __ARM_ARCH   7
+#   else
+#       define __ARM_ARCH   5
+#   endif
+#endif
+
+#if defined(__x86_64__) || defined(__amd64__) || defined(__amd64)
+#   define CDS_PROCESSOR_ARCH    CDS_PROCESSOR_AMD64
+#   define CDS_BUILD_BITS        64
+#   define CDS_PROCESSOR__NAME   "Intel x86-64"
+#   define CDS_PROCESSOR__NICK   "amd64"
+#elif defined(__i386__)
+#   define CDS_PROCESSOR_ARCH    CDS_PROCESSOR_X86
+#   define CDS_BUILD_BITS        32
+#   define CDS_PROCESSOR__NAME   "Intel x86"
+#   define CDS_PROCESSOR__NICK   "x86"
+#elif defined(sparc) || defined (__sparc__)
+#   define CDS_PROCESSOR_ARCH    CDS_PROCESSOR_SPARC
+#   define CDS_PROCESSOR__NAME   "Sparc"
+#   define CDS_PROCESSOR__NICK   "sparc"
+#   ifdef __arch64__
+#       define CDS_BUILD_BITS   64
+#    else
+#       error Sparc 32bit is not supported
+#    endif
+#elif defined( __ia64__)
+#    define CDS_PROCESSOR_ARCH    CDS_PROCESSOR_IA64
+#    define CDS_BUILD_BITS        64
+#    define CDS_PROCESSOR__NAME   "Intel IA64"
+#    define CDS_PROCESSOR__NICK   "ia64"
+#elif defined(_ARCH_PPC64)
+#    define CDS_PROCESSOR_ARCH    CDS_PROCESSOR_PPC64
+#    define CDS_BUILD_BITS        64
+#    define CDS_PROCESSOR__NAME   "IBM PowerPC64"
+#    define CDS_PROCESSOR__NICK   "ppc64"
+#elif defined(__arm__) && __SIZEOF_POINTER__ == 4 && __ARM_ARCH >= 7
+#    define CDS_PROCESSOR_ARCH    CDS_PROCESSOR_ARM7
+#    define CDS_BUILD_BITS        32
+#    define CDS_PROCESSOR__NAME   "ARM v7"
+#    define CDS_PROCESSOR__NICK   "arm7"
+#else
+#   if defined(CDS_USE_LIBCDS_ATOMIC)
+#       error "Libcds does not support atomic implementation for the processor architecture. Try to use C++11-compatible compiler and remove CDS_USE_LIBCDS_ATOMIC flag from compiler command line"
+#   elif !defined(CDS_USE_BOOST_ATOMIC) && !defined(CDS_CXX11_ATOMIC_SUPPORT)
+#       error "The current compiler does not support C++11 atomic. Try to use boost.atomic (-DCDS_USE_BOOST_ATOMIC) or C++11 compiler"
+#   else
+#       define CDS_PROCESSOR_ARCH    CDS_PROCESSOR_UNKNOWN
+#       define CDS_BUILD_BITS        32
+#       define CDS_PROCESSOR__NAME   "unknown"
+#       define CDS_PROCESSOR__NICK   "unknown"
+#   endif
+#endif
+
+#if CDS_OS_TYPE == CDS_OS_MINGW
+#   ifdef CDS_BUILD_LIB
+#       define CDS_EXPORT_API          __declspec(dllexport)
+#   else
+#       define CDS_EXPORT_API          __declspec(dllimport)
+#   endif
+#else
+#   ifndef __declspec
+#       define __declspec( _x )
+#   endif
+#endif
+
+#if CDS_PROCESSOR_ARCH == CDS_PROCESSOR_X86
+#   define CDS_STDCALL __attribute__((stdcall))
+#else
+#   define CDS_STDCALL
+#endif
+
+
+#endif // #ifndef __CDS_COMPILER_GCC_COMPILER_MACRO_H
diff --git a/cds/compiler/gcc/cxx11_atomic_patches.h b/cds/compiler/gcc/cxx11_atomic_patches.h
new file mode 100644 (file)
index 0000000..c681887
--- /dev/null
@@ -0,0 +1,47 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_CXX11_ATOMIC_PATCHES_H
+#define __CDS_COMPILER_GCC_CXX11_ATOMIC_PATCHES_H
+
+#if CDS_CXX11_ATOMIC_SUPPORT == 1
+#   if CDS_COMPILER_VERSION >= 40600 && CDS_COMPILER_VERSION < 40700
+    // GCC 4.6.x has no atomic_thread_fence/atomic_signal_fence
+    namespace std {
+        inline void atomic_thread_fence(memory_order order)
+        {
+            switch(order)
+            {
+            case memory_order_relaxed:
+            case memory_order_consume:
+                break;
+            case memory_order_release:
+            case memory_order_acquire:
+            case memory_order_acq_rel:
+            case memory_order_seq_cst:
+                __sync_synchronize();
+                break;
+            default:;
+            }
+
+        }
+        inline void atomic_signal_fence(memory_order order)
+        {
+            switch(order)
+            {
+            case memory_order_relaxed:
+                break;
+            case memory_order_consume:
+            case memory_order_release:
+            case memory_order_acquire:
+            case memory_order_acq_rel:
+            case memory_order_seq_cst:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            default:;
+            }
+        }
+    } // namespace std
+#   endif
+#endif
+
+#endif // #ifndef __CDS_COMPILER_GCC_CXX11_ATOMIC_PATCHES_H
diff --git a/cds/compiler/gcc/defs.h b/cds/compiler/gcc/defs.h
new file mode 100644 (file)
index 0000000..803945e
--- /dev/null
@@ -0,0 +1,143 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_DEFS_H
+#define __CDS_COMPILER_GCC_DEFS_H
+
+// Compiler version
+#define CDS_COMPILER_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+
+#if CDS_COMPILER_VERSION < 40300
+#   error "Compiler version error. GCC version 4.3.0 and above is supported"
+#endif
+
+// Compiler name
+#ifdef __VERSION__
+#   define  CDS_COMPILER__NAME    ("GNU C++ " __VERSION__)
+#else
+#   define  CDS_COMPILER__NAME    "GNU C++"
+#endif
+#define  CDS_COMPILER__NICK        "gcc"
+
+// C++11 atomic support
+#if CDS_COMPILER_VERSION >= 40700
+#   define CDS_CXX11_ATOMIC_SUPPORT     1
+#elif defined(CDS_CXX11_ATOMIC_GCC)
+#   define CDS_CXX11_ATOMIC_SUPPORT     1
+#endif
+
+
+#include <cds/compiler/gcc/compiler_macro.h>
+
+
+#define alignof __alignof__
+
+// ***************************************
+// C++11 features
+
+// Variadic template support (only if -std=c++0x compile-line option provided)
+#if CDS_COMPILER_VERSION >= 40300
+#   define CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+#endif
+
+// RValue
+#if CDS_COMPILER_VERSION >= 40300
+#   define CDS_RVALUE_SUPPORT
+#   define CDS_MOVE_SEMANTICS_SUPPORT
+#endif
+
+// Default template arguments for function templates
+#if CDS_COMPILER_VERSION >= 40300
+#   define CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+#endif
+
+// C++11 inline namespace
+#if CDS_COMPILER_VERSION >= 40400
+#   define CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+#endif
+
+// Delete definition and explicitly-defaulted function
+#if CDS_COMPILER_VERSION >= 40400
+// C++11 delete definition ( function declaration = delete)
+#   define CDS_CXX11_DELETE_DEFINITION_SUPPORT
+
+// C++11 explicitly-defaulted function (= default) [std 8.4.2 [dcl.fct.def.default]]
+#   define CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+#endif
+
+// Lambda
+#if CDS_COMPILER_VERSION >= 40500
+#   define CDS_CXX11_LAMBDA_SUPPORT
+#   if CDS_COMPILER_VERSION < 40800
+#       define CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+#   endif
+#endif
+
+// Explicit conversion operator
+#if CDS_COMPILER_VERSION >= 40500
+#   define CDS_CXX11_EXPLICIT_CONVERSION_OPERATOR_SUPPORT
+#endif
+
+#if CDS_COMPILER_VERSION >= 40600
+#   define CDS_CONSTEXPR    constexpr
+#   define CDS_NOEXCEPT_SUPPORT        noexcept
+#   define CDS_NOEXCEPT_SUPPORT_(expr) noexcept(expr)
+#   if CDS_COMPILER_VERSION >= 40600 && CDS_COMPILER_VERSION < 40700
+    // GCC 4.6.x does not allow noexcept specification in defaulted function
+    // void foo() noexcept = default
+    // error: function \91foo\92 defaulted on its first declaration must not have an exception-specification
+#       define CDS_NOEXCEPT_DEFAULTED
+#       define CDS_NOEXCEPT_DEFAULTED_(expr)
+    // GCC 4.6.x: constexpr and const are incompatible in variable declaration
+#       define CDS_CONSTEXPR_CONST const
+#   else
+#       define CDS_CONSTEXPR_CONST constexpr const
+#   endif
+#else
+#   define CDS_CONSTEXPR
+#   define CDS_CONSTEXPR_CONST const
+#   define CDS_NOEXCEPT_SUPPORT
+#   define CDS_NOEXCEPT_SUPPORT_(expr)
+#endif
+
+// C++11 template alias
+#if CDS_COMPILER_VERSION >= 40700
+#   define CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
+#endif
+
+// C++11 thread_local keyword
+#if CDS_COMPILER_VERSION >= 40800
+#   define CDS_CXX11_THREAD_LOCAL_SUPPORT
+#endif
+
+
+#if defined( CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT ) && defined(CDS_MOVE_SEMANTICS_SUPPORT) && CDS_COMPILER_VERSION >= 40400 && CDS_COMPILER_VERSION < 40600
+    // GCC 4.4 - 4.5 bug: move ctor & assignment operator cannot be defaulted
+#   define CDS_DISABLE_DEFAULT_MOVE_CTOR
+#endif
+
+#include <cds/compiler/cstdint_std.h>
+
+// Thread support library (thread, mutex, condition variable, chrono)
+#if CDS_COMPILER_VERSION >= 40800
+#   define CDS_CXX11_STDLIB_THREAD
+#   define CDS_CXX11_STDLIB_MUTEX
+#   define CDS_CXX11_STDLIB_CONDITION_VARIABLE
+#   define CDS_CXX11_STDLIB_CHRONO
+#endif
+
+// Full SFINAE support
+#if CDS_COMPILER_VERSION >= 40700
+#   define CDS_CXX11_SFINAE
+#endif
+
+// *************************************************
+// Alignment macro
+
+#define CDS_TYPE_ALIGNMENT(n)   __attribute__ ((aligned (n)))
+#define CDS_CLASS_ALIGNMENT(n)  __attribute__ ((aligned (n)))
+#define CDS_DATA_ALIGNMENT(n)   __attribute__ ((aligned (n)))
+
+
+#include <cds/compiler/gcc/compiler_barriers.h>
+
+#endif // #ifndef __CDS_COMPILER_GCC_DEFS_H
diff --git a/cds/compiler/gcc/ia64/backoff.h b/cds/compiler/gcc/ia64/backoff.h
new file mode 100644 (file)
index 0000000..84d718c
--- /dev/null
@@ -0,0 +1,37 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_IA64_BACKOFF_H
+#define __CDS_COMPILER_GCC_IA64_BACKOFF_H
+
+//@cond none
+
+namespace cds { namespace backoff {
+    namespace gcc { namespace ia64 {
+
+#       define CDS_backoff_pause_defined
+        static inline void backoff_pause( unsigned int nLoop = 0x000003FF )
+        {
+            asm volatile ( "hint @pause" );
+        }
+
+#       define CDS_backoff_hint_defined
+        static inline void backoff_hint()
+        {
+            asm volatile ( "hint @pause;;" );
+        }
+
+#       define CDS_backoff_nop_defined
+        static inline void backoff_nop()
+        {
+            asm volatile ( "nop;;" );
+        }
+
+    }} // namespace gcc::ia64
+
+    namespace platform {
+        using namespace gcc::ia64;
+    }
+}}  // namespace cds::backoff
+
+//@endcond
+#endif  // #ifndef __CDS_COMPILER_GCC_IA64_BACKOFF_H
diff --git a/cds/compiler/gcc/ia64/bitop.h b/cds/compiler/gcc/ia64/bitop.h
new file mode 100644 (file)
index 0000000..64e21e1
--- /dev/null
@@ -0,0 +1,62 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_IA64_BITOP_H
+#define __CDS_COMPILER_GCC_IA64_BITOP_H
+
+//@cond none
+namespace cds {
+    namespace bitop { namespace platform { namespace gcc { namespace ia64 {
+
+        // MSB - return index (1..32) of most significant bit in x. If x == 0 return 0
+#        define cds_bitop_msb32_DEFINED
+        static inline int msb32( atomic32u_t nArg )
+        {
+            if ( !nArg )
+                return 0;
+            atomic64u_t x = nArg;
+            x |= x >> 1;
+            x |= x >> 2;
+            x |= x >> 4;
+            x |= x >> 8;
+            x |= x >> 16;
+
+            atomic64u_t    nRes;
+            asm __volatile__( "popcnt %0=%1\n\t" : "=r" (nRes) : "r" (x) );
+            return (int) nRes;
+        }
+
+        // It is not compiled on HP-UX. Why?..
+#if CDS_OS_TYPE != CDS_OS_HPUX
+        // MSB - return index (0..31) of most significant bit in nArg.
+        // !!! nArg != 0
+#        define cds_bitop_msb32nz_DEFINED
+        static inline int msb32nz( atomic32u_t nArg )
+        {
+            assert( nArg != 0 );
+            long double d = nArg;
+            long nExp;
+            asm __volatile__("getf.exp %0=%1\n\t" : "=r"(nExp) : "f"(d));
+            return (int) (nExp - 0xffff);
+        }
+
+        // MSB - return index (0..63) of most significant bit in nArg.
+        // !!! nArg != 0
+#        define cds_bitop_msb64nz_DEFINED
+        static inline int msb64nz( atomic64u_t nArg )
+        {
+            assert( nArg != 0 );
+            long double d = nArg;
+            long nExp;
+            asm __volatile__("getf.exp %0=%1\n\t" : "=r" (nExp) : "f" (d));
+            return (int) (nExp - 0xffff);
+        }
+#endif    // #if CDS_OS_TYPE != CDS_OS_HPUX
+
+    }} // namespace gcc::ia64
+
+    using namespace gcc::ia64;
+
+}}}    // namespace cds::bitop::platform
+//@endcond
+
+#endif // #ifndef __CDS_COMPILER_GCC_IA64_BITOP_H
diff --git a/cds/compiler/gcc/ia64/cxx11_atomic.h b/cds/compiler/gcc/ia64/cxx11_atomic.h
new file mode 100644 (file)
index 0000000..cacfa9d
--- /dev/null
@@ -0,0 +1,653 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_IA64_CXX11_ATOMIC_H
+#define __CDS_COMPILER_GCC_IA64_CXX11_ATOMIC_H
+
+/*
+    Source:
+        1. load/store: http://www.decadent.org.uk/pipermail/cpp-threads/2008-December/001932.html
+        2. Mapping to C++ Memory Model: http://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html
+*/
+
+#include <cstdint>
+
+//@cond
+namespace cds { namespace cxx11_atomics {
+    namespace platform { CDS_CXX11_INLINE_NAMESPACE namespace gcc { CDS_CXX11_INLINE_NAMESPACE namespace ia64 {
+
+        static inline void itanium_full_fence() CDS_NOEXCEPT
+        {
+            __asm__ __volatile__ ( "mf \n\t" ::: "memory" );
+        }
+
+        static inline void fence_before( memory_order order ) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_relaxed:
+            case memory_order_consume:
+            case memory_order_acquire:
+                break;
+            case memory_order_release:
+            case memory_order_acq_rel:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            case memory_order_seq_cst:
+                itanium_full_fence();
+                break;
+            }
+        }
+
+        static inline void fence_after( memory_order order ) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_acquire:
+            case memory_order_acq_rel:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            case memory_order_relaxed:
+            case memory_order_consume:
+            case memory_order_release:
+                break;
+            case memory_order_seq_cst:
+                itanium_full_fence();
+                break;
+            }
+        }
+
+
+        //-----------------------------------------------------------------------------
+        // fences
+        //-----------------------------------------------------------------------------
+        static inline void thread_fence(memory_order order) CDS_NOEXCEPT
+        {
+            switch(order)
+            {
+                case memory_order_relaxed:
+                case memory_order_consume:
+                    break;
+                case memory_order_release:
+                case memory_order_acquire:
+                case memory_order_acq_rel:
+                    CDS_COMPILER_RW_BARRIER;
+                    break;
+                case memory_order_seq_cst:
+                    itanium_full_fence();
+                    break;
+                default:;
+            }
+        }
+
+        static inline void signal_fence(memory_order order) CDS_NOEXCEPT
+        {
+            // C++11: 29.8.8: only compiler optimization, no hardware instructions
+            switch(order)
+            {
+                case memory_order_relaxed:
+                    break;
+                case memory_order_consume:
+                case memory_order_release:
+                case memory_order_acquire:
+                case memory_order_acq_rel:
+                case memory_order_seq_cst:
+                    CDS_COMPILER_RW_BARRIER;
+                    break;
+                default:;
+            }
+        }
+
+#define CDS_ITANIUM_ATOMIC_LOAD( n_bytes, n_bits )   \
+        template <typename T>   \
+        static inline T load##n_bits( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT \
+        { \
+            static_assert( sizeof(T) == n_bytes, "Illegal size of operand" )   ; \
+            assert( order ==  memory_order_relaxed \
+                || order ==  memory_order_consume  \
+                || order ==  memory_order_acquire  \
+                || order == memory_order_seq_cst   \
+                ) ; \
+            assert( pSrc != NULL )  ; \
+            T val    ; \
+            __asm__ __volatile__ ( \
+                "ld" #n_bytes ".acq %[val] = [%[pSrc]]  \n\t" \
+                : [val] "=r" (val) \
+                : [pSrc] "r" (pSrc) \
+                : "memory" \
+                ) ; \
+            return val ; \
+        }
+
+#define CDS_ITANIUM_ATOMIC_STORE( n_bytes, n_bits ) \
+        template <typename T> \
+        static inline void store##n_bits( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT \
+        { \
+            static_assert( sizeof(T) == n_bytes, "Illegal size of operand" )   ; \
+            assert( order ==  memory_order_relaxed \
+                || order ==  memory_order_release  \
+                || order == memory_order_seq_cst   \
+                ) ; \
+            assert( pDest != NULL )  ; \
+            if ( order == memory_order_seq_cst ) { \
+                __asm__ __volatile__ ( \
+                    "st" #n_bytes ".rel [%[pDest]] = %[val] \n\t" \
+                    "mf     \n\t" \
+                    :: [pDest] "r" (pDest), [val] "r" (val) \
+                    : "memory" \
+                    ) ; \
+            } \
+            else { \
+                __asm__ __volatile__ ( \
+                    "st" #n_bytes ".rel [%[pDest]] = %[val] \n\t" \
+                    :: [pDest] "r" (pDest), [val] "r" (val) \
+                    : "memory" \
+                    ) ; \
+                fence_after(order) ; \
+            } \
+        }
+
+#define CDS_ITANIUM_ATOMIC_CAS( n_bytes, n_bits ) \
+        template <typename T> \
+        static inline bool cas##n_bits##_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order /*mo_fail*/ ) CDS_NOEXCEPT \
+        { \
+            static_assert( sizeof(T) == n_bytes, "Illegal size of operand" )   ; \
+            T current ; \
+            switch(mo_success) { \
+            case memory_order_relaxed: \
+            case memory_order_consume: \
+            case memory_order_acquire: \
+                __asm__ __volatile__ ( \
+                    "mov ar.ccv = %[expected] ;;\n\t" \
+                    "cmpxchg" #n_bytes ".acq %[current] = [%[pDest]], %[desired], ar.ccv\n\t" \
+                    : [current] "=r" (current) \
+                    : [pDest] "r" (pDest), [expected] "r" (expected), [desired] "r" (desired) \
+                    : "ar.ccv", "memory" \
+                    ); \
+                break ; \
+            case memory_order_release: \
+                __asm__ __volatile__ ( \
+                    "mov ar.ccv = %[expected] ;;\n\t" \
+                    "cmpxchg" #n_bytes ".rel %[current] = [%[pDest]], %[desired], ar.ccv\n\t" \
+                    : [current] "=r" (current) \
+                    : [pDest] "r" (pDest), [expected] "r" (expected), [desired] "r" (desired) \
+                    : "ar.ccv", "memory" \
+                    ); \
+                break ; \
+            case memory_order_acq_rel: \
+            case memory_order_seq_cst: \
+                __asm__ __volatile__ ( \
+                    "mov ar.ccv = %[expected] ;;\n\t" \
+                    "cmpxchg" #n_bytes ".rel %[current] = [%[pDest]], %[desired], ar.ccv\n\t" \
+                    "mf \n\t" \
+                    : [current] "=r" (current) \
+                    : [pDest] "r" (pDest), [expected] "r" (expected), [desired] "r" (desired) \
+                    : "ar.ccv", "memory" \
+                    ); \
+                break; \
+            default: \
+                assert(false); \
+            } \
+            bool bSuccess = expected == current ; \
+            expected = current ; \
+            return bSuccess ; \
+        } \
+        template <typename T> \
+        static inline bool cas##n_bits##_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT \
+        { return cas##n_bits##_strong( pDest, expected, desired, mo_success, mo_fail ); }
+
+        // xchg is performed with acquire semantics
+#define CDS_ITANIUM_ATOMIC_EXCHANGE( n_bytes, n_bits ) \
+        template <typename T> \
+        static inline T exchange##n_bits( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT \
+        { \
+            static_assert( sizeof(T) == n_bytes, "Illegal size of operand" )   ; \
+            assert( pDest != NULL ) ; \
+            T current ; \
+            switch(order) \
+            { \
+            case memory_order_relaxed: \
+            case memory_order_consume: \
+            case memory_order_acquire: \
+                __asm__ __volatile__ ( \
+                    "xchg" #n_bytes " %[current] = [%[pDest]], %[val]\n\t" \
+                    : [current] "=r" (current) \
+                    : [pDest] "r" (pDest), [val] "r" (val) \
+                    : "memory" \
+                    ); \
+                break; \
+            case memory_order_acq_rel: \
+            case memory_order_release: \
+            case memory_order_seq_cst: \
+                __asm__ __volatile__ ( \
+                    "mf \n\t" \
+                    "xchg" #n_bytes " %[current] = [%[pDest]], %[val]\n\t" \
+                    : [current] "=r" (current) \
+                    : [pDest] "r" (pDest), [val] "r" (val) \
+                    : "memory" \
+                    ); \
+                break; \
+            default: assert(false); \
+            } \
+            return current ; \
+        }
+
+#define CDS_ITANIUM_ATOMIC_FETCH_ADD( n_bytes, n_add )  \
+        switch (order) { \
+            case memory_order_relaxed: \
+            case memory_order_consume: \
+            case memory_order_acquire: \
+                __asm__ __volatile__ ( \
+                    "fetchadd" #n_bytes ".acq %[cur] = [%[pDest]], " #n_add " \n\t" \
+                    : [cur] "=r" (cur) \
+                    : [pDest] "r" (pDest) \
+                    : "memory" \
+                    ); \
+                break ; \
+            case memory_order_release: \
+                __asm__ __volatile__ ( \
+                    "fetchadd" #n_bytes ".rel %[cur] = [%[pDest]], " #n_add " \n\t" \
+                    : [cur] "=r" (cur) \
+                    : [pDest] "r" (pDest) \
+                    : "memory" \
+                    ); \
+                break ; \
+            case memory_order_acq_rel: \
+            case memory_order_seq_cst: \
+                __asm__ __volatile__ ( \
+                    "fetchadd" #n_bytes ".rel %[cur] = [%[pDest]], " #n_add " \n\t" \
+                    "mf \n\t" \
+                    : [cur] "=r" (cur) \
+                    : [pDest] "r" (pDest) \
+                    : "memory" \
+                    ); \
+                break ; \
+            default: \
+                assert(false); \
+        }
+
+        //-----------------------------------------------------------------------------
+        // 8bit primitives
+        //-----------------------------------------------------------------------------
+
+        CDS_ITANIUM_ATOMIC_LOAD( 1, 8 )
+        CDS_ITANIUM_ATOMIC_STORE( 1, 8 )
+        CDS_ITANIUM_ATOMIC_CAS( 1, 8 )
+        CDS_ITANIUM_ATOMIC_EXCHANGE( 1, 8 )
+
+        //-----------------------------------------------------------------------------
+        // 16bit primitives
+        //-----------------------------------------------------------------------------
+
+        CDS_ITANIUM_ATOMIC_LOAD( 2, 16 )
+        CDS_ITANIUM_ATOMIC_STORE( 2, 16 )
+        CDS_ITANIUM_ATOMIC_CAS( 2, 16 )
+        CDS_ITANIUM_ATOMIC_EXCHANGE( 2, 16 )
+
+        //-----------------------------------------------------------------------------
+        // 32bit primitives
+        //-----------------------------------------------------------------------------
+
+        CDS_ITANIUM_ATOMIC_LOAD( 4, 32 )
+        CDS_ITANIUM_ATOMIC_STORE( 4, 32 )
+        CDS_ITANIUM_ATOMIC_CAS( 4, 32 )
+        CDS_ITANIUM_ATOMIC_EXCHANGE( 4, 32 )
+
+#       define CDS_ATOMIC_fetch32_add_defined
+        template <typename T>
+        static inline T fetch32_add( T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            T cur;
+            switch ( val ) {
+                case 1:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 4, 1 );
+                    break;
+                case 4:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 4, 4 );
+                    break;
+                case 8:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 4, 8 );
+                    break;
+                case 16:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 4, 16 );
+                    break;
+                default:
+                    cur = load32( pDest, memory_order_relaxed );
+                    do {} while ( !cas32_strong( pDest, cur, cur + val, order, memory_order_relaxed ));
+                    break;
+            }
+            return cur;
+        }
+
+#       define CDS_ATOMIC_fetch32_sub_defined
+        template <typename T>
+        static inline T fetch32_sub( T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( pDest != NULL );
+            T cur;
+            switch ( val ) {
+                case 1:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 4, -1 );
+                    break;
+                case 4:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 4, -4 );
+                    break;
+                case 8:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 4, -8 );
+                    break;
+                case 16:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 4, -16 );
+                    break;
+                default:
+                    cur = load32( pDest, memory_order_relaxed );
+                    do {} while ( !cas32_strong( pDest, cur, cur - val, order, memory_order_relaxed ));
+                    break;
+            }
+            return cur;
+        }
+
+        //-----------------------------------------------------------------------------
+        // 64bit primitives
+        //-----------------------------------------------------------------------------
+
+        CDS_ITANIUM_ATOMIC_LOAD( 8, 64 )
+        CDS_ITANIUM_ATOMIC_STORE( 8, 64 )
+        CDS_ITANIUM_ATOMIC_CAS( 8, 64 )
+        CDS_ITANIUM_ATOMIC_EXCHANGE( 8, 64 )
+
+#       define CDS_ATOMIC_fetch64_add_defined
+        template <typename T>
+        static inline T fetch64_add( T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            T cur;
+            switch ( val ) {
+                case 1:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, 1 );
+                    break;
+                case 4:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, 4 );
+                    break;
+                case 8:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, 8 );
+                    break;
+                case 16:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, 16 );
+                    break;
+                default:
+                    cur = load64( pDest, memory_order_relaxed );
+                    do {} while ( !cas64_strong( pDest, cur, cur + val, order, memory_order_relaxed ));
+                    break;
+            }
+            return cur;
+        }
+
+#       define CDS_ATOMIC_fetch64_sub_defined
+        template <typename T>
+        static inline T fetch64_sub( T volatile * pDest, T val, memory_order order) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( pDest != NULL );
+            T cur;
+            switch ( val ) {
+                case 1:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, -1 );
+                    break;
+                case 4:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, -4 );
+                    break;
+                case 8:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, -8 );
+                    break;
+                case 16:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, -16 );
+                    break;
+                default:
+                    cur = load64( pDest, memory_order_relaxed );
+                    do {} while ( !cas64_strong( pDest, cur, cur - val, order, memory_order_relaxed ));
+                    break;
+            }
+            return cur;
+        }
+
+        //-----------------------------------------------------------------------------
+        // pointer primitives
+        //-----------------------------------------------------------------------------
+        template <typename T>
+        static inline T * load_ptr( T * volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            assert( order ==  memory_order_relaxed
+                 || order ==  memory_order_consume
+                 || order ==  memory_order_acquire
+                 || order == memory_order_seq_cst
+            );
+            assert( pSrc != NULL );
+            T * val;
+            __asm__ __volatile__ (
+                "ld8.acq %[val] = [%[pSrc]]  \n\t"
+                : [val] "=r" (val)
+                : [pSrc] "r" (pSrc)
+                : "memory"
+            );
+            return val;
+        }
+
+        template <typename T>
+        static inline void store_ptr( T * volatile * pDest, T * val, memory_order order ) CDS_NOEXCEPT
+        {
+            assert( order ==  memory_order_relaxed
+                 || order ==  memory_order_release
+                 || order == memory_order_seq_cst
+            );
+            assert( pDest != NULL );
+
+            if ( order == memory_order_seq_cst ) {
+                __asm__ __volatile__ (
+                    "st8.rel [%[pDest]] = %[val] \n\t"
+                    "mf     \n\t"
+                    :: [pDest] "r" (pDest), [val] "r" (val)
+                    : "memory"
+                );
+            }
+            else {
+                __asm__ __volatile__ (
+                    "st8.rel [%[pDest]] = %[val] \n\t"
+                    :: [pDest] "r" (pDest), [val] "r" (val)
+                    : "memory"
+                );
+                fence_after(order);
+            }
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_strong( T * volatile * pDest, T *& expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == 8, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            T * current;
+
+            switch(mo_success) {
+            case memory_order_relaxed:
+            case memory_order_consume:
+            case memory_order_acquire:
+                __asm__ __volatile__ (
+                    "mov ar.ccv = %[expected] ;;\n\t"
+                    "cmpxchg8.acq %[current] = [%[pDest]], %[desired], ar.ccv\n\t"
+                    : [current] "=r" (current)
+                    : [pDest] "r" (pDest), [expected] "r" (expected), [desired] "r" (desired)
+                    : "ar.ccv", "memory"
+                );
+                break;
+            case memory_order_release:
+               __asm__ __volatile__ (
+                   "mov ar.ccv = %[expected] ;;\n\t"
+                   "cmpxchg8.rel %[current] = [%[pDest]], %[desired], ar.ccv\n\t"
+                   : [current] "=r" (current)
+                   : [pDest] "r" (pDest), [expected] "r" (expected), [desired] "r" (desired)
+                   : "ar.ccv", "memory"
+               );
+               break;
+            case memory_order_acq_rel:
+            case memory_order_seq_cst:
+               __asm__ __volatile__ (
+                   "mov ar.ccv = %[expected] ;;\n\t"
+                   "cmpxchg8.rel %[current] = [%[pDest]], %[desired], ar.ccv\n\t"
+                   "mf \n\t"
+                   : [current] "=r" (current)
+                   : [pDest] "r" (pDest), [expected] "r" (expected), [desired] "r" (desired)
+                   : "ar.ccv", "memory"
+               );
+               break;
+            default:
+                assert(false);
+            }
+
+            bool bSuccess = expected == current;
+            expected = current;
+            if ( !bSuccess )
+                fence_after( mo_fail );
+            return bSuccess;
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_weak( T * volatile * pDest, T *& expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas_ptr_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline T * exchange_ptr( T * volatile * pDest, T * val, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == 8, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            T * current;
+            switch(order) {
+                case memory_order_relaxed:
+                case memory_order_consume:
+                case memory_order_acquire:
+                    __asm__ __volatile__ (
+                        "xchg8 %[current] = [%[pDest]], %[val]\n\t"
+                        : [current] "=r" (current)
+                        : [pDest] "r" (pDest), [val] "r" (val)
+                        : "memory"
+                    );
+                    break;
+                case memory_order_acq_rel:
+                case memory_order_release:
+                case memory_order_seq_cst:
+                    __asm__ __volatile__ (
+                        "mf \n\t"
+                        "xchg8 %[current] = [%[pDest]], %[val]\n\t"
+                        : [current] "=r" (current)
+                        : [pDest] "r" (pDest), [val] "r" (val)
+                        : "memory"
+                    );
+                    break;
+                default: assert(false);
+            }
+            return current;
+        }
+
+
+        template <typename T> struct atomic_pointer_sizeof { enum { value = sizeof(T) }; };
+        template <> struct atomic_pointer_sizeof<void> { enum { value = 1 }; };
+
+        // It does not work properly
+        // atomic.fetch_add( ... ) returns NULL, why?..
+//#       define CDS_ATOMIC_fetch_ptr_add_defined
+        template <typename T>
+        static inline T * fetch_ptr_add( T * volatile * pDest, ptrdiff_t val, memory_order order) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == 8, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            T * cur;
+            val *= atomic_pointer_sizeof<T>::value;
+            switch ( val ) {
+                case 1:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, 1 );
+                    break;
+                case 4:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, 4 );
+                    break;
+                case 8:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, 8 );
+                    break;
+                case 16:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, 16 );
+                    break;
+                default:
+                    cur = load_ptr( pDest, memory_order_relaxed );
+                    do {} while ( !cas_ptr_strong( pDest, cur, reinterpret_cast<T *>(reinterpret_cast<uint8_t *>(cur) + val), order, memory_order_relaxed ));
+                    break;
+            }
+            return cur;
+        }
+
+        // It does not work properly
+        // atomic.fetch_sub( ... ) returns NULL, why?..
+//#       define CDS_ATOMIC_fetch_ptr_sub_defined
+        template <typename T>
+        static inline T * fetch_ptr_sub( T * volatile * pDest, ptrdiff_t val, memory_order order) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == 8, "Illegal size of operand" );
+            assert( pDest != NULL );
+            T * cur;
+            val *= atomic_pointer_sizeof<T>::value;
+            switch ( val ) {
+                case 1:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, -1 );
+                    break;
+                case 4:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, -4 );
+                    break;
+                case 8:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, -8 );
+                    break;
+                case 16:
+                    CDS_ITANIUM_ATOMIC_FETCH_ADD( 8, -16 );
+                    break;
+                default:
+                    cur = load_ptr( pDest, memory_order_relaxed );
+                    do {} while ( !cas_ptr_strong( pDest, cur, reinterpret_cast<T *>(reinterpret_cast<uint8_t *>(cur) - val), order, memory_order_relaxed ));
+                    break;
+            }
+            return cur;
+        }
+
+        //-----------------------------------------------------------------------------
+        // atomic flag primitives
+        //-----------------------------------------------------------------------------
+
+        typedef bool atomic_flag_type;
+        static inline bool atomic_flag_tas( atomic_flag_type volatile * pFlag, memory_order order ) CDS_NOEXCEPT
+        {
+            return exchange8( pFlag, true, order );
+        }
+
+        static inline void atomic_flag_clear( atomic_flag_type volatile * pFlag, memory_order order ) CDS_NOEXCEPT
+        {
+            store8( pFlag, false, order );
+        }
+
+#undef CDS_ITANIUM_ATOMIC_LOAD
+#undef CDS_ITANIUM_ATOMIC_STORE
+#undef CDS_ITANIUM_ATOMIC_CAS
+#undef CDS_ITANIUM_ATOMIC_EXCHANGE
+#undef CDS_ITANIUM_ATOMIC_FETCH_ADD
+
+    }} // namespace gcc::ia64
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using namespace gcc::ia64;
+#endif
+    }   // namespace platform
+}}  // namespace cds::cxx11_atomics
+//@endcond
+
+#endif // #ifndef __CDS_COMPILER_GCC_IA64_CXX11_ATOMIC_H
diff --git a/cds/compiler/gcc/ppc64/backoff.h b/cds/compiler/gcc/ppc64/backoff.h
new file mode 100644 (file)
index 0000000..d4d1252
--- /dev/null
@@ -0,0 +1,19 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_PPC64_BACKOFF_H
+#define __CDS_COMPILER_GCC_PPC64_BACKOFF_H
+
+//@cond none
+
+namespace cds { namespace backoff {
+    namespace gcc { namespace ppc64 {
+
+    }} // namespace gcc::ppc64
+
+    namespace platform {
+        using namespace gcc::ppc64;
+    }
+}}  // namespace cds::backoff
+
+//@endcond
+#endif  // #ifndef __CDS_COMPILER_GCC_PPC64_BACKOFF_H
diff --git a/cds/compiler/gcc/ppc64/bitop.h b/cds/compiler/gcc/ppc64/bitop.h
new file mode 100644 (file)
index 0000000..c435d39
--- /dev/null
@@ -0,0 +1,17 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_PPC64_BITOP_H
+#define __CDS_COMPILER_GCC_PPC64_BITOP_H
+
+//@cond none
+namespace cds {
+    namespace bitop { namespace platform { namespace gcc { namespace ppc64 {
+
+    }} // namespace gcc::ppc64
+
+    using namespace gcc::ppc64;
+
+}}}    // namespace cds::bitop::platform
+//@endcond
+
+#endif // #ifndef __CDS_COMPILER_GCC_PPC64_BITOP_H
diff --git a/cds/compiler/gcc/sparc/backoff.h b/cds/compiler/gcc/sparc/backoff.h
new file mode 100644 (file)
index 0000000..e8f9b28
--- /dev/null
@@ -0,0 +1,30 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_SPARC_BACKOFF_H
+#define __CDS_COMPILER_GCC_SPARC_BACKOFF_H
+
+//@cond none
+
+namespace cds { namespace backoff {
+    namespace gcc { namespace Sparc {
+
+#       define CDS_backoff_pause_defined
+        static inline void backoff_pause( unsigned int nLoop = 0x000003FF )
+        {}
+
+#       define CDS_backoff_nop_defined
+        static inline void backoff_nop()
+        {
+            asm volatile ( "nop;" );
+        }
+
+
+    }} // namespace gcc::Sparc
+
+    namespace platform {
+        using namespace gcc::Sparc;
+    }
+}}  // namespace cds::backoff
+
+//@endcond
+#endif  // #ifndef __CDS_COMPILER_GCC_SPARC_BACKOFF_H
diff --git a/cds/compiler/gcc/sparc/bitop.h b/cds/compiler/gcc/sparc/bitop.h
new file mode 100644 (file)
index 0000000..632b401
--- /dev/null
@@ -0,0 +1,42 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_SPARC_BITOP_H
+#define __CDS_COMPILER_GCC_SPARC_BITOP_H
+
+//@cond none
+namespace cds {
+    namespace bitop { namespace platform { namespace gcc { namespace Sparc {
+
+        // MSB - return index (1..64) of most significant bit in nArg. If nArg == 0 return 0
+        // Source: UltraSPARC Architecture 2007
+        //
+        // Test result: this variant and its variation about 100 times slower then generic implementation :-(
+        static inline int sparc_msb64( atomic64u_t nArg )
+        {
+            atomic64u_t result;
+            asm volatile (
+                "neg %[nArg], %[result] \n\t"
+                "xnor %[nArg], %[result], %%g5 \n\t"
+                "popc %%g5, %[result] \n\t"
+                "movrz %[nArg], %%g0, %[result] \n\t"
+                : [result] "=r" (result)
+                : [nArg] "r" (nArg)
+                : "g5"
+            );
+            return result;
+        }
+
+        // MSB - return index (1..32) of most significant bit in nArg. If nArg == 0 return 0
+        static inline int sparc_msb32( atomic32u_t nArg )
+        {
+            return sparc_msb64( (atomic64u_t) nArg );
+        }
+
+    }} // namespace gcc::Sparc
+
+    using namespace gcc::Sparc;
+
+}}}    // namespace cds::bitop::platform
+//@endcond
+
+#endif // #ifndef __CDS_COMPILER_GCC_SPARC_BITOP_H
diff --git a/cds/compiler/gcc/sparc/cxx11_atomic.h b/cds/compiler/gcc/sparc/cxx11_atomic.h
new file mode 100644 (file)
index 0000000..801bc79
--- /dev/null
@@ -0,0 +1,610 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_SPARC_CXX11_ATOMIC_H
+#define __CDS_COMPILER_GCC_SPARC_CXX11_ATOMIC_H
+
+#include <cstdint>
+
+/*
+    Source:
+
+    1. [Doug Lea "JSR-133 Cookbook for Compiler Writers]:
+
+        Acquire semantics: load; LoadLoad+LoadStore
+        Release semantics: LoadStore+StoreStore; store
+
+    2. boost::atomic library by Helge Bahman
+    3. OpenSparc source code
+*/
+
+#if CDS_OS_TYPE == CDS_OS_LINUX
+#   define CDS_SPARC_RMO_MEMORY_MODEL
+#endif
+
+#define CDS_SPARC_MB_FULL    "membar #Sync \n\t"
+#ifdef CDS_SPARC_RMO_MEMORY_MODEL
+        // RMO memory model (Linux only?..) Untested
+#   define CDS_SPARC_MB_LL_LS       "membar #LoadLoad|#LoadStore \n\t"
+#   define CDS_SPARC_MB_LS_SS       "membar #LoadStore|#StoreStore \n\t"
+#   define CDS_SPARC_MB_LL_LS_SS    "membar #LoadLoad|#LoadStore|#StoreStore \n\t"
+#else
+        // TSO memory model (default; Solaris uses this model)
+#   define CDS_SPARC_MB_LL_LS
+#   define CDS_SPARC_MB_LS_SS
+#   define CDS_SPARC_MB_LL_LS_SS
+#endif
+
+#define CDS_SPARC_MB_ACQ        CDS_SPARC_MB_LL_LS
+#define CDS_SPARC_MB_REL        CDS_SPARC_MB_LS_SS
+#define CDS_SPARC_MB_ACQ_REL    CDS_SPARC_MB_LL_LS_SS
+#define CDS_SPARC_MB_SEQ_CST    CDS_SPARC_MB_FULL
+
+//@cond
+namespace cds { namespace cxx11_atomics {
+    namespace platform { CDS_CXX11_INLINE_NAMESPACE namespace gcc { CDS_CXX11_INLINE_NAMESPACE namespace Sparc {
+
+        static inline void fence_before( memory_order order ) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_relaxed:
+            case memory_order_acquire:
+            case memory_order_consume:
+                break;
+            case memory_order_release:
+            case memory_order_acq_rel:
+                __asm__ __volatile__ ( "" CDS_SPARC_MB_REL ::: "memory" );
+                break;
+            case memory_order_seq_cst:
+                __asm__ __volatile__ ( "" CDS_SPARC_MB_FULL ::: "memory" );
+                break;
+            }
+        }
+
+        static inline void fence_after( memory_order order ) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_relaxed:
+            case memory_order_consume:
+            case memory_order_release:
+                break;
+            case memory_order_acquire:
+            case memory_order_acq_rel:
+                __asm__ __volatile__ ( "" CDS_SPARC_MB_ACQ ::: "memory" );
+                break;
+            case memory_order_seq_cst:
+                __asm__ __volatile__ ( "" CDS_SPARC_MB_FULL ::: "memory" );
+                break;
+            }
+        }
+
+
+        //-----------------------------------------------------------------------------
+        // fences
+        //-----------------------------------------------------------------------------
+        static inline void thread_fence(memory_order order) CDS_NOEXCEPT
+        {
+            switch(order)
+            {
+                case memory_order_relaxed:
+                case memory_order_consume:
+                    break;
+                case memory_order_acquire:
+                    __asm__ __volatile__ ( "" CDS_SPARC_MB_ACQ ::: "memory" );
+                    break;
+                case memory_order_release:
+                    __asm__ __volatile__ ( "" CDS_SPARC_MB_REL ::: "memory" );
+                    break;
+                case memory_order_acq_rel:
+                    __asm__ __volatile__ ( "" CDS_SPARC_MB_ACQ_REL ::: "memory" );
+                    break;
+                case memory_order_seq_cst:
+                    __asm__ __volatile__ ( "" CDS_SPARC_MB_SEQ_CST ::: "memory"  );
+                    break;
+                default:;
+            }
+        }
+
+        static inline void signal_fence(memory_order order) CDS_NOEXCEPT
+        {
+            // C++11: 29.8.8: only compiler optimization, no hardware instructions
+            switch(order)
+            {
+                case memory_order_relaxed:
+                    break;
+                case memory_order_consume:
+                case memory_order_release:
+                case memory_order_acquire:
+                case memory_order_acq_rel:
+                case memory_order_seq_cst:
+                    CDS_COMPILER_RW_BARRIER;
+                    break;
+                default:;
+            }
+        }
+
+        //-----------------------------------------------------------------------------
+        // atomic flag primitives
+        //-----------------------------------------------------------------------------
+
+        typedef unsigned char atomic_flag_type;
+        static inline bool atomic_flag_tas( atomic_flag_type volatile * pFlag, memory_order order ) CDS_NOEXCEPT
+        {
+            atomic_flag_type fCur;
+            fence_before( order );
+            __asm__ __volatile__(
+                "ldstub    [%[pFlag]], %[fCur] \n\t"
+                : [fCur] "=r"(fCur)
+                : [pFlag] "r"(pFlag)
+                : "memory", "cc"
+                );
+            fence_after( order );
+            return fCur != 0;
+        }
+
+        static inline void atomic_flag_clear( atomic_flag_type volatile * pFlag, memory_order order ) CDS_NOEXCEPT
+        {
+            fence_before( order );
+            __asm__ __volatile__(
+                CDS_SPARC_MB_REL
+                "stub    %%g0, [%[pFlag]] \n\t"
+                :: [pFlag] "r"(pFlag)
+                : "memory"
+            );
+            fence_after( order );
+        }
+
+        //-----------------------------------------------------------------------------
+        // 32bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline void store32( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            fence_before(order);
+            *pDest = src;
+            fence_after(order);
+        }
+
+        template <typename T>
+        static inline T load32( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            fence_before(order);
+            T v = *pSrc;
+            fence_after(order);
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas32_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            fence_before( mo_success );
+            __asm__ __volatile__(
+                "cas [%[pDest]], %[expected], %[desired]"
+                : [desired] "+r" (desired)
+                : [pDest] "r" (pDest), [expected] "r" (expected)
+                : "memory"
+                );
+
+            // desired contains current value
+
+            bool bSuccess = desired == expected;
+            if ( bSuccess )
+                fence_after( mo_success );
+            else {
+                fence_after(mo_fail);
+                expected = desired;
+            }
+
+            return bSuccess;
+        }
+
+        template <typename T>
+        static inline bool cas32_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas32_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline T exchange32( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            // This primitive could be implemented via "swap" instruction but "swap" is deprecated in UltraSparc
+
+            T cur = load32( pDest, memory_order_relaxed );
+            do {} while ( !cas32_strong( pDest, cur, v, order, memory_order_relaxed ));
+            return cur;
+        }
+
+        //-----------------------------------------------------------------------------
+        // 64bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline T load64( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            fence_before(order);
+            T v = *pSrc;
+            fence_after(order);
+            return v;
+        }
+
+        template <typename T>
+        static inline void store64( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            fence_before(order);
+            *pDest = val;
+            fence_after(order);
+
+        }
+
+        template <typename T>
+        static inline bool cas64_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            fence_before( mo_success );
+            __asm__ __volatile__(
+                "casx [%[pDest]], %[expected], %[desired]"
+                : [desired] "+r" (desired)
+                : [pDest] "r" (pDest), [expected] "r" (expected)
+                : "memory"
+                );
+
+            // desired contains current value
+
+            bool bSuccess = desired == expected;
+            if ( bSuccess ) {
+                fence_after( mo_success );
+            }
+            else {
+                fence_after(mo_fail);
+                expected = desired;
+            }
+
+            return bSuccess;
+        }
+
+        template <typename T>
+        static inline bool cas64_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas64_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline T exchange64( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            T cur = load64( pDest, memory_order_relaxed );
+            do {} while ( !cas64_strong( pDest, cur, v, order, memory_order_relaxed ));
+            return cur;
+        }
+
+        //-----------------------------------------------------------------------------
+        // 8bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline void store8( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            fence_before( order );
+            *pDest = src;
+            fence_after( order );
+        }
+
+        template <typename T>
+        static inline T load8( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order == memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            fence_before( order );
+            T v = *pSrc;
+            fence_after( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas8_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            union u32 {
+                uint32_t    w;
+                T           c[4];
+            };
+            static_assert( sizeof(u32) == sizeof(uint32_t), "Argument size error" );
+
+            u32 volatile *  pDest32 = (u32 *)( uintptr_t( pDest ) & ~0x03 );
+            size_t const  nCharIdx = (size_t)( uintptr_t( pDest ) & 0x03 );
+            u32 uExpected;
+            u32 uDesired;
+
+            bool bSuccess;
+            for (;;) {
+                uExpected.w =
+                    uDesired.w = pDest32->w;
+                uExpected.c[nCharIdx] = expected;
+                uDesired.c[nCharIdx] = desired;
+
+                bSuccess = cas32_weak( reinterpret_cast<uint32_t volatile *>(pDest32), uExpected.w, uDesired.w, mo_success, mo_fail );
+                if ( bSuccess || uExpected.c[nCharIdx] != expected )
+                    break;
+            }
+
+            expected = uExpected.c[nCharIdx];
+            return bSuccess;
+        }
+
+        template <typename T>
+        static inline bool cas8_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            union u32 {
+                uint32_t    w;
+                T           c[4];
+            };
+            static_assert( sizeof(u32) == sizeof(uint32_t), "Argument size error" );
+
+            u32 volatile * pDest32 = (u32 *)( uintptr_t( pDest ) & ~0x03 );
+            size_t const  nCharIdx = (size_t)( uintptr_t( pDest ) & 0x03 );
+            u32 uExpected;
+            u32 uDesired;
+
+            uExpected.w =
+                uDesired.w = pDest32->w;
+            uExpected.c[nCharIdx] = expected;
+            uDesired.c[nCharIdx] = desired;
+
+            bool bSuccess = cas32_weak( reinterpret_cast<uint32_t volatile *>(pDest32), uExpected.w, uDesired.w, mo_success, mo_fail );
+
+            expected = uExpected.c[nCharIdx];
+            return bSuccess;
+        }
+
+        template <typename T>
+        static inline T exchange8( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            T cur = load8( pDest, memory_order_relaxed );
+            do {} while ( !cas8_strong( pDest, cur, v, order, memory_order_relaxed ));
+            return cur;
+        }
+
+        //-----------------------------------------------------------------------------
+        // 16bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline T load16( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            fence_before( order );
+            T v = *pSrc;
+            fence_after( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline void store16( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            fence_before(order);
+            *pDest = src;
+            fence_after(order);
+        }
+
+        template <typename T>
+        static inline bool cas16_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            union u32 {
+                uint32_t    w;
+                T           c[2];
+            };
+            static_assert( sizeof(u32) == sizeof(uint32_t), "Argument size error" );
+
+            u32 volatile *  pDest32 = (u32 *)( uintptr_t( pDest ) & ~0x03 );
+            size_t const  nIdx = (size_t)( (uintptr_t( pDest ) >> 1) & 0x01 );
+            u32 uExpected;
+            u32 uDesired;
+
+            bool bSuccess;
+            for (;;) {
+                uExpected.w =
+                    uDesired.w = pDest32->w;
+                uExpected.c[nIdx] = expected;
+                uDesired.c[nIdx] = desired;
+
+                bSuccess = cas32_weak( reinterpret_cast<uint32_t volatile *>(pDest32), uExpected.w, uDesired.w, mo_success, mo_fail );
+                if ( bSuccess || uExpected.c[nIdx] != expected )
+                    break;
+            }
+
+            expected = uExpected.c[nIdx];
+            return bSuccess;
+        }
+
+        template <typename T>
+        static inline bool cas16_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            union u32 {
+                uint32_t    w;
+                T           c[2];
+            };
+            static_assert( sizeof(u32) == sizeof(uint32_t), "Argument size error" );
+
+            u32 volatile * pDest32 = (u32 *)( uintptr_t( pDest ) & ~0x03 );
+            size_t const  nIdx = (size_t)( (uintptr_t( pDest ) >> 1) & 0x01 );
+            u32 uExpected;
+            u32 uDesired;
+
+            uExpected.w =
+                uDesired.w = pDest32->w;
+            uExpected.c[nIdx] = expected;
+            uDesired.c[nIdx] = desired;
+
+            bool bSuccess = cas32_weak( reinterpret_cast<uint32_t volatile *>(pDest32), uExpected.w, uDesired.w, mo_success, mo_fail );
+
+            expected = uExpected.c[nIdx];
+            return bSuccess;
+        }
+
+        template <typename T>
+        static inline T exchange16( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( pDest != NULL );
+
+            T cur = load16( pDest, memory_order_relaxed );
+            do {} while ( !cas16_strong( pDest, cur, v, order, memory_order_relaxed ));
+            return cur;
+        }
+
+        //-----------------------------------------------------------------------------
+        // pointer primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline void store_ptr( T * volatile * pDest, T * src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            fence_before(order);
+            *pDest = src;
+            fence_after(order);
+        }
+
+        template <typename T>
+        static inline T * load_ptr( T * volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            fence_before( order );
+            T * v = *pSrc;
+            fence_after( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_strong( T * volatile * pDest, T *& expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+
+            return cas64_strong( (uint64_t volatile *) pDest, *reinterpret_cast<uint64_t *>( &expected ), (uint64_t) desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_weak( T * volatile * pDest, T *& expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas_ptr_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline T * exchange_ptr( T * volatile * pDest, T * v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+            return (T *) exchange64( (uint64_t volatile *) pDest, (uint64_t) v, order );
+        }
+
+    }} // namespace gcc::Sparc
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using namespace gcc::Sparc;
+#endif
+    }   // namespace platform
+}}  // namespace cds::cxx11_atomics
+//@endcond
+
+#undef CDS_SPARC_MB_ACQ
+#undef CDS_SPARC_MB_REL
+#undef CDS_SPARC_MB_SEQ_CST
+#undef CDS_SPARC_MB_FULL
+#undef CDS_SPARC_MB_LL_LS
+#undef CDS_SPARC_MB_LS_SS
+#undef CDS_SPARC_MB_LL_LS_SS
+
+#endif // #ifndef __CDS_COMPILER_GCC_AMD64_CXX11_ATOMIC_H
diff --git a/cds/compiler/gcc/x86/backoff.h b/cds/compiler/gcc/x86/backoff.h
new file mode 100644 (file)
index 0000000..074c9c3
--- /dev/null
@@ -0,0 +1,39 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_X86_BACKOFF_H
+#define __CDS_COMPILER_GCC_X86_BACKOFF_H
+
+//@cond none
+
+namespace cds { namespace backoff {
+    namespace gcc { namespace x86 {
+
+#       define CDS_backoff_pause_defined
+        static inline void backoff_pause( unsigned int nLoop = 0x000003FF )
+        {
+            asm volatile (
+                "andl %[nLoop], %%ecx;      \n\t"
+                "cmovzl %[nLoop], %%ecx;    \n\t"
+                "rep; "
+                "nop;   \n\t"
+                : /*no output*/
+                : [nLoop] "r" (nLoop)
+                : "ecx", "cc"
+                );
+        }
+
+#       define CDS_backoff_nop_defined
+        static inline void backoff_nop()
+        {
+            asm volatile ( "nop;" );
+        }
+
+    }} // namespace gcc::x86
+
+    namespace platform {
+        using namespace gcc::x86;
+    }
+}}  // namespace cds::backoff
+
+//@endcond
+#endif  // #ifndef __CDS_COMPILER_GCC_X86_BACKOFF_H
diff --git a/cds/compiler/gcc/x86/bitop.h b/cds/compiler/gcc/x86/bitop.h
new file mode 100644 (file)
index 0000000..3982fb9
--- /dev/null
@@ -0,0 +1,86 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_X86_BITOP_H
+#define __CDS_COMPILER_GCC_X86_BITOP_H
+
+//@cond none
+namespace cds {
+    namespace bitop { namespace platform { namespace gcc { namespace x86 {
+        // MSB - return index (1..32) of most significant bit in nArg. If nArg == 0 return 0
+#        define cds_bitop_msb32_DEFINED
+        static inline int msb32( atomic32u_t nArg )
+        {
+            int        nRet;
+            __asm__ __volatile__ (
+                "bsrl        %[nArg], %[nRet]     ;\n\t"
+                "jnz        1f                    ;\n\t"
+                "xorl        %[nRet], %[nRet]    ;\n\t"
+                "subl        $1, %[nRet]         ;\n\t"
+            "1:"
+                "addl        $1, %[nRet]         ;\n\t"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+            );
+            return nRet;
+        }
+
+#        define cds_bitop_msb32nz_DEFINED
+        static inline int msb32nz( atomic32u_t nArg )
+        {
+            assert( nArg != 0 );
+            int        nRet;
+            __asm__ __volatile__ (
+                "bsrl        %[nArg], %[nRet]    ;"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+            );
+            return nRet;
+        }
+
+        // LSB - return index (0..31) of least significant bit in nArg. If nArg == 0 return -1U
+#        define cds_bitop_lsb32_DEFINED
+        static inline int lsb32( atomic32u_t nArg )
+        {
+
+            int        nRet;
+            __asm__ __volatile__ (
+                "bsfl        %[nArg], %[nRet]     ;"
+                "jnz        1f        ;"
+                "xorl        %[nRet], %[nRet]    ;"
+                "subl        $1, %[nRet]         ;"
+                "1:"
+                "addl        $1, %[nRet]         ;"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+                );
+            return nRet;
+
+        }
+
+        // LSB - return index (0..31) of least significant bit in nArg.
+        // Condition: nArg != 0
+#        define cds_bitop_lsb32nz_DEFINED
+        static inline int lsb32nz( atomic32u_t nArg )
+        {
+            assert( nArg != 0 );
+            int        nRet;
+            __asm__ __volatile__ (
+                "bsfl        %[nArg], %[nRet]    ;"
+                : [nRet] "=a" (nRet)
+                : [nArg] "r" (nArg)
+                : "cc"
+                );
+            return nRet;
+        }
+
+    }} // namespace gcc::x86
+
+    using namespace gcc::x86;
+
+}}}    // namespace cds::bitop::platform
+//@endcond
+
+#endif    // #ifndef __CDS_ARH_X86_GCC_BITOP_H
diff --git a/cds/compiler/gcc/x86/cxx11_atomic.h b/cds/compiler/gcc/x86/cxx11_atomic.h
new file mode 100644 (file)
index 0000000..152ccc7
--- /dev/null
@@ -0,0 +1,184 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_X86_CXX11_ATOMIC_H
+#define __CDS_COMPILER_GCC_X86_CXX11_ATOMIC_H
+
+#include <cstdint>
+#include <cds/compiler/gcc/x86/cxx11_atomic32.h>
+
+//@cond
+namespace cds { namespace cxx11_atomics {
+    namespace platform { CDS_CXX11_INLINE_NAMESPACE namespace gcc { CDS_CXX11_INLINE_NAMESPACE namespace x86 {
+
+        //-----------------------------------------------------------------------------
+        // 64bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline bool cas64_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            uint32_t ebxStore;
+            T prev = expected;
+
+            fence_before(mo_success);
+
+            // We must save EBX in PIC mode
+            __asm__ __volatile__ (
+                "movl %%ebx, %[ebxStore]\n"
+                "movl %[desiredLo], %%ebx\n"
+                "lock; cmpxchg8b 0(%[pDest])\n"
+                "movl %[ebxStore], %%ebx\n"
+                : [prev] "=A" (prev), [ebxStore] "=m" (ebxStore)
+                : [desiredLo] "D" ((int)desired), [desiredHi] "c" ((int)(desired >> 32)), [pDest] "S" (pDest), "0" (prev)
+                : "memory");
+            bool success = (prev == expected);
+            if (success)
+                fence_after(mo_success);
+            else {
+                fence_after(mo_fail);
+                expected = prev;
+            }
+            return success;
+        }
+
+        template <typename T>
+        static inline bool cas64_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas64_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline T load64( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+            assert( cds::details::is_aligned( pSrc, 8 ));
+
+            T CDS_DATA_ALIGNMENT(8) v;
+            __asm__ __volatile__(
+                "movq   (%[pSrc]), %[v]   ;   \n\t"
+                : [v] "=x" (v)
+                : [pSrc] "r" (pSrc)
+                :
+            );
+            return v;
+        }
+
+
+        template <typename T>
+        static inline T exchange64( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            T cur = load64( pDest, memory_order_relaxed );
+            do {
+            } while (!cas64_weak( pDest, cur, v, order, memory_order_relaxed ));
+            return cur;
+        }
+
+        template <typename T>
+        static inline void store64( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                // Atomically stores 64bit value by SSE instruction
+                __asm__ __volatile__(
+                    "movq       %[val], (%[pDest])   ;   \n\t"
+                    :
+                    : [val] "x" (val), [pDest] "r" (pDest)
+                    : "memory"
+                    );
+            }
+            else {
+                exchange64( pDest, val, order );
+            }
+        }
+
+
+        //-----------------------------------------------------------------------------
+        // pointer primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline T * exchange_ptr( T * volatile * pDest, T * v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+
+            return (T *) exchange32( (uint32_t volatile *) pDest, (uint32_t) v, order );
+        }
+
+        template <typename T>
+        static inline void store_ptr( T * volatile * pDest, T * src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange_ptr( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T * load_ptr( T * volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            T * v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_strong( T * volatile * pDest, T *& expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+
+            return cas32_strong( (uint32_t volatile *) pDest, *reinterpret_cast<uint32_t *>( &expected ), (uint32_t) desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_weak( T * volatile * pDest, T *& expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas_ptr_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+    }} // namespace gcc::x86
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+        using namespace gcc::x86;
+#endif
+    }   // namespace platform
+}}  // namespace cds::cxx11_atomics
+//@endcond
+
+#endif // #ifndef __CDS_COMPILER_GCC_X86_CXX11_ATOMIC_H
diff --git a/cds/compiler/gcc/x86/cxx11_atomic32.h b/cds/compiler/gcc/x86/cxx11_atomic32.h
new file mode 100644 (file)
index 0000000..c945a98
--- /dev/null
@@ -0,0 +1,474 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_GCC_X86_CXX11_ATOMIC32_H
+#define __CDS_COMPILER_GCC_X86_CXX11_ATOMIC32_H
+
+#include <cstdint>
+#include <cds/details/is_aligned.h>
+
+//@cond
+namespace cds { namespace cxx11_atomics {
+    namespace platform { CDS_CXX11_INLINE_NAMESPACE namespace gcc { CDS_CXX11_INLINE_NAMESPACE namespace x86 {
+
+        static inline void fence_before( memory_order order ) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_relaxed:
+            case memory_order_acquire:
+            case memory_order_consume:
+                break;
+            case memory_order_release:
+            case memory_order_acq_rel:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            case memory_order_seq_cst:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            }
+        }
+
+        static inline void fence_after( memory_order order ) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_acquire:
+            case memory_order_acq_rel:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            case memory_order_relaxed:
+            case memory_order_consume:
+            case memory_order_release:
+                break;
+            case memory_order_seq_cst:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            }
+        }
+
+
+        static inline void fence_after_load(memory_order order) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_relaxed:
+            case memory_order_release:
+                break;
+            case memory_order_acquire:
+            case memory_order_acq_rel:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            case memory_order_consume:
+                break;
+            case memory_order_seq_cst:
+                __asm__ __volatile__ ( "mfence" ::: "memory"  );
+                break;
+            default:;
+            }
+        }
+
+        //-----------------------------------------------------------------------------
+        // fences
+        //-----------------------------------------------------------------------------
+        static inline void thread_fence(memory_order order) CDS_NOEXCEPT
+        {
+            switch(order)
+            {
+                case memory_order_relaxed:
+                case memory_order_consume:
+                    break;
+                case memory_order_release:
+                case memory_order_acquire:
+                case memory_order_acq_rel:
+                    CDS_COMPILER_RW_BARRIER;
+                    break;
+                case memory_order_seq_cst:
+                    __asm__ __volatile__ ( "mfence" ::: "memory"  );
+                    break;
+                default:;
+            }
+        }
+
+        static inline void signal_fence(memory_order order) CDS_NOEXCEPT
+        {
+            // C++11: 29.8.8: only compiler optimization, no hardware instructions
+            switch(order)
+            {
+                case memory_order_relaxed:
+                    break;
+                case memory_order_consume:
+                case memory_order_release:
+                case memory_order_acquire:
+                case memory_order_acq_rel:
+                case memory_order_seq_cst:
+                    CDS_COMPILER_RW_BARRIER;
+                    break;
+                default:;
+            }
+        }
+
+        //-----------------------------------------------------------------------------
+        // 8bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline bool cas8_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+
+            T prev = expected;
+            fence_before(mo_success);
+            __asm__ __volatile__  (
+                "lock ; cmpxchgb %[desired], %[pDest]"
+                : [prev] "+a" (prev), [pDest] "+m" (*pDest)
+                : [desired] "q" (desired)
+                );
+            bool success = (prev == expected);
+            expected = prev;
+            if (success)
+                fence_after(mo_success);
+            else
+                fence_after(mo_fail);
+            return success;
+        }
+
+        template <typename T>
+        static inline bool cas8_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas8_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline T exchange8( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+
+            fence_before(order);
+            __asm__ __volatile__  (
+                "xchgb %[v], %[pDest]"
+                : [v] "+q" (v), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return v;
+        }
+
+        template <typename T>
+        static inline void store8( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange8( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T load8( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order == memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            T v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+#       define CDS_ATOMIC_fetch8_add_defined
+        template <typename T>
+        static inline T fetch8_add( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+        {
+            fence_before(order);
+            __asm__ __volatile__  (
+                "lock ; xaddb %[val], %[pDest]"
+                : [val] "+q" (val), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return val;
+        }
+
+#       define CDS_ATOMIC_fetch8_sub_defined
+        template <typename T>
+        static inline T fetch8_sub( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+        {
+            fence_before(order);
+            __asm__ __volatile__  (
+                "negb %[val] ; \n"
+                "lock ; xaddb %[val], %[pDest]"
+                : [val] "+q" (val), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return val;
+        }
+
+        //-----------------------------------------------------------------------------
+        // atomic flag primitives
+        //-----------------------------------------------------------------------------
+
+        typedef bool atomic_flag_type;
+        static inline bool atomic_flag_tas( atomic_flag_type volatile * pFlag, memory_order order ) CDS_NOEXCEPT
+        {
+            return exchange8( pFlag, true, order );
+        }
+
+        static inline void atomic_flag_clear( atomic_flag_type volatile * pFlag, memory_order order ) CDS_NOEXCEPT
+        {
+            store8( pFlag, false, order );
+        }
+
+        //-----------------------------------------------------------------------------
+        // 16bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline T exchange16( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 2 ));
+
+            fence_before(order);
+            __asm__ __volatile__  (
+                "xchgw %[v], %[pDest]"
+                : [v] "+q" (v), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return v;
+        }
+
+        template <typename T>
+        static inline void store16( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+            assert( cds::details::is_aligned( pDest, 2 ));
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange16( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T load16( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+            assert( cds::details::is_aligned( pSrc, 2 ));
+
+            T v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas16_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 2 ));
+
+            T prev = expected;
+            fence_before(mo_success);
+            __asm__ __volatile__  (
+                "lock ; cmpxchgw %[desired], %[pDest]"
+                : [prev] "+a" (prev), [pDest] "+m" (*pDest)
+                : [desired] "q" (desired)
+                );
+            bool success = prev == expected;
+            if (success)
+                fence_after(mo_success);
+            else {
+                fence_after(mo_fail);
+                expected = prev;
+            }
+
+            return success;
+        }
+
+        template <typename T>
+        static inline bool cas16_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas16_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+#       define CDS_ATOMIC_fetch16_add_defined
+        template <typename T>
+        static inline T fetch16_add( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 2 ));
+
+            fence_before(order);
+            __asm__ __volatile__  (
+                "lock ; xaddw %[val], %[pDest]"
+                : [val] "+q" (val), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return val;
+        }
+
+#       define CDS_ATOMIC_fetch16_sub_defined
+        template <typename T>
+        static inline T fetch16_sub( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 2 ));
+
+            fence_before(order);
+            __asm__ __volatile__  (
+                "negw %[val] ; \n"
+                "lock ; xaddw %[val], %[pDest]"
+                : [val] "+q" (val), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return val;
+        }
+
+        //-----------------------------------------------------------------------------
+        // 32bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline T exchange32( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            fence_before(order);
+            __asm__ __volatile__  (
+                "xchgl %[v], %[pDest]"
+                : [v] "+r" (v), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return v;
+        }
+
+        template <typename T>
+        static inline void store32( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange32( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T load32( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+            assert( cds::details::is_aligned( pSrc, 4 ));
+
+            T v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas32_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            T prev = expected;
+            fence_before(mo_success);
+            __asm__ __volatile__  (
+                "lock ; cmpxchgl %[desired], %[pDest]"
+                : [prev] "+a" (prev), [pDest] "+m" (*pDest)
+                : [desired] "r" (desired)
+                );
+            bool success = prev == expected;
+            if (success)
+                fence_after(mo_success);
+            else {
+                fence_after(mo_fail);
+                expected = prev;
+            }
+            return success;
+        }
+
+        template <typename T>
+        static inline bool cas32_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas32_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        // fetch_xxx may be emulated via cas32
+        // If the platform has special fetch_xxx instruction
+        // then it should define CDS_ATOMIC_fetch32_xxx_defined macro
+
+#       define CDS_ATOMIC_fetch32_add_defined
+        template <typename T>
+        static inline T fetch32_add( T volatile * pDest, T v, memory_order order) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            fence_before(order);
+            __asm__ __volatile__  (
+                "lock ; xaddl %[v], %[pDest]"
+                : [v] "+r" (v), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return v;
+        }
+
+#       define CDS_ATOMIC_fetch32_sub_defined
+        template <typename T>
+        static inline T fetch32_sub( T volatile * pDest, T v, memory_order order) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            fence_before(order);
+            __asm__ __volatile__  (
+                "negl   %[v] ; \n"
+                "lock ; xaddl %[v], %[pDest]"
+                : [v] "+r" (v), [pDest] "+m" (*pDest)
+                );
+            fence_after(order);
+            return v;
+        }
+
+    }}} // namespace platform::gcc::x86
+}}  // namespace cds::cxx11_atomics
+//@endcond
+
+#endif // #ifndef __CDS_COMPILER_GCC_X86_CXX11_ATOMIC32_H
diff --git a/cds/compiler/icl/compiler_barriers.h b/cds/compiler/icl/compiler_barriers.h
new file mode 100644 (file)
index 0000000..d06e014
--- /dev/null
@@ -0,0 +1,30 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_ICL_COMPILER_BARRIERS_H
+#define __CDS_COMPILER_ICL_COMPILER_BARRIERS_H
+
+#if _MSC_VER > 0
+#   if _MSC_VER < 1700
+        // VC++ up to vc10
+#       include <intrin.h>
+
+#       pragma intrinsic(_ReadWriteBarrier)
+#       pragma intrinsic(_ReadBarrier)
+#       pragma intrinsic(_WriteBarrier)
+
+#       define CDS_COMPILER_RW_BARRIER  _ReadWriteBarrier()
+#       define CDS_COMPILER_R_BARRIER   _ReadBarrier()
+#       define CDS_COMPILER_W_BARRIER   _WriteBarrier()
+
+#   else
+        // MS VC11+
+#       include <atomic>
+
+#       define CDS_COMPILER_RW_BARRIER  std::atomic_thread_fence( std::memory_order_acq_rel )
+#       define CDS_COMPILER_R_BARRIER   CDS_COMPILER_RW_BARRIER
+#       define CDS_COMPILER_W_BARRIER   CDS_COMPILER_RW_BARRIER
+
+#   endif
+#endif
+
+#endif  // #ifndef __CDS_COMPILER_ICL_COMPILER_BARRIERS_H
diff --git a/cds/compiler/icl/cxx11_atomic_patches_win.h b/cds/compiler/icl/cxx11_atomic_patches_win.h
new file mode 100644 (file)
index 0000000..b5719d7
--- /dev/null
@@ -0,0 +1,27 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_ICL_CXX11_ATOMIC_PATCHES_WIN_H
+#define __CDS_COMPILER_ICL_CXX11_ATOMIC_PATCHES_WIN_H
+
+//@cond
+#if CDS_COMPILER == CDS_COMPILER_INTEL && CDS_CXX11_ATOMIC_SUPPORT == 1 && _MSC_VER < 1700
+
+namespace std {
+    typedef std::atomic<size_t> atomic_size_t;
+
+    // Fences
+    static inline void atomic_thread_fence(memory_order order) CDS_NOEXCEPT
+    {
+        CDS_COMPILER_RW_BARRIER;
+    }
+    static inline void atomic_signal_fence(memory_order order) CDS_NOEXCEPT
+    {
+        CDS_COMPILER_RW_BARRIER;
+    }
+
+}
+
+#endif
+//@endcond
+
+#endif // #ifndef __CDS_COMPILER_ICL_CXX11_ATOMIC_PATCHES_WIN_H
diff --git a/cds/compiler/icl/defs.h b/cds/compiler/icl/defs.h
new file mode 100644 (file)
index 0000000..96391fd
--- /dev/null
@@ -0,0 +1,207 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_ICL_DEFS_H
+#define __CDS_COMPILER_ICL_DEFS_H
+//@cond
+
+// Compiler version
+#ifdef __ICL
+#   define CDS_COMPILER_VERSION    __ICL
+#else
+#   define CDS_COMPILER_VERSION    __INTEL_COMPILER
+#endif
+
+// Compiler name
+// Supported compilers: MS VC 2008, 2010, 2012
+//
+#   define  CDS_COMPILER__NAME  "Intel C++"
+#   define  CDS_COMPILER__NICK  "icl"
+
+// OS name
+#if defined(_WIN64)
+#   define CDS_OS_INTERFACE CDS_OSI_WINDOWS
+#   define CDS_OS_TYPE      CDS_OS_WIN64
+#   define CDS_OS__NAME     "Win64"
+#   define CDS_OS__NICK     "Win64"
+#elif defined(_WIN32)
+#   define CDS_OS_INTERFACE CDS_OSI_WINDOWS
+#   define CDS_OS_TYPE      CDS_OS_WIN32
+#   define CDS_OS__NAME     "Win32"
+#   define CDS_OS__NICK     "Win32"
+#elif defined( __linux__ )
+#   define CDS_OS_INTERFACE     CDS_OSI_UNIX
+#   define CDS_OS_TYPE          CDS_OS_LINUX
+#   define CDS_OS__NAME         "linux"
+#   define CDS_OS__NICK         "linux"
+#endif
+
+// Processor architecture
+#if defined(_M_X64) || defined(_M_AMD64)
+#   define CDS_BUILD_BITS       64
+#   define CDS_PROCESSOR_ARCH   CDS_PROCESSOR_AMD64
+#   define CDS_PROCESSOR__NAME  "AMD64"
+#   define CDS_PROCESSOR__NICK  "amd64"
+#elif defined(_M_IX86)
+#   define CDS_BUILD_BITS       32
+#   define CDS_PROCESSOR_ARCH   CDS_PROCESSOR_X86
+#   define CDS_PROCESSOR__NAME  "Intel x86"
+#   define CDS_PROCESSOR__NICK  "x86"
+#else
+#   define CDS_BUILD_BITS        -1
+#   define CDS_PROCESSOR_ARCH    CDS_PROCESSOR_UNKNOWN
+#   define CDS_PROCESSOR__NAME    "<<Undefined>>"
+#   error Intel C++ compiler is supported for x86 only
+#endif
+
+#if CDS_OS_INTERFACE == CDS_OSI_WINDOWS
+#   define  __attribute__( _x )
+#   define  CDS_STDCALL    __stdcall
+#else
+#   if CDS_PROCESSOR_ARCH == CDS_PROCESSOR_X86
+#       define CDS_STDCALL __attribute__((stdcall))
+#   else
+#       define CDS_STDCALL
+#   endif
+#endif
+
+#if CDS_OS_INTERFACE == CDS_OSI_WINDOWS
+#   ifdef CDS_BUILD_LIB
+#       define CDS_EXPORT_API          __declspec(dllexport)
+#   else
+#       define CDS_EXPORT_API          __declspec(dllimport)
+#   endif
+#endif
+
+#if CDS_OS_INTERFACE == CDS_OSI_WINDOWS
+#   define alignof     __alignof
+#else
+#   define alignof __alignof__
+#endif
+
+//#if CDS_COMPILER_VERSION < 1600
+//#   include <boost/static_assert.hpp>
+//#   define static_assert(_expr, _msg)     BOOST_STATIC_ASSERT((_expr))
+//#endif
+
+// Memory leaks detection (debug build only)
+//#ifdef _DEBUG
+//#   define _CRTDBG_MAP_ALLOC
+//#   define _CRTDBG_MAPALLOC
+//#   include <stdlib.h>
+//#   include <crtdbg.h>
+//#   define CDS_MSVC_MEMORY_LEAKS_DETECTING_ENABLED
+//#endif
+
+#if CDS_COMPILER_VERSION < 1400
+#   define CDS_CONSTEXPR
+#   define CDS_CONSTEXPR_CONST const
+#else
+#   define CDS_CONSTEXPR    constexpr
+#   define CDS_CONSTEXPR_CONST constexpr const
+#endif
+
+// noexcept is not yet supported
+#if CDS_COMPILER_VERSION < 1400
+#   define CDS_NOEXCEPT_SUPPORT
+#   define CDS_NOEXCEPT_SUPPORT_(expr)
+#else
+#   define CDS_NOEXCEPT_SUPPORT        noexcept
+#   define CDS_NOEXCEPT_SUPPORT_(expr) noexcept(expr)
+#endif
+
+// C++11 atomic support
+#if CDS_COMPILER_VERSION >= 1300 && CDS_OS_INTERFACE == CDS_OSI_WINDOWS && _MSC_VER >= 1700
+    // Intel C++ 13 supports C++11 atomic standard for VC++ 2012
+#   define CDS_CXX11_ATOMIC_SUPPORT     1
+#endif
+
+
+// Lambda (ICL 12 +)
+#if CDS_COMPILER_VERSION >= 1200
+#   define CDS_CXX11_LAMBDA_SUPPORT
+#endif
+
+// RValue (ICL 10+)
+#if CDS_COMPILER_VERSION >= 1200
+#   define CDS_RVALUE_SUPPORT
+#   define CDS_MOVE_SEMANTICS_SUPPORT
+#endif
+
+// Default template arguments for function templates (ICL 12.1+)
+#if CDS_COMPILER_VERSION >= 1201
+#   define CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+#endif
+
+// C++11 delete definition ( function declaration = delete)
+#if CDS_COMPILER_VERSION >= 1200
+#   define CDS_CXX11_DELETE_DEFINITION_SUPPORT
+#endif
+
+// C++11 explicitly-defaulted function (= default) [std 8.4.2 [dcl.fct.def.default]]
+#if CDS_COMPILER_VERSION >= 1200
+#   define CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+#endif
+
+// Variadic template support (ICL 12.1+)
+#if CDS_COMPILER_VERSION >= 1201
+#   define CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT     1
+#endif
+
+// C++11 template alias
+#if CDS_COMPILER_VERSION >= 1201
+#   define CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
+#endif
+
+// C++11 inline namespace
+#if CDS_COMPILER_VERSION >= 1400
+#   define CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+#endif
+
+// Explicit conversion operator
+//#if CDS_COMPILER_VERSION >= 1800
+//#   define CDS_CXX11_EXPLICIT_CONVERSION_OPERATOR_SUPPORT
+//#endif
+
+
+// <cstdint>
+// <cstdint>
+#if _MSC_VER == 1500
+// MS VC 2008 has no <cstdint>
+#   include <cds/compiler/cstdint_boost.h>
+#else
+#   include <cds/compiler/cstdint_std.h>
+#endif
+
+// Thread support library (thread, mutex, condition variable)
+#if _MSC_VER >= 1700
+    // MS VC 11+
+#   define CDS_CXX11_STDLIB_THREAD
+#   define CDS_CXX11_STDLIB_MUTEX
+#   define CDS_CXX11_STDLIB_CONDITION_VARIABLE
+#   define CDS_CXX11_STDLIB_CHRONO
+#endif
+
+#if defined( CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT ) && defined(CDS_MOVE_SEMANTICS_SUPPORT) && CDS_COMPILER_VERSION < 1400
+    // Intel C++ bug: move ctor & assignment operator cannot be defaulted
+    // http://software.intel.com/en-us/forums/topic/394395
+#   define CDS_DISABLE_DEFAULT_MOVE_CTOR
+#endif
+
+
+// *************************************************
+// Alignment macro
+
+#if CDS_OS_INTERFACE == CDS_OSI_WINDOWS
+#   define CDS_TYPE_ALIGNMENT(n)     __declspec( align(n) )
+#   define CDS_DATA_ALIGNMENT(n)     __declspec( align(n) )
+#   define CDS_CLASS_ALIGNMENT(n)    __declspec( align(n) )
+#else
+#   define CDS_TYPE_ALIGNMENT(n)   __attribute__ ((aligned (n)))
+#   define CDS_CLASS_ALIGNMENT(n)  __attribute__ ((aligned (n)))
+#   define CDS_DATA_ALIGNMENT(n)   __attribute__ ((aligned (n)))
+#endif
+
+#include <cds/compiler/icl/compiler_barriers.h>
+
+//@endcond
+#endif // #ifndef __CDS_COMPILER_VC_DEFS_H
diff --git a/cds/compiler/vc/amd64/backoff.h b/cds/compiler/vc/amd64/backoff.h
new file mode 100644 (file)
index 0000000..fa569a7
--- /dev/null
@@ -0,0 +1,32 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_VC_AMD64_BACKOFF_H
+#define __CDS_COMPILER_VC_AMD64_BACKOFF_H
+
+//@cond none
+
+namespace cds { namespace backoff {
+    namespace vc { namespace amd64 {
+
+#       define CDS_backoff_pause_defined
+        static inline void backoff_pause( unsigned int nLoop = 0x000003FF )
+        {
+            for ( unsigned int i = 0; i < nLoop; i++ )
+                __nop();
+        }
+
+#       define CDS_backoff_nop_defined
+        static inline void backoff_nop()
+        {
+            __nop();
+        }
+
+    }} // namespace vc::amd64
+
+    namespace platform {
+        using namespace vc::amd64;
+    }
+}}  // namespace cds::backoff
+
+//@endcond
+#endif  // #ifndef __CDS_COMPILER_VC_AMD64_BACKOFF_H
diff --git a/cds/compiler/vc/amd64/bitop.h b/cds/compiler/vc/amd64/bitop.h
new file mode 100644 (file)
index 0000000..ee143d6
--- /dev/null
@@ -0,0 +1,126 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_VC_AMD64_BITOP_H
+#define __CDS_COMPILER_VC_AMD64_BITOP_H
+
+#if _MSC_VER == 1500
+    /*
+        VC 2008 bug:
+            math.h(136) : warning C4985: 'ceil': attributes not present on previous declaration.
+            intrin.h(142) : see declaration of 'ceil'
+
+        See http://connect.microsoft.com/VisualStudio/feedback/details/381422/warning-of-attributes-not-present-on-previous-declaration-on-ceil-using-both-math-h-and-intrin-h
+    */
+#   pragma warning(push)
+#   pragma warning(disable: 4985)
+#   include <intrin.h>
+#   pragma warning(pop)
+#else
+#   include <intrin.h>
+#endif
+
+#pragma intrinsic(_BitScanReverse)
+#pragma intrinsic(_BitScanForward)
+#pragma intrinsic(_BitScanReverse64)
+#pragma intrinsic(_BitScanForward64)
+
+//@cond none
+namespace cds {
+    namespace bitop { namespace platform { namespace vc { namespace amd64 {
+
+        // MSB - return index (1..32) of most significant bit in nArg. If nArg == 0 return 0
+#        define cds_bitop_msb32_DEFINED
+        static inline int msb32( atomic32u_t nArg )
+        {
+            unsigned long nIndex;
+            if ( _BitScanReverse( &nIndex, nArg ))
+                return (int) nIndex + 1;
+            return 0;
+        }
+
+#        define cds_bitop_msb32nz_DEFINED
+        static inline int msb32nz( atomic32u_t nArg )
+        {
+            assert( nArg != 0 );
+            unsigned long nIndex;
+            _BitScanReverse( &nIndex, nArg );
+            return (int) nIndex;
+        }
+
+        // LSB - return index (1..32) of least significant bit in nArg. If nArg == 0 return -1U
+#        define cds_bitop_lsb32_DEFINED
+        static inline int lsb32( atomic32u_t nArg )
+        {
+            unsigned long nIndex;
+            if ( _BitScanForward( &nIndex, nArg ))
+                return (int) nIndex + 1;
+            return 0;
+        }
+
+#        define cds_bitop_lsb32nz_DEFINED
+        static inline int lsb32nz( atomic32u_t nArg )
+        {
+            assert( nArg != 0 );
+            unsigned long nIndex;
+            _BitScanForward( &nIndex, nArg );
+            return (int) nIndex;
+        }
+
+
+#        define cds_bitop_msb64_DEFINED
+        static inline int msb64( atomic64u_unaligned nArg )
+        {
+            unsigned long nIndex;
+            if ( _BitScanReverse64( &nIndex, nArg ))
+                return (int) nIndex + 1;
+            return 0;
+        }
+
+#        define cds_bitop_msb64nz_DEFINED
+        static inline int msb64nz( atomic64u_unaligned nArg )
+        {
+            assert( nArg != 0 );
+            unsigned long nIndex;
+            _BitScanReverse64( &nIndex, nArg );
+            return (int) nIndex;
+        }
+
+#        define cds_bitop_lsb64_DEFINED
+        static inline int lsb64( atomic64u_unaligned nArg )
+        {
+            unsigned long nIndex;
+            if ( _BitScanForward64( &nIndex, nArg ))
+                return (int) nIndex + 1;
+            return 0;
+        }
+
+#        define cds_bitop_lsb64nz_DEFINED
+        static inline int lsb64nz( atomic64u_unaligned nArg )
+        {
+            assert( nArg != 0 );
+            unsigned long nIndex;
+            _BitScanForward64( &nIndex, nArg );
+            return (int) nIndex;
+        }
+
+#       define cds_bitop_complement32_DEFINED
+        static inline bool complement32( atomic32u_t * pArg, unsigned int nBit )
+        {
+            return _bittestandcomplement( reinterpret_cast<long *>( pArg ), nBit ) != 0;
+        }
+
+#       define cds_bitop_complement64_DEFINED
+        static inline bool complement64( atomic64u_t * pArg, unsigned int nBit )
+        {
+            return _bittestandcomplement64( reinterpret_cast<__int64 *>( pArg ), nBit ) != 0;
+        }
+
+
+    }} // namespace vc::amd64
+
+    using namespace vc::amd64;
+
+}}}    // namespace cds::bitop::platform
+//@endcond
+
+#endif    // #ifndef __CDS_COMPILER_VC_AMD64_BITOP_H
diff --git a/cds/compiler/vc/amd64/cxx11_atomic.h b/cds/compiler/vc/amd64/cxx11_atomic.h
new file mode 100644 (file)
index 0000000..49b2f2c
--- /dev/null
@@ -0,0 +1,584 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_VC_AMD64_CXX11_ATOMIC_H
+#define __CDS_COMPILER_VC_AMD64_CXX11_ATOMIC_H
+
+#include <intrin.h>
+#include <emmintrin.h>  // for 128bit atomic load/store
+#include <cds/details/is_aligned.h>
+
+#pragma intrinsic( _InterlockedIncrement )
+#pragma intrinsic( _InterlockedDecrement )
+#pragma intrinsic( _InterlockedCompareExchange )
+#pragma intrinsic( _InterlockedCompareExchangePointer )
+#pragma intrinsic( _InterlockedCompareExchange16 )
+#pragma intrinsic( _InterlockedCompareExchange64 )
+#pragma intrinsic( _InterlockedExchange )
+#pragma intrinsic( _InterlockedExchange64 )
+#pragma intrinsic( _InterlockedExchangePointer )
+#pragma intrinsic( _InterlockedExchangeAdd )
+#pragma intrinsic( _InterlockedExchangeAdd64 )
+//#pragma intrinsic( _InterlockedAnd )
+//#pragma intrinsic( _InterlockedOr )
+//#pragma intrinsic( _InterlockedXor )
+//#pragma intrinsic( _InterlockedAnd64 )
+//#pragma intrinsic( _InterlockedOr64 )
+//#pragma intrinsic( _InterlockedXor64 )
+#pragma intrinsic( _interlockedbittestandset )
+#if _MSC_VER >= 1600
+#   pragma intrinsic( _InterlockedCompareExchange8 )
+#   pragma intrinsic( _InterlockedExchange8 )
+#   pragma intrinsic( _InterlockedExchange16 )
+#endif
+
+//@cond
+namespace cds { namespace cxx11_atomics {
+    namespace platform { CDS_CXX11_INLINE_NAMESPACE namespace vc { CDS_CXX11_INLINE_NAMESPACE namespace amd64 {
+
+        static inline void fence_before( memory_order order ) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_relaxed:
+            case memory_order_acquire:
+            case memory_order_consume:
+                break;
+            case memory_order_release:
+            case memory_order_acq_rel:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            case memory_order_seq_cst:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            }
+        }
+
+        static inline void fence_after( memory_order order ) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_acquire:
+            case memory_order_acq_rel:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            case memory_order_relaxed:
+            case memory_order_consume:
+            case memory_order_release:
+                break;
+            case memory_order_seq_cst:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            }
+        }
+
+        static inline void full_fence()
+        {
+            // MS VC does not support inline assembler in C code.
+            // So, we use InterlockedExchange for full fence instead of mfence inst
+            long t;
+            _InterlockedExchange( &t, 0 );
+        }
+
+        static inline void fence_after_load(memory_order order) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_relaxed:
+            case memory_order_release:
+                break;
+            case memory_order_acquire:
+            case memory_order_acq_rel:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            case memory_order_consume:
+                break;
+            case memory_order_seq_cst:
+                full_fence();
+                break;
+            default:;
+            }
+        }
+
+        //-----------------------------------------------------------------------------
+        // fences
+        //-----------------------------------------------------------------------------
+        static inline void thread_fence(memory_order order) CDS_NOEXCEPT
+        {
+            switch(order)
+            {
+                case memory_order_relaxed:
+                case memory_order_consume:
+                    break;
+                case memory_order_release:
+                case memory_order_acquire:
+                case memory_order_acq_rel:
+                    CDS_COMPILER_RW_BARRIER;
+                    break;
+                case memory_order_seq_cst:
+                    full_fence();
+                    break;
+                default:;
+            }
+        }
+
+        static inline void signal_fence(memory_order order) CDS_NOEXCEPT
+        {
+            // C++11: 29.8.8: only compiler optimization, no hardware instructions
+            switch(order)
+            {
+                case memory_order_relaxed:
+                    break;
+                case memory_order_consume:
+                case memory_order_release:
+                case memory_order_acquire:
+                case memory_order_acq_rel:
+                case memory_order_seq_cst:
+                    CDS_COMPILER_RW_BARRIER;
+                    break;
+                default:;
+            }
+        }
+
+        //-----------------------------------------------------------------------------
+        // atomic flag primitives
+        //-----------------------------------------------------------------------------
+
+        typedef unsigned char atomic_flag_type;
+        static inline bool atomic_flag_tas( atomic_flag_type volatile * pFlag, memory_order /*order*/ ) CDS_NOEXCEPT
+        {
+            return _interlockedbittestandset( (long volatile *) pFlag, 0 ) != 0;
+        }
+
+        static inline void atomic_flag_clear( atomic_flag_type volatile * pFlag, memory_order order ) CDS_NOEXCEPT
+        {
+            assert( order != memory_order_acquire
+                && order != memory_order_acq_rel
+                );
+
+            fence_before( order );
+            *pFlag = 0;
+            fence_after( order );
+        }
+
+        //-----------------------------------------------------------------------------
+        // 8bit primitives
+        //-----------------------------------------------------------------------------
+
+#if _MSC_VER >= 1600
+#   pragma warning(push)
+        // Disable warning C4800: 'char' : forcing value to bool 'true' or 'false' (performance warning)
+#   pragma warning( disable: 4800 )
+#endif
+        template <typename T>
+        static inline bool cas8_strong( T volatile * pDest, T& expected, T desired, memory_order /*mo_success*/, memory_order /*mo_fail*/ ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+
+#       if _MSC_VER >= 1600
+            // VC 2010 +
+            T prev = expected;
+            expected = (T) _InterlockedCompareExchange8( (char volatile*) pDest, (char) desired, (char) expected );
+            return expected == prev;
+#       else
+            // VC 2008
+            unsigned int *  pnDest = (unsigned int *)( ((unsigned __int64) pDest) & ~(unsigned __int64(3)) );
+            unsigned int    nOffset = ((unsigned __int64) pDest) & 3;
+            unsigned int    nExpected;
+            unsigned int    nDesired;
+
+            for (;;) {
+                nExpected =
+                    nDesired = *pnDest;
+                memcpy( reinterpret_cast<T *>(&nExpected) + nOffset, &expected, sizeof(T));
+                memcpy( reinterpret_cast<T *>(&nDesired) + nOffset, &desired, sizeof(T));
+
+                unsigned int nPrev = (unsigned int) _InterlockedCompareExchange( (long *) pnDest, (long) nDesired, (long) nExpected );
+                if ( nPrev == nExpected )
+                    return true;
+                T nByte;
+                memcpy( &nByte, reinterpret_cast<T *>(&nPrev) + nOffset, sizeof(T));
+                if ( nByte != expected ) {
+                    expected = nByte;
+                    return false;
+                }
+            }
+#       endif
+        }
+#if _MSC_VER >= 1600
+#   pragma warning(pop)
+#endif
+
+        template <typename T>
+        static inline bool cas8_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas8_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+#if _MSC_VER >= 1600
+#   pragma warning(push)
+        // Disable warning C4800: 'char' : forcing value to bool 'true' or 'false' (performance warning)
+#   pragma warning( disable: 4800 )
+#endif
+        template <typename T>
+        static inline T exchange8( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+
+#       if _MSC_VER >= 1600
+            CDS_UNUSED(order);
+            return (T) _InterlockedExchange8( (char volatile *) pDest, (char) v );
+#       else
+            T expected = *pDest;
+            do {} while ( !cas8_strong( pDest, expected, v, order, memory_order_relaxed ));
+            return expected;
+#       endif
+        }
+#if _MSC_VER >= 1600
+#   pragma warning(pop)
+#endif
+
+        template <typename T>
+        static inline void store8( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange8( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T load8( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order == memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            T v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+        //-----------------------------------------------------------------------------
+        // 16bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline bool cas16_strong( T volatile * pDest, T& expected, T desired, memory_order /*mo_success*/, memory_order /*mo_fail*/ ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 2 ));
+
+            // _InterlockedCompareExchange behave as read-write memory barriers
+            T prev = expected;
+            expected = (T) _InterlockedCompareExchange16( (short *) pDest, (short) desired, (short) expected );
+            return expected == prev;
+        }
+
+        template <typename T>
+        static inline bool cas16_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas16_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline T exchange16( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 2 ));
+
+#       if _MSC_VER >= 1600
+            order;
+            return (T) _InterlockedExchange16( (short volatile *) pDest, (short) v );
+#       else
+            T expected = *pDest;
+            do {} while ( !cas16_strong( pDest, expected, v, order, memory_order_relaxed ));
+            return expected;
+#       endif
+        }
+
+        template <typename T>
+        static inline void store16( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+            assert( cds::details::is_aligned( pDest, 2 ));
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange16( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T load16( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+            assert( cds::details::is_aligned( pSrc, 2 ));
+
+            T v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+        //-----------------------------------------------------------------------------
+        // 32bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline T exchange32( T volatile * pDest, T v, memory_order /*order*/ ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            return (T) _InterlockedExchange( (long *) pDest, (long) v );
+        }
+
+        template <typename T>
+        static inline void store32( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange32( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T load32( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+            assert( cds::details::is_aligned( pSrc, 4 ));
+
+            T v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas32_strong( T volatile * pDest, T& expected, T desired, memory_order /*mo_success*/, memory_order /*mo_fail*/ ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            // _InterlockedCompareExchange behave as read-write memory barriers
+            T prev = expected;
+            expected = (T) _InterlockedCompareExchange( (long *) pDest, (long) desired, (long) expected );
+            return expected == prev;
+        }
+
+        template <typename T>
+        static inline bool cas32_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas32_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        // fetch_xxx may be emulated via cas32
+        // If the platform has special fetch_xxx instruction
+        // then it should define CDS_ATOMIC_fetch32_xxx_defined macro
+
+#       define CDS_ATOMIC_fetch32_add_defined
+        template <typename T>
+        static inline T fetch32_add( T volatile * pDest, T v, memory_order /*order*/) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            // _InterlockedExchangeAdd behave as read-write memory barriers
+            return (T) _InterlockedExchangeAdd( (long *) pDest, (long) v );
+        }
+
+        //-----------------------------------------------------------------------------
+        // 64bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline bool cas64_strong( T volatile * pDest, T& expected, T desired, memory_order /*mo_success*/, memory_order /*mo_fail*/ ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            // _InterlockedCompareExchange behave as read-write memory barriers
+            T prev = expected;
+            expected = (T) _InterlockedCompareExchange64( (__int64 *) pDest, (__int64) desired, (__int64) expected );
+            return expected == prev;
+        }
+
+        template <typename T>
+        static inline bool cas64_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas64_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline T load64( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+            assert( cds::details::is_aligned( pSrc, 8 ));
+
+            T v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+
+        template <typename T>
+        static inline T exchange64( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+
+            T cur = load64( pDest, memory_order_relaxed );
+            do {
+            } while (!cas64_weak( pDest, cur, v, order, memory_order_relaxed ));
+            return cur;
+        }
+
+        template <typename T>
+        static inline void store64( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = val;
+            }
+            else {
+                exchange64( pDest, val, order );
+            }
+        }
+
+#       define CDS_ATOMIC_fetch64_add_defined
+        template <typename T>
+        static inline T fetch64_add( T volatile * pDest, T v, memory_order /*order*/) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal size of operand" );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            // _InterlockedExchangeAdd64 behave as read-write memory barriers
+            return (T) _InterlockedExchangeAdd64( (__int64 *) pDest, (__int64) v );
+        }
+
+        //-----------------------------------------------------------------------------
+        // pointer primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline T * exchange_ptr( T * volatile * pDest, T * v, memory_order /*order*/ ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+            return (T *) _InterlockedExchangePointer( (void * volatile *) pDest, reinterpret_cast<void *>(v) );
+        }
+
+        template <typename T>
+        static inline void store_ptr( T * volatile * pDest, T * src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange_ptr( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T * load_ptr( T * volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            T * v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_strong( T * volatile * pDest, T *& expected, T * desired, memory_order /*mo_success*/, memory_order /*mo_fail*/ ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal size of operand" );
+
+            // _InterlockedCompareExchangePointer behave as read-write memory barriers
+            T * prev = expected;
+            expected = (T *) _InterlockedCompareExchangePointer( (void * volatile *) pDest, (void *) desired, (void *) expected );
+            return expected == prev;
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_weak( T * volatile * pDest, T *& expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas_ptr_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+    }} // namespace vc::amd64
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using namespace vc::amd64;
+#endif
+    } // namespace platform
+}}  // namespace cds::cxx11_atomics
+//@endcond
+
+#endif // #ifndef __CDS_COMPILER_VC_AMD64_CXX11_ATOMIC_H
diff --git a/cds/compiler/vc/compiler_barriers.h b/cds/compiler/vc/compiler_barriers.h
new file mode 100644 (file)
index 0000000..cdeb200
--- /dev/null
@@ -0,0 +1,29 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_VC_COMPILER_BARRIERS_H
+#define __CDS_COMPILER_VC_COMPILER_BARRIERS_H
+
+#if CDS_COMPILER_VERSION < 1700
+    // VC++ up to vc10
+
+#   include <intrin.h>
+
+#   pragma intrinsic(_ReadWriteBarrier)
+#   pragma intrinsic(_ReadBarrier)
+#   pragma intrinsic(_WriteBarrier)
+
+#   define CDS_COMPILER_RW_BARRIER  _ReadWriteBarrier()
+#   define CDS_COMPILER_R_BARRIER   _ReadBarrier()
+#   define CDS_COMPILER_W_BARRIER   _WriteBarrier()
+
+#else
+    // MS VC11+
+#   include <atomic>
+
+#   define CDS_COMPILER_RW_BARRIER  std::atomic_thread_fence( std::memory_order_acq_rel )
+#   define CDS_COMPILER_R_BARRIER   CDS_COMPILER_RW_BARRIER
+#   define CDS_COMPILER_W_BARRIER   CDS_COMPILER_RW_BARRIER
+
+#endif
+
+#endif  // #ifndef __CDS_COMPILER_VC_COMPILER_BARRIERS_H
diff --git a/cds/compiler/vc/defs.h b/cds/compiler/vc/defs.h
new file mode 100644 (file)
index 0000000..e24d30d
--- /dev/null
@@ -0,0 +1,196 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_VC_DEFS_H
+#define __CDS_COMPILER_VC_DEFS_H
+//@cond
+
+// Compiler version
+#define CDS_COMPILER_VERSION    _MSC_VER
+
+// Compiler name
+// Supported compilers: MS VC 2008, 2010, 2012, 2013
+// C++ compiler versions:
+#define CDS_COMPILER_MSVC9  1500    // 2008 vc9
+#define CDS_COMPILER_MSVC10 1600    // 2010 vc10
+#define CDS_COMPILER_MSVC11 1700    // 2012 vc11
+#define CDS_COMPILER_MSVC12 1800    // 2013 vc12
+
+#if _MSC_VER == 1500
+#   define  CDS_COMPILER__NAME  "MS Visual C++ 2008"
+#   define  CDS_COMPILER__NICK  "vc9"
+#elif _MSC_VER == 1600
+#   define  CDS_COMPILER__NAME  "MS Visual C++ 2010"
+#   define  CDS_COMPILER__NICK  "vc10"
+#elif _MSC_VER == 1700
+#   define  CDS_COMPILER__NAME  "MS Visual C++ 2012"
+#   define  CDS_COMPILER__NICK  "vc11"
+#elif _MSC_VER == 1800
+#   define  CDS_COMPILER__NAME  "MS Visual C++ 2013"
+#   define  CDS_COMPILER__NICK  "vc12"
+#else
+#   define  CDS_COMPILER__NAME  "MS Visual C++"
+#   define  CDS_COMPILER__NICK  "msvc"
+#endif
+
+// OS interface
+#define CDS_OS_INTERFACE CDS_OSI_WINDOWS
+
+// OS name
+#if defined(_WIN64)
+#   define CDS_OS_TYPE      CDS_OS_WIN64
+#   define CDS_OS__NAME     "Win64"
+#   define CDS_OS__NICK     "Win64"
+#elif defined(_WIN32)
+#   define CDS_OS_TYPE      CDS_OS_WIN32
+#   define CDS_OS__NAME     "Win32"
+#   define CDS_OS__NICK     "Win32"
+#endif
+
+// Processor architecture
+#ifdef _M_IX86
+#   define CDS_BUILD_BITS       32
+#   define CDS_PROCESSOR_ARCH   CDS_PROCESSOR_X86
+#   define CDS_PROCESSOR__NAME  "Intel x86"
+#   define CDS_PROCESSOR__NICK  "x86"
+#elif _M_X64
+#   define CDS_BUILD_BITS       64
+#   define CDS_PROCESSOR_ARCH   CDS_PROCESSOR_AMD64
+#   define CDS_PROCESSOR__NAME  "AMD64"
+#   define CDS_PROCESSOR__NICK  "amd64"
+#else
+#   define CDS_BUILD_BITS        -1
+#   define CDS_PROCESSOR_ARCH    CDS_PROCESSOR_UNKNOWN
+#   define CDS_PROCESSOR__NAME    "<<Undefined>>"
+#   error Microsoft Visual C++ compiler is supported for x86 only
+#endif
+
+
+#define  __attribute__( _x )
+
+#define  CDS_STDCALL    __stdcall
+
+#ifdef CDS_BUILD_LIB
+#   define CDS_EXPORT_API          __declspec(dllexport)
+#else
+#   define CDS_EXPORT_API          __declspec(dllimport)
+#endif
+
+#define alignof     __alignof
+
+#if CDS_COMPILER_VERSION < 1600
+#   include <boost/static_assert.hpp>
+#   define static_assert(_expr, _msg)     BOOST_STATIC_ASSERT((_expr))
+#endif
+
+// Memory leaks detection (debug build only)
+#ifdef _DEBUG
+#   define _CRTDBG_MAP_ALLOC
+#   define _CRTDBG_MAPALLOC
+#   include <stdlib.h>
+#   include <crtdbg.h>
+#   define CDS_MSVC_MEMORY_LEAKS_DETECTING_ENABLED
+#endif
+
+// constexpr is not yet supported
+#define CDS_CONSTEXPR
+#define CDS_CONSTEXPR_CONST const
+
+// noexcept is not yet supported
+//#define CDS_NOEXCEPT_SUPPORT        noexcept
+//#define CDS_NOEXCEPT_SUPPORT_(expr) noexcept(expr)
+#define CDS_NOEXCEPT_SUPPORT
+#define CDS_NOEXCEPT_SUPPORT_(expr)
+
+// C++11 atomic support
+// MSVC 2012 has <atomic> implementation but all load/store is based on CAS
+// that is quite inefficient.
+// So for VC 2012 we use internal implementation for atomics
+#if CDS_COMPILER_VERSION >= 1800
+#   define CDS_CXX11_ATOMIC_SUPPORT     1
+#endif
+
+
+// Lambda (VC 10 +)
+#if CDS_COMPILER_VERSION >= 1600
+#   define CDS_CXX11_LAMBDA_SUPPORT
+#   if CDS_COMPILER_VERSION < 1700
+#       define CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+#   endif
+#endif
+
+// RValue (VC 10+)
+#if CDS_COMPILER_VERSION >= 1600
+#   define CDS_RVALUE_SUPPORT
+#   define CDS_MOVE_SEMANTICS_SUPPORT
+#endif
+
+// Default template arguments for function templates (VC12+)
+#if CDS_COMPILER_VERSION >= 1800
+#   define CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+#endif
+
+// C++11 delete definition ( function declaration = delete)
+#if CDS_COMPILER_VERSION >= 1800
+#   define CDS_CXX11_DELETE_DEFINITION_SUPPORT
+#endif
+
+// C++11 explicitly-defaulted function (= default) [std 8.4.2 [dcl.fct.def.default]]
+#if CDS_COMPILER_VERSION >= 1800
+#   define CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+#endif
+
+// Variadic template support (VC12+)
+#if CDS_COMPILER_VERSION >= 1800
+#   define CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT     1
+#endif
+
+// C++11 template alias
+#if CDS_COMPILER_VERSION >= 1800
+#   define CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
+#endif
+
+// C++11 inline namespace
+//#define CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+
+// Explicit conversion operator (VC12+)
+#if CDS_COMPILER_VERSION >= 1800
+#   define CDS_CXX11_EXPLICIT_CONVERSION_OPERATOR_SUPPORT
+#endif
+
+
+// <cstdint>
+#if CDS_COMPILER_VERSION == 1500
+    // MS VC 2008 has no <cstdint>
+#   include <cds/compiler/cstdint_boost.h>
+#else
+#   include <cds/compiler/cstdint_std.h>
+#endif
+
+// Thread support library (thread, mutex, condition variable)
+#if CDS_COMPILER_VERSION >= 1700
+    // MS VC 11+
+#   define CDS_CXX11_STDLIB_THREAD
+#   define CDS_CXX11_STDLIB_MUTEX
+#   define CDS_CXX11_STDLIB_CONDITION_VARIABLE
+#   define CDS_CXX11_STDLIB_CHRONO
+#endif
+
+// Full SFINAE support
+//#if CDS_COMPILER_VERSION >= ????
+//#   define CDS_CXX11_SFINAE
+//#endif
+
+
+// *************************************************
+// Alignment macro
+
+// VC 2005 generates error C2719 "formal parameter with __declspec(align('#')) won't be aligned"
+// for function's formal parameter with align declspec
+#define CDS_TYPE_ALIGNMENT(n)     __declspec( align(n) )
+#define CDS_DATA_ALIGNMENT(n)     __declspec( align(n) )
+#define CDS_CLASS_ALIGNMENT(n)    __declspec( align(n) )
+
+#include <cds/compiler/vc/compiler_barriers.h>
+
+//@endcond
+#endif // #ifndef __CDS_COMPILER_VC_DEFS_H
diff --git a/cds/compiler/vc/x86/backoff.h b/cds/compiler/vc/x86/backoff.h
new file mode 100644 (file)
index 0000000..24dc75d
--- /dev/null
@@ -0,0 +1,35 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_VC_X86_BACKOFF_H
+#define __CDS_COMPILER_VC_X86_BACKOFF_H
+
+//@cond none
+
+namespace cds { namespace backoff {
+    namespace vc { namespace x86 {
+
+#       define CDS_backoff_pause_defined
+        static inline void backoff_pause( unsigned int nLoop = 0x000003FF )
+        {
+            __asm {
+                and ecx, nLoop;
+                cmovz ecx, nLoop;
+                rep nop;
+            }
+        }
+
+#       define CDS_backoff_nop_defined
+        static inline void backoff_nop()
+        {
+            __nop();
+        }
+
+    }} // namespace vc::x86
+
+    namespace platform {
+        using namespace vc::x86;
+    }
+}}  // namespace cds::backoff
+
+//@endcond
+#endif  // #ifndef __CDS_COMPILER_VC_X86_BACKOFF_H
diff --git a/cds/compiler/vc/x86/bitop.h b/cds/compiler/vc/x86/bitop.h
new file mode 100644 (file)
index 0000000..f277200
--- /dev/null
@@ -0,0 +1,83 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_VC_X86_BITOP_H
+#define __CDS_COMPILER_VC_X86_BITOP_H
+
+#include <intrin.h>
+#pragma intrinsic(_BitScanReverse)
+#pragma intrinsic(_BitScanForward)
+
+//@cond none
+namespace cds {
+    namespace bitop { namespace platform { namespace vc { namespace x86 {
+        // MSB - return index (1..32) of most significant bit in nArg. If nArg == 0 return 0
+#        define cds_bitop_msb32_DEFINED
+        static inline int msb32( atomic32u_t nArg )
+        {
+            unsigned long nIndex;
+            if ( _BitScanReverse( &nIndex, nArg ))
+                return (int) nIndex + 1;
+            return 0;
+        }
+
+#        define cds_bitop_msb32nz_DEFINED
+        static inline int msb32nz( atomic32u_t nArg )
+        {
+            assert( nArg != 0 );
+            unsigned long nIndex;
+            _BitScanReverse( &nIndex, nArg );
+            return (int) nIndex;
+        }
+
+        // LSB - return index (1..32) of least significant bit in nArg. If nArg == 0 return -1U
+#        define cds_bitop_lsb32_DEFINED
+        static inline int lsb32( atomic32u_t nArg )
+        {
+            unsigned long nIndex;
+            if ( _BitScanForward( &nIndex, nArg ))
+                return (int) nIndex + 1;
+            return 0;
+        }
+
+#        define cds_bitop_lsb32nz_DEFINED
+        static inline int lsb32nz( atomic32u_t nArg )
+        {
+            assert( nArg != 0 );
+            unsigned long nIndex;
+            _BitScanForward( &nIndex, nArg );
+            return (int) nIndex;
+        }
+
+        // bswap - Reverses the byte order of a 32-bit word
+#        define cds_bitop_bswap32_DEFINED
+        static inline atomic32u_t bswap32( atomic32u_t nArg )
+        {
+            __asm {
+                mov    eax, nArg;
+                bswap    eax;
+            }
+        }
+
+#       define cds_bitop_complement32_DEFINED
+        static inline bool complement32( atomic32u_t * pArg, unsigned int nBit )
+        {
+            return _bittestandcomplement( reinterpret_cast<long *>( pArg ), nBit ) != 0;
+        }
+
+#       define cds_bitop_complement64_DEFINED
+        static inline bool complement64( atomic64u_t * pArg, unsigned int nBit )
+        {
+            if ( nBit < 32 )
+                return _bittestandcomplement( reinterpret_cast<long *>( pArg ), nBit ) != 0;
+            else
+                return _bittestandcomplement( reinterpret_cast<long *>( pArg ) + 1, nBit - 32 ) != 0;
+        }
+
+    }} // namespace vc::x86
+
+    using namespace vc::x86;
+
+}}}    // namespace cds::bitop::platform
+//@endcond
+
+#endif    // #ifndef __CDS_COMPILER_VC_X86_BITOP_H
diff --git a/cds/compiler/vc/x86/cxx11_atomic.h b/cds/compiler/vc/x86/cxx11_atomic.h
new file mode 100644 (file)
index 0000000..4670a3b
--- /dev/null
@@ -0,0 +1,556 @@
+//$$CDS-header$$
+
+#ifndef __CDS_COMPILER_VC_X86_CXX11_ATOMIC_H
+#define __CDS_COMPILER_VC_X86_CXX11_ATOMIC_H
+
+#include <intrin.h>
+#include <emmintrin.h>  // for 64bit atomic load/store
+#include <cds/details/is_aligned.h>
+
+#pragma intrinsic( _InterlockedIncrement )
+#pragma intrinsic( _InterlockedDecrement )
+#pragma intrinsic( _InterlockedCompareExchange )
+//#pragma intrinsic( _InterlockedCompareExchangePointer )   // On the x86 architecture, _InterlockedCompareExchangePointer is a macro that calls _InterlockedCompareExchange
+#pragma intrinsic( _InterlockedCompareExchange16 )
+#pragma intrinsic( _InterlockedCompareExchange64 )
+#pragma intrinsic( _InterlockedExchange )
+//#pragma intrinsic( _InterlockedExchangePointer )  // On the x86 architecture, _InterlockedExchangePointer is a macro that calls _InterlockedExchange
+#pragma intrinsic( _InterlockedExchangeAdd )
+#pragma intrinsic( _InterlockedXor )
+#pragma intrinsic( _InterlockedOr )
+#pragma intrinsic( _InterlockedAnd )
+#pragma intrinsic( _interlockedbittestandset )
+#if _MSC_VER >= 1600
+#   pragma intrinsic( _InterlockedCompareExchange8 )
+#   pragma intrinsic( _InterlockedExchange8 )
+#   pragma intrinsic( _InterlockedExchange16 )
+#endif
+
+//@cond
+namespace cds { namespace cxx11_atomics {
+    namespace platform { CDS_CXX11_INLINE_NAMESPACE namespace vc { CDS_CXX11_INLINE_NAMESPACE namespace x86 {
+
+        static inline void fence_before( memory_order order ) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_relaxed:
+            case memory_order_acquire:
+            case memory_order_consume:
+                break;
+            case memory_order_release:
+            case memory_order_acq_rel:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            case memory_order_seq_cst:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            }
+        }
+
+        static inline void fence_after( memory_order order ) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_acquire:
+            case memory_order_acq_rel:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            case memory_order_relaxed:
+            case memory_order_consume:
+            case memory_order_release:
+                break;
+            case memory_order_seq_cst:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            }
+        }
+
+
+        static inline void fence_after_load(memory_order order) CDS_NOEXCEPT
+        {
+            switch(order) {
+            case memory_order_relaxed:
+            case memory_order_release:
+                break;
+            case memory_order_acquire:
+            case memory_order_acq_rel:
+                CDS_COMPILER_RW_BARRIER;
+                break;
+            case memory_order_consume:
+                break;
+            case memory_order_seq_cst:
+                __asm { mfence };
+                break;
+            default:;
+            }
+        }
+
+        //-----------------------------------------------------------------------------
+        // fences
+        //-----------------------------------------------------------------------------
+        static inline void thread_fence(memory_order order) CDS_NOEXCEPT
+        {
+            switch(order)
+            {
+                case memory_order_relaxed:
+                case memory_order_consume:
+                    break;
+                case memory_order_release:
+                case memory_order_acquire:
+                case memory_order_acq_rel:
+                    CDS_COMPILER_RW_BARRIER;
+                    break;
+                case memory_order_seq_cst:
+                    __asm { mfence };
+                    break;
+                default:;
+            }
+        }
+
+        static inline void signal_fence(memory_order order) CDS_NOEXCEPT
+        {
+            // C++11: 29.8.8: only compiler optimization, no hardware instructions
+            switch(order)
+            {
+                case memory_order_relaxed:
+                    break;
+                case memory_order_consume:
+                case memory_order_release:
+                case memory_order_acquire:
+                case memory_order_acq_rel:
+                case memory_order_seq_cst:
+                    CDS_COMPILER_RW_BARRIER;
+                    break;
+                default:;
+            }
+        }
+
+        //-----------------------------------------------------------------------------
+        // atomic flag primitives
+        //-----------------------------------------------------------------------------
+
+        typedef unsigned char atomic_flag_type;
+        static inline bool atomic_flag_tas( atomic_flag_type volatile * pFlag, memory_order /*order*/ ) CDS_NOEXCEPT
+        {
+            return _interlockedbittestandset( (long volatile *) pFlag, 0 ) != 0;
+        }
+
+        static inline void atomic_flag_clear( atomic_flag_type volatile * pFlag, memory_order order ) CDS_NOEXCEPT
+        {
+            assert( order != memory_order_acquire
+                && order != memory_order_acq_rel
+                );
+
+            fence_before( order );
+            *pFlag = 0;
+            fence_after( order );
+        }
+
+
+        //-----------------------------------------------------------------------------
+        // 8bit primitives
+        //-----------------------------------------------------------------------------
+
+#if _MSC_VER >= 1600
+#   pragma warning(push)
+        // Disable warning C4800: 'char' : forcing value to bool 'true' or 'false' (performance warning)
+#   pragma warning( disable: 4800 )
+#endif
+        template <typename T>
+        static inline bool cas8_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal operand size"  );
+
+#       if _MSC_VER >= 1600
+            T prev = expected;
+            expected = (T) _InterlockedCompareExchange8( reinterpret_cast<char volatile*>(pDest), (char) desired, (char) expected );
+            return expected == prev;
+#       else
+            bool bRet = false;
+            __asm {
+                mov ecx, pDest;
+                mov edx, expected;
+                mov al, byte ptr [edx];
+                mov ah, desired;
+                lock cmpxchg byte ptr [ecx], ah;
+                mov byte ptr [edx], al;
+                setz bRet;
+            }
+            return bRet;
+#       endif
+        }
+#if _MSC_VER >= 1600
+#   pragma warning(pop)
+#endif
+
+        template <typename T>
+        static inline bool cas8_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas8_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+#if _MSC_VER >= 1600
+#   pragma warning(push)
+    // Disable warning C4800: 'char' : forcing value to bool 'true' or 'false' (performance warning)
+#   pragma warning( disable: 4800 )
+#endif
+        template <typename T>
+        static inline T exchange8( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal operand size" );
+
+#       if _MSC_VER >= 1600
+            return (T) _InterlockedExchange8( reinterpret_cast<char volatile *>(pDest), (char) v );
+#       else
+            __asm {
+                mov al, v;
+                mov ecx, pDest;
+                lock xchg byte ptr [ecx], al;
+            }
+#       endif
+        }
+#if _MSC_VER >= 1600
+#   pragma warning(pop)
+#endif
+
+        template <typename T>
+        static inline void store8( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal operand size" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange8( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T load8( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 1, "Illegal operand size" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order == memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            T v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+        //-----------------------------------------------------------------------------
+        // 16bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline T exchange16( T volatile * pDest, T v, memory_order /*order*/ ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal operand size" );
+            assert( cds::details::is_aligned( pDest, 2 ));
+
+#       if _MSC_VER >= 1600
+            return (T) _InterlockedExchange16( (short volatile *) pDest, (short) v );
+#       else
+            __asm {
+                mov ax, v;
+                mov ecx, pDest;
+                lock xchg word ptr [ecx], ax;
+            }
+#       endif
+        }
+
+        template <typename T>
+        static inline void store16( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal operand size" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+            assert( cds::details::is_aligned( pDest, 2 ));
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange16( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T load16( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal operand size" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+            assert( cds::details::is_aligned( pSrc, 2 ));
+
+            T v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas16_strong( T volatile * pDest, T& expected, T desired, memory_order /*mo_success*/, memory_order /*mo_fail*/ ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 2, "Illegal operand size" );
+            assert( cds::details::is_aligned( pDest, 2 ));
+
+            // _InterlockedCompareExchange behave as read-write memory barriers
+            T prev = expected;
+            expected = (T) _InterlockedCompareExchange16( (short *) pDest, (short) desired, (short) expected );
+            return expected == prev;
+        }
+
+        template <typename T>
+        static inline bool cas16_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas16_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        //-----------------------------------------------------------------------------
+        // 32bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline T exchange32( T volatile * pDest, T v, memory_order /*order*/ ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal operand size" );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            return (T) _InterlockedExchange( (long *) pDest, (long) v );
+        }
+
+        template <typename T>
+        static inline void store32( T volatile * pDest, T src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal operand size" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange32( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T load32( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal operand size" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+            assert( cds::details::is_aligned( pSrc, 4 ));
+
+            T v( *pSrc );
+            fence_after_load( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas32_strong( T volatile * pDest, T& expected, T desired, memory_order /*mo_success*/, memory_order /*mo_fail*/ ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal operand size" );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            // _InterlockedCompareExchange behave as read-write memory barriers
+            T prev = expected;
+            expected = (T) _InterlockedCompareExchange( (long *) pDest, (long) desired, (long) expected );
+            return expected == prev;
+        }
+
+        template <typename T>
+        static inline bool cas32_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas32_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        // fetch_xxx may be emulated via cas32
+        // If the platform has special fetch_xxx instruction
+        // then it should define CDS_ATOMIC_fetch32_xxx_defined macro
+
+#       define CDS_ATOMIC_fetch32_add_defined
+        template <typename T>
+        static inline T fetch32_add( T volatile * pDest, T v, memory_order /*order*/) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 4, "Illegal operand size" );
+            assert( cds::details::is_aligned( pDest, 4 ));
+
+            // _InterlockedExchangeAdd behave as read-write memory barriers
+            return (T) _InterlockedExchangeAdd( (long *) pDest, (long) v );
+        }
+
+        //-----------------------------------------------------------------------------
+        // 64bit primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline bool cas64_strong( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal operand size" );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            // _InterlockedCompareExchange behave as read-write memory barriers
+            T prev = expected;
+            expected = (T) _InterlockedCompareExchange64( (__int64 *) pDest, (__int64) desired, (__int64) expected );
+            return expected == prev;
+        }
+
+        template <typename T>
+        static inline bool cas64_weak( T volatile * pDest, T& expected, T desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas64_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+
+        template <typename T>
+        static inline T load64( T volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal operand size" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+            assert( cds::details::is_aligned( pSrc, 8 ));
+
+            // Atomically loads 64bit value by SSE intrinsics
+            __m128i volatile v = _mm_loadl_epi64( (__m128i const *) pSrc );
+            fence_after_load( order );
+            return (T) v.m128i_i64[0];
+        }
+
+
+        template <typename T>
+        static inline T exchange64( T volatile * pDest, T v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal operand size" );
+
+            T cur = load64( pDest, memory_order_relaxed );
+            do {
+            } while (!cas64_weak( pDest, cur, v, order, memory_order_relaxed ));
+            return cur;
+        }
+
+        template <typename T>
+        static inline void store64( T volatile * pDest, T val, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T) == 8, "Illegal operand size" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+            assert( cds::details::is_aligned( pDest, 8 ));
+
+            if ( order != memory_order_seq_cst ) {
+                __m128i v;
+                v.m128i_i64[0] = val;
+                fence_before( order );
+                _mm_storel_epi64( (__m128i *) pDest, v );
+            }
+            else {
+                exchange64( pDest, val, order );
+            }
+        }
+
+
+        //-----------------------------------------------------------------------------
+        // pointer primitives
+        //-----------------------------------------------------------------------------
+
+        template <typename T>
+        static inline T * exchange_ptr( T * volatile * pDest, T * v, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal operand size" );
+            return (T *) _InterlockedExchange( (long volatile *) pDest, (uintptr_t) v );
+            //return (T *) _InterlockedExchangePointer( (void * volatile *) pDest, reinterpret_cast<void *>(v) );
+        }
+
+        template <typename T>
+        static inline void store_ptr( T * volatile * pDest, T * src, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal operand size" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_release
+                || order == memory_order_seq_cst
+                );
+            assert( pDest != NULL );
+
+            if ( order != memory_order_seq_cst ) {
+                fence_before( order );
+                *pDest = src;
+            }
+            else {
+                exchange_ptr( pDest, src, order );
+            }
+        }
+
+        template <typename T>
+        static inline T * load_ptr( T * volatile const * pSrc, memory_order order ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal operand size" );
+            assert( order ==  memory_order_relaxed
+                || order ==  memory_order_consume
+                || order ==  memory_order_acquire
+                || order ==  memory_order_seq_cst
+                );
+            assert( pSrc != NULL );
+
+            T * v = *pSrc;
+            fence_after_load( order );
+            return v;
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_strong( T * volatile * pDest, T *& expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            static_assert( sizeof(T *) == sizeof(void *), "Illegal operand size" );
+
+            // _InterlockedCompareExchangePointer behave as read-write memory barriers
+            T * prev = expected;
+            expected = (T *) _InterlockedCompareExchange( (long volatile *) pDest, (uintptr_t) desired, (uintptr_t) prev );
+            return expected == prev;
+        }
+
+        template <typename T>
+        static inline bool cas_ptr_weak( T * volatile * pDest, T *& expected, T * desired, memory_order mo_success, memory_order mo_fail ) CDS_NOEXCEPT
+        {
+            return cas_ptr_strong( pDest, expected, desired, mo_success, mo_fail );
+        }
+    }} // namespace vc::x86
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using namespace vc::x86;
+#endif
+    } // namespace platform
+}}  // namespace cds::cxx11_atomics
+//@endcond
+
+#endif // #ifndef __CDS_COMPILER_VC_X86_CXX11_ATOMIC_H
diff --git a/cds/container/base.h b/cds/container/base.h
new file mode 100644 (file)
index 0000000..bd6ed3e
--- /dev/null
@@ -0,0 +1,60 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_BASE_H
+#define __CDS_CONTAINER_BASE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/details/allocator.h>
+
+namespace cds {
+
+/// Standard (non-intrusive) containers
+/**
+    @ingroup cds_nonintrusive_containers
+    This namespace contains implementations of non-intrusive (std-like) lock-free containers.
+*/
+namespace container {
+
+    /// Common options for non-intrusive containers
+    /** @ingroup cds_nonintrusive_helper
+        This namespace contains options for non-intrusive containers that is, in general, the same as for the intrusive containers.
+        It imports all definitions from cds::opt and cds::intrusive::opt namespaces
+    */
+    namespace opt {
+        using namespace cds::intrusive::opt;
+    }   // namespace opt
+
+    /// @defgroup cds_nonintrusive_containers Non-intrusive containers
+    /** @defgroup cds_nonintrusive_helper Helper structs for non-intrusive containers
+        @ingroup cds_nonintrusive_containers
+    */
+
+    /** @defgroup cds_nonintrusive_stack Stack
+        @ingroup cds_nonintrusive_containers
+    */
+    /** @defgroup cds_nonintrusive_queue Queue
+        @ingroup cds_nonintrusive_containers
+    */
+    /** @defgroup cds_nonintrusive_deque Deque
+        @ingroup cds_nonintrusive_containers
+    */
+    /** @defgroup cds_nonintrusive_priority_queue Priority queue
+        @ingroup cds_nonintrusive_containers
+    */
+    /** @defgroup cds_nonintrusive_map Map
+        @ingroup cds_nonintrusive_containers
+    */
+    /** @defgroup cds_nonintrusive_set Set
+        @ingroup cds_nonintrusive_containers
+    */
+    /** @defgroup cds_nonintrusive_list List
+        @ingroup cds_nonintrusive_containers
+    */
+    /** @defgroup cds_nonintrusive_tree Tree
+        @ingroup cds_nonintrusive_containers
+    */
+
+}   // namespace container
+}   // namespace cds
+
+#endif // #ifndef __CDS_CONTAINER_BASE_H
diff --git a/cds/container/basket_queue.h b/cds/container/basket_queue.h
new file mode 100644 (file)
index 0000000..991b3cb
--- /dev/null
@@ -0,0 +1,393 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_BASKET_QUEUE_H
+#define __CDS_CONTAINER_BASKET_QUEUE_H
+
+#include <cds/intrusive/basket_queue.h>
+#include <cds/container/base.h>
+#include <cds/ref.h>
+#include <cds/details/trivial_assign.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+        template <typename GC, typename T, CDS_DECL_OPTIONS7>
+        struct make_basket_queue
+        {
+            typedef GC gc;
+            typedef T value_type;
+
+            struct default_options {
+                typedef cds::backoff::empty     back_off;
+                typedef CDS_DEFAULT_ALLOCATOR   allocator;
+                typedef atomicity::empty_item_counter item_counter;
+                typedef intrusive::basket_queue::dummy_stat stat;
+                typedef opt::v::relaxed_ordering    memory_model;
+                enum { alignment = opt::cache_line_alignment };
+            };
+
+            typedef typename opt::make_options<
+                typename cds::opt::find_type_traits< default_options, CDS_OPTIONS7 >::type
+                ,CDS_OPTIONS7
+            >::type   options;
+
+            struct node_type: public intrusive::basket_queue::node< gc >
+            {
+                value_type  m_value;
+
+                node_type( const value_type& val )
+                    : m_value( val )
+                {}
+#           ifdef CDS_EMPLACE_SUPPORT
+                template <typename... Args>
+                node_type( Args&&... args )
+                    : m_value( std::forward<Args>(args)...)
+                {}
+#           else
+                node_type()
+                {}
+#           endif
+            };
+
+            typedef typename options::allocator::template rebind<node_type>::other allocator_type;
+            typedef cds::details::Allocator< node_type, allocator_type >           cxx_allocator;
+
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_allocator().Delete( pNode );
+                }
+            };
+
+            typedef intrusive::BasketQueue< gc,
+                node_type
+                ,intrusive::opt::hook<
+                    intrusive::basket_queue::base_hook< opt::gc<gc> >
+                >
+                ,opt::back_off< typename options::back_off >
+                ,intrusive::opt::disposer< node_deallocator >
+                ,opt::item_counter< typename options::item_counter >
+                ,opt::stat< typename options::stat >
+                ,opt::alignment< options::alignment >
+                ,opt::memory_model< typename options::memory_model >
+            >   type;
+        };
+    }
+    //@endcond
+
+    /// Basket lock-free queue (non-intrusive variant)
+    /** @ingroup cds_nonintrusive_queue
+        It is non-intrusive version of basket queue algorithm based on intrusive::BasketQueue counterpart.
+
+        \par Source:
+            [2007] Moshe Hoffman, Ori Shalev, Nir Shavit "The Baskets Queue"
+
+        <b>Key idea</b>
+
+        In the \93basket\94 approach, instead of
+        the traditional ordered list of nodes, the queue consists of an ordered list of groups
+        of nodes (logical baskets). The order of nodes in each basket need not be specified, and in
+        fact, it is easiest to maintain them in LIFO order. The baskets fulfill the following basic
+        rules:
+        - Each basket has a time interval in which all its nodes\92 enqueue operations overlap.
+        - The baskets are ordered by the order of their respective time intervals.
+        - For each basket, its nodes\92 dequeue operations occur after its time interval.
+        - The dequeue operations are performed according to the order of baskets.
+
+        Two properties define the FIFO order of nodes:
+        - The order of nodes in a basket is not specified.
+        - The order of nodes in different baskets is the FIFO-order of their respective baskets.
+
+        In algorithms such as the MS-queue or optimistic
+        queue, threads enqueue items by applying a Compare-and-swap (CAS) operation to the
+        queue\92s tail pointer, and all the threads that fail on a particular CAS operation (and also
+        the winner of that CAS) overlap in time. In particular, they share the time interval of
+        the CAS operation itself. Hence, all the threads that fail to CAS on the tail-node of
+        the queue may be inserted into the same basket. By integrating the basket-mechanism
+        as the back-off mechanism, the time usually spent on backing-off before trying to link
+        onto the new tail, can now be utilized to insert the failed operations into the basket,
+        allowing enqueues to complete sooner. In the meantime, the next successful CAS operations
+        by enqueues allow new baskets to be formed down the list, and these can be
+        filled concurrently. Moreover, the failed operations don\92t retry their link attempt on the
+        new tail, lowering the overall contention on it. This leads to a queue
+        algorithm that unlike all former concurrent queue algorithms requires virtually no tuning
+        of the backoff mechanisms to reduce contention, making the algorithm an attractive
+        out-of-the-box queue.
+
+        In order to enqueue, just as in MSQueue, a thread first tries to link the new node to
+        the last node. If it failed to do so, then another thread has already succeeded. Thus it
+        tries to insert the new node into the new basket that was created by the winner thread.
+        To dequeue a node, a thread first reads the head of the queue to obtain the
+        oldest basket. It may then dequeue any node in the oldest basket.
+
+
+        Template arguments:
+        - \p GC - garbage collector type: gc::HP, gc::HRC, gc::PTB
+        - \p T is a type stored in the queue. It should be default-constructible, copy-constructible, assignable type.
+        - \p Options - options
+
+        Permissible \p Options:
+        - opt::allocator - allocator (like \p std::allocator). Default is \ref CDS_DEFAULT_ALLOCATOR
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::stat - the type to gather internal statistics for debugging and profiling purposes.
+            Possible option value are: intrusive::basket_queue::stat, intrusive::basket_queue::dummy_stat (the default),
+            user-provided class that supports intrusive::basket_queue::stat interface.
+            Generic option intrusive::queue_stat and intrusive::queue_dummy_stat are acceptable too, however,
+            they will be automatically converted to intrusive::basket_queue::stat and intrusive::basket_queue::dummy_stat
+            respectively.
+        - opt::alignment - the alignment for internal queue data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+    */
+    template <typename GC, typename T, CDS_DECL_OPTIONS7>
+    class BasketQueue:
+#ifdef CDS_DOXYGEN_INVOKED
+        intrusive::BasketQueue< GC, intrusive::basket_queue::node< T >, Options... >
+#else
+        details::make_basket_queue< GC, T, CDS_OPTIONS7 >::type
+#endif
+    {
+        //@cond
+        typedef details::make_basket_queue< GC, T, CDS_OPTIONS7 > options;
+        typedef typename options::type base_class;
+        //@endcond
+
+    public:
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS7>
+        struct rebind {
+            typedef BasketQueue< GC2, T2, CDS_OTHER_OPTIONS7> other   ;   ///< Rebinding result
+        };
+
+    public:
+        typedef T value_type ; ///< Value type stored in the queue
+
+        typedef typename base_class::gc                 gc              ; ///< Garbage collector used
+        typedef typename base_class::back_off           back_off        ; ///< Back-off strategy used
+        typedef typename options::allocator_type        allocator_type  ; ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter       item_counter    ; ///< Item counting policy used
+        typedef typename base_class::stat               stat            ; ///< Internal statistics policy used
+        typedef typename base_class::memory_model       memory_model    ; ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        typedef typename options::node_type  node_type   ;   ///< queue node type (derived from intrusive::single_link::node)
+
+        //@cond
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;   // deallocate node
+        typedef typename base_class::node_traits    node_traits;
+        //@endcond
+
+    protected:
+        ///@cond
+        static node_type * alloc_node()
+        {
+            return cxx_allocator().New();
+        }
+        static node_type * alloc_node( const value_type& val )
+        {
+            return cxx_allocator().New( val );
+        }
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node_move( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>( args )... );
+        }
+#   endif
+        static void free_node( node_type * p )
+        {
+            node_deallocator()( p );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+        //@endcond
+
+    public:
+        /// Initializes empty queue
+        BasketQueue()
+        {}
+
+        /// Destructor clears the queue
+        ~BasketQueue()
+        {}
+
+        /// Returns queue's item count
+        /** \copydetails cds::intrusive::BasketQueue::size()
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns reference to internal statistics
+        const stat& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Enqueues \p val value into the queue.
+        /**
+            The function makes queue node in dynamic memory calling copy constructor for \p val
+            and then it calls intrusive::BasketQueue::enqueue.
+            Returns \p true if success, \p false otherwise.
+        */
+        bool enqueue( const value_type& val )
+        {
+            scoped_node_ptr p( alloc_node(val));
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Enqueues \p data to queue using copy functor
+        /**
+            \p Func is a functor called to copy value \p data of type \p Type
+            which may be differ from type \p T stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(T& dest, Type const& data)
+                {
+                    // // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool enqueue( const Type& data, Func f  )
+        {
+            scoped_node_ptr p( alloc_node());
+            cds::unref(f)( p->m_value, data );
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Enqueues data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr p( alloc_node_move( std::forward<Args>(args)...));
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+
+        /// Dequeues a value using copy functor
+        /**
+            \p Func is a functor called to copy dequeued value to \p dest of type \p Type
+            which may be differ from type \p T stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(Type& dest, T const& data)
+                {
+                    // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool dequeue( Type& dest, Func f )
+        {
+            typename base_class::dequeue_result res;
+            if ( base_class::do_dequeue( res, true )) {
+                cds::unref(f)( dest, node_traits::to_value_ptr( *res.pNext )->m_value );
+                return true;
+            }
+            return false;
+        }
+
+        /// Dequeues a value from the queue
+        /**
+            If queue is not empty, the function returns \p true, \p dest contains copy of
+            dequeued value. The assignment operator for type \ref value_type is invoked.
+            If queue is empty, the function returns \p false, \p dest is unchanged.
+        */
+        bool dequeue( value_type& dest )
+        {
+            typedef cds::details::trivial_assign<value_type, value_type> functor;
+            return dequeue( dest, functor() );
+        }
+
+        /// Synonym for \ref enqueue function
+        bool push( const value_type& val )
+        {
+            return enqueue( val );
+        }
+
+        /// Synonym for template version of \ref enqueue function
+        template <typename Type, typename Func>
+        bool push( const Type& data, Func f  )
+        {
+            return enqueue( data, f );
+        }
+
+        /// Synonym for \ref dequeue function
+        bool pop( value_type& dest )
+        {
+            return dequeue( dest );
+        }
+
+        /// Synonym for template version of \ref dequeue function
+        template <typename Type, typename Func>
+        bool pop( Type& dest, Func f )
+        {
+            return dequeue( dest, f );
+        }
+
+        /// Checks if the queue is empty
+        /**
+            Note that this function is not \p const.
+            The function is based on \ref dequeue algorithm.
+        */
+        bool empty()
+        {
+            return base_class::empty();
+        }
+
+        /// Clear the queue
+        /**
+            The function repeatedly calls \ref dequeue until it returns NULL.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+    };
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_BASKET_QUEUE_H
diff --git a/cds/container/cuckoo_base.h b/cds/container/cuckoo_base.h
new file mode 100644 (file)
index 0000000..8c2f90b
--- /dev/null
@@ -0,0 +1,211 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_CUCKOO_BASE_H
+#define __CDS_CONTAINER_CUCKOO_BASE_H
+
+#include <cds/intrusive/cuckoo_set.h>
+
+namespace cds { namespace container {
+
+    /// CuckooSet and CuckooMap related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace cuckoo {
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Lock striping concurrent access policy. This is typedef for intrusive::cuckoo::striping template
+        class striping
+        {};
+#else
+        using intrusive::cuckoo::striping;
+#endif
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Refinable concurrent access policy. This is typedef for intrusive::cuckoo::refinable template
+        class refinable
+        {};
+#else
+        using intrusive::cuckoo::refinable;
+#endif
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Striping internal statistics. This is typedef for intrusive::cuckoo::striping_stat
+        class striping_stat
+        {};
+#else
+        using intrusive::cuckoo::striping_stat;
+#endif
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Empty striping internal statistics. This is typedef for intrusive::cuckoo::empty_striping_stat
+        class empty_striping_stat
+        {};
+#else
+        using intrusive::cuckoo::empty_striping_stat;
+#endif
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Refinable internal statistics. This is typedef for intrusive::cuckoo::refinable_stat
+        class refinable_stat
+        {};
+#else
+        using intrusive::cuckoo::refinable_stat;
+#endif
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Empty refinable internal statistics. This is typedef for intrusive::cuckoo::empty_refinable_stat
+        class empty_refinable_stat
+        {};
+#else
+        using intrusive::cuckoo::empty_refinable_stat;
+#endif
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Cuckoo statistics. This is typedef for intrusive::cuckoo::stat
+        class stat
+        {};
+#else
+        using intrusive::cuckoo::stat;
+#endif
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Cuckoo empty statistics.This is typedef for intrusive::cuckoo::empty_stat
+        class empty_stat
+        {};
+#else
+        using intrusive::cuckoo::empty_stat;
+#endif
+
+        /// Option specifying whether to store hash values in the node
+        /**
+             This option reserves additional space in the hook to store the hash value of the object once it's introduced in the container.
+             When this option is used, the unordered container will store the calculated hash value in the hook and rehashing operations won't need
+             to recalculate the hash of the value. This option will improve the performance of unordered containers
+             when rehashing is frequent or hashing the value is a slow operation
+
+             The \p Enable template parameter toggles the feature:
+             - the value \p true enables storing the hash values
+             - the value \p false disables storing the hash values
+        */
+        template <bool Enable>
+        struct store_hash
+        {
+            //@cond
+            template <typename Base>
+            struct pack: public Base {
+                static bool const store_hash = Enable;
+            };
+            //@endcond
+        };
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Probe set type option
+        /**
+            The option specifies probe set type for the CuckooSet and CuckooMap.
+            Available \p Type:
+            - \p cuckoo::list - the probe-set is a single-linked list.
+            - \p cuckoo::vector<Capacity> - the probe-set is a vector
+                with constant-size \p Capacity where \p Capacity is an <tt>unsigned int</tt> constant.
+        */
+        template <typename Type>
+        struct probeset_type
+        {};
+#else
+        using intrusive::cuckoo::probeset_type;
+#endif
+
+        using intrusive::cuckoo::list;
+        using intrusive::cuckoo::vector;
+
+        /// Type traits for CuckooSet and CuckooMap classes
+        struct type_traits
+        {
+            /// Hash functors tuple
+            /**
+                This is mandatory type and has no predefined one.
+
+                At least, two hash functors should be provided. All hash functor
+                should be orthogonal (different): for each <tt> i,j: i != j => h[i](x) != h[j](x) </tt>.
+                The hash functors are defined as <tt> std::tuple< H1, H2, ... Hn > </tt>:
+                \@code cds::opt::hash< std::tuple< h1, h2 > > \@endcode
+                The number of hash functors specifies the number \p k - the count of hash tables in cuckoo hashing.
+                Up to 10 different hash functors are supported.
+            */
+            typedef cds::opt::none      hash;
+
+            /// Concurrent access policy
+            /**
+                Available opt::mutex_policy types:
+                - cuckoo::striping - simple, but the lock array is not resizable
+                - cuckoo::refinable - resizable lock array, but more complex access to set data.
+
+                Default is cuckoo::striping.
+            */
+            typedef cuckoo::striping<>               mutex_policy;
+
+            /// Key equality functor
+            /**
+                Default is <tt>std::equal_to<T></tt>
+            */
+            typedef opt::none                       equal_to;
+
+            /// Key comparison functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+            */
+            typedef opt::none                       compare;
+
+            /// specifies binary predicate used for key comparison.
+            /**
+                Default is \p std::less<T>.
+            */
+            typedef opt::none                       less;
+
+            /// Item counter
+            /**
+                The type for item counting feature.
+                Default is cds::atomicity::item_counter
+
+                Only atomic item counter type is allowed.
+            */
+            typedef cds::intrusive::cuckoo::type_traits::item_counter   item_counter;
+
+            /// Allocator type
+            /**
+                The allocator type for allocating bucket tables.
+                Default is \p CDS_DEFAULT_ALLOCATOR that is \p std::allocator
+            */
+            typedef CDS_DEFAULT_ALLOCATOR       allocator;
+
+            /// Node allocator type
+            /**
+                If this type is not set explicitly, the \ref allocator type is used.
+            */
+            typedef opt::none                   node_allocator;
+
+            /// Store hash value into items. See cuckoo::store_hash for explanation
+            static bool const store_hash = false;
+
+            /// Probe-set type. See \ref probeset_type option for explanation
+            typedef cuckoo::list                probeset_type;
+
+            /// Internal statistics
+            typedef empty_stat                  stat;
+        };
+
+        /// Metafunction converting option list to CuckooSet/CuckooMap traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options list see CuckooSet and CuckooMap
+        */
+        template <CDS_DECL_OPTIONS12>
+        struct make_traits {
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< cuckoo::type_traits, CDS_OPTIONS12 >::type
+                ,CDS_OPTIONS12
+            >::type   type ;    ///< Result of metafunction
+        };
+    }   // namespace cuckoo
+}} // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_CUCKOO_BASE_H
diff --git a/cds/container/cuckoo_map.h b/cds/container/cuckoo_map.h
new file mode 100644 (file)
index 0000000..d928226
--- /dev/null
@@ -0,0 +1,906 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_CUCKOO_MAP_H
+#define __CDS_CONTAINER_CUCKOO_MAP_H
+
+#include <cds/container/cuckoo_base.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+        template <typename Key, typename T, typename Traits>
+        struct make_cuckoo_map
+        {
+            typedef Key key_type    ;   ///< key type
+            typedef T   mapped_type ;   ///< type of value stored in the map
+            typedef std::pair<key_type const, mapped_type>   value_type  ;   ///< Pair type
+
+            typedef Traits original_type_traits;
+            typedef typename original_type_traits::probeset_type probeset_type;
+            static bool const store_hash = original_type_traits::store_hash;
+            static unsigned int const store_hash_count = store_hash ? ((unsigned int) std::tuple_size< typename original_type_traits::hash::hash_tuple_type >::value) : 0;
+
+            struct node_type: public intrusive::cuckoo::node<probeset_type, store_hash_count>
+            {
+                value_type  m_val;
+
+                template <typename K>
+                node_type( K const& key )
+                    : m_val( std::make_pair( key_type(key), mapped_type() ))
+                {}
+
+                template <typename K, typename Q>
+                node_type( K const& key, Q const& v )
+                    : m_val( std::make_pair( key_type(key), mapped_type(v) ))
+                {}
+
+#           ifdef CDS_EMPLACE_SUPPORT
+                template <typename K, typename... Args>
+                node_type( K&& key, Args&&... args )
+                    : m_val( std::forward<K>(key), std::move( mapped_type(std::forward<Args>(args)...)) )
+                {}
+#           else
+                node_type()
+                {}
+#           endif
+            };
+
+            /*
+            template <typename Pred, typename ReturnValue>
+            struct predicate_wrapper {
+                typedef Pred native_predicate;
+
+                ReturnValue operator()( node_type const& n1, node_type const& n2) const
+                {
+                    return native_predicate()(n1.m_val.first, n2.m_val.first );
+                }
+                template <typename Q>
+                ReturnValue operator()( node_type const& n, Q const& v) const
+                {
+                    return native_predicate()(n.m_val.first, v);
+                }
+                template <typename Q>
+                ReturnValue operator()( Q const& v, node_type const& n) const
+                {
+                    return native_predicate()(v, n.m_val.first);
+                }
+
+                template <typename Q1, typename Q2>
+                ReturnValue operator()( Q1 const& v1, Q2 const& v2) const
+                {
+                    return native_predicate()(v1, v2);
+                }
+            };
+            */
+
+            struct key_accessor {
+                key_type const& operator()( node_type const& node ) const
+                {
+                    return node.m_val.first;
+                }
+            };
+
+            struct intrusive_traits: public original_type_traits
+            {
+                typedef intrusive::cuckoo::base_hook<
+                    cds::intrusive::cuckoo::probeset_type< probeset_type >
+                    ,cds::intrusive::cuckoo::store_hash< store_hash_count >
+                >  hook;
+
+                typedef cds::intrusive::cuckoo::type_traits::disposer   disposer;
+
+                typedef typename std::conditional<
+                    std::is_same< typename original_type_traits::equal_to, opt::none >::value
+                    , opt::none
+                    , cds::details::predicate_wrapper< node_type, typename original_type_traits::equal_to, key_accessor >
+                >::type equal_to;
+
+                typedef typename std::conditional<
+                    std::is_same< typename original_type_traits::compare, opt::none >::value
+                    , opt::none
+                    , cds::details::compare_wrapper< node_type, typename original_type_traits::compare, key_accessor >
+                >::type compare;
+
+                typedef typename std::conditional<
+                    std::is_same< typename original_type_traits::less, opt::none >::value
+                    ,opt::none
+                    ,cds::details::predicate_wrapper< node_type, typename original_type_traits::less, key_accessor >
+                >::type less;
+
+                typedef opt::details::hash_list_wrapper< typename original_type_traits::hash, node_type, key_accessor >    hash;
+            };
+
+            typedef intrusive::CuckooSet< node_type, intrusive_traits > type;
+        };
+    }   // namespace details
+    //@endcond
+
+    /// Cuckoo hash map
+    /** @ingroup cds_nonintrusive_map
+
+        Source
+            - [2007] M.Herlihy, N.Shavit, M.Tzafrir "Concurrent Cuckoo Hashing. Technical report"
+            - [2008] Maurice Herlihy, Nir Shavit "The Art of Multiprocessor Programming"
+
+        <b>About Cuckoo hashing</b>
+
+            [From "The Art of Multiprocessor Programming"]
+            Cuckoo hashing is a hashing algorithm in which a newly added item displaces any earlier item
+            occupying the same slot. For brevity, a table is a k-entry array of items. For a hash set f size
+            N = 2k we use a two-entry array of tables, and two independent hash functions,
+            <tt> h0, h1: KeyRange -> 0,...,k-1</tt>
+            mapping the set of possible keys to entries in he array. To test whether a value \p x is in the set,
+            <tt>find(x)</tt> tests whether either <tt>table[0][h0(x)]</tt> or <tt>table[1][h1(x)]</tt> is
+            equal to \p x. Similarly, <tt>erase(x)</tt>checks whether \p x is in either <tt>table[0][h0(x)]</tt>
+            or <tt>table[1][h1(x)]</tt>, ad removes it if found.
+
+            The <tt>insert(x)</tt> successively "kicks out" conflicting items until every key has a slot.
+            To add \p x, the method swaps \p x with \p y, the current occupant of <tt>table[0][h0(x)]</tt>.
+            If the prior value was \p NULL, it is done. Otherwise, it swaps the newly nest-less value \p y
+            for the current occupant of <tt>table[1][h1(y)]</tt> in the same way. As before, if the prior value
+            was \p NULL, it is done. Otherwise, the method continues swapping entries (alternating tables)
+            until it finds an empty slot. We might not find an empty slot, either because the table is full,
+            or because the sequence of displacement forms a cycle. We therefore need an upper limit on the
+            number of successive displacements we are willing to undertake. When this limit is exceeded,
+            we resize the hash table, choose new hash functions and start over.
+
+            For concurrent cuckoo hashing, rather than organizing the set as a two-dimensional table of
+            items, we use two-dimensional table of probe sets, where a probe set is a constant-sized set
+            of items with the same hash code. Each probe set holds at most \p PROBE_SIZE items, but the algorithm
+            tries to ensure that when the set is quiescent (i.e no method call in progress) each probe set
+            holds no more than <tt>THRESHOLD < PROBE_SET</tt> items. While method calls are in-flight, a probe
+            set may temporarily hold more than \p THRESHOLD but never more than \p PROBE_SET items.
+
+            In current implementation, a probe set can be defined either as a (single-linked) list
+            or as a fixed-sized vector, optionally ordered.
+
+            In description above two-table cuckoo hashing (<tt>k = 2</tt>) has been considered.
+            We can generalize this approach for <tt>k >= 2</tt> when we have \p k hash functions
+            <tt>h[0], ... h[k-1]</tt> and \p k tables <tt>table[0], ... table[k-1]</tt>.
+
+            The search in probe set is linear, the complexity is <tt> O(PROBE_SET) </tt>.
+            The probe set may be ordered or not. Ordered probe set can be a little better since
+            the average search complexity is <tt>O(PROBE_SET/2)</tt>.
+            However, the overhead of sorting can eliminate a gain of ordered search.
+
+            The probe set is ordered if opt::compare or opt::less is specified in \p %CuckooSet
+            declaration. Otherwise, the probe set is unordered and \p %CuckooSet must contain
+            opt::equal_to option.
+
+        Template arguments:
+        - \p Key - key type
+        - \p T - the type stored in the map.
+        - \p Traits - type traits. See cuckoo::type_traits for explanation.
+            It is possible to declare option-based set with cuckoo::make_traits metafunction result as \p Traits template argument.
+
+        Template argument list \p Options... of cuckoo::make_traits metafunction are:
+        - opt::hash - hash functor tuple, mandatory option. At least, two hash functors should be provided. All hash functor
+            should be orthogonal (different): for each <tt> i,j: i != j => h[i](x) != h[j](x) </tt>.
+            The hash functors are passed as <tt> std::tuple< H1, H2, ... Hn > </tt>. The number of hash functors specifies
+            the number \p k - the count of hash tables in cuckoo hashing. If the compiler supports variadic templates
+            then k is unlimited, otherwise up to 10 different hash functors are supported.
+        - opt::mutex_policy - concurrent access policy.
+            Available policies: cuckoo::striping, cuckoo::refinable.
+            Default is cuckoo::striping.
+        - opt::equal_to - key equality functor like \p std::equal_to.
+            If this functor is defined then the probe-set will be unordered.
+            If opt::compare or opt::less option is specified too, then the probe-set will be ordered
+            and opt::equal_to will be ignored.
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+            If opt::compare or opt::less option is specified, then the probe-set will be ordered.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+            If opt::compare or opt::less option is specified, then the probe-set will be ordered.
+        - opt::item_counter - the type of item counting feature. Default is \ref opt::v::sequential_item_counter.
+        - opt::allocator - the allocator type using for allocating bucket tables.
+            Default is \p CDS_DEFAULT_ALLOCATOR
+        - opt::node_allocator - the allocator type using for allocating map's items. If this option
+            is not specified then the type defined in opt::allocator option is used.
+        - cuckoo::store_hash - this option reserves additional space in the node to store the hash value
+            of the object once it's introduced in the container. When this option is used,
+            the map will store the calculated hash value in the node and rehashing operations won't need
+            to recalculate the hash of the value. This option will improve the performance of maps
+            when rehashing is frequent or hashing the value is a slow operation. Default value is \p false.
+        - \ref intrusive::cuckoo::probeset_type "cuckoo::probeset_type" - type of probe set, may be \p cuckoo::list or <tt>cuckoo::vector<Capacity></tt>,
+            Default is \p cuckoo::list.
+        - opt::stat - internal statistics. Possibly types: cuckoo::stat, cuckoo::empty_stat.
+            Default is cuckoo::empty_stat
+
+       <b>Examples</b>
+
+       Declares cuckoo mapping from \p std::string to struct \p foo.
+       For cuckoo hashing we should provide at least two hash functions:
+       \code
+        struct hash1 {
+            size_t operator()(std::string const& s) const
+            {
+                return cds::opt::v::hash<std::string>( s );
+            }
+        };
+
+        struct hash2: private hash1 {
+            size_t operator()(std::string const& s) const
+            {
+                size_t h = ~( hash1::operator()(s));
+                return ~h + 0x9e3779b9 + (h << 6) + (h >> 2);
+            }
+        };
+       \endcode
+
+        Cuckoo-map with list-based unordered probe set and storing hash values
+        \code
+        #include <cds/container/cuckoo_map.h>
+
+        // Declare type traits
+        struct my_traits: public cds::container::cuckoo::type_traits
+        {
+            typedef std::equal_to< std::string > equal_to;
+            typedef std::tuple< hash1, hash2 >  hash;
+
+            static bool const store_hash = true;
+        };
+
+        // Declare CuckooMap type
+        typedef cds::container::CuckooMap< std::string, foo, my_traits > my_cuckoo_map;
+
+        // Equal option-based declaration
+        typedef cds::container::CuckooMap< std::string, foo,
+            cds::container::cuckoo::make_traits<
+                cds::opt::hash< std::tuple< hash1, hash2 > >
+                ,cds::opt::equal_to< std::equal_to< std::string > >
+                ,cds::container::cuckoo::store_hash< true >
+            >::type
+        > opt_cuckoo_map;
+        \endcode
+
+        If we provide \p less functor instead of \p equal_to
+        we get as a result a cuckoo map with ordered probe set that may improve
+        performance.
+        Example for ordered vector-based probe-set:
+
+        \code
+        #include <cds/container/cuckoo_map.h>
+
+        // Declare type traits
+        // We use a vector of capacity 4 as probe-set container and store hash values in the node
+        struct my_traits: public cds::container::cuckoo::type_traits
+        {
+            typedef std::less< std::string > less;
+            typedef std::tuple< hash1, hash2 >  hash;
+            typedef cds::container::cuckoo::vector<4> probeset_type;
+
+            static bool const store_hash = true;
+        };
+
+        // Declare CuckooMap type
+        typedef cds::container::CuckooMap< std::string, foo, my_traits > my_cuckoo_map;
+
+        // Equal option-based declaration
+        typedef cds::container::CuckooMap< std::string, foo,
+            cds::container::cuckoo::make_traits<
+                cds::opt::hash< std::tuple< hash1, hash2 > >
+                ,cds::opt::less< std::less< std::string > >
+                ,cds::container::cuckoo::probeset_type< cds::container::cuckoo::vector<4> >
+                ,cds::container::cuckoo::store_hash< true >
+            >::type
+        > opt_cuckoo_map;
+        \endcode
+
+    */
+    template <typename Key, typename T, typename Traits = cuckoo::type_traits>
+    class CuckooMap:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::CuckooSet< std::pair< Key const, T>, Traits>
+#else
+        protected details::make_cuckoo_map<Key, T, Traits>::type
+#endif
+    {
+        //@cond
+        typedef details::make_cuckoo_map<Key, T, Traits>    maker;
+        typedef typename maker::type  base_class;
+        //@endcond
+    public:
+        typedef Key     key_type    ;   ///< key type
+        typedef T       mapped_type ;   ///< value type stored in the container
+        typedef std::pair<key_type const, mapped_type>   value_type  ;   ///< Key-value pair type stored in the map
+
+        typedef Traits  options     ;   ///< traits
+
+        typedef typename options::hash                  hash             ; ///< hash functor tuple wrapped for internal use
+        typedef typename base_class::hash_tuple_type    hash_tuple_type  ; ///< hash tuple type
+
+        typedef typename base_class::mutex_policy       mutex_policy     ;  ///< Concurrent access policy, see cuckoo::type_traits::mutex_policy
+        typedef typename base_class::stat               stat             ;  ///< internal statistics type
+
+        static bool const c_isSorted = base_class::c_isSorted   ; ///< whether the probe set should be ordered
+        static size_t const c_nArity = base_class::c_nArity     ; ///< the arity of cuckoo hashing: the number of hash functors provided; minimum 2.
+
+        typedef typename base_class::key_equal_to key_equal_to  ; ///< Key equality functor; used only for unordered probe-set
+
+        typedef typename base_class::key_comparator  key_comparator ; ///< key comparing functor based on opt::compare and opt::less option setter. Used only for ordered probe set
+
+        typedef typename base_class::allocator     allocator   ; ///< allocator type used for internal bucket table allocations
+
+        /// Node allocator type
+        typedef typename std::conditional<
+            std::is_same< typename options::node_allocator, opt::none >::value,
+            allocator,
+            typename options::node_allocator
+        >::type node_allocator;
+
+        /// item counter type
+        typedef typename options::item_counter  item_counter;
+
+    protected:
+        //@cond
+        typedef typename base_class::scoped_cell_lock   scoped_cell_lock;
+        typedef typename base_class::scoped_full_lock   scoped_full_lock;
+        typedef typename base_class::scoped_resize_lock scoped_resize_lock;
+        typedef typename maker::key_accessor            key_accessor;
+
+        typedef typename base_class::value_type         node_type;
+        typedef cds::details::Allocator< node_type, node_allocator >    cxx_node_allocator;
+        //@endcond
+
+    public:
+        static unsigned int const   c_nDefaultProbesetSize = base_class::c_nDefaultProbesetSize ;   ///< default probeset size
+        static size_t const         c_nDefaultInitialSize = base_class::c_nDefaultInitialSize   ;   ///< default initial size
+        static unsigned int const   c_nRelocateLimit = base_class::c_nRelocateLimit             ;   ///< Count of attempts to relocate before giving up
+
+    protected:
+        //@cond
+        template <typename K>
+        static node_type * alloc_node( K const& key )
+        {
+            return cxx_node_allocator().New( key );
+        }
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename K, typename... Args>
+        static node_type * alloc_node( K&& key, Args&&... args )
+        {
+            return cxx_node_allocator().MoveNew( std::forward<K>( key ), std::forward<Args>(args)... );
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_node_allocator().Delete( pNode );
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+#ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor
+        {
+            void operator()( value_type& ) const
+            {}
+        };
+
+        template <typename Q>
+        class insert_value_functor
+        {
+            Q const&    m_val;
+        public:
+            insert_value_functor( Q const & v)
+                : m_val(v)
+            {}
+
+            void operator()( value_type& item )
+            {
+                item.second = m_val;
+            }
+        };
+
+        template <typename Func>
+        class insert_key_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_key_wrapper( Func f ): base_class(f) {}
+
+            void operator()( node_type& item )
+            {
+                base_class::get()( item.m_val );
+            }
+        };
+
+        template <typename Func>
+        class ensure_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            ensure_wrapper( Func f) : base_class(f) {}
+
+            void operator()( bool bNew, node_type& item, node_type const& )
+            {
+                base_class::get()( bNew, item.m_val );
+            }
+        };
+
+        template <typename Func>
+        class find_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_wrapper( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator()( node_type& item, Q& val )
+            {
+                base_class::get()( item.m_val, val );
+            }
+        };
+#endif  // #ifndef CDS_CXX11_LAMBDA_SUPPORT
+
+        //@endcond
+
+    public:
+        /// Default constructor
+        /**
+            Initial size = \ref c_nDefaultInitialSize
+
+            Probe set size:
+            - \ref c_nDefaultProbesetSize if \p probeset_type is \p cuckoo::list
+            - \p Capacity if \p probeset_type is <tt> cuckoo::vector<Capacity> </tt>
+
+            Probe set threshold = probe set size - 1
+        */
+        CuckooMap()
+        {}
+
+        /// Constructs an object with given probe set size and threshold
+        /**
+            If probe set type is <tt> cuckoo::vector<Capacity> </tt> vector
+            then \p nProbesetSize should be equal to vector's \p Capacity.
+        */
+        CuckooMap(
+            size_t nInitialSize                     ///< Initial map size; if 0 - use default initial size \ref c_nDefaultInitialSize
+            , unsigned int nProbesetSize            ///< probe set size
+            , unsigned int nProbesetThreshold = 0   ///< probe set threshold, <tt>nProbesetThreshold < nProbesetSize</tt>. If 0, nProbesetThreshold = nProbesetSize - 1
+        )
+        : base_class( nInitialSize, nProbesetSize, nProbesetThreshold )
+        {}
+
+        /// Constructs an object with given hash functor tuple
+        /**
+            The probe set size and threshold are set as default, see CuckooSet()
+        */
+        CuckooMap(
+            hash_tuple_type const& h    ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+        : base_class( h )
+        {}
+
+        /// Constructs a map with given probe set properties and hash functor tuple
+        /**
+            If probe set type is <tt> cuckoo::vector<Capacity> </tt> vector
+            then \p nProbesetSize should be equal to vector's \p Capacity.
+        */
+        CuckooMap(
+            size_t nInitialSize                 ///< Initial map size; if 0 - use default initial size \ref c_nDefaultInitialSize
+            , unsigned int nProbesetSize        ///< probe set size
+            , unsigned int nProbesetThreshold   ///< probe set threshold, <tt>nProbesetThreshold < nProbesetSize</tt>. If 0, nProbesetThreshold = nProbesetSize - 1
+            , hash_tuple_type const& h    ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+        : base_class( nInitialSize, nProbesetSize, nProbesetThreshold, h )
+        {}
+
+#   ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        /// Constructs a map with given hash functor tuple (move semantics)
+        /**
+            The probe set size and threshold are set as default, see CuckooSet()
+        */
+        CuckooMap(
+            hash_tuple_type&& h     ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+        : base_class( std::forward<hash_tuple_type>(h) )
+        {}
+
+        /// Constructs a map with given probe set properties and hash functor tuple (move semantics)
+        /**
+            If probe set type is <tt> cuckoo::vector<Capacity> </tt> vector
+            then \p nProbesetSize should be equal to vector's \p Capacity.
+        */
+        CuckooMap(
+            size_t nInitialSize                 ///< Initial map size; if 0 - use default initial size \ref c_nDefaultInitialSize
+            , unsigned int nProbesetSize        ///< probe set size
+            , unsigned int nProbesetThreshold   ///< probe set threshold, <tt>nProbesetThreshold < nProbesetSize</tt>. If 0, nProbesetThreshold = nProbesetSize - 1
+            , hash_tuple_type&& h    ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+        : base_class( nInitialSize, nProbesetSize, nProbesetThreshold, std::forward<hash_tuple_type>(h) )
+        {}
+#   endif   // ifdef CDS_MOVE_SEMANTICS_SUPPORT
+
+        /// Destructor clears the map
+        ~CuckooMap()
+        {
+            clear();
+        }
+
+    public:
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from a value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( K const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert_key( key, [](value_type&){} );
+#       else
+            return insert_key( key, empty_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref value_type should be constructible from \p val of type \p V.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( K const& key, V const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert_key( key, [&val](value_type& item) { item.second = val ; } );
+#       else
+            insert_value_functor<V> f(val);
+            return insert_key( key, cds::ref(f) );
+#       endif
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted:
+                - <tt>item.first</tt> is a const reference to item's key that cannot be changed.
+                - <tt>item.second</tt> is a reference to item's value that may be changed.
+
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p value_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *pNode, [&func]( node_type& item ) { cds::unref(func)( item.m_val ); } ))
+#       else
+            insert_key_wrapper<Func> wrapper(func);
+            if ( base_class::insert( *pNode, cds::ref(wrapper) ))
+#endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            scoped_node_ptr pNode( alloc_node( std::forward<K>(key), std::forward<Args>(args)... ));
+            if ( base_class::insert( *pNode )) {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+
+        /// Ensures that the \p key exists in the map
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the map, then the new item created from \p key
+            is inserted into the map (note that in this case the \ref key_type should be
+            constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref value_type.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( K const& key, Func func )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> res = base_class::ensure( *pNode,
+                [&func](bool bNew, node_type& item, node_type const& ){ cds::unref(func)( bNew, item.m_val ); }
+            );
+#       else
+            ensure_wrapper<Func> wrapper( func );
+            std::pair<bool, bool> res = base_class::ensure( *pNode, cds::ref(wrapper) );
+#       endif
+            if ( res.first && res.second )
+                pNode.release();
+            return res;
+        }
+
+        /// Delete \p key from the map
+        /** \anchor cds_nonintrusive_CuckooMap_erase_val
+
+            Return \p true if \p key is found and deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            node_type * pNode = base_class::erase(key);
+            if ( pNode ) {
+                free_node( pNode );
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_CuckooMap_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            If cuckoo map is ordered, then \p Predicate should have the interface and semantics like \p std::less.
+            If cuckoo map is unordered, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p Predicate must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Predicate>
+        bool erase_with( K const& key, Predicate pred )
+        {
+            node_type * pNode = base_class::erase_with(key, cds::details::predicate_wrapper<node_type, Predicate, key_accessor>());
+            if ( pNode ) {
+                free_node( pNode );
+                return true;
+            }
+            return false;
+        }
+
+        /// Delete \p key from the map
+        /** \anchor cds_nonintrusive_CuckooMap_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& item) { ... }
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Return \p true if key is found and deleted, \p false otherwise
+
+            See also: \ref erase
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+            node_type * pNode = base_class::erase( key );
+            if ( pNode ) {
+                cds::unref(f)( pNode->m_val );
+                free_node( pNode );
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_CuckooMap_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            If cuckoo map is ordered, then \p Predicate should have the interface and semantics like \p std::less.
+            If cuckoo map is unordered, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p Predicate must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Predicate, typename Func>
+        bool erase_with( K const& key, Predicate pred, Func f )
+        {
+            node_type * pNode = base_class::erase_with( key, cds::details::predicate_wrapper<node_type, Predicate, key_accessor>() );
+            if ( pNode ) {
+                cds::unref(f)( pNode->m_val );
+                free_node( pNode );
+                return true;
+            }
+            return false;
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_CuckooMap_find_func
+
+            The function searches the item with key equal to \p key and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change \p item.second.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename K, typename Func>
+        bool find( K const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( key, [&f](node_type& item, K const& ) { cds::unref(f)( item.m_val );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find( key, cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Find the key \p val using \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_nonintrusive_CuckooMap_find_func "find(K const&, Func)"
+            but \p pred is used for key comparison.
+            If you use ordered cuckoo map, then \p Predicate should have the interface and semantics like \p std::less.
+            If you use unordered cuckoo map, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Predicate, typename Func>
+        bool find_with( K const& key, Predicate pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( key, cds::details::predicate_wrapper<node_type, Predicate, key_accessor>(),
+                [&f](node_type& item, K const& ) { cds::unref(f)( item.m_val );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find_with( key, cds::details::predicate_wrapper<node_type, Predicate, key_accessor>(), cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_CuckooMap_find_val
+
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+        */
+        template <typename K>
+        bool find( K const& key )
+        {
+            return base_class::find( key );
+        }
+
+        /// Find the key \p val using \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_nonintrusive_CuckooMap_find_val "find(K const&)"
+            but \p pred is used for key comparison.
+            If you use ordered cuckoo map, then \p Predicate should have the interface and semantics like \p std::less.
+            If you use unordered cuckoo map, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Predicate>
+        bool find_with( K const& key, Predicate pred )
+        {
+            return base_class::find_with( key, cds::details::predicate_wrapper<node_type, Predicate, key_accessor>() );
+        }
+
+        /// Clears the map
+        void clear()
+        {
+            base_class::clear_and_dispose( node_disposer() );
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns the size of hash table
+        /**
+            The hash table size is non-constant and can be increased via resizing.
+        */
+        size_t bucket_count() const
+        {
+            return base_class::bucket_count();
+        }
+
+        /// Returns lock array size
+        /**
+            The lock array size is constant.
+        */
+        size_t lock_count() const
+        {
+            return base_class::lock_count();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Returns const reference to mutex policy internal statistics
+        typename mutex_policy::statistics_type const& mutex_policy_statistics() const
+        {
+            return base_class::mutex_policy_statistics();
+        }
+
+    };
+}}  // namespace cds::container
+
+#endif //#ifndef __CDS_CONTAINER_CUCKOO_MAP_H
diff --git a/cds/container/cuckoo_set.h b/cds/container/cuckoo_set.h
new file mode 100644 (file)
index 0000000..05606af
--- /dev/null
@@ -0,0 +1,987 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_CUCKOO_SET_H
+#define __CDS_CONTAINER_CUCKOO_SET_H
+
+#include <cds/container/cuckoo_base.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+        template <typename T, typename Traits>
+        struct make_cuckoo_set
+        {
+            typedef T value_type;
+            typedef Traits original_type_traits;
+            typedef typename original_type_traits::probeset_type probeset_type;
+            static bool const store_hash = original_type_traits::store_hash;
+            static unsigned int const store_hash_count = store_hash ? ((unsigned int) std::tuple_size< typename original_type_traits::hash::hash_tuple_type >::value) : 0;
+
+            struct node_type: public intrusive::cuckoo::node<probeset_type, store_hash_count>
+            {
+                value_type  m_val;
+
+                template <typename Q>
+                node_type( Q const& v )
+                    : m_val(v)
+                {}
+
+#           ifdef CDS_EMPLACE_SUPPORT
+                template <typename... Args>
+                node_type( Args&&... args )
+                    : m_val( std::forward<Args>(args)...)
+                {}
+#           else
+                node_type()
+                {}
+#           endif
+            };
+
+            struct value_accessor {
+                value_type const& operator()( node_type const& node ) const
+                {
+                    return node.m_val;
+                }
+            };
+
+#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
+            template <typename Pred, typename ReturnValue>
+            using predicate_wrapper = cds::details::binary_functor_wrapper< ReturnValue, Pred, node_type, value_accessor >;
+#else
+            template <typename Pred, typename ReturnValue>
+            struct predicate_wrapper: public cds::details::binary_functor_wrapper< ReturnValue, Pred, node_type, value_accessor >
+            {};
+#endif
+
+            struct intrusive_traits: public original_type_traits
+            {
+                typedef intrusive::cuckoo::base_hook<
+                    cds::intrusive::cuckoo::probeset_type< probeset_type >
+                    ,cds::intrusive::cuckoo::store_hash< store_hash_count >
+                >  hook;
+
+                typedef cds::intrusive::cuckoo::type_traits::disposer   disposer;
+
+                typedef typename std::conditional<
+                    std::is_same< typename original_type_traits::equal_to, opt::none >::value
+                    , opt::none
+                    , predicate_wrapper< typename original_type_traits::equal_to, bool >
+                >::type equal_to;
+
+                typedef typename std::conditional<
+                    std::is_same< typename original_type_traits::compare, opt::none >::value
+                    , opt::none
+                    , predicate_wrapper< typename original_type_traits::compare, int >
+                >::type compare;
+
+                typedef typename std::conditional<
+                    std::is_same< typename original_type_traits::less, opt::none >::value
+                    ,opt::none
+                    ,predicate_wrapper< typename original_type_traits::less, bool >
+                >::type less;
+
+                typedef opt::details::hash_list_wrapper< typename original_type_traits::hash, node_type, value_accessor >    hash;
+            };
+
+            typedef intrusive::CuckooSet< node_type, intrusive_traits > type;
+        };
+    } // namespace details
+    //@endcond
+
+    /// Cuckoo hash set
+    /** @ingroup cds_nonintrusive_set
+
+        Source
+            - [2007] M.Herlihy, N.Shavit, M.Tzafrir "Concurrent Cuckoo Hashing. Technical report"
+            - [2008] Maurice Herlihy, Nir Shavit "The Art of Multiprocessor Programming"
+
+        <b>About Cuckoo hashing</b>
+
+            [From "The Art of Multiprocessor Programming"]
+            Cuckoo hashing is a hashing algorithm in which a newly added item displaces any earlier item
+            occupying the same slot. For brevity, a table is a k-entry array of items. For a hash set f size
+            N = 2k we use a two-entry array of tables, and two independent hash functions,
+            <tt> h0, h1: KeyRange -> 0,...,k-1</tt>
+            mapping the set of possible keys to entries in he array. To test whether a value \p x is in the set,
+            <tt>find(x)</tt> tests whether either <tt>table[0][h0(x)]</tt> or <tt>table[1][h1(x)]</tt> is
+            equal to \p x. Similarly, <tt>erase(x)</tt>checks whether \p x is in either <tt>table[0][h0(x)]</tt>
+            or <tt>table[1][h1(x)]</tt>, ad removes it if found.
+
+            The <tt>insert(x)</tt> successively "kicks out" conflicting items until every key has a slot.
+            To add \p x, the method swaps \p x with \p y, the current occupant of <tt>table[0][h0(x)]</tt>.
+            If the prior value was \p NULL, it is done. Otherwise, it swaps the newly nest-less value \p y
+            for the current occupant of <tt>table[1][h1(y)]</tt> in the same way. As before, if the prior value
+            was \p NULL, it is done. Otherwise, the method continues swapping entries (alternating tables)
+            until it finds an empty slot. We might not find an empty slot, either because the table is full,
+            or because the sequence of displacement forms a cycle. We therefore need an upper limit on the
+            number of successive displacements we are willing to undertake. When this limit is exceeded,
+            we resize the hash table, choose new hash functions and start over.
+
+            For concurrent cuckoo hashing, rather than organizing the set as a two-dimensional table of
+            items, we use two-dimensional table of probe sets, where a probe set is a constant-sized set
+            of items with the same hash code. Each probe set holds at most \p PROBE_SIZE items, but the algorithm
+            tries to ensure that when the set is quiescent (i.e no method call in progress) each probe set
+            holds no more than <tt>THRESHOLD < PROBE_SET</tt> items. While method calls are in-flight, a probe
+            set may temporarily hold more than \p THRESHOLD but never more than \p PROBE_SET items.
+
+            In current implementation, a probe set can be defined either as a (single-linked) list
+            or as a fixed-sized vector, optionally ordered.
+
+            In description above two-table cuckoo hashing (<tt>k = 2</tt>) has been considered.
+            We can generalize this approach for <tt>k >= 2</tt> when we have \p k hash functions
+            <tt>h[0], ... h[k-1]</tt> and \p k tables <tt>table[0], ... table[k-1]</tt>.
+
+            The search in probe set is linear, the complexity is <tt> O(PROBE_SET) </tt>.
+            The probe set may be ordered or not. Ordered probe set can be a little better since
+            the average search complexity is <tt>O(PROBE_SET/2)</tt>.
+            However, the overhead of sorting can eliminate a gain of ordered search.
+
+            The probe set is ordered if opt::compare or opt::less is specified in \p %CuckooSet
+            declaration. Otherwise, the probe set is unordered and \p %CuckooSet must contain
+            opt::equal_to option.
+
+        Template arguments:
+        - \p T - the type stored in the set.
+        - \p Traits - type traits. See cuckoo::type_traits for explanation.
+            It is possible to declare option-based set with cuckoo::make_traits metafunction result as \p Traits template argument.
+
+        Template argument list \p Options... of cuckoo::make_traits metafunction are:
+        - opt::hash - hash functor tuple, mandatory option. At least, two hash functors should be provided. All hash functor
+            should be orthogonal (different): for each <tt> i,j: i != j => h[i](x) != h[j](x) </tt>.
+            The hash functors are passed as <tt> std::tuple< H1, H2, ... Hn > </tt>. The number of hash functors specifies
+            the number \p k - the count of hash tables in cuckoo hashing. If the compiler supports variadic templates
+            then k is unlimited, otherwise up to 10 different hash functors are supported.
+        - opt::mutex_policy - concurrent access policy.
+            Available policies: cuckoo::striping, cuckoo::refinable.
+            Default is cuckoo::striping.
+        - opt::equal_to - key equality functor like \p std::equal_to.
+            If this functor is defined then the probe-set will be unordered.
+            If opt::compare or opt::less option is specified too, then the probe-set will be ordered
+            and opt::equal_to will be ignored.
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+            If opt::compare or opt::less option is specified, then the probe-set will be ordered.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+            If opt::compare or opt::less option is specified, then the probe-set will be ordered.
+        - opt::item_counter - the type of item counting feature. Default is \ref opt::v::sequential_item_counter.
+        - opt::allocator - the allocator type using for allocating bucket tables.
+            Default is \p CDS_DEFAULT_ALLOCATOR
+        - opt::node_allocator - the allocator type using for allocating set's items. If this option
+            is not specified then the type defined in opt::allocator option is used.
+        - cuckoo::store_hash - this option reserves additional space in the node to store the hash value
+            of the object once it's introduced in the container. When this option is used,
+            the unordered container will store the calculated hash value in the node and rehashing operations won't need
+            to recalculate the hash of the value. This option will improve the performance of unordered containers
+            when rehashing is frequent or hashing the value is a slow operation. Default value is \p false.
+        - \ref intrusive::cuckoo::probeset_type "cuckoo::probeset_type" - type of probe set, may be \p cuckoo::list or <tt>cuckoo::vector<Capacity></tt>,
+            Default is \p cuckoo::list.
+        - opt::stat - internal statistics. Possibly types: cuckoo::stat, cuckoo::empty_stat.
+            Default is cuckoo::empty_stat
+
+        <b>Examples</b>
+
+        Cuckoo-set with list-based unordered probe set and storing hash values
+        \code
+        #include <cds/container/cuckoo_set.h>
+
+        // Data stored in cuckoo set
+        struct my_data
+        {
+            // key field
+            std::string     strKey;
+
+            // other data
+            // ...
+        };
+
+        // Provide equal_to functor for my_data since we will use unordered probe-set
+        struct my_data_equal_to {
+            bool operator()( const my_data& d1, const my_data& d2 ) const
+            {
+                return d1.strKey.compare( d2.strKey ) == 0;
+            }
+
+            bool operator()( const my_data& d, const std::string& s ) const
+            {
+                return d.strKey.compare(s) == 0;
+            }
+
+            bool operator()( const std::string& s, const my_data& d ) const
+            {
+                return s.compare( d.strKey ) == 0;
+            }
+        };
+
+        // Provide two hash functor for my_data
+        struct hash1 {
+            size_t operator()(std::string const& s) const
+            {
+                return cds::opt::v::hash<std::string>( s );
+            }
+            size_t operator()( my_data const& d ) const
+            {
+                return (*this)( d.strKey );
+            }
+        };
+
+        struct hash2: private hash1 {
+            size_t operator()(std::string const& s) const
+            {
+                size_t h = ~( hash1::operator()(s));
+                return ~h + 0x9e3779b9 + (h << 6) + (h >> 2);
+            }
+            size_t operator()( my_data const& d ) const
+            {
+                return (*this)( d.strKey );
+            }
+        };
+
+        // Declare type traits
+        struct my_traits: public cds::container::cuckoo::type_traits
+        {
+            typedef my_data_equa_to equal_to;
+            typedef std::tuple< hash1, hash2 >  hash;
+
+            static bool const store_hash = true;
+        };
+
+        // Declare CuckooSet type
+        typedef cds::container::CuckooSet< my_data, my_traits > my_cuckoo_set;
+
+        // Equal option-based declaration
+        typedef cds::container::CuckooSet< my_data,
+            cds::container::cuckoo::make_traits<
+                cds::opt::hash< std::tuple< hash1, hash2 > >
+                ,cds::opt::equal_to< my_data_equal_to >
+                ,cds::container::cuckoo::store_hash< true >
+            >::type
+        > opt_cuckoo_set;
+        \endcode
+
+        If we provide \p compare function instead of \p equal_to for \p my_data
+        we get as a result a cuckoo set with ordered probe set that may improve
+        performance.
+        Example for ordered vector-based probe-set:
+
+        \code
+        #include <cds/container/cuckoo_set.h>
+
+        // Data stored in cuckoo set
+        struct my_data
+        {
+            // key field
+            std::string     strKey;
+
+            // other data
+            // ...
+        };
+
+        // Provide compare functor for my_data since we want to use ordered probe-set
+        struct my_data_compare {
+            int operator()( const my_data& d1, const my_data& d2 ) const
+            {
+                return d1.strKey.compare( d2.strKey );
+            }
+
+            int operator()( const my_data& d, const std::string& s ) const
+            {
+                return d.strKey.compare(s);
+            }
+
+            int operator()( const std::string& s, const my_data& d ) const
+            {
+                return s.compare( d.strKey );
+            }
+        };
+
+        // Provide two hash functor for my_data
+        struct hash1 {
+            size_t operator()(std::string const& s) const
+            {
+                return cds::opt::v::hash<std::string>( s );
+            }
+            size_t operator()( my_data const& d ) const
+            {
+                return (*this)( d.strKey );
+            }
+        };
+
+        struct hash2: private hash1 {
+            size_t operator()(std::string const& s) const
+            {
+                size_t h = ~( hash1::operator()(s));
+                return ~h + 0x9e3779b9 + (h << 6) + (h >> 2);
+            }
+            size_t operator()( my_data const& d ) const
+            {
+                return (*this)( d.strKey );
+            }
+        };
+
+        // Declare type traits
+        // We use a vector of capacity 4 as probe-set container and store hash values in the node
+        struct my_traits: public cds::container::cuckoo::type_traits
+        {
+            typedef my_data_compare compare;
+            typedef std::tuple< hash1, hash2 >  hash;
+            typedef cds::container::cuckoo::vector<4> probeset_type;
+
+            static bool const store_hash = true;
+        };
+
+        // Declare CuckooSet type
+        typedef cds::container::CuckooSet< my_data, my_traits > my_cuckoo_set;
+
+        // Equal option-based declaration
+        typedef cds::container::CuckooSet< my_data,
+            cds::container::cuckoo::make_traits<
+                cds::opt::hash< std::tuple< hash1, hash2 > >
+                ,cds::opt::compare< my_data_compare >
+                ,cds::container::cuckoo::probeset_type< cds::container::cuckoo::vector<4> >
+                ,cds::container::cuckoo::store_hash< true >
+            >::type
+        > opt_cuckoo_set;
+        \endcode
+
+    */
+    template <typename T, typename Traits = cuckoo::type_traits>
+    class CuckooSet:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::CuckooSet<T, Traits>
+#else
+        protected details::make_cuckoo_set<T, Traits>::type
+#endif
+    {
+        //@cond
+        typedef details::make_cuckoo_set<T, Traits> maker;
+        typedef typename maker::type  base_class;
+        //@endcond
+
+    public:
+        typedef T       value_type  ;   ///< value type stored in the container
+        typedef Traits  options     ;   ///< traits
+
+        typedef typename options::hash                  hash            ;   ///< hash functor tuple wrapped for internal use
+        typedef typename base_class::hash_tuple_type    hash_tuple_type ;   ///< Type of hash tuple
+
+        typedef typename base_class::mutex_policy       mutex_policy    ;   ///< Concurrent access policy, see cuckoo::type_traits::mutex_policy
+        typedef typename base_class::stat               stat            ;   ///< internal statistics type
+
+
+        static bool const c_isSorted = base_class::c_isSorted   ; ///< whether the probe set should be ordered
+        static size_t const c_nArity = base_class::c_nArity     ; ///< the arity of cuckoo hashing: the number of hash functors provided; minimum 2.
+
+        typedef typename base_class::key_equal_to key_equal_to  ; ///< Key equality functor; used only for unordered probe-set
+
+        typedef typename base_class::key_comparator  key_comparator ; ///< key comparing functor based on opt::compare and opt::less option setter. Used only for ordered probe set
+
+        typedef typename base_class::allocator     allocator   ; ///< allocator type used for internal bucket table allocations
+
+        /// Node allocator type
+        typedef typename std::conditional<
+            std::is_same< typename options::node_allocator, opt::none >::value,
+            allocator,
+            typename options::node_allocator
+        >::type node_allocator;
+
+        /// item counter type
+        typedef typename options::item_counter  item_counter;
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type         node_type;
+        typedef cds::details::Allocator< node_type, node_allocator >    cxx_node_allocator;
+        //@endcond
+
+    public:
+        static unsigned int const   c_nDefaultProbesetSize = base_class::c_nDefaultProbesetSize ;   ///< default probeset size
+        static size_t const         c_nDefaultInitialSize = base_class::c_nDefaultInitialSize   ;   ///< default initial size
+        static unsigned int const   c_nRelocateLimit = base_class::c_nRelocateLimit             ;   ///< Count of attempts to relocate before giving up
+
+    protected:
+        //@cond
+        template <typename Q>
+        static node_type * alloc_node( Q const& v )
+        {
+            return cxx_node_allocator().New( v );
+        }
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_node_allocator().MoveNew( std::forward<Args>(args)... );
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_node_allocator().Delete( pNode );
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor {
+            void operator()( value_type& ) const
+            {}
+        };
+
+        struct empty_find_functor {
+            template <typename Q>
+            void operator()( node_type& item, Q& val ) const
+            {}
+        };
+
+        template <typename Func>
+        class insert_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_wrapper( Func f ): base_class(f) {}
+
+            void operator()( node_type& node )
+            {
+                base_class::get()( node.m_val );
+            }
+        };
+
+        template <typename Q, typename Func>
+        class ensure_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            Q const&    val;
+
+            ensure_wrapper( Q const& v, Func f) : base_class(f), val(v) {}
+
+            void operator()( bool bNew, node_type& item, node_type const& )
+            {
+                base_class::get()( bNew, item.m_val, val );
+            }
+        };
+
+        template <typename Func>
+        class find_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_wrapper( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator()( node_type& item, Q& val )
+            {
+                base_class::get()( item.m_val, val );
+            }
+        };
+#   endif
+        //@endcond
+
+    public:
+        /// Default constructor
+        /**
+            Initial size = \ref c_nDefaultInitialSize
+
+            Probe set size:
+            - \ref c_nDefaultProbesetSize if \p probeset_type is \p cuckoo::list
+            - \p Capacity if \p probeset_type is <tt> cuckoo::vector<Capacity> </tt>
+
+            Probe set threshold = probe set size - 1
+        */
+        CuckooSet()
+        {}
+
+        /// Constructs the set object with given probe set size and threshold
+        /**
+            If probe set type is <tt> cuckoo::vector<Capacity> </tt> vector
+            then \p nProbesetSize should be equal to vector's \p Capacity.
+        */
+        CuckooSet(
+            size_t nInitialSize                 ///< Initial set size; if 0 - use default initial size \ref c_nDefaultInitialSize
+            , unsigned int nProbesetSize        ///< probe set size
+            , unsigned int nProbesetThreshold = 0  ///< probe set threshold, <tt>nProbesetThreshold < nProbesetSize</tt>. If 0, nProbesetThreshold = nProbesetSize - 1
+        )
+        : base_class( nInitialSize, nProbesetSize, nProbesetThreshold )
+        {}
+
+        /// Constructs the set object with given hash functor tuple
+        /**
+            The probe set size and threshold are set as default, see CuckooSet()
+        */
+        CuckooSet(
+            hash_tuple_type const& h    ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+        : base_class( h )
+        {}
+
+        /// Constructs the set object with given probe set properties and hash functor tuple
+        /**
+            If probe set type is <tt> cuckoo::vector<Capacity> </tt> vector
+            then \p nProbesetSize should be equal to vector's \p Capacity.
+        */
+        CuckooSet(
+            size_t nInitialSize                 ///< Initial set size; if 0 - use default initial size \ref c_nDefaultInitialSize
+            , unsigned int nProbesetSize        ///< probe set size
+            , unsigned int nProbesetThreshold   ///< probe set threshold, <tt>nProbesetThreshold < nProbesetSize</tt>. If 0, nProbesetThreshold = nProbesetSize - 1
+            , hash_tuple_type const& h    ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+        : base_class( nInitialSize, nProbesetSize, nProbesetThreshold, h )
+        {}
+
+#   ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        /// Constructs the set object with given hash functor tuple (move semantics)
+        /**
+            The probe set size and threshold are set as default, see CuckooSet()
+        */
+        CuckooSet(
+            hash_tuple_type&& h     ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+        : base_class( std::forward<hash_tuple_type>(h) )
+        {}
+
+        /// Constructs the set object with given probe set properties and hash functor tuple (move semantics)
+        /**
+            If probe set type is <tt> cuckoo::vector<Capacity> </tt> vector
+            then \p nProbesetSize should be equal to vector's \p Capacity.
+        */
+        CuckooSet(
+            size_t nInitialSize                 ///< Initial set size; if 0 - use default initial size \ref c_nDefaultInitialSize
+            , unsigned int nProbesetSize        ///< probe set size
+            , unsigned int nProbesetThreshold   ///< probe set threshold, <tt>nProbesetThreshold < nProbesetSize</tt>. If 0, nProbesetThreshold = nProbesetSize - 1
+            , hash_tuple_type&& h    ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+        : base_class( nInitialSize, nProbesetSize, nProbesetThreshold, std::forward<hash_tuple_type>(h) )
+        {}
+#   endif   // ifdef CDS_MOVE_SEMANTICS_SUPPORT
+
+        /// Destructor clears the set
+        ~CuckooSet()
+        {
+            clear();
+        }
+
+    public:
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the set.
+
+            The type \p Q should contain as minimum the complete key for the node.
+            The object of \ref value_type should be constructible from a value of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert( val, []( value_type& ) {} );
+#       else
+            return insert( val, empty_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls \p f functor to initialize value-field of new item .
+
+            The functor signature is:
+            \code
+                void func( value_type& item );
+            \endcode
+            where \p item is the item inserted.
+
+            The type \p Q can differ from \ref value_type of items storing in the set.
+            Therefore, the \p value_type should be constructible from type \p Q.
+
+            The user-defined functor is called only if the inserting is success. It can be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& val, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( val ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *pNode, [&f]( node_type& node ) { cds::unref(f)( node.m_val ); } ))
+#       else
+            insert_wrapper<Func> wrapper( f );
+            if ( base_class::insert( *pNode, cds::ref(wrapper) ))
+#       endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr pNode( alloc_node( std::forward<Args>(args)... ));
+            if ( base_class::insert( *pNode )) {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Ensures that the \p val exists in the set
+        /**
+            The operation performs inserting or changing data.
+
+            If the \p val key not found in the set, then the new item created from \p val
+            is inserted into the set. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+
+            The functor can change non-key fields of the \p item.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p val key
+            already exists.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( Q const& val, Func func )
+        {
+            scoped_node_ptr pNode( alloc_node( val ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> res = base_class::ensure( *pNode,
+                [&val,&func](bool bNew, node_type& item, node_type const& ){ cds::unref(func)( bNew, item.m_val, val ); }
+            );
+#       else
+            ensure_wrapper<Q, Func> wrapper( val, func );
+            std::pair<bool, bool> res = base_class::ensure( *pNode, cds::ref(wrapper) );
+#       endif
+            if ( res.first && res.second )
+                pNode.release();
+            return res;
+        }
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_CuckooSet_erase
+
+            Since the key of set's item type \ref value_type is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The set item comparator should be able to compare the type \p value_type
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+            node_type * pNode = base_class::erase( key );
+            if ( pNode ) {
+                free_node( pNode );
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_CuckooSet_erase "erase(Q const&)"
+            but \p pred is used for key comparing.
+            If cuckoo set is ordered, then \p Predicate should have the interface and semantics like \p std::less.
+            If cuckoo set is unordered, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p Predicate must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Predicate>
+        bool erase_with( Q const& key, Predicate pred )
+        {
+            node_type * pNode = base_class::erase_with( key, typename maker::template predicate_wrapper<Predicate, bool>() );
+            if ( pNode ) {
+                free_node( pNode );
+                return true;
+            }
+            return false;
+        }
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_CuckooSet_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface is:
+            \code
+            struct functor {
+                void operator()(value_type const& val);
+            };
+            \endcode
+            The functor can be passed by value or by reference using <tt>boost:ref</tt>
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+            node_type * pNode = base_class::erase( key );
+            if ( pNode ) {
+                cds::unref(f)( pNode->m_val );
+                free_node( pNode );
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_CuckooSet_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            If you use ordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::less.
+            If you use unordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p Predicate must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Predicate, typename Func>
+        bool erase_with( Q const& key, Predicate pred, Func f )
+        {
+            node_type * pNode = base_class::erase_with( key, typename maker::template predicate_wrapper<Predicate, bool>() );
+            if ( pNode ) {
+                cds::unref(f)( pNode->m_val );
+                free_node( pNode );
+                return true;
+            }
+            return false;
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_CuckooSet_find_func
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            The type \p Q can differ from \ref value_type of items storing in the container.
+            Therefore, the \p value_type should be comparable with type \p Q.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f](node_type& item, Q& v) { cds::unref(f)( item.m_val, v );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find( val, cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Find the key \p val using \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_nonintrusive_CuckooSet_find_func "find(Q&, Func)"
+            but \p pred is used for key comparison.
+            If you use ordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::less.
+            If you use unordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Predicate, typename Func>
+        bool find_with( Q& val, Predicate pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Predicate, bool>(),
+                [&f](node_type& item, Q& v) { cds::unref(f)( item.m_val, v );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Predicate, bool>(), cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_CuckooSet_find_cfunc
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+
+            The type \p Q can differ from \ref value_type of items storing in the container.
+            Therefore, the \p value_type should be comparable with type \p Q.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f](node_type& item, Q const& v) { cds::unref(f)( item.m_val, v );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find( val, cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Find the key \p val using \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_nonintrusive_CuckooSet_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparison.
+            If you use ordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::less.
+            If you use unordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Predicate, typename Func>
+        bool find_with( Q const& val, Predicate pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Predicate, bool>(),
+                [&f](node_type& item, Q const& v) { cds::unref(f)( item.m_val, v );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Predicate, bool>(), cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_CuckooSet_find_val
+
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \ref value_type.
+        */
+        template <typename Q>
+        bool find( Q const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [](node_type&, Q const&) {});
+#       else
+            return base_class::find( val, empty_find_functor());
+#       endif
+        }
+
+        /// Find the key \p val using \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_nonintrusive_CuckooSet_find_val "find(Q const&)"
+            but \p pred is used for key comparison.
+            If you use ordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::less.
+            If you use unordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Predicate>
+        bool find_with( Q const& val, Predicate pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Predicate, bool>(), [](node_type&, Q const&) {});
+#       else
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Predicate, bool>(), empty_find_functor());
+#       endif
+        }
+
+        /// Clears the set
+        /**
+            The function erases all items from the set.
+        */
+        void clear()
+        {
+            return base_class::clear_and_dispose( node_disposer() );
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns the size of hash table
+        /**
+            The hash table size is non-constant and can be increased via resizing.
+        */
+        size_t bucket_count() const
+        {
+            return base_class::bucket_count();
+        }
+
+        /// Returns lock array size
+        size_t lock_count() const
+        {
+            return base_class::lock_count();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Returns const reference to mutex policy internal statistics
+        typename mutex_policy::statistics_type const& mutex_policy_statistics() const
+        {
+            return base_class::mutex_policy_statistics();
+        }
+
+    };
+
+}} // namespace cds::container
+
+#endif //#ifndef __CDS_CONTAINER_CUCKOO_SET_H
diff --git a/cds/container/details/guarded_ptr_cast.h b/cds/container/details/guarded_ptr_cast.h
new file mode 100644 (file)
index 0000000..351e060
--- /dev/null
@@ -0,0 +1,30 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_DETAILS_GUARDED_PTR_CAST_H
+#define __CDS_CONTAINER_DETAILS_GUARDED_PTR_CAST_H
+//@cond
+
+#include <cds/details/defs.h>
+
+namespace cds { namespace container { namespace details {
+
+    template <typename Node, typename T>
+    struct guarded_ptr_cast_set {
+        T * operator()(Node* pNode ) const CDS_NOEXCEPT
+        {
+            return &(pNode->m_Value);
+        }
+    };
+
+    template <typename Node, typename T>
+    struct guarded_ptr_cast_map {
+        T * operator()(Node* pNode ) const CDS_NOEXCEPT
+        {
+            return &(pNode->m_Data);
+        }
+    };
+
+}}} // namespace cds::container::details
+
+//@endcond
+#endif // #ifndef __CDS_CONTAINER_DETAILS_GUARDED_PTR_CAST_H
diff --git a/cds/container/details/make_lazy_kvlist.h b/cds/container/details/make_lazy_kvlist.h
new file mode 100644 (file)
index 0000000..89351f7
--- /dev/null
@@ -0,0 +1,89 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_DETAILS_MAKE_LAZY_KVLIST_H
+#define __CDS_CONTAINER_DETAILS_MAKE_LAZY_KVLIST_H
+
+#include <cds/details/binary_functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+
+        template <class GC, typename K, typename T, class Traits>
+        struct make_lazy_kvlist
+        {
+            typedef Traits original_type_traits;
+
+            typedef GC      gc;
+            typedef K       key_type;
+            typedef T       value_type;
+            typedef std::pair<key_type const, value_type>       pair_type;
+
+            struct node_type: public intrusive::lazy_list::node<gc, typename original_type_traits::lock_type>
+            {
+                pair_type   m_Data;
+
+                template <typename Q>
+                node_type( Q const& key )
+                    : m_Data( key, value_type() )
+                {}
+
+                template <typename Q, typename R>
+                explicit node_type( std::pair<Q, R> const& pair )
+                    : m_Data( pair )
+                {}
+
+                template <typename Q, typename R>
+                node_type( Q const& key, R const& value )
+                    : m_Data( key, value )
+                {}
+
+#           ifdef CDS_EMPLACE_SUPPORT
+                template <typename Ky, typename... Args>
+                node_type( Ky&& key, Args&&... args )
+                    : m_Data( std::forward<Ky>(key), std::move( value_type( std::forward<Args>(args)...)))
+                {}
+#           endif
+            };
+
+            typedef typename original_type_traits::allocator::template rebind<node_type>::other  allocator_type;
+            typedef cds::details::Allocator< node_type, allocator_type >                cxx_allocator;
+
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_allocator().Delete( pNode );
+                }
+            };
+
+            struct key_field_accessor {
+                key_type const& operator()( node_type const& pair )
+                {
+                    return pair.m_Data.first;
+                }
+            };
+
+            typedef typename opt::details::make_comparator< key_type, original_type_traits >::type key_comparator;
+
+            template <typename Less>
+            struct less_wrapper {
+                typedef cds::details::compare_wrapper< node_type, cds::opt::details::make_comparator_from_less<Less>, key_field_accessor >    type;
+            };
+
+            struct type_traits: public original_type_traits
+            {
+                typedef intrusive::lazy_list::base_hook< opt::gc<gc> >  hook;
+                typedef node_deallocator                    disposer;
+                typedef cds::details::compare_wrapper< node_type, key_comparator, key_field_accessor > compare;
+            };
+
+            typedef intrusive::LazyList<gc, node_type, type_traits>  type;
+        };
+    }   // namespace details
+    //@endcond
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_DETAILS_MAKE_LAZY_KVLIST_H
diff --git a/cds/container/details/make_lazy_list.h b/cds/container/details/make_lazy_list.h
new file mode 100644 (file)
index 0000000..30b30c6
--- /dev/null
@@ -0,0 +1,79 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_DETAILS_MAKE_LAZY_LIST_H
+#define __CDS_CONTAINER_DETAILS_MAKE_LAZY_LIST_H
+
+#include <cds/details/binary_functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+
+        template <class GC, typename T, class Traits>
+        struct make_lazy_list
+        {
+            typedef GC      gc;
+            typedef T       value_type;
+            typedef Traits original_type_traits;
+
+            struct node_type : public intrusive::lazy_list::node<gc, typename original_type_traits::lock_type>
+            {
+                value_type  m_Value;
+
+                node_type()
+                {}
+
+                template <typename Q>
+                node_type( Q const& v )
+                    : m_Value(v)
+                {}
+#       ifdef CDS_EMPLACE_SUPPORT
+                template <typename... Args>
+                node_type( Args&&... args )
+                    : m_Value( std::forward<Args>(args)...)
+                {}
+#       endif
+            };
+
+            typedef typename original_type_traits::allocator::template rebind<node_type>::other  allocator_type;
+            typedef cds::details::Allocator< node_type, allocator_type >                cxx_allocator;
+
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_allocator().Delete( pNode );
+                }
+            };
+
+            typedef typename opt::details::make_comparator< value_type, original_type_traits >::type key_comparator;
+
+            struct value_accessor {
+                value_type const & operator()( node_type const & node ) const
+                {
+                    return node.m_Value;
+                }
+            };
+
+            template <typename Less>
+            struct less_wrapper {
+                typedef cds::details::compare_wrapper< node_type, cds::opt::details::make_comparator_from_less<Less>, value_accessor > type;
+            };
+
+            struct type_traits: public original_type_traits
+            {
+                typedef intrusive::lazy_list::base_hook< opt::gc<gc> >  hook;
+                typedef node_deallocator               disposer;
+
+                typedef cds::details::compare_wrapper< node_type, key_comparator, value_accessor > compare;
+            };
+
+            typedef intrusive::LazyList<gc, node_type, type_traits>  type;
+        };
+    }   // namespace details
+    //@endcond
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_DETAILS_MAKE_MICHAEL_LIST_H
diff --git a/cds/container/details/make_michael_kvlist.h b/cds/container/details/make_michael_kvlist.h
new file mode 100644 (file)
index 0000000..9d0bcf2
--- /dev/null
@@ -0,0 +1,89 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_DETAILS_MAKE_MICHAEL_KVLIST_H
+#define __CDS_CONTAINER_DETAILS_MAKE_MICHAEL_KVLIST_H
+
+#include <cds/details/binary_functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+
+        template <class GC, typename K, typename T, class Traits>
+        struct make_michael_kvlist
+        {
+            typedef Traits original_type_traits;
+
+            typedef GC       gc;
+            typedef K        key_type;
+            typedef T        value_type;
+            typedef std::pair<key_type const, value_type>       pair_type;
+
+            struct node_type: public intrusive::michael_list::node<gc>
+            {
+                pair_type               m_Data;
+
+                template <typename Q>
+                node_type( Q const& key )
+                    : m_Data( key, value_type() )
+                {}
+
+                template <typename Q, typename R>
+                explicit node_type( std::pair<Q, R> const& pair )
+                    : m_Data( pair )
+                {}
+
+                template <typename Q, typename R>
+                node_type( Q const& key, R const& value )
+                    : m_Data( key, value )
+                {}
+
+#       ifdef CDS_EMPLACE_SUPPORT
+                template< typename Ky, typename... Args>
+                node_type( Ky&& key, Args&&... args )
+                    : m_Data( std::forward<Ky>(key), std::move( value_type( std::forward<Args>(args)...)))
+                {}
+#       endif
+            };
+
+            typedef typename original_type_traits::allocator::template rebind<node_type>::other  allocator_type;
+            typedef cds::details::Allocator< node_type, allocator_type >                cxx_allocator;
+
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_allocator().Delete( pNode );
+                }
+            };
+
+            struct key_field_accessor {
+                key_type const& operator()( node_type const& pair )
+                {
+                    return pair.m_Data.first;
+                }
+            };
+
+            typedef typename opt::details::make_comparator< key_type, original_type_traits >::type key_comparator;
+
+            template <typename Less>
+            struct less_wrapper {
+                typedef cds::details::compare_wrapper< node_type, cds::opt::details::make_comparator_from_less<Less>, key_field_accessor >    type;
+            };
+
+            struct type_traits: public original_type_traits
+            {
+                typedef intrusive::michael_list::base_hook< opt::gc<gc> >  hook;
+                typedef node_deallocator                    disposer;
+                typedef cds::details::compare_wrapper< node_type, key_comparator, key_field_accessor > compare;
+            };
+
+            typedef intrusive::MichaelList<gc, node_type, type_traits>  type;
+        };
+    }   // namespace details
+    //@endcond
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_DETAILS_MAKE_MICHAEL_KVLIST_H
diff --git a/cds/container/details/make_michael_list.h b/cds/container/details/make_michael_list.h
new file mode 100644 (file)
index 0000000..8d65e28
--- /dev/null
@@ -0,0 +1,82 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_DETAILS_MAKE_MICHAEL_LIST_H
+#define __CDS_CONTAINER_DETAILS_MAKE_MICHAEL_LIST_H
+
+#include <cds/details/binary_functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+
+        template <class GC, typename T, class Traits>
+        struct make_michael_list
+        {
+            typedef GC      gc;
+            typedef T       value_type;
+
+            struct node_type : public intrusive::michael_list::node<gc>
+            {
+                value_type  m_Value;
+
+                node_type()
+                {}
+
+                template <typename Q>
+                node_type( Q const& v )
+                    : m_Value(v)
+                {}
+
+#       ifdef CDS_EMPLACE_SUPPORT
+                template <typename... Args>
+                node_type( Args&&... args )
+                    : m_Value( std::forward<Args>(args)... )
+                {}
+#       endif
+            };
+
+            typedef Traits original_type_traits;
+
+            typedef typename original_type_traits::allocator::template rebind<node_type>::other  allocator_type;
+            typedef cds::details::Allocator< node_type, allocator_type >                cxx_allocator;
+
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_allocator().Delete( pNode );
+                }
+            };
+
+            typedef typename opt::details::make_comparator< value_type, original_type_traits >::type key_comparator;
+
+            struct value_accessor
+            {
+                value_type const & operator()( node_type const& node ) const
+                {
+                    return node.m_Value;
+                }
+            };
+
+            template <typename Less>
+            struct less_wrapper {
+                typedef cds::details::compare_wrapper< node_type, cds::opt::details::make_comparator_from_less<Less>, value_accessor >    type;
+            };
+
+            struct type_traits: public original_type_traits
+            {
+                typedef intrusive::michael_list::base_hook< opt::gc<gc> >  hook;
+                typedef node_deallocator               disposer;
+
+                typedef cds::details::compare_wrapper< node_type, key_comparator, value_accessor > compare;
+            };
+
+            typedef intrusive::MichaelList<gc, node_type, type_traits>  type;
+        };
+    }   // namespace details
+    //@endcond
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_DETAILS_MAKE_MICHAEL_LIST_H
diff --git a/cds/container/details/make_skip_list_map.h b/cds/container/details/make_skip_list_map.h
new file mode 100644 (file)
index 0000000..b91c998
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_DETAILS_MAKE_SKIP_LIST_MAP_H
+#define __CDS_CONTAINER_DETAILS_MAKE_SKIP_LIST_MAP_H
+
+#include <cds/container/skip_list_base.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+//@cond
+namespace cds { namespace container { namespace details {
+
+    template <typename GC, typename K, typename T, typename Traits>
+    struct make_skip_list_map
+    {
+        typedef GC      gc;
+        typedef K       key_type;
+        typedef T       mapped_type;
+        typedef std::pair< key_type const, mapped_type> value_type;
+        typedef Traits  type_traits;
+
+        typedef cds::intrusive::skip_list::node< gc >   intrusive_node_type;
+        struct node_type: public intrusive_node_type
+        {
+            typedef intrusive_node_type                     base_class;
+            typedef typename base_class::atomic_marked_ptr  atomic_marked_ptr;
+            typedef value_type                              stored_value_type;
+
+            value_type m_Value;
+            //atomic_marked_ptr m_arrTower[] ;  // allocated together with node_type in single memory block
+
+            template <typename Q>
+            node_type( unsigned int nHeight, atomic_marked_ptr * pTower, Q const& key )
+                : m_Value( std::make_pair( key, mapped_type() ))
+            {
+                init_tower( nHeight, pTower );
+            }
+
+            template <typename Q, typename U>
+            node_type( unsigned int nHeight, atomic_marked_ptr * pTower, Q const& key, U const& val )
+                : m_Value( std::make_pair( key, val ))
+            {
+                init_tower( nHeight, pTower );
+            }
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            template <typename Q, typename... Args>
+            node_type( unsigned int nHeight, atomic_marked_ptr * pTower, Q&& key, Args&&... args )
+                : m_Value( std::forward<Q>(key), std::move( mapped_type( std::forward<Args>(args)... )))
+            {
+                init_tower( nHeight, pTower );
+            }
+#       endif
+
+        private:
+            node_type() ;   // no default ctor
+
+            void init_tower( unsigned int nHeight, atomic_marked_ptr * pTower )
+            {
+                if ( nHeight > 1 ) {
+                    new (pTower) atomic_marked_ptr[ nHeight - 1 ];
+                    base_class::make_tower( nHeight, pTower );
+                }
+            }
+        };
+
+        class node_allocator: public skip_list::details::node_allocator< node_type, type_traits>
+        {
+            typedef skip_list::details::node_allocator< node_type, type_traits> base_class;
+        public:
+            template <typename Q>
+            node_type * New( unsigned int nHeight, Q const& key )
+            {
+                return base_class::New( nHeight, key );
+            }
+            template <typename Q, typename U>
+            node_type * New( unsigned int nHeight, Q const& key, U const& val )
+            {
+                unsigned char * pMem = base_class::alloc_space( nHeight );
+                return new( pMem )
+                    node_type( nHeight,
+                        nHeight > 1 ? reinterpret_cast<typename base_class::node_tower_item *>( pMem + base_class::c_nNodeSize )
+                            : null_ptr<typename base_class::node_tower_item *>(),
+                        key, val );
+            }
+#       ifdef CDS_EMPLACE_SUPPORT
+            template <typename... Args>
+            node_type * New( unsigned int nHeight, Args&&... args )
+            {
+                unsigned char * pMem = base_class::alloc_space( nHeight );
+                return new( pMem )
+                    node_type( nHeight, nHeight > 1 ? reinterpret_cast<typename base_class::node_tower_item *>( pMem + base_class::c_nNodeSize )
+                        : null_ptr<typename base_class::node_tower_item *>(),
+                    std::forward<Args>(args)... );
+            }
+#       endif
+        };
+
+        struct node_deallocator {
+            void operator ()( node_type * pNode )
+            {
+                node_allocator().Delete( pNode );
+            }
+        };
+
+        typedef skip_list::details::dummy_node_builder<intrusive_node_type> dummy_node_builder;
+
+        struct key_accessor
+        {
+            key_type const & operator()( node_type const& node ) const
+            {
+                return node.m_Value.first;
+            }
+        };
+        typedef typename opt::details::make_comparator< key_type, type_traits >::type key_comparator;
+
+        class intrusive_type_traits: public cds::intrusive::skip_list::make_traits<
+            cds::opt::type_traits< type_traits >
+            ,cds::intrusive::opt::hook< intrusive::skip_list::base_hook< cds::opt::gc< gc > > >
+            ,cds::intrusive::opt::disposer< node_deallocator >
+            ,cds::intrusive::skip_list::internal_node_builder< dummy_node_builder >
+            ,cds::opt::compare< cds::details::compare_wrapper< node_type, key_comparator, key_accessor > >
+        >::type
+        {};
+
+        typedef cds::intrusive::SkipListSet< gc, node_type, intrusive_type_traits>   type;
+    };
+
+}}} // namespace cds::container::details
+//@endcond
+
+#endif // __CDS_CONTAINER_DETAILS_MAKE_SKIP_LIST_MAP_H
diff --git a/cds/container/details/make_skip_list_set.h b/cds/container/details/make_skip_list_set.h
new file mode 100644 (file)
index 0000000..e88ee5c
--- /dev/null
@@ -0,0 +1,94 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_DETAILS_MAKE_SKIP_LIST_SET_H
+#define __CDS_CONTAINER_DETAILS_MAKE_SKIP_LIST_SET_H
+
+#include <cds/container/skip_list_base.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+//@cond
+namespace cds { namespace container { namespace details {
+
+    template <typename GC, typename T, typename Traits>
+    struct make_skip_list_set
+    {
+        typedef GC      gc;
+        typedef T       value_type;
+        typedef Traits  type_traits;
+
+        typedef cds::intrusive::skip_list::node< gc >   intrusive_node_type;
+        struct node_type: public intrusive_node_type
+        {
+            typedef intrusive_node_type                     base_class;
+            typedef typename base_class::atomic_marked_ptr  atomic_marked_ptr;
+            typedef value_type                              stored_value_type;
+
+            value_type m_Value;
+            //atomic_marked_ptr m_arrTower[] ;  // allocated together with node_type in single memory block
+
+            template <typename Q>
+            node_type( unsigned int nHeight, atomic_marked_ptr * pTower, Q const& v )
+                : m_Value(v)
+            {
+                if ( nHeight > 1 ) {
+                    new (pTower) atomic_marked_ptr[ nHeight - 1 ];
+                    base_class::make_tower( nHeight, pTower );
+                }
+            }
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            template <typename Q, typename... Args>
+            node_type( unsigned int nHeight, atomic_marked_ptr * pTower, Q&& q, Args&&... args )
+                : m_Value( std::forward<Q>(q), std::forward<Args>(args)... )
+            {
+                if ( nHeight > 1 ) {
+                    new (pTower) atomic_marked_ptr[ nHeight - 1 ];
+                    base_class::make_tower( nHeight, pTower );
+                }
+            }
+#       endif
+
+        private:
+            node_type() ;   // no default ctor
+        };
+
+        typedef skip_list::details::node_allocator< node_type, type_traits> node_allocator;
+
+        struct node_deallocator {
+            void operator ()( node_type * pNode )
+            {
+                node_allocator().Delete( pNode );
+            }
+        };
+
+        typedef skip_list::details::dummy_node_builder<intrusive_node_type> dummy_node_builder;
+
+        struct value_accessor
+        {
+            value_type const& operator()( node_type const& node ) const
+            {
+                return node.m_Value;
+            }
+        };
+        typedef typename opt::details::make_comparator< value_type, type_traits >::type key_comparator;
+
+        template <typename Less>
+        struct less_wrapper {
+            typedef cds::details::compare_wrapper< node_type, cds::opt::details::make_comparator_from_less<Less>, value_accessor >    type;
+        };
+
+        class intrusive_type_traits: public cds::intrusive::skip_list::make_traits<
+            cds::opt::type_traits< type_traits >
+            ,cds::intrusive::opt::hook< intrusive::skip_list::base_hook< cds::opt::gc< gc > > >
+            ,cds::intrusive::opt::disposer< node_deallocator >
+            ,cds::intrusive::skip_list::internal_node_builder< dummy_node_builder >
+            ,cds::opt::compare< cds::details::compare_wrapper< node_type, key_comparator, value_accessor > >
+        >::type
+        {};
+
+        typedef cds::intrusive::SkipListSet< gc, node_type, intrusive_type_traits>   type;
+    };
+}}} // namespace cds::container::details
+//@endcond
+
+#endif //#ifndef __CDS_CONTAINER_DETAILS_MAKE_SKIP_LIST_SET_H
diff --git a/cds/container/details/make_split_list_set.h b/cds/container/details/make_split_list_set.h
new file mode 100644 (file)
index 0000000..1a5d02e
--- /dev/null
@@ -0,0 +1,239 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_DETAILS_MAKE_SPLIT_LIST_SET_H
+#define __CDS_CONTAINER_DETAILS_MAKE_SPLIT_LIST_SET_H
+
+#include <cds/container/split_list_base.h>
+#include <cds/details/allocator.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+//@cond
+namespace cds { namespace container {
+
+    // Forward declaration
+    struct michael_list_tag;
+    struct lazy_list_tag;
+
+    namespace details {
+
+#ifdef __CDS_CONTAINER_MICHAEL_LIST_BASE_H
+        // if michael_list included
+
+        template <typename GC, typename T, typename Traits>
+        struct make_split_list_set< GC, T, michael_list_tag, Traits >
+        {
+            typedef GC      gc;
+            typedef T       value_type;
+            typedef Traits  original_type_traits;
+
+            typedef typename cds::opt::select_default<
+                typename original_type_traits::ordered_list_traits,
+                cds::container::michael_list::type_traits
+            >::type         original_ordered_list_traits;
+
+            typedef cds::intrusive::split_list::node< cds::intrusive::michael_list::node<gc> > primary_node_type;
+            struct node_type: public primary_node_type
+            {
+                value_type  m_Value;
+
+                template <typename Q>
+                explicit node_type( Q const& v )
+                    : m_Value(v)
+                {}
+#       ifdef CDS_EMPLACE_SUPPORT
+                template <typename Q, typename... Args>
+                explicit node_type( Q&& q, Args&&... args )
+                    : m_Value( std::forward<Q>(q), std::forward<Args>(args)... )
+                {}
+#       endif
+            private:
+                node_type() ;   // no default ctor
+            };
+
+            typedef typename cds::opt::select_default<
+                typename original_type_traits::ordered_list_traits,
+                typename original_type_traits::allocator,
+                typename cds::opt::select_default<
+                    typename original_type_traits::ordered_list_traits::allocator,
+                    typename original_type_traits::allocator
+                >::type
+            >::type node_allocator_;
+
+            typedef typename node_allocator_::template rebind<node_type>::other node_allocator_type;
+
+            typedef cds::details::Allocator< node_type, node_allocator_type >   cxx_node_allocator;
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_node_allocator().Delete( pNode );
+                }
+            };
+
+            typedef typename opt::details::make_comparator< value_type, original_ordered_list_traits >::type key_comparator;
+
+            typedef typename original_type_traits::key_accessor key_accessor;
+
+            struct value_accessor
+            {
+                typename key_accessor::key_type const& operator()( node_type const& node ) const
+                {
+                    return key_accessor()(node.m_Value);
+                }
+            };
+
+            template <typename Predicate>
+            struct predicate_wrapper {
+                typedef cds::details::predicate_wrapper< node_type, Predicate, value_accessor > type;
+            };
+
+            struct ordered_list_traits: public original_ordered_list_traits
+            {
+                typedef cds::intrusive::michael_list::base_hook<
+                    opt::gc<gc>
+                >   hook;
+                typedef atomicity::empty_item_counter   item_counter;
+                typedef node_deallocator                disposer;
+                typedef cds::details::compare_wrapper< node_type, key_comparator, value_accessor > compare;
+            };
+
+            struct type_traits: public original_type_traits
+            {
+                struct hash: public original_type_traits::hash
+                {
+                    typedef typename original_type_traits::hash  base_class;
+
+                    size_t operator()(node_type const& v ) const
+                    {
+                        return base_class::operator()( key_accessor()( v.m_Value ) );
+                    }
+                    template <typename Q>
+                    size_t operator()( Q const& k ) const
+                    {
+                        return base_class::operator()( k );
+                    }
+                    //using base_class::operator();
+                };
+            };
+
+            typedef cds::intrusive::MichaelList< gc, node_type, ordered_list_traits >   ordered_list;
+            typedef cds::intrusive::SplitListSet< gc, ordered_list, type_traits >       type;
+        };
+#endif  // ifdef __CDS_CONTAINER_MICHAEL_LIST_BASE_H
+
+#ifdef __CDS_CONTAINER_LAZY_LIST_BASE_H
+        // if lazy_list included
+        template <typename GC, typename T, typename Traits>
+        struct make_split_list_set< GC, T, lazy_list_tag, Traits >
+        {
+            typedef GC      gc;
+            typedef T       value_type;
+            typedef Traits  original_type_traits;
+
+            typedef typename cds::opt::select_default<
+                typename original_type_traits::ordered_list_traits,
+                cds::container::lazy_list::type_traits
+            >::type         original_ordered_list_traits;
+
+            typedef typename cds::opt::select_default<
+                typename original_ordered_list_traits::lock_type,
+                typename cds::container::lazy_list::type_traits::lock_type
+            >::type   lock_type;
+
+            typedef cds::intrusive::split_list::node< cds::intrusive::lazy_list::node<gc, lock_type > > primary_node_type;
+            struct node_type: public primary_node_type
+            {
+                value_type  m_Value;
+
+                template <typename Q>
+                explicit node_type( const Q& v )
+                    : m_Value(v)
+                {}
+
+#       ifdef CDS_EMPLACE_SUPPORT
+                template <typename Q, typename... Args>
+                explicit node_type( Q&& q, Args&&... args )
+                    : m_Value( std::forward<Q>(q), std::forward<Args>(args)... )
+                {}
+#       endif
+            private:
+                node_type() ;   // no default ctor
+            };
+
+            typedef typename cds::opt::select_default<
+                typename original_type_traits::ordered_list_traits,
+                typename original_type_traits::allocator,
+                typename cds::opt::select_default<
+                    typename original_type_traits::ordered_list_traits::allocator,
+                    typename original_type_traits::allocator
+                >::type
+            >::type node_allocator_;
+
+            typedef typename node_allocator_::template rebind<node_type>::other node_allocator_type;
+
+            typedef cds::details::Allocator< node_type, node_allocator_type >   cxx_node_allocator;
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_node_allocator().Delete( pNode );
+                }
+            };
+
+            typedef typename opt::details::make_comparator< value_type, original_ordered_list_traits >::type key_comparator;
+
+            typedef typename original_type_traits::key_accessor key_accessor;
+
+            struct value_accessor
+            {
+                typename key_accessor::key_type const & operator()( node_type const & node ) const
+                {
+                    return key_accessor()(node.m_Value);
+                }
+            };
+
+            template <typename Predicate>
+            struct predicate_wrapper {
+                typedef cds::details::predicate_wrapper< node_type, Predicate, value_accessor > type;
+            };
+
+            struct ordered_list_traits: public original_ordered_list_traits
+            {
+                typedef cds::intrusive::lazy_list::base_hook<
+                    opt::gc<gc>
+                    ,opt::lock_type< lock_type >
+                >  hook;
+                typedef atomicity::empty_item_counter   item_counter;
+                typedef node_deallocator                disposer;
+                typedef cds::details::compare_wrapper< node_type, key_comparator, value_accessor > compare;
+            };
+
+            struct type_traits: public original_type_traits
+            {
+                struct hash: public original_type_traits::hash
+                {
+                    typedef typename original_type_traits::hash  base_class;
+
+                    size_t operator()(node_type const& v ) const
+                    {
+                        return base_class::operator()( key_accessor()( v.m_Value ));
+                    }
+                    template <typename Q>
+                    size_t operator()( Q const& k ) const
+                    {
+                        return base_class::operator()( k );
+                    }
+                    //using base_class::operator();
+                };
+            };
+
+            typedef cds::intrusive::LazyList< gc, node_type, ordered_list_traits >  ordered_list;
+            typedef cds::intrusive::SplitListSet< gc, ordered_list, type_traits >   type;
+        };
+#endif  // ifdef __CDS_CONTAINER_LAZY_LIST_BASE_H
+
+    }   // namespace details
+}}  // namespace cds::container
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_DETAILS_MAKE_SPLIT_LIST_SET_H
diff --git a/cds/container/ellen_bintree_base.h b/cds/container/ellen_bintree_base.h
new file mode 100644 (file)
index 0000000..80d8e6d
--- /dev/null
@@ -0,0 +1,374 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_ELLEN_BINTREE_BASE_H
+#define __CDS_CONTAINER_ELLEN_BINTREE_BASE_H
+
+#include <cds/intrusive/details/ellen_bintree_base.h>
+#include <cds/container/base.h>
+#include <cds/opt/compare.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+
+namespace cds { namespace container {
+    /// EllenBinTree related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace ellen_bintree {
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Typedef for cds::intrusive::ellen_bintree::update_desc
+        typedef cds::intrusive::ellen_bintree::update_desc update_desc;
+
+        /// Typedef for cds::intrusive::ellen_bintree::internal_node
+        typedef cds::intrusive::ellen_bintree::internal_node internal_node;
+
+        /// Typedef for cds::intrusive::ellen_bintree::key_extractor
+        typedef cds::intrusive::ellen_bintree::key_extractor key_extractor;
+
+        /// Typedef for cds::intrusive::ellen_bintree::update_desc_allocator
+        typedef cds::intrusive::ellen_bintree::update_desc_allocator update_desc_allocator;
+
+        /// Typedef for cds::intrusive::ellen_bintree::stat
+        typedef cds::intrusive::ellen_bintree::stat stat;
+
+        /// Typedef for cds::intrusive::ellen_bintree::empty_stat
+        typedef cds::intrusive::ellen_bintree::empty_stat empty_stat;
+#else
+        using cds::intrusive::ellen_bintree::update_desc;
+        using cds::intrusive::ellen_bintree::internal_node;
+        using cds::intrusive::ellen_bintree::key_extractor;
+        using cds::intrusive::ellen_bintree::update_desc_allocator;
+        using cds::intrusive::ellen_bintree::stat;
+        using cds::intrusive::ellen_bintree::empty_stat;
+        using cds::intrusive::ellen_bintree::node_types;
+#endif
+
+        /// EllenBinTree leaf node
+        template <typename GC, typename T>
+        struct node: public cds::intrusive::ellen_bintree::node<GC>
+        {
+            typedef T   value_type  ;   ///< Value type
+
+            T   m_Value ;   ///< Value
+
+            /// Default ctor
+            node()
+            {}
+
+            /// Initializing ctor
+            template <typename Q>
+            node(Q const& v)
+                : m_Value(v)
+            {}
+
+#ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+            /// Copy constructor
+            template <typename... Args>
+            node( Args const&... args)
+                : m_Value( args... )
+            {}
+
+#ifdef CDS_RVALUE_SUPPORT
+            /// Move constructor
+            template <typename... Args>
+            node( Args&&... args)
+                : m_Value( std::forward<Args>(args)... )
+            {}
+#endif  // CDS_RVALUE_SUPPORT
+#endif  // CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+        };
+
+        /// EllenBinTreeMap leaf node
+        template <typename GC, typename Key, typename T>
+        struct map_node: public cds::intrusive::ellen_bintree::node< GC >
+        {
+            typedef Key     key_type    ;   ///< key type
+            typedef T       mapped_type ;   ///< value type
+            typedef std::pair<key_type const, mapped_type> value_type  ;   ///< key-value pair stored in the map
+
+            value_type  m_Value     ;   ///< Key-value pair stored in map leaf node
+
+            /// Initializes key field, value if default-constructed
+            template <typename K>
+            map_node( K const& key )
+                : m_Value( std::make_pair( key_type(key), mapped_type() ))
+            {}
+
+            /// Initializes key and value fields
+            template <typename K, typename Q>
+            map_node( K const& key, Q const& v )
+                : m_Value( std::make_pair(key_type(key), mapped_type(v) ))
+            {}
+        };
+
+        /// Type traits for EllenBinTreeSet, EllenBinTreeMap and EllenBinTreePriorityQueue
+        struct type_traits
+        {
+            /// Key extracting functor (only for EllenBinTreeSet)
+            /**
+                You should explicit define a valid functor.
+                The functor has the following prototype:
+                \code
+                struct key_extractor {
+                    void operator ()( Key& dest, T const& src );
+                };
+                \endcode
+                It should initialize \p dest key from \p src data.
+                The functor is used to initialize internal nodes.
+            */
+            typedef opt::none           key_extractor;
+
+            /// Key comparison functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+
+                See cds::opt::compare option description for functor interface.
+
+                You should provide \p compare or \p less functor.
+                See \ref cds_container_EllenBinTreeSet_rcu_less "predicate requirements".
+            */
+            typedef opt::none                       compare;
+
+            /// Specifies binary predicate used for key compare.
+            /**
+                See cds::opt::less option description for predicate interface.
+
+                You should provide \p compare or \p less functor.
+                See \ref cds_container_EllenBinTreeSet_rcu_less "predicate requirements".
+            */
+            typedef opt::none                       less;
+
+            /// Item counter
+            /**
+                The type for item counting feature (see cds::opt::item_counter).
+                Default is no item counter (\ref atomicity::empty_item_counter)
+            */
+            typedef atomicity::empty_item_counter     item_counter;
+
+            /// C++ memory ordering model
+            /**
+                List of available memory ordering see opt::memory_model
+            */
+            typedef opt::v::relaxed_ordering        memory_model;
+
+            /// Allocator for update descriptors
+            /**
+                The allocator type is used for \ref update_desc.
+
+                Update descriptor is helping data structure with short lifetime and it is good candidate
+                for pooling. The number of simultaneously existing descriptors is a small number
+                limited the number of threads working with the tree.
+                Therefore, a bounded lock-free container like \p cds::container::VyukovMPMCCycleQueue
+                is good choice for the free-list of update descriptors,
+                see cds::memory::vyukov_queue_pool free-list implementation.
+
+                Also notice that size of update descriptor is not dependent on the type of data
+                stored in the tree so single free-list object can be used for several \p EllenBinTree object.
+            */
+            typedef CDS_DEFAULT_ALLOCATOR           update_desc_allocator;
+
+            /// Allocator for internal nodes
+            /**
+                The allocator type is used for \ref internal_node.
+            */
+            typedef CDS_DEFAULT_ALLOCATOR           node_allocator;
+
+            /// Allocator for leaf nodes
+            /**
+                Each leaf node contains data stored in the container.
+            */
+            typedef CDS_DEFAULT_ALLOCATOR           allocator;
+
+            /// Internal statistics
+            /**
+                Possible types: ellen_bintree::empty_stat (the default), ellen_bintree::stat or any
+                other with interface like \p %stat.
+            */
+            typedef empty_stat                      stat;
+
+            /// RCU deadlock checking policy (only for RCU-based EllenBinTree<i>XXX</i> classes)
+            /**
+                List of available options see opt::rcu_check_deadlock
+            */
+            typedef cds::opt::v::rcu_throw_deadlock      rcu_check_deadlock;
+
+            /// Key copy policy (for EllenBinTreeMap)
+            /**
+                The key copy policy defines a functor to copy leaf node's key to internal node.
+                This policy is used only in EllenBinTreeMap. By default, assignment operator is used.
+
+                The copy functor interface is:
+                \code
+                struct copy_functor {
+                    void operator()( Key& dest, Key const& src );
+                };
+                \endcode
+            */
+            typedef opt::none                           copy_policy;
+        };
+
+
+        /// Metafunction converting option list to EllenBinTreeSet traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options list see \ref cds_container_EllenBinTreeSet "EllenBinTreeSet".
+        */
+        template <CDS_DECL_OPTIONS11>
+        struct make_set_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS11 >::type
+                ,CDS_OPTIONS11
+            >::type   type;
+#   endif
+        };
+
+        /// Metafunction converting option list to EllenBinTreeMap traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options list see \ref cds_container_EllenBinTreeMap "EllenBinTreeMap".
+        */
+        template <CDS_DECL_OPTIONS11>
+        struct make_map_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS11 >::type
+                ,CDS_OPTIONS11
+            >::type   type;
+#   endif
+        };
+
+        //@cond
+        namespace details {
+
+            template < class GC, typename Key, typename T, class Traits>
+            struct make_ellen_bintree_set
+            {
+                typedef GC      gc;
+                typedef Key     key_type;
+                typedef T       value_type;
+                typedef Traits  original_type_traits;
+
+                typedef node< gc, value_type >  leaf_node;
+
+                struct intrusive_key_extractor
+                {
+                    void operator()( key_type& dest, leaf_node const& src ) const
+                    {
+                        typename original_type_traits::key_extractor()( dest, src.m_Value );
+                    }
+                };
+
+                struct value_accessor
+                {
+                    value_type const& operator()( leaf_node const& node ) const
+                    {
+                        return node.m_Value;
+                    }
+                };
+
+                typedef typename cds::opt::details::make_comparator< value_type, original_type_traits, false >::type key_comparator;
+
+                typedef cds::details::Allocator< leaf_node, typename original_type_traits::allocator>    cxx_leaf_node_allocator;
+                struct leaf_deallocator
+                {
+                    void operator()( leaf_node * p ) const
+                    {
+                        cxx_leaf_node_allocator().Delete( p );
+                    }
+                };
+
+                struct intrusive_type_traits: public original_type_traits
+                {
+                    typedef cds::intrusive::ellen_bintree::base_hook< cds::opt::gc< gc > >  hook;
+                    typedef intrusive_key_extractor key_extractor;
+                    typedef leaf_deallocator        disposer;
+                    typedef cds::details::compare_wrapper< leaf_node, key_comparator, value_accessor > compare;
+                };
+
+                // Metafunction result
+                typedef cds::intrusive::EllenBinTree< gc, key_type, leaf_node, intrusive_type_traits >    type;
+            };
+
+            template < class GC, typename Key, typename T, class Traits>
+            struct make_ellen_bintree_map
+            {
+                typedef GC      gc;
+                typedef Key     key_type;
+                typedef T       mapped_type;
+                typedef map_node< gc, key_type, mapped_type >   leaf_node;
+                typedef typename leaf_node::value_type          value_type;
+
+                typedef Traits  original_type_traits;
+
+                struct assignment_copy_policy {
+                    void operator()( key_type& dest, key_type const& src )
+                    {
+                        dest = src;
+                    }
+                };
+                typedef typename std::conditional<
+                    std::is_same< typename original_type_traits::copy_policy, opt::none >::value,
+                    assignment_copy_policy,
+                    typename original_type_traits::copy_policy
+                >::type copy_policy;
+
+                struct intrusive_key_extractor
+                {
+                    void operator()( key_type& dest, leaf_node const& src ) const
+                    {
+                        copy_policy()( dest, src.m_Value.first );
+                    }
+                };
+
+                struct key_accessor
+                {
+                    key_type const& operator()( leaf_node const& node ) const
+                    {
+                        return node.m_Value.first;
+                    }
+                };
+
+                typedef typename cds::opt::details::make_comparator< key_type, original_type_traits, false >::type key_comparator;
+
+                typedef cds::details::Allocator< leaf_node, typename original_type_traits::allocator>    cxx_leaf_node_allocator;
+                struct leaf_deallocator
+                {
+                    void operator()( leaf_node * p ) const
+                    {
+                        cxx_leaf_node_allocator().Delete( p );
+                    }
+                };
+
+                struct intrusive_type_traits: public original_type_traits
+                {
+                    typedef cds::intrusive::ellen_bintree::base_hook< cds::opt::gc< gc > >  hook;
+                    typedef intrusive_key_extractor key_extractor;
+                    typedef leaf_deallocator        disposer;
+                    typedef cds::details::compare_wrapper< leaf_node, key_comparator, key_accessor >    compare;
+                };
+
+                // Metafunction result
+                typedef cds::intrusive::EllenBinTree< gc, key_type, leaf_node, intrusive_type_traits >    type;
+            };
+
+        } // namespace details
+        //@endcond
+    } // namespace ellen_bintree
+
+    // Forward declarations
+    //@cond
+    template < class GC, typename Key, typename T, class Traits = ellen_bintree::type_traits >
+    class EllenBinTreeSet;
+
+    template < class GC, typename Key, typename T, class Traits = ellen_bintree::type_traits >
+    class EllenBinTreeMap;
+    //@endcond
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_ELLEN_BINTREE_BASE_H
diff --git a/cds/container/ellen_bintree_map_hp.h b/cds/container/ellen_bintree_map_hp.h
new file mode 100644 (file)
index 0000000..22c365f
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_ELLEN_BINTREE_MAP_HP_H
+#define __CDS_CONTAINER_ELLEN_BINTREE_MAP_HP_H
+
+#include <cds/gc/hp.h>
+#include <cds/container/ellen_bintree_map_impl.h>
+
+#endif // #ifndef __CDS_CONTAINER_ELLEN_BINTREE_MAP_HP_H
diff --git a/cds/container/ellen_bintree_map_impl.h b/cds/container/ellen_bintree_map_impl.h
new file mode 100644 (file)
index 0000000..d42c861
--- /dev/null
@@ -0,0 +1,677 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_ELLEN_BINTREE_MAP_IMPL_H
+#define __CDS_CONTAINER_ELLEN_BINTREE_MAP_IMPL_H
+
+#include <cds/container/ellen_bintree_base.h>
+#include <cds/intrusive/ellen_bintree_impl.h>
+#include <cds/details/functor_wrapper.h>
+#include <cds/details/std/type_traits.h>
+#include <cds/container/details/guarded_ptr_cast.h>
+
+namespace cds { namespace container {
+
+    /// Map based on Ellen's et al binary search tree
+    /** @ingroup cds_nonintrusive_map
+        @ingroup cds_nonintrusive_tree
+        @anchor cds_container_EllenBinTreeMap
+
+        Source:
+            - [2010] F.Ellen, P.Fatourou, E.Ruppert, F.van Breugel "Non-blocking Binary Search Tree"
+
+        %EllenBinTreeMap is an unbalanced leaf-oriented binary search tree that implements the <i>map</i>
+        abstract data type. Nodes maintains child pointers but not parent pointers.
+        Every internal node has exactly two children, and all data of type <tt>std::pair<Key const, T></tt>
+        currently in the tree are stored in the leaves. Internal nodes of the tree are used to direct \p find
+        operation along the path to the correct leaf. The keys (of \p Key type) stored in internal nodes
+        may or may not be in the map.
+        Unlike \ref cds_container_EllenBinTreeSet "EllenBinTreeSet" keys are not a part of \p T type.
+        The map can be represented as a set containing <tt>std::pair< Key const, T> </tt> values.
+
+        Due to \p extract_min and \p extract_max member functions the \p %EllenBinTreeMap can act as
+        a <i>priority queue</i>. In this case you should provide unique compound key, for example,
+        the priority value plus some uniformly distributed random value.
+
+        @warning Recall the tree is <b>unbalanced</b>. The complexity of operations is <tt>O(log N)</tt>
+        for uniformly distributed random keys, but in worst case the complexity is <tt>O(N)</tt>.
+
+        @note In the current implementation we do not use helping technique described in original paper.
+        So, the current implementation is near to fine-grained lock-based tree.
+        Helping will be implemented in future release
+
+        <b>Template arguments</b> :
+        - \p GC - safe memory reclamation (i.e. light-weight garbage collector) type, like cds::gc::HP, cds::gc::PTB
+            Note that cds::gc::HRC is not supported.
+        - \p Key - key type
+        - \p T - value type to be stored in tree's leaf nodes.
+        - \p Traits - type traits. See ellen_bintree::type_traits for explanation.
+
+        It is possible to declare option-based tree with ellen_bintree::make_map_traits metafunction
+        instead of \p Traits template argument.
+        Template argument list \p Options of ellen_bintree::make_map_traits metafunction are:
+        - opt::compare - key compare functor. No default functor is provided.
+            If the option is not specified, \p %opt::less is used.
+        - opt::less - specifies binary predicate used for key compare. At least \p %opt::compare or \p %opt::less should be defined.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - opt::allocator - the allocator used for \ref ellen_bintree::map_node "leaf nodes" which contains data.
+            Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::node_allocator - the allocator used for \ref ellen_bintree::internal_node "internal nodes".
+            Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - ellen_bintree::update_desc_allocator - an allocator of \ref ellen_bintree::update_desc "update descriptors",
+            default is \ref CDS_DEFAULT_ALLOCATOR.
+            Note that update descriptor is helping data structure with short lifetime and it is good candidate for pooling.
+            The number of simultaneously existing descriptors is a relatively small number limited the number of threads
+            working with the tree and GC buffer size.
+            Therefore, a bounded lock-free container like \p cds::container::VyukovMPMCCycleQueue is good choice for the free-list
+            of update descriptors, see cds::memory::vyukov_queue_pool free-list implementation.
+            Also notice that size of update descriptor is not dependent on the type of data
+            stored in the tree so single free-list object can be used for several EllenBinTree-based object.
+        - opt::stat - internal statistics. Available types: ellen_bintree::stat, ellen_bintree::empty_stat (the default)
+        - opt::copy_policy - key copy policy defines a functor to copy leaf node's key to internal node.
+            By default, assignment operator is used.
+            The copy functor interface is:
+            \code
+            struct copy_functor {
+                void operator()( Key& dest, Key const& src );
+            };
+            \endcode
+
+        @note Do not include <tt><cds/container/ellen_bintree_map_impl.h></tt> header file directly.
+        There are header file for each GC type:
+        - <tt><cds/container/ellen_bintree_map_hp.h></tt> - for Hazard Pointer GC cds::gc::HP
+        - <tt><cds/container/ellen_bintree_map_ptb.h></tt> - for Pass-the-Buck GC cds::gc::PTB
+        - <tt><cds/container/ellen_bintree_map_rcu.h></tt> - for RCU GC
+            (see \ref cds_container_EllenBinTreeMap_rcu "RCU-based EllenBinTreeMap")
+    */
+    template <
+        class GC,
+        typename Key,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = ellen_bintree::type_traits
+#else
+        class Traits
+#endif
+    >
+    class EllenBinTreeMap
+#ifdef CDS_DOXYGEN_INVOKED
+        : public cds::intrusive::EllenBinTree< GC, Key, T, Traits >
+#else
+        : public ellen_bintree::details::make_ellen_bintree_map< GC, Key, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef ellen_bintree::details::make_ellen_bintree_map< GC, Key, T, Traits > maker;
+        typedef typename maker::type base_class;
+        //@endcond
+    public:
+        typedef GC      gc              ;   ///< Garbage collector
+        typedef Key     key_type        ;   ///< type of a key stored in the map
+        typedef T       mapped_type      ;  ///< type of value stored in the map
+        typedef std::pair< key_type const, mapped_type >    value_type  ;   ///< Key-value pair stored in leaf node of the mp
+        typedef Traits  options         ;   ///< Traits template parameter
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key compare functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename maker::intrusive_type_traits::compare   key_comparator;
+#   endif
+        typedef typename base_class::item_counter           item_counter        ; ///< Item counting policy used
+        typedef typename base_class::memory_model           memory_model        ; ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename base_class::node_allocator         node_allocator_type ; ///< allocator for maintaining internal node
+        typedef typename base_class::stat                   stat                ; ///< internal statistics type
+        typedef typename options::copy_policy               copy_policy         ; ///< key copy policy
+
+        typedef typename options::allocator                 allocator_type      ;   ///< Allocator for leaf nodes
+        typedef typename base_class::node_allocator         node_allocator      ;   ///< Internal node allocator
+        typedef typename base_class::update_desc_allocator  update_desc_allocator ; ///< Update descriptor allocator
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type         leaf_node;
+        typedef typename base_class::internal_node      internal_node;
+        typedef typename base_class::update_desc        update_desc;
+
+        typedef typename maker::cxx_leaf_node_allocator cxx_leaf_node_allocator;
+
+        typedef std::unique_ptr< leaf_node, typename maker::leaf_deallocator >    scoped_node_ptr;
+        //@endcond
+
+    public:
+        /// Guarded pointer
+        typedef cds::gc::guarded_ptr< gc, leaf_node, value_type, details::guarded_ptr_cast_set<leaf_node, value_type> > guarded_ptr;
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor
+        {
+            void operator()( value_type& ) const
+            {}
+        };
+
+        template <typename Q>
+        class insert_value_functor
+        {
+            Q const&    m_val;
+        public:
+            insert_value_functor( Q const& v)
+                : m_val(v)
+            {}
+
+            void operator()( value_type& item )
+            {
+                item.second = m_val;
+            }
+        };
+
+        template <typename Func>
+        class insert_key_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_key_wrapper( Func f ): base_class(f) {}
+
+            void operator()( leaf_node& item )
+            {
+                base_class::get()( item.m_Value );
+            }
+        };
+
+        template <typename Func>
+        class ensure_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            ensure_wrapper( Func f) : base_class(f) {}
+
+            void operator()( bool bNew, leaf_node& item, leaf_node const& )
+            {
+                base_class::get()( bNew, item.m_Value );
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( leaf_node& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+
+        template <typename Func>
+        class find_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_wrapper( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator()( leaf_node& item, Q& val )
+            {
+                base_class::get()( item.m_Value, val );
+            }
+        };
+#   endif
+        //@endcond
+
+    public:
+        /// Default constructor
+        EllenBinTreeMap()
+            : base_class()
+        {
+            //static_assert( (std::is_same<gc, cds::gc::HP>::value || std::is_same<gc, cds::gc::PTB>::value), "GC must be cds::gc::HP or cds:gc::PTB" );
+        }
+
+        /// Clears the map
+        ~EllenBinTreeMap()
+        {}
+
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from a value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( K const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert_key( key, [](value_type&){} );
+#       else
+            return insert_key( key, empty_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref value_type should be constructible from \p val of type \p V.
+
+            Returns \p true if \p val is inserted into the map, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( K const& key, V const& val )
+        {
+            scoped_node_ptr pNode( cxx_leaf_node_allocator().New( key, val ));
+            if ( base_class::insert( *pNode ))
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted:
+                - <tt>item.first</tt> is a const reference to item's key that cannot be changed.
+                - <tt>item.second</tt> is a reference to item's value that may be changed.
+
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p value_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            scoped_node_ptr pNode( cxx_leaf_node_allocator().New( key ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *pNode, [&func]( leaf_node& item ) { cds::unref(func)( item.m_Value ); } ))
+#       else
+            insert_key_wrapper<Func> wrapper(func);
+            if ( base_class::insert( *pNode, cds::ref(wrapper) ))
+#endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            scoped_node_ptr pNode( cxx_leaf_node_allocator().New( std::forward<K>(key), std::forward<Args>(args)... ));
+            if ( base_class::insert( *pNode )) {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Ensures that the \p key exists in the map
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the map, then the new item created from \p key
+            is inserted into the map (note that in this case the \ref key_type should be
+            constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref value_type.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( K const& key, Func func )
+        {
+            scoped_node_ptr pNode( cxx_leaf_node_allocator().New( key ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> res = base_class::ensure( *pNode,
+                [&func](bool bNew, leaf_node& item, leaf_node const& ){ cds::unref(func)( bNew, item.m_Value ); }
+            );
+#       else
+            ensure_wrapper<Func> wrapper( func );
+            std::pair<bool, bool> res = base_class::ensure( *pNode, cds::ref(wrapper) );
+#       endif
+            if ( res.first && res.second )
+                pNode.release();
+            return res;
+        }
+
+        /// Delete \p key from the map
+        /**\anchor cds_nonintrusive_EllenBinTreeMap_erase_val
+
+            Return \p true if \p key is found and deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            return base_class::erase(key);
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_erase_val "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool erase_with( K const& key, Less pred )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >());
+        }
+
+        /// Delete \p key from the map
+        /** \anchor cds_nonintrusive_EllenBinTreeMap_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& item) { ... }
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase( key, [&f]( leaf_node& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase( key, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >(),
+                [&f]( leaf_node& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >(), cds::ref(wrapper));
+#       endif
+        }
+
+        /// Extracts an item with minimal key from the map
+        /**
+            If the map is not empty, the function returns \p true, \p result contains a pointer to minimum value.
+            If the map is empty, the function returns \p false, \p result is left unchanged.
+
+            @note Due the concurrent nature of the map, the function extracts <i>nearly</i> minimum key.
+            It means that the function gets leftmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key less than leftmost item's key.
+            So, the function returns the item with minimum key at the moment of tree traversing.
+
+            The guarded pointer \p result prevents deallocation of returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        bool extract_min( guarded_ptr& result )
+        {
+            return base_class::extract_min_( result.guard() );
+        }
+
+        /// Extracts an item with maximal key from the map
+        /**
+            If the map is not empty, the function returns \p true, \p result contains a pointer to maximal value.
+            If the map is empty, the function returns \p false, \p result is left unchanged.
+
+            @note Due the concurrent nature of the map, the function extracts <i>nearly</i> maximal key.
+            It means that the function gets rightmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key great than leftmost item's key.
+            So, the function returns the item with maximum key at the moment of tree traversing.
+
+            The guarded pointer \p result prevents deallocation of returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        bool extract_max( guarded_ptr& result )
+        {
+            return base_class::extract_max_( result.guard() );
+        }
+
+        /// Extracts an item from the tree
+        /** \anchor cds_nonintrusive_EllenBinTreeMap_extract
+            The function searches an item with key equal to \p key in the tree,
+            unlinks it, and returns pointer to an item found in \p result parameter.
+            If the item  is not found the function returns \p false.
+
+            The guarded pointer \p result prevents deallocation of returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& result, Q const& key )
+        {
+            return base_class::extract_( result.guard(), key );
+        }
+
+        /// Extracts an item from the map using \p pred for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_extract "extract(guarded_ptr&, Q const&)"
+            but \p pred is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& result, Q const& key, Less pred )
+        {
+            return base_class::extract_with_( result.guard(), key,
+                cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >());
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_EllenBinTreeMap_find_cfunc
+
+            The function searches the item with key equal to \p key and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change \p item.second.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename K, typename Func>
+        bool find( K const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( key, [&f](leaf_node& item, K const& ) { cds::unref(f)( item.m_Value );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find( key, cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_find_cfunc "find(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool find_with( K const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >(),
+                [&f](leaf_node& item, K const& ) { cds::unref(f)( item.m_Value );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >(), cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_EllenBinTreeMap_find_val
+
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+        */
+        template <typename K>
+        bool find( K const& key )
+        {
+            return base_class::find( key );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_find_val "find(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool find_with( K const& key, Less pred )
+        {
+            return base_class::find_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >() );
+        }
+
+        /// Finds \p key and returns the item found
+        /** @anchor cds_nonintrusive_EllenBinTreeMap_get
+            The function searches the item with key equal to \p key and returns the item found in \p result parameter.
+            The function returns \p true if \p key is found, \p false otherwise.
+
+            The guarded pointer \p result prevents deallocation of returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& result, Q const& key )
+        {
+            return base_class::get_( result.guard(), key );
+        }
+
+        /// Finds \p key with predicate \p pred and returns the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_get "get(guarded_ptr&, Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& result, Q const& key, Less pred )
+        {
+            return base_class::get_with_( result.guard(), key,
+                cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >() );
+        }
+
+        /// Clears the map
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Checks internal consistency (not atomic, not thread-safe)
+        /**
+            The debugging function to check internal consistency of the tree.
+        */
+        bool check_consistency() const
+        {
+            return base_class::check_consistency();
+        }
+
+    };
+}} // namespace cds::container
+
+#endif //#ifndef __CDS_CONTAINER_ELLEN_BINTREE_MAP_IMPL_H
diff --git a/cds/container/ellen_bintree_map_ptb.h b/cds/container/ellen_bintree_map_ptb.h
new file mode 100644 (file)
index 0000000..bb2f77d
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_ELLEN_BINTREE_MAP_PTB_H
+#define __CDS_CONTAINER_ELLEN_BINTREE_MAP_PTB_H
+
+#include <cds/gc/ptb.h>
+#include <cds/container/ellen_bintree_map_impl.h>
+
+#endif // #ifndef __CDS_CONTAINER_ELLEN_BINTREE_MAP_PTB_H
diff --git a/cds/container/ellen_bintree_map_rcu.h b/cds/container/ellen_bintree_map_rcu.h
new file mode 100644 (file)
index 0000000..6634814
--- /dev/null
@@ -0,0 +1,704 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_ELLEN_BINTREE_MAP_RCU_H
+#define __CDS_CONTAINER_ELLEN_BINTREE_MAP_RCU_H
+
+#include <cds/container/ellen_bintree_base.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+#include <cds/details/functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    /// Map based on Ellen's et al binary search tree (RCU specialization)
+    /** @ingroup cds_nonintrusive_map
+        @ingroup cds_nonintrusive_tree
+        @anchor cds_container_EllenBinTreeMap_rcu
+
+        Source:
+            - [2010] F.Ellen, P.Fatourou, E.Ruppert, F.van Breugel "Non-blocking Binary Search Tree"
+
+        %EllenBinTreeMap is an unbalanced leaf-oriented binary search tree that implements the <i>map</i>
+        abstract data type. Nodes maintains child pointers but not parent pointers.
+        Every internal node has exactly two children, and all data of type <tt>std::pair<Key const, T></tt>
+        currently in the tree are stored in the leaves. Internal nodes of the tree are used to direct \p find
+        operation along the path to the correct leaf. The keys (of \p Key type) stored in internal nodes
+        may or may not be in the map.
+        Unlike \ref cds_container_EllenBinTreeSet_rcu "EllenBinTreeSet" keys are not a part of \p T type.
+        The map can be represented as a set containing <tt>std::pair< Key const, T> </tt> values.
+
+        Due to \p extract_min and \p extract_max member functions the \p %EllenBinTreeMap can act as
+        a <i>priority queue</i>. In this case you should provide unique compound key, for example,
+        the priority value plus some uniformly distributed random value.
+
+        @warning Recall the tree is <b>unbalanced</b>. The complexity of operations is <tt>O(log N)</tt>
+        for uniformly distributed random keys, but in worst case the complexity is <tt>O(N)</tt>.
+
+        @note In the current implementation we do not use helping technique described in original paper.
+        So, the current implementation is near to fine-grained lock-based tree.
+        Helping will be implemented in future release
+
+        <b>Template arguments</b> :
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p Key - key type
+        - \p T - value type to be stored in tree's leaf nodes.
+        - \p Traits - type traits. See ellen_bintree::type_traits for explanation.
+
+        It is possible to declare option-based tree with ellen_bintree::make_map_traits metafunction
+        instead of \p Traits template argument.
+        Template argument list \p Options of ellen_bintree::make_map_traits metafunction are:
+        - opt::compare - key compare functor. No default functor is provided.
+            If the option is not specified, \p %opt::less is used.
+        - opt::less - specifies binary predicate used for key compare. At least \p %opt::compare or \p %opt::less should be defined.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - opt::allocator - the allocator used for \ref ellen_bintree::map_node "leaf nodes" which contains data.
+            Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::node_allocator - the allocator used for \ref ellen_bintree::internal_node "internal nodes".
+            Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - ellen_bintree::update_desc_allocator - an allocator of \ref ellen_bintree::update_desc "update descriptors",
+            default is \ref CDS_DEFAULT_ALLOCATOR.
+            Note that update descriptor is helping data structure with short lifetime and it is good candidate for pooling.
+            The number of simultaneously existing descriptors is a relatively small number limited the number of threads
+            working with the tree and RCU buffer size.
+            Therefore, a bounded lock-free container like \p cds::container::VyukovMPMCCycleQueue is good choice for the free-list
+            of update descriptors, see cds::memory::vyukov_queue_pool free-list implementation.
+            Also notice that size of update descriptor is not dependent on the type of data
+            stored in the tree so single free-list object can be used for several EllenBinTree-based object.
+        - opt::stat - internal statistics. Available types: ellen_bintree::stat, ellen_bintree::empty_stat (the default)
+        - opt::rcu_check_deadlock - a deadlock checking policy. Default is opt::v::rcu_throw_deadlock
+        - opt::copy_policy - key copy policy defines a functor to copy leaf node's key to internal node.
+            By default, assignment operator is used.
+            The copy functor interface is:
+            \code
+            struct copy_functor {
+                void operator()( Key& dest, Key const& src );
+            };
+            \endcode
+
+        @note Before including <tt><cds/container/ellen_bintree_map_rcu.h></tt> you should include appropriate RCU header file,
+        see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+    */
+    template <
+        class RCU,
+        typename Key,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = ellen_bintree::type_traits
+#else
+        class Traits
+#endif
+    >
+    class EllenBinTreeMap< cds::urcu::gc<RCU>, Key, T, Traits >
+#ifdef CDS_DOXYGEN_INVOKED
+        : public cds::intrusive::EllenBinTree< cds::urcu::gc<RCU>, Key, T, Traits >
+#else
+        : public ellen_bintree::details::make_ellen_bintree_map< cds::urcu::gc<RCU>, Key, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef ellen_bintree::details::make_ellen_bintree_map< cds::urcu::gc<RCU>, Key, T, Traits > maker;
+        typedef typename maker::type base_class;
+        //@endcond
+    public:
+        typedef cds::urcu::gc<RCU>  gc  ;   ///< RCU Garbage collector
+        typedef Key     key_type        ;   ///< type of a key stored in the map
+        typedef T       mapped_type      ;  ///< type of value stored in the map
+        typedef std::pair< key_type const, mapped_type >    value_type  ;   ///< Key-value pair stored in leaf node of the mp
+        typedef Traits  options         ;   ///< Traits template parameter
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key compare functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename maker::intrusive_type_traits::compare   key_comparator;
+#   endif
+        typedef typename base_class::item_counter           item_counter        ; ///< Item counting policy used
+        typedef typename base_class::memory_model           memory_model        ; ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename base_class::node_allocator         node_allocator_type ; ///< allocator for maintaining internal node
+        typedef typename base_class::stat                   stat                ; ///< internal statistics type
+        typedef typename base_class::rcu_check_deadlock     rcu_check_deadlock  ; ///< Deadlock checking policy
+        typedef typename options::copy_policy               copy_policy         ; ///< key copy policy
+
+        typedef typename options::allocator                 allocator_type      ;   ///< Allocator for leaf nodes
+        typedef typename base_class::node_allocator         node_allocator      ;   ///< Internal node allocator
+        typedef typename base_class::update_desc_allocator  update_desc_allocator ; ///< Update descriptor allocator
+
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = base_class::c_bExtractLockExternal; ///< Group of \p extract_xxx functions do not require external locking
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type         leaf_node;
+        typedef typename base_class::internal_node      internal_node;
+        typedef typename base_class::update_desc        update_desc;
+
+        typedef typename maker::cxx_leaf_node_allocator cxx_leaf_node_allocator;
+
+        typedef std::unique_ptr< leaf_node, typename maker::leaf_deallocator >    scoped_node_ptr;
+        //@endcond
+
+    public:
+        typedef typename gc::scoped_lock    rcu_lock ;  ///< RCU scoped lock
+
+        /// pointer to extracted node
+        typedef cds::urcu::exempt_ptr< gc, leaf_node, value_type, typename maker::intrusive_type_traits::disposer,
+            cds::urcu::details::conventional_exempt_member_cast<leaf_node, value_type>
+        > exempt_ptr;
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor
+        {
+            void operator()( value_type& ) const
+            {}
+        };
+
+        template <typename Q>
+        class insert_value_functor
+        {
+            Q const&    m_val;
+        public:
+            insert_value_functor( Q const& v)
+                : m_val(v)
+            {}
+
+            void operator()( value_type& item )
+            {
+                item.second = m_val;
+            }
+        };
+
+        template <typename Func>
+        class insert_key_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_key_wrapper( Func f ): base_class(f) {}
+
+            void operator()( leaf_node& item )
+            {
+                base_class::get()( item.m_Value );
+            }
+        };
+
+        template <typename Func>
+        class ensure_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            ensure_wrapper( Func f) : base_class(f) {}
+
+            void operator()( bool bNew, leaf_node& item, leaf_node const& )
+            {
+                base_class::get()( bNew, item.m_Value );
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( leaf_node& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+
+        template <typename Func>
+        class find_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_wrapper( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator()( leaf_node& item, Q& val )
+            {
+                base_class::get()( item.m_Value, val );
+            }
+        };
+#   endif
+        //@endcond
+
+    public:
+        /// Default constructor
+        EllenBinTreeMap()
+            : base_class()
+        {}
+
+        /// Clears the map
+        ~EllenBinTreeMap()
+        {}
+
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from a value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( K const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert_key( key, [](value_type&){} );
+#       else
+            return insert_key( key, empty_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref value_type should be constructible from \p val of type \p V.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns \p true if \p val is inserted into the map, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( K const& key, V const& val )
+        {
+            scoped_node_ptr pNode( cxx_leaf_node_allocator().New( key, val ));
+            if ( base_class::insert( *pNode ))
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted:
+                - <tt>item.first</tt> is a const reference to item's key that cannot be changed.
+                - <tt>item.second</tt> is a reference to item's value that may be changed.
+
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p value_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            scoped_node_ptr pNode( cxx_leaf_node_allocator().New( key ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *pNode, [&func]( leaf_node& item ) { cds::unref(func)( item.m_Value ); } ))
+#       else
+            insert_key_wrapper<Func> wrapper(func);
+            if ( base_class::insert( *pNode, cds::ref(wrapper) ))
+#endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            scoped_node_ptr pNode( cxx_leaf_node_allocator().New( std::forward<K>(key), std::forward<Args>(args)... ));
+            if ( base_class::insert( *pNode )) {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Ensures that the \p key exists in the map
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the map, then the new item created from \p key
+            is inserted into the map (note that in this case the \ref key_type should be
+            constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref value_type.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( K const& key, Func func )
+        {
+            scoped_node_ptr pNode( cxx_leaf_node_allocator().New( key ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> res = base_class::ensure( *pNode,
+                [&func](bool bNew, leaf_node& item, leaf_node const& ){ cds::unref(func)( bNew, item.m_Value ); }
+            );
+#       else
+            ensure_wrapper<Func> wrapper( func );
+            std::pair<bool, bool> res = base_class::ensure( *pNode, cds::ref(wrapper) );
+#       endif
+            if ( res.first && res.second )
+                pNode.release();
+            return res;
+        }
+
+        /// Delete \p key from the map
+        /**\anchor cds_nonintrusive_EllenBinTreeMap_rcu_erase_val
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if \p key is found and deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            return base_class::erase(key);
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_rcu_erase_val "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool erase_with( K const& key, Less pred )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >());
+        }
+
+        /// Delete \p key from the map
+        /** \anchor cds_nonintrusive_EllenBinTreeMap_rcu_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& item) { ... }
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase( key, [&f]( leaf_node& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase( key, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_rcu_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >(),
+                [&f]( leaf_node& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >(), cds::ref(wrapper));
+#       endif
+        }
+
+        /// Extracts an item with minimal key from the map
+        /**
+            If the map is not empty, the function returns \p true, \p result contains a pointer to value.
+            If the map is empty, the function returns \p false, \p result is left unchanged.
+
+            @note Due the concurrent nature of the map, the function extracts <i>nearly</i> minimum key.
+            It means that the function gets leftmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key less than leftmost item's key.
+            So, the function returns the item with minimum key at the moment of tree traversing.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not free the item.
+            The deallocator will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        bool extract_min( exempt_ptr& result )
+        {
+            return base_class::extract_min_( result );
+        }
+
+        /// Extracts an item with maximal key from the map
+        /**
+            If the map is not empty, the function returns \p true, \p result contains a pointer to extracted item.
+            If the map is empty, the function returns \p false, \p result is left unchanged.
+
+            @note Due the concurrent nature of the map, the function extracts <i>nearly</i> maximal key.
+            It means that the function gets rightmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key great than leftmost item's key.
+            So, the function returns the item with maximum key at the moment of tree traversing.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not free the item.
+            The deallocator will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        bool extract_max( exempt_ptr& result )
+        {
+            return base_class::extract_max_( result );
+        }
+
+        /// Extracts an item from the map
+        /** \anchor cds_nonintrusive_EllenBinTreeMap_rcu_extract
+            The function searches an item with key equal to \p key in the tree,
+            unlinks it, and returns pointer to an item found in \p result parameter.
+            If \p key is not found the function returns \p false.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not destroy the item found.
+            The dealloctor will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& result, Q const& key )
+        {
+            return base_class::extract_( result, key, typename base_class::node_compare());
+        }
+
+        /// Extracts an item from the map using \p pred for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_rcu_extract "extract(exempt_ptr&, Q const&)"
+            but \p pred is used for key compare.
+            \p Less has the interface like \p std::less and should meet \ref cds_container_EllenBinTreeSet_rcu_less
+            "predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& result,  Q const& val, Less pred )
+        {
+            return base_class::extract_with_( result, val,
+                cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >() );
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_EllenBinTreeMap_rcu_find_cfunc
+
+            The function searches the item with key equal to \p key and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change \p item.second.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename K, typename Func>
+        bool find( K const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( key, [&f](leaf_node& item, K const& ) { cds::unref(f)( item.m_Value );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find( key, cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_rcu_find_cfunc "find(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool find_with( K const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >(),
+                [&f](leaf_node& item, K const& ) { cds::unref(f)( item.m_Value );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >(), cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_EllenBinTreeMap_rcu_find_val
+
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+
+            The function applies RCU lock internally.
+        */
+        template <typename K>
+        bool find( K const& key )
+        {
+            return base_class::find( key );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_rcu_find_val "find(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool find_with( K const& key, Less pred )
+        {
+            return base_class::find_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >() );
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_nonintrusive_EllenBinTreeMap_rcu_get
+            The function searches the item with key equal to \p key and returns the pointer to item found.
+            If \p key is not found it returns \p NULL.
+
+            RCU should be locked before call the function.
+            Returned pointer is valid while RCU is locked.
+        */
+        template <typename Q>
+        value_type * get( Q const& key ) const
+        {
+            leaf_node * pNode = base_class::get( key );
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+
+        /// Finds \p key with \p pred predicate and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeMap_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type
+            and \p Q in any order.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& key, Less pred ) const
+        {
+            leaf_node * pNode = base_class::get_with( key,
+                cds::details::predicate_wrapper< leaf_node, Less, typename maker::key_accessor >());
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+
+        /// Clears the map
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Checks internal consistency (not atomic, not thread-safe)
+        /**
+            The debugging function to check internal consistency of the tree.
+        */
+        bool check_consistency() const
+        {
+            return base_class::check_consistency();
+        }
+
+    };
+}} // namespace cds::container
+
+#endif //#ifndef __CDS_CONTAINER_ELLEN_BINTREE_MAP_RCU_H
diff --git a/cds/container/ellen_bintree_set_hp.h b/cds/container/ellen_bintree_set_hp.h
new file mode 100644 (file)
index 0000000..34a6070
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_ELLEN_BINTREE_SET_HP_H
+#define __CDS_CONTAINER_ELLEN_BINTREE_SET_HP_H
+
+#include <cds/gc/hp.h>
+#include <cds/container/ellen_bintree_set_impl.h>
+
+#endif // #ifndef __CDS_CONTAINER_ELLEN_BINTREE_SET_HP_H
diff --git a/cds/container/ellen_bintree_set_impl.h b/cds/container/ellen_bintree_set_impl.h
new file mode 100644 (file)
index 0000000..a043156
--- /dev/null
@@ -0,0 +1,753 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_ELLEN_BINTREE_SET_IMPL_H
+#define __CDS_CONTAINER_ELLEN_BINTREE_SET_IMPL_H
+
+#include <cds/container/ellen_bintree_base.h>
+#include <cds/intrusive/ellen_bintree_impl.h>
+#include <cds/details/std/type_traits.h>
+#include <cds/container/details/guarded_ptr_cast.h>
+
+namespace cds { namespace container {
+
+    /// Set based on Ellen's et al binary search tree
+    /** @ingroup cds_nonintrusive_set
+        @ingroup cds_nonintrusive_tree
+        @anchor cds_container_EllenBinTreeSet
+
+        Source:
+            - [2010] F.Ellen, P.Fatourou, E.Ruppert, F.van Breugel "Non-blocking Binary Search Tree"
+
+        %EllenBinTreeSet is an unbalanced leaf-oriented binary search tree that implements the <i>set</i>
+        abstract data type. Nodes maintains child pointers but not parent pointers.
+        Every internal node has exactly two children, and all data of type \p T currently in
+        the tree are stored in the leaves. Internal nodes of the tree are used to direct \p find
+        operation along the path to the correct leaf. The keys (of \p Key type) stored in internal nodes
+        may or may not be in the set. \p Key type is a subset of \p T type.
+        There should be exactly defined a key extracting functor for converting object of type \p T to
+        object of type \p Key.
+
+        Due to \p extract_min and \p extract_max member functions the \p %EllenBinTreeSet can act as
+        a <i>priority queue</i>. In this case you should provide unique compound key, for example,
+        the priority value plus some uniformly distributed random value.
+
+        @warning Recall the tree is <b>unbalanced</b>. The complexity of operations is <tt>O(log N)</tt>
+        for uniformly distributed random keys, but in worst case the complexity is <tt>O(N)</tt>.
+
+        @note In the current implementation we do not use helping technique described in original paper.
+        So, the current implementation is near to fine-grained lock-based tree.
+        Helping will be implemented in future release
+
+        <b>Template arguments</b> :
+        - \p GC - safe memory reclamation (i.e. light-weight garbage collector) type, like cds::gc::HP, cds::gc::PTB
+            Note that cds::gc::HRC is not supported.
+        - \p Key - key type, a subset of \p T
+        - \p T - type to be stored in tree's leaf nodes.
+        - \p Traits - type traits. See ellen_bintree::type_traits for explanation.
+
+        It is possible to declare option-based tree with ellen_bintree::make_set_traits metafunction
+        instead of \p Traits template argument.
+        Template argument list \p Options of ellen_bintree::make_set_traits metafunction are:
+        - ellen_bintree::key_extractor - key extracting functor, mandatory option. The functor has the following prototype:
+            \code
+                struct key_extractor {
+                    void operator ()( Key& dest, T const& src );
+                };
+            \endcode
+            It should initialize \p dest key from \p src data. The functor is used to initialize internal nodes.
+        - opt::compare - key compare functor. No default functor is provided.
+            If the option is not specified, \p %opt::less is used.
+        - opt::less - specifies binary predicate used for key compare. At least \p %opt::compare or \p %opt::less should be defined.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - opt::allocator - the allocator used for \ref ellen_bintree::node "leaf nodes" which contains data.
+            Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::node_allocator - the allocator used for internal nodes. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - ellen_bintree::update_desc_allocator - an allocator of \ref ellen_bintree::update_desc "update descriptors",
+            default is \ref CDS_DEFAULT_ALLOCATOR.
+            Note that update descriptor is helping data structure with short lifetime and it is good candidate for pooling.
+            The number of simultaneously existing descriptors is a relatively small number limited the number of threads
+            working with the tree and GC buffer size.
+            Therefore, a bounded lock-free container like \p cds::container::VyukovMPMCCycleQueue is good choice for the free-list
+            of update descriptors, see cds::memory::vyukov_queue_pool free-list implementation.
+            Also notice that size of update descriptor is not dependent on the type of data
+            stored in the tree so single free-list object can be used for several EllenBinTree-based object.
+        - opt::stat - internal statistics. Available types: ellen_bintree::stat, ellen_bintree::empty_stat (the default)
+
+        @note Do not include <tt><cds/container/ellen_bintree_set_impl.h></tt> header file directly.
+        There are header file for each GC type:
+        - <tt><cds/container/ellen_bintree_set_hp.h></tt> - for Hazard Pointer GC cds::gc::HP
+        - <tt><cds/container/ellen_bintree_set_ptb.h></tt> - for Pass-the-Buck GC cds::gc::PTB
+        - <tt><cds/container/ellen_bintree_set_rcu.h></tt> - for RCU GC
+            (see \ref cds_container_EllenBinTreeSet_rcu "RCU-based EllenBinTreeSet")
+
+        @anchor cds_container_EllenBinTreeSet_less
+        <b>Predicate requirements</b>
+
+        opt::less, opt::compare and other predicates using with member fuctions should accept at least parameters
+        of type \p T and \p Key in any combination.
+        For example, for \p Foo struct with \p std::string key field the appropiate \p less functor is:
+        \code
+        struct Foo
+        {
+            std::string m_strKey;
+            ...
+        };
+
+        struct less {
+            bool operator()( Foo const& v1, Foo const& v2 ) const
+            { return v1.m_strKey < v2.m_strKey ; }
+
+            bool operator()( Foo const& v, std::string const& s ) const
+            { return v.m_strKey < s ; }
+
+            bool operator()( std::string const& s, Foo const& v ) const
+            { return s < v.m_strKey ; }
+
+            // Support comparing std::string and char const *
+            bool operator()( std::string const& s, char const * p ) const
+            { return s.compare(p) < 0 ; }
+
+            bool operator()( Foo const& v, char const * p ) const
+            { return v.m_strKey.compare(p) < 0 ; }
+
+            bool operator()( char const * p, std::string const& s ) const
+            { return s.compare(p) > 0; }
+
+            bool operator()( char const * p, Foo const& v ) const
+            { return v.m_strKey.compare(p) > 0; }
+        };
+        \endcode
+    */
+    template <
+        class GC,
+        typename Key,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = ellen_bintree::type_traits
+#else
+        class Traits
+#endif
+    >
+    class EllenBinTreeSet
+#ifdef CDS_DOXYGEN_INVOKED
+        : public cds::intrusive::EllenBinTree< GC, Key, T, Traits >
+#else
+        : public ellen_bintree::details::make_ellen_bintree_set< GC, Key, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef ellen_bintree::details::make_ellen_bintree_set< GC, Key, T, Traits > maker;
+        typedef typename maker::type base_class;
+        //@endcond
+
+    public:
+        typedef GC      gc              ;   ///< Garbage collector
+        typedef Key     key_type        ;   ///< type of a key stored in internal nodes; key is a part of \p value_type
+        typedef T       value_type      ;   ///< type of value stored in the binary tree
+        typedef Traits  options         ;   ///< Traits template parameter
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key compare functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename maker::intrusive_type_traits::compare   key_comparator;
+#   endif
+        typedef typename base_class::item_counter           item_counter        ; ///< Item counting policy used
+        typedef typename base_class::memory_model           memory_model        ; ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename base_class::stat                   stat                ; ///< internal statistics type
+        typedef typename options::key_extractor             key_extractor       ; ///< key extracting functor
+
+        typedef typename options::allocator                 allocator_type      ;   ///< Allocator for leaf nodes
+        typedef typename base_class::node_allocator         node_allocator      ;   ///< Internal node allocator
+        typedef typename base_class::update_desc_allocator  update_desc_allocator ; ///< Update descriptor allocator
+
+    protected:
+        //@cond
+        typedef typename maker::cxx_leaf_node_allocator cxx_leaf_node_allocator;
+        typedef typename base_class::value_type         leaf_node;
+        typedef typename base_class::internal_node      internal_node;
+
+        typedef std::unique_ptr< leaf_node, typename maker::leaf_deallocator > scoped_node_ptr;
+        //@endcond
+
+    public:
+        /// Guarded pointer
+        typedef cds::gc::guarded_ptr< gc, leaf_node, value_type, details::guarded_ptr_cast_set<leaf_node, value_type> > guarded_ptr;
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        struct insert_functor
+        {
+            Func        m_func;
+
+            insert_functor ( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( leaf_node& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+
+        template <typename Q, typename Func>
+        struct ensure_functor
+        {
+            Func        m_func;
+            Q const&    m_arg;
+
+            ensure_functor( Q const& arg, Func f )
+                : m_func(f)
+                , m_arg( arg )
+            {}
+
+            void operator ()( bool bNew, leaf_node& node, leaf_node& )
+            {
+                cds::unref(m_func)( bNew, node.m_Value, m_arg );
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( leaf_node const& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+
+        template <typename Func>
+        struct find_functor
+        {
+            Func    m_func;
+
+            find_functor( Func f )
+                : m_func(f)
+            {}
+
+            template <typename Q>
+            void operator ()( leaf_node& node, Q& val )
+            {
+                cds::unref(m_func)( node.m_Value, val );
+            }
+        };
+#endif
+        //@endcond
+
+    public:
+        /// Default constructor
+        EllenBinTreeSet()
+            : base_class()
+        {
+            //static_assert( (std::is_same<gc, cds::gc::HP>::value || std::is_same<gc, cds::gc::PTB>::value), "GC must be cds::gc::HP or cds:gc::PTB" );
+        }
+
+        /// Clears the set
+        ~EllenBinTreeSet()
+        {}
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the set.
+
+            The type \p Q should contain at least the complete key for the node.
+            The object of \ref value_type should be constructible from a value of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            scoped_node_ptr sp( cxx_leaf_node_allocator().New( val ));
+            if ( base_class::insert( *sp.get() )) {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-fields of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success. It may be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& val, Func f )
+        {
+            scoped_node_ptr sp( cxx_leaf_node_allocator().New( val ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *sp.get(), [&f]( leaf_node& val ) { cds::unref(f)( val.m_Value ); } ))
+#       else
+            insert_functor<Func> wrapper(f);
+            if ( base_class::insert( *sp, cds::ref(wrapper) ))
+#       endif
+            {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Ensures that the item exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p val key not found in the set, then the new item created from \p val
+            is inserted into the set. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p key passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( const Q& val, Func func )
+        {
+            scoped_node_ptr sp( cxx_leaf_node_allocator().New( val ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> bRes = base_class::ensure( *sp,
+                [&func, &val](bool bNew, leaf_node& node, leaf_node&){ cds::unref(func)( bNew, node.m_Value, val ); });
+#       else
+            ensure_functor<Q, Func> wrapper( val, func );
+            std::pair<bool, bool> bRes = base_class::ensure( *sp, cds::ref(wrapper));
+#       endif
+            if ( bRes.first && bRes.second )
+                sp.release();
+            return bRes;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr sp( cxx_leaf_node_allocator().New( std::forward<Args>(args)... ));
+            if ( base_class::insert( *sp.get() )) {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_EllenBinTreeSet_erase_val
+
+            The item comparator should be able to compare the type \p value_type
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+            return base_class::erase( key );
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >());
+        }
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_EllenBinTreeSet_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type const& val);
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Since the key of MichaelHashSet's \p value_type is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase( key, [&f]( leaf_node const& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase( key, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(),
+                [&f]( leaf_node const& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(), cds::ref(wrapper));
+#       endif
+        }
+
+        /// Extracts an item with minimal key from the set
+        /**
+            If the set is not empty, the function returns \p true, \p result contains a pointer to minimum value.
+            If the set is empty, the function returns \p false, \p result is left unchanged.
+
+            @note Due the concurrent nature of the set, the function extracts <i>nearly</i> minimum key.
+            It means that the function gets leftmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key less than leftmost item's key.
+            So, the function returns the item with minimum key at the moment of tree traversing.
+
+            The guarded pointer \p dest prevents deallocation of returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        bool extract_min( guarded_ptr& result )
+        {
+            return base_class::extract_min_( result.guard() );
+        }
+
+        /// Extracts an item with maximal key from the set
+        /**
+            If the set is not empty, the function returns \p true, \p result contains a pointer to maximal value.
+            If the set is empty, the function returns \p false, \p result is left unchanged.
+
+            @note Due the concurrent nature of the set, the function extracts <i>nearly</i> maximal key.
+            It means that the function gets rightmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key great than leftmost item's key.
+            So, the function returns the item with maximum key at the moment of tree traversing.
+
+            The guarded pointer \p dest prevents deallocation of returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        bool extract_max( guarded_ptr& result )
+        {
+            return base_class::extract_max_( result.guard() );
+        }
+
+        /// Extracts an item from the tree
+        /** \anchor cds_nonintrusive_EllenBinTreeSet_extract
+            The function searches an item with key equal to \p key in the tree,
+            unlinks it, and returns pointer to an item found in \p result parameter.
+            If the item  is not found the function returns \p false.
+
+            The guarded pointer \p dest prevents deallocation of returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& result, Q const& key )
+        {
+            return base_class::extract_( result.guard(), key );
+        }
+
+        /// Extracts an item from the set using \p pred for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_extract "extract(guarded_ptr& dest, Q const&)"
+            but \p pred is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& result, Q const& key, Less pred )
+        {
+            return base_class::extract_with_( result.guard(), key,
+                cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >());
+        }
+
+        /// Find the key \p val
+        /**
+            @anchor cds_nonintrusive_EllenBinTreeSet_find_func
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f]( leaf_node& node, Q& v ) { cds::unref(f)( node.m_Value, v ); });
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find( val, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(),
+                [&f]( leaf_node& node, Q& v ) { cds::unref(f)( node.m_Value, v ); } );
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find_with( val, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(),
+                cds::ref(wrapper));
+#       endif
+        }
+
+        /// Find the key \p val
+        /** @anchor cds_nonintrusive_EllenBinTreeSet_find_cfunc
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f]( leaf_node& node, Q const& v ) { cds::unref(f)( node.m_Value, v ); });
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find( val, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(),
+                [&f]( leaf_node& node, Q const& v ) { cds::unref(f)( node.m_Value, v ); } );
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find_with( val, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(),
+                cds::ref(wrapper));
+#       endif
+        }
+
+        /// Find the key \p val
+        /** @anchor cds_nonintrusive_EllenBinTreeSet_find_val
+
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \ref value_type.
+        */
+        template <typename Q>
+        bool find( Q const & val )
+        {
+            return base_class::find( val );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+            return base_class::find_with( val, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >());
+        }
+
+        /// Finds \p key and returns the item found
+        /** @anchor cds_nonintrusive_EllenBinTreeSet_get
+            The function searches the item with key equal to \p key and returns the item found in \p result parameter.
+            The function returns \p true if \p key is found, \p false otherwise.
+
+            The guarded pointer \p dest prevents deallocation of returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& result, Q const& key )
+        {
+            return base_class::get_( result.guard(), key );
+        }
+
+        /// Finds \p key with predicate \p pred and returns the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_get "get(guarded_ptr&, Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& result, Q const& key, Less pred )
+        {
+            return base_class::get_with_( result.guard(), key,
+                cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >() );
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function unlink all items from the tree.
+            The function is not atomic, thus, in multi-threaded environment with parallel insertions
+            this sequence
+            \code
+            set.clear();
+            assert( set.empty() );
+            \endcode
+            the assertion could be raised.
+
+            For each leaf the \ref disposer will be called after unlinking.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the set is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the set
+        /**
+            Only leaf nodes containing user data are counted.
+
+            The value returned depends on item counter type provided by \p Traits template parameter.
+            If it is atomicity::empty_item_counter this function always returns 0.
+            Therefore, the function is not suitable for checking the tree emptiness, use \ref empty
+            member function for this purpose.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Checks internal consistency (not atomic, not thread-safe)
+        /**
+            The debugging function to check internal consistency of the tree.
+        */
+        bool check_consistency() const
+        {
+            return base_class::check_consistency();
+        }
+    };
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_ELLEN_BINTREE_SET_IMPL_H
diff --git a/cds/container/ellen_bintree_set_ptb.h b/cds/container/ellen_bintree_set_ptb.h
new file mode 100644 (file)
index 0000000..4f1f217
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_ELLEN_BINTREE_SET_PTB_H
+#define __CDS_CONTAINER_ELLEN_BINTREE_SET_PTB_H
+
+#include <cds/gc/ptb.h>
+#include <cds/container/ellen_bintree_set_impl.h>
+
+#endif // #ifndef __CDS_CONTAINER_ELLEN_BINTREE_SET_PTB_H
diff --git a/cds/container/ellen_bintree_set_rcu.h b/cds/container/ellen_bintree_set_rcu.h
new file mode 100644 (file)
index 0000000..7ca083e
--- /dev/null
@@ -0,0 +1,785 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_ELLEN_BINTREE_SET_RCU_H
+#define __CDS_CONTAINER_ELLEN_BINTREE_SET_RCU_H
+
+#include <cds/container/ellen_bintree_base.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+namespace cds { namespace container {
+
+    /// Set based on Ellen's et al binary search tree (RCU specialization)
+    /** @ingroup cds_nonintrusive_set
+        @ingroup cds_nonintrusive_tree
+        @anchor cds_container_EllenBinTreeSet_rcu
+
+        Source:
+            - [2010] F.Ellen, P.Fatourou, E.Ruppert, F.van Breugel "Non-blocking Binary Search Tree"
+
+        %EllenBinTreeSet is an unbalanced leaf-oriented binary search tree that implements the <i>set</i>
+        abstract data type. Nodes maintains child pointers but not parent pointers.
+        Every internal node has exactly two children, and all data of type \p T currently in
+        the tree are stored in the leaves. Internal nodes of the tree are used to direct \p find
+        operation along the path to the correct leaf. The keys (of \p Key type) stored in internal nodes
+        may or may not be in the set. \p Key type is a subset of \p T type.
+        There should be exactly defined a key extracting functor for converting object of type \p T to
+        object of type \p Key.
+
+        Due to \p extract_min and \p extract_max member functions the \p %EllenBinTreeSet can act as
+        a <i>priority queue</i>. In this case you should provide unique compound key, for example,
+        the priority value plus some uniformly distributed random value.
+
+        @warning Recall the tree is <b>unbalanced</b>. The complexity of operations is <tt>O(log N)</tt>
+        for uniformly distributed random keys, but in worst case the complexity is <tt>O(N)</tt>.
+
+        @note In the current implementation we do not use helping technique described in original paper.
+        So, the current implementation is near to fine-grained lock-based tree.
+        Helping will be implemented in future release
+
+        <b>Template arguments</b> :
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p Key - key type, a subset of \p T
+        - \p T - type to be stored in tree's leaf nodes.
+        - \p Traits - type traits. See ellen_bintree::type_traits for explanation.
+
+        It is possible to declare option-based tree with ellen_bintree::make_set_traits metafunction
+        instead of \p Traits template argument.
+        Template argument list \p Options of ellen_bintree::make_set_traits metafunction are:
+        - ellen_bintree::key_extractor - key extracting functor, mandatory option. The functor has the following prototype:
+            \code
+                struct key_extractor {
+                    void operator ()( Key& dest, T const& src );
+                };
+            \endcode
+            It should initialize \p dest key from \p src data. The functor is used to initialize internal nodes.
+        - opt::compare - key compare functor. No default functor is provided.
+            If the option is not specified, \p %opt::less is used.
+        - opt::less - specifies binary predicate used for key compare. At least \p %opt::compare or \p %opt::less should be defined.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - opt::allocator - the allocator used for \ref ellen_bintree::node "leaf nodes" which contains data.
+            Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::node_allocator - the allocator used for internal nodes. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - ellen_bintree::update_desc_allocator - an allocator of \ref ellen_bintree::update_desc "update descriptors",
+            default is \ref CDS_DEFAULT_ALLOCATOR.
+            Note that update descriptor is helping data structure with short lifetime and it is good candidate for pooling.
+            The number of simultaneously existing descriptors is a relatively small number limited the number of threads
+            working with the tree and RCU buffer size.
+            Therefore, a bounded lock-free container like \p cds::container::VyukovMPMCCycleQueue is good choice for the free-list
+            of update descriptors, see cds::memory::vyukov_queue_pool free-list implementation.
+            Also notice that size of update descriptor is not dependent on the type of data
+            stored in the tree so single free-list object can be used for several EllenBinTree-based object.
+        - opt::stat - internal statistics. Available types: ellen_bintree::stat, ellen_bintree::empty_stat (the default)
+        - opt::rcu_check_deadlock - a deadlock checking policy. Default is opt::v::rcu_throw_deadlock
+
+        @note Before including <tt><cds/container/ellen_bintree_set_rcu.h></tt> you should include appropriate RCU header file,
+        see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+
+        @anchor cds_container_EllenBinTreeSet_rcu_less
+        <b>Predicate requirements</b>
+
+        opt::less, opt::compare and other predicates using with member fuctions should accept at least parameters
+        of type \p T and \p Key in any combination.
+        For example, for \p Foo struct with \p std::string key field the appropiate \p less functor is:
+        \code
+        struct Foo
+        {
+            std::string m_strKey;
+            ...
+        };
+
+        struct less {
+            bool operator()( Foo const& v1, Foo const& v2 ) const
+            { return v1.m_strKey < v2.m_strKey ; }
+
+            bool operator()( Foo const& v, std::string const& s ) const
+            { return v.m_strKey < s ; }
+
+            bool operator()( std::string const& s, Foo const& v ) const
+            { return s < v.m_strKey ; }
+
+            // Support comparing std::string and char const *
+            bool operator()( std::string const& s, char const * p ) const
+            { return s.compare(p) < 0 ; }
+
+            bool operator()( Foo const& v, char const * p ) const
+            { return v.m_strKey.compare(p) < 0 ; }
+
+            bool operator()( char const * p, std::string const& s ) const
+            { return s.compare(p) > 0; }
+
+            bool operator()( char const * p, Foo const& v ) const
+            { return v.m_strKey.compare(p) > 0; }
+        };
+        \endcode
+
+    */
+    template <
+        class RCU,
+        typename Key,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = ellen_bintree::type_traits
+#else
+        class Traits
+#endif
+    >
+    class EllenBinTreeSet< cds::urcu::gc<RCU>, Key, T, Traits >
+#ifdef CDS_DOXYGEN_INVOKED
+        : public cds::intrusive::EllenBinTree< cds::urcu::gc<RCU>, Key, T, Traits >
+#else
+        : public ellen_bintree::details::make_ellen_bintree_set< cds::urcu::gc<RCU>, Key, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef ellen_bintree::details::make_ellen_bintree_set< cds::urcu::gc<RCU>, Key, T, Traits > maker;
+        typedef typename maker::type base_class;
+        //@endcond
+
+    public:
+        typedef cds::urcu::gc<RCU>  gc  ;   ///< RCU Garbage collector
+        typedef Key     key_type        ;   ///< type of a key stored in internal nodes; key is a part of \p value_type
+        typedef T       value_type      ;   ///< type of value stored in the binary tree
+        typedef Traits  options         ;   ///< Traits template parameter
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key compare functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename maker::intrusive_type_traits::compare   key_comparator;
+#   endif
+        typedef typename base_class::item_counter           item_counter        ; ///< Item counting policy used
+        typedef typename base_class::memory_model           memory_model        ; ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename base_class::stat                   stat                ; ///< internal statistics type
+        typedef typename base_class::rcu_check_deadlock     rcu_check_deadlock  ; ///< Deadlock checking policy
+        typedef typename options::key_extractor             key_extractor       ; ///< key extracting functor
+
+        typedef typename options::allocator                 allocator_type      ;   ///< Allocator for leaf nodes
+        typedef typename base_class::node_allocator         node_allocator      ;   ///< Internal node allocator
+        typedef typename base_class::update_desc_allocator  update_desc_allocator ; ///< Update descriptor allocator
+
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = base_class::c_bExtractLockExternal; ///< Group of \p extract_xxx functions do not require external locking
+
+    protected:
+        //@cond
+        typedef typename maker::cxx_leaf_node_allocator cxx_leaf_node_allocator;
+        typedef typename base_class::value_type         leaf_node;
+        typedef typename base_class::internal_node      internal_node;
+        typedef std::unique_ptr< leaf_node, typename maker::intrusive_type_traits::disposer >    scoped_node_ptr;
+        //@endcond
+
+    public:
+        typedef typename gc::scoped_lock    rcu_lock ;  ///< RCU scoped lock
+
+        /// pointer to extracted node
+        typedef cds::urcu::exempt_ptr< gc, leaf_node, value_type, typename maker::intrusive_type_traits::disposer,
+            cds::urcu::details::conventional_exempt_member_cast<leaf_node, value_type>
+        > exempt_ptr;
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        struct insert_functor
+        {
+            Func        m_func;
+
+            insert_functor ( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( leaf_node& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+
+        template <typename Q, typename Func>
+        struct ensure_functor
+        {
+            Func        m_func;
+            Q const&    m_arg;
+
+            ensure_functor( Q const& arg, Func f )
+                : m_func(f)
+                , m_arg( arg )
+            {}
+
+            void operator ()( bool bNew, leaf_node& node, leaf_node& )
+            {
+                cds::unref(m_func)( bNew, node.m_Value, m_arg );
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( leaf_node const& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+
+        template <typename Func>
+        struct find_functor
+        {
+            Func    m_func;
+
+            find_functor( Func f )
+                : m_func(f)
+            {}
+
+            template <typename Q>
+            void operator ()( leaf_node& node, Q& val )
+            {
+                cds::unref(m_func)( node.m_Value, val );
+            }
+        };
+#endif
+        //@endcond
+
+    public:
+        /// Default constructor
+        EllenBinTreeSet()
+            : base_class()
+        {}
+
+        /// Clears the set
+        ~EllenBinTreeSet()
+        {}
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the set.
+
+            The type \p Q should contain at least the complete key for the node.
+            The object of \ref value_type should be constructible from a value of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            scoped_node_ptr sp( cxx_leaf_node_allocator().New( val ));
+            if ( base_class::insert( *sp.get() )) {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-fields of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success. It may be passed by reference
+            using <tt>boost::ref</tt>
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& val, Func f )
+        {
+            scoped_node_ptr sp( cxx_leaf_node_allocator().New( val ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *sp.get(), [&f]( leaf_node& val ) { cds::unref(f)( val.m_Value ); } ))
+#       else
+            insert_functor<Func> wrapper(f);
+            if ( base_class::insert( *sp, cds::ref(wrapper) ))
+#       endif
+            {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Ensures that the item exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p val key not found in the set, then the new item created from \p val
+            is inserted into the set. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p key passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( const Q& val, Func func )
+        {
+            scoped_node_ptr sp( cxx_leaf_node_allocator().New( val ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> bRes = base_class::ensure( *sp,
+                [&func, &val](bool bNew, leaf_node& node, leaf_node&){ cds::unref(func)( bNew, node.m_Value, val ); });
+#       else
+            ensure_functor<Q, Func> wrapper( val, func );
+            std::pair<bool, bool> bRes = base_class::ensure( *sp, cds::ref(wrapper));
+#       endif
+            if ( bRes.first && bRes.second )
+                sp.release();
+            return bRes;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr sp( cxx_leaf_node_allocator().New( std::forward<Args>(args)... ));
+            if ( base_class::insert( *sp.get() )) {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_EllenBinTreeSet_rcu_erase_val
+
+            The item comparator should be able to compare the type \p value_type
+            and the type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+            return base_class::erase( key );
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_rcu_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >());
+        }
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_EllenBinTreeSet_rcu_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type const& val);
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Since the key of MichaelHashSet's \p value_type is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+
+            See also: \ref erase
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase( key, [&f]( leaf_node const& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase( key, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_rcu_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(),
+                [&f]( leaf_node const& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase_with( key, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(), cds::ref(wrapper));
+#       endif
+        }
+
+        /// Extracts an item with minimal key from the set
+        /**
+            If the set is not empty, the function returns \p true, \p result contains a pointer to value.
+            If the set is empty, the function returns \p false, \p result is left unchanged.
+
+            @note Due the concurrent nature of the set, the function extracts <i>nearly</i> minimum key.
+            It means that the function gets leftmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key less than leftmost item's key.
+            So, the function returns the item with minimum key at the moment of tree traversing.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not free the item.
+            The deallocator will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        bool extract_min( exempt_ptr& result )
+        {
+            return base_class::extract_min_( result );
+        }
+
+        /// Extracts an item with maximal key from the set
+        /**
+            If the set is not empty, the function returns \p true, \p result contains a pointer to extracted item.
+            If the set is empty, the function returns \p false, \p result is left unchanged.
+
+            @note Due the concurrent nature of the set, the function extracts <i>nearly</i> maximal key.
+            It means that the function gets rightmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key great than leftmost item's key.
+            So, the function returns the item with maximum key at the moment of tree traversing.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not free the item.
+            The deallocator will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        bool extract_max( exempt_ptr& result )
+        {
+            return base_class::extract_max_( result );
+        }
+
+        /// Extracts an item from the set
+        /** \anchor cds_nonintrusive_EllenBinTreeSet_rcu_extract
+            The function searches an item with key equal to \p key in the tree,
+            unlinks it, and returns pointer to an item found in \p result parameter.
+            If \p key is not found the function returns \p false.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not destroy the item found.
+            The dealloctor will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& result, Q const& key )
+        {
+            return base_class::extract_( result, key, typename base_class::node_compare());
+        }
+
+        /// Extracts an item from the set using \p pred for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_rcu_extract "extract(exempt_ptr&, Q const&)"
+            but \p pred is used for key compare.
+            \p Less has the interface like \p std::less and should meet \ref cds_container_EllenBinTreeSet_rcu_less
+            "predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& result,  Q const& val, Less pred )
+        {
+            return base_class::extract_with_( result, val,
+                cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >() );
+        }
+
+        /// Find the key \p val
+        /**
+            @anchor cds_nonintrusive_EllenBinTreeSet_rcu_find_func
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f]( leaf_node& node, Q& v ) { cds::unref(f)( node.m_Value, v ); });
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find( val, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_rcu_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(),
+                [&f]( leaf_node& node, Q& v ) { cds::unref(f)( node.m_Value, v ); } );
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find_with( val, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(),
+                cds::ref(wrapper));
+#       endif
+        }
+
+        /// Find the key \p val
+        /** @anchor cds_nonintrusive_EllenBinTreeSet_rcu_find_cfunc
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f]( leaf_node& node, Q const& v ) { cds::unref(f)( node.m_Value, v ); });
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find( val, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_rcu_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(),
+                [&f]( leaf_node& node, Q const& v ) { cds::unref(f)( node.m_Value, v ); } );
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find_with( val, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >(),
+                cds::ref(wrapper));
+#       endif
+        }
+
+        /// Find the key \p val
+        /** @anchor cds_nonintrusive_EllenBinTreeSet_rcu_find_val
+
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \ref value_type.
+
+            The function applies RCU lock internally.
+        */
+        template <typename Q>
+        bool find( Q const & val ) const
+        {
+            return base_class::find( val );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_rcu_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred ) const
+        {
+            return base_class::find_with( val, cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >());
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_nonintrusive_EllenBinTreeSet_rcu_get
+            The function searches the item with key equal to \p key and returns the pointer to item found.
+            If \p key is not found it returns \p NULL.
+
+            RCU should be locked before call the function.
+            Returned pointer is valid while RCU is locked.
+        */
+        template <typename Q>
+        value_type * get( Q const& key ) const
+        {
+            leaf_node * pNode = base_class::get( key );
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+
+        /// Finds \p key with \p pred predicate and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_EllenBinTreeSet_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type
+            and \p Q in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& key, Less pred ) const
+        {
+            leaf_node * pNode = base_class::get_with( key,
+                cds::details::predicate_wrapper< leaf_node, Less, typename maker::value_accessor >());
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function unlink all items from the tree.
+            The function is not atomic, thus, in multi-threaded environment with parallel insertions
+            this sequence
+            \code
+            set.clear();
+            assert( set.empty() );
+            \endcode
+            the assertion could be raised.
+
+            For each leaf the \ref disposer will be called after unlinking.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the set is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the set
+        /**
+            Only leaf nodes containing user data are counted.
+
+            The value returned depends on item counter type provided by \p Traits template parameter.
+            If it is atomicity::empty_item_counter this function always returns 0.
+            Therefore, the function is not suitable for checking the tree emptiness, use \ref empty
+            member function for this purpose.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Checks internal consistency (not atomic, not thread-safe)
+        /**
+            The debugging function to check internal consistency of the tree.
+        */
+        bool check_consistency() const
+        {
+            return base_class::check_consistency();
+        }
+
+    };
+
+}}  // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_ELLEN_BINTREE_SET_RCU_H
diff --git a/cds/container/fcdeque.h b/cds/container/fcdeque.h
new file mode 100644 (file)
index 0000000..452d7a5
--- /dev/null
@@ -0,0 +1,481 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_FCDEQUE_H
+#define __CDS_CONTAINER_FCDEQUE_H
+
+#include <cds/algo/flat_combining.h>
+#include <cds/algo/elimination_opt.h>
+#include <deque>
+
+namespace cds { namespace container {
+
+    /// FCDeque related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace fcdeque {
+
+        /// FCDeque internal statistics
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat: public cds::algo::flat_combining::stat<Counter>
+        {
+            typedef cds::algo::flat_combining::stat<Counter>    flat_combining_stat; ///< Flat-combining statistics
+            typedef typename flat_combining_stat::counter_type  counter_type;        ///< Counter type
+
+            counter_type    m_nPushFront     ;  ///< Count of push_front operations
+            counter_type    m_nPushFrontMove ;  ///< Count of push_front operations with move semantics
+            counter_type    m_nPushBack      ;  ///< Count of push_back operations
+            counter_type    m_nPushBackMove  ;  ///< Count of push_back operations with move semantics
+            counter_type    m_nPopFront      ;  ///< Count of success pop_front operations
+            counter_type    m_nFailedPopFront;  ///< Count of failed pop_front operations (pop from empty deque)
+            counter_type    m_nPopBack       ;  ///< Count of success pop_back operations
+            counter_type    m_nFailedPopBack ;  ///< Count of failed pop_back operations (pop from empty deque)
+            counter_type    m_nCollided      ;  ///< How many pairs of push/pop were collided, if elimination is enabled
+
+            //@cond
+            void    onPushFront()             { ++m_nPushFront; }
+            void    onPushFrontMove()         { ++m_nPushFrontMove; }
+            void    onPushBack()              { ++m_nPushBack; }
+            void    onPushBackMove()          { ++m_nPushBackMove; }
+            void    onPopFront( bool bFailed ) { if ( bFailed ) ++m_nFailedPopFront; else ++m_nPopFront;  }
+            void    onPopBack( bool bFailed ) { if ( bFailed ) ++m_nFailedPopBack; else ++m_nPopBack;  }
+            void    onCollide()               { ++m_nCollided; }
+            //@endcond
+        };
+
+        /// FCDeque dummy statistics, no overhead
+        struct empty_stat: public cds::algo::flat_combining::empty_stat
+        {
+            //@cond
+            void    onPushFront()       {}
+            void    onPushFrontMove()   {}
+            void    onPushBack()        {}
+            void    onPushBackMove()    {}
+            void    onPopFront(bool)    {}
+            void    onPopBack(bool)     {}
+            void    onCollide()         {}
+            //@endcond
+        };
+
+        /// FCDeque type traits
+        struct type_traits: public cds::algo::flat_combining::type_traits
+        {
+            typedef empty_stat      stat;   ///< Internal statistics
+            static CDS_CONSTEXPR_CONST bool enable_elimination = false; ///< Enable \ref cds_elimination_description "elimination"
+        };
+
+        /// Metafunction converting option list to traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options are:
+            - \p opt::lock_type - mutex type, default is \p cds::lock::Spin
+            - \p opt::back_off - back-off strategy, defalt is \p cds::backoff::Default
+            - \p opt::allocator - allocator type, default is \ref CDS_DEFAULT_ALLOCATOR
+            - \p opt::stat - internal statistics, possible type: \ref stat, \ref empty_stat (the default)
+            - \p opt::memory_model - C++ memory ordering model.
+                List of all available memory ordering see opt::memory_model.
+                Default if cds::opt::v:relaxed_ordering
+            - \p opt::enable_elimination - enable/disable operation \ref cds_elimination_description "elimination"
+                By default, the elimination is disabled. For queue, the elimination is possible if the queue
+                is empty.
+        */
+        template <CDS_DECL_OPTIONS8>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS8 >::type
+                ,CDS_OPTIONS8
+            >::type   type;
+#   endif
+        };
+
+    } // namespace fcqueue
+
+    /// Flat-combining deque
+    /**
+        @ingroup cds_nonintrusive_deque
+        @ingroup cds_flat_combining_container
+
+        \ref cds_flat_combining_description "Flat combining" sequential deque.
+        The class can be considered as a concurrent FC-based wrapper for \p std::deque.
+
+        Template parameters:
+        - \p T - a value type stored in the deque
+        - \p Deque - sequential deque implementation, for example, \p std::deque<T> (the default)
+            or \p boost::container::deque
+        - \p Trats - type traits of flat combining, default is \p fcdeque::type_traits.
+            \p fcdeque::make_traits metafunction can be used to construct specialized \p %type_traits
+    */
+    template <typename T,
+        class Deque = std::deque<T>,
+        typename Traits = fcdeque::type_traits
+    >
+    class FCDeque
+#ifndef CDS_DOXYGEN_INVOKED
+        : public cds::algo::flat_combining::container
+#endif
+    {
+    public:
+        typedef T           value_type;     ///< Value type
+        typedef Deque       deque_type;     ///< Sequential deque class
+        typedef Traits      type_traits;    ///< Deque type traits
+
+        typedef typename type_traits::stat  stat;   ///< Internal statistics type
+        static CDS_CONSTEXPR_CONST bool c_bEliminationEnabled = type_traits::enable_elimination; ///< \p true if elimination is enabled
+
+    protected:
+        //@cond
+        /// Deque operation IDs
+        enum fc_operation {
+            op_push_front = cds::algo::flat_combining::req_Operation, ///< Push front
+            op_push_front_move,     ///< Push front (move semantics)
+            op_push_back,           ///< Push back
+            op_push_back_move,      ///< Push back (move semantics)
+            op_pop_front,           ///< Pop front
+            op_pop_back,            ///< Pop back
+            op_clear                ///< Clear
+        };
+
+        /// Flat combining publication list record
+        struct fc_record: public cds::algo::flat_combining::publication_record
+        {
+            union {
+                value_type const *  pValPush; ///< Value to push
+                value_type *        pValPop;  ///< Pop destination
+            };
+            bool            bEmpty; ///< \p true if the deque is empty
+        };
+        //@endcond
+
+        /// Flat combining kernel
+        typedef cds::algo::flat_combining::kernel< fc_record, type_traits > fc_kernel;
+
+    protected:
+        //@cond
+        fc_kernel   m_FlatCombining;
+        deque_type  m_Deque;
+        //@endcond
+
+    public:
+        /// Initializes empty deque object
+        FCDeque()
+        {}
+
+        /// Initializes empty deque object and gives flat combining parameters
+        FCDeque(
+            unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
+            ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
+            )
+            : m_FlatCombining( nCompactFactor, nCombinePassCount )
+        {}
+
+        /// Inserts a new element at the beginning of the deque container
+        /**
+            The function always returns \p true
+        */
+        bool push_front(
+            value_type const& val ///< Value to be copied to inserted element
+        )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPush = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_push_front, pRec, *this );
+            else
+                m_FlatCombining.combine( op_push_front, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onPushFront();
+            return true;
+        }
+
+#   ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        /// Inserts a new element at the beginning of the deque container (move semantics)
+        /**
+            The function always returns \p true
+        */
+        bool push_front(
+            value_type&& val ///< Value to be moved to inserted element
+        )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPush = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_push_front_move, pRec, *this );
+            else
+                m_FlatCombining.combine( op_push_front_move, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onPushFrontMove();
+            return true;
+        }
+#   endif
+
+        /// Inserts a new element at the end of the deque container
+        /**
+            The function always returns \p true
+        */
+        bool push_back(
+            value_type const& val ///< Value to be copied to inserted element
+        )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPush = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_push_back, pRec, *this );
+            else
+                m_FlatCombining.combine( op_push_back, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onPushBack();
+            return true;
+        }
+
+#   ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        /// Inserts a new element at the end of the deque container (move semantics)
+        /**
+            The function always returns \p true
+        */
+        bool push_back(
+            value_type&& val ///< Value to be moved to inserted element
+        )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPush = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_push_back_move, pRec, *this );
+            else
+                m_FlatCombining.combine( op_push_back_move, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onPushBackMove();
+            return true;
+        }
+#   endif
+
+        /// Removes the first element in the deque container
+        /**
+            The function returns \p false if the deque is empty, \p true otherwise.
+            If the deque is empty \p val is not changed.
+        */
+        bool pop_front(
+            value_type& val ///< Target to be received the copy of removed element
+        )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPop = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_pop_front, pRec, *this );
+            else
+                m_FlatCombining.combine( op_pop_front, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onPopFront( pRec->bEmpty );
+            return !pRec->bEmpty;
+        }
+
+        /// Removes the last element in the deque container
+        /**
+            The function returns \p false if the deque is empty, \p true otherwise.
+            If the deque is empty \p val is not changed.
+        */
+        bool pop_back(
+            value_type& val ///< Target to be received the copy of removed element
+        )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPop = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_pop_back, pRec, *this );
+            else
+                m_FlatCombining.combine( op_pop_back, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onPopBack( pRec->bEmpty );
+            return !pRec->bEmpty;
+        }
+
+        /// Clears the deque
+        void clear()
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_clear, pRec, *this );
+            else
+                m_FlatCombining.combine( op_clear, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+        }
+
+        /// Returns the number of elements in the deque.
+        /**
+            Note that <tt>size() == 0</tt> is not mean that the deque is empty because
+            combining record can be in process.
+            To check emptiness use \ref empty function.
+        */
+        size_t size() const
+        {
+            return m_Deque.size();
+        }
+
+        /// Checks if the deque is empty
+        /**
+            If the combining is in process the function waits while combining done.
+        */
+        bool empty() const
+        {
+            m_FlatCombining.wait_while_combining();
+            return m_Deque.empty();
+        }
+
+        /// Internal statistics
+        stat const& statistics() const
+        {
+            return m_FlatCombining.statistics();
+        }
+
+    public: // flat combining cooperation, not for direct use!
+        //@cond
+        /// Flat combining supporting function. Do not call it directly!
+        /**
+            The function is called by \ref cds::algo::flat_combining::kernel "flat combining kernel"
+            object if the current thread becomes a combiner. Invocation of the function means that
+            the deque should perform an action recorded in \p pRec.
+        */
+        void fc_apply( fc_record * pRec )
+        {
+            assert( pRec );
+
+            switch ( pRec->op() ) {
+            case op_push_front:
+                assert( pRec->pValPush );
+                m_Deque.push_front( *(pRec->pValPush) );
+                break;
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            case op_push_front_move:
+                assert( pRec->pValPush );
+                m_Deque.push_front( std::move( *(pRec->pValPush )) );
+                break;
+#       endif
+            case op_push_back:
+                assert( pRec->pValPush );
+                m_Deque.push_back( *(pRec->pValPush) );
+                break;
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            case op_push_back_move:
+                assert( pRec->pValPush );
+                m_Deque.push_back( std::move( *(pRec->pValPush )) );
+                break;
+#       endif
+            case op_pop_front:
+                assert( pRec->pValPop );
+                pRec->bEmpty = m_Deque.empty();
+                if ( !pRec->bEmpty ) {
+                    *(pRec->pValPop) = m_Deque.front();
+                    m_Deque.pop_front();
+                }
+                break;
+            case op_pop_back:
+                assert( pRec->pValPop );
+                pRec->bEmpty = m_Deque.empty();
+                if ( !pRec->bEmpty ) {
+                    *(pRec->pValPop) = m_Deque.back();
+                    m_Deque.pop_back();
+                }
+                break;
+            case op_clear:
+                while ( !m_Deque.empty() )
+                    m_Deque.pop_front();
+                break;
+            default:
+                assert(false);
+                break;
+            }
+        }
+
+        /// Batch-processing flat combining
+        void fc_process( typename fc_kernel::iterator itBegin, typename fc_kernel::iterator itEnd )
+        {
+            typedef typename fc_kernel::iterator fc_iterator;
+            for ( fc_iterator it = itBegin, itPrev = itEnd; it != itEnd; ++it ) {
+                switch ( it->op() ) {
+                case op_push_front:
+                case op_push_front_move:
+                    if ( itPrev != itEnd
+                      && (itPrev->op() == op_pop_front || ( m_Deque.empty() && itPrev->op() == op_pop_back )))
+                    {
+                        collide( *it, *itPrev );
+                        itPrev = itEnd;
+                    }
+                    else
+                        itPrev = it;
+                    break;
+                case op_push_back:
+                case op_push_back_move:
+                    if ( itPrev != itEnd
+                        && (itPrev->op() == op_pop_back || ( m_Deque.empty() && itPrev->op() == op_pop_front )))
+                    {
+                        collide( *it, *itPrev );
+                        itPrev = itEnd;
+                    }
+                    else
+                        itPrev = it;
+                    break;
+                case op_pop_front:
+                    if ( itPrev != itEnd
+                        && ( itPrev->op() == op_push_front || itPrev->op() == op_push_front_move
+                          || ( m_Deque.empty() && ( itPrev->op() == op_push_back || itPrev->op() == op_push_back_move ))))
+                    {
+                        collide( *itPrev, *it );
+                        itPrev = itEnd;
+                    }
+                    else
+                        itPrev = it;
+                    break;
+                case op_pop_back:
+                    if ( itPrev != itEnd
+                        && ( itPrev->op() == op_push_back || itPrev->op() == op_push_back_move
+                        || ( m_Deque.empty() && ( itPrev->op() == op_push_front || itPrev->op() == op_push_front_move ))))
+                    {
+                        collide( *itPrev, *it );
+                        itPrev = itEnd;
+                    }
+                    else
+                        itPrev = it;
+                    break;
+                }
+            }
+        }
+        //@endcond
+
+    private:
+        //@cond
+        void collide( fc_record& recPush, fc_record& recPop )
+        {
+            *(recPop.pValPop) = *(recPush.pValPush);
+            recPop.bEmpty = false;
+            m_FlatCombining.operation_done( recPush );
+            m_FlatCombining.operation_done( recPop );
+            m_FlatCombining.internal_statistics().onCollide();
+        }
+        //@endcond
+    };
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_FCDEQUE_H
diff --git a/cds/container/fcpriority_queue.h b/cds/container/fcpriority_queue.h
new file mode 100644 (file)
index 0000000..740b7c5
--- /dev/null
@@ -0,0 +1,293 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_FCPRIORITY_QUEUE_H
+#define __CDS_CONTAINER_FCPRIORITY_QUEUE_H
+
+#include <cds/algo/flat_combining.h>
+#include <cds/algo/elimination_opt.h>
+#include <queue>
+
+namespace cds { namespace container {
+
+    /// FCPriorityQueue related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace fcpqueue {
+
+        /// FCPriorityQueue internal statistics
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat: public cds::algo::flat_combining::stat<Counter>
+        {
+            typedef cds::algo::flat_combining::stat<Counter>    flat_combining_stat; ///< Flat-combining statistics
+            typedef typename flat_combining_stat::counter_type  counter_type;        ///< Counter type
+
+            counter_type    m_nPush     ;  ///< Count of push operations
+            counter_type    m_nPushMove ;  ///< Count of push operations with move semantics
+            counter_type    m_nPop      ;  ///< Count of success pop operations
+            counter_type    m_nFailedPop;  ///< Count of failed pop operations (pop from empty queue)
+
+            //@cond
+            void    onPush()             { ++m_nPush; }
+            void    onPushMove()         { ++m_nPushMove; }
+            void    onPop( bool bFailed ) { if ( bFailed ) ++m_nFailedPop; else ++m_nPop;  }
+            //@endcond
+        };
+
+        /// FCPriorityQueue dummy statistics, no overhead
+        struct empty_stat: public cds::algo::flat_combining::empty_stat
+        {
+            //@cond
+            void    onPush()       {}
+            void    onPushMove()   {}
+            void    onPop(bool)    {}
+            //@endcond
+        };
+
+        /// FCPriorityQueue type traits
+        struct type_traits: public cds::algo::flat_combining::type_traits
+        {
+            typedef empty_stat      stat;   ///< Internal statistics
+        };
+
+        /// Metafunction converting option list to traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options are:
+            - \p opt::lock_type - mutex type, default is \p cds::lock::Spin
+            - \p opt::back_off - back-off strategy, defalt is \p cds::backoff::Default
+            - \p opt::allocator - allocator type, default is \ref CDS_DEFAULT_ALLOCATOR
+            - \p opt::stat - internal statistics, possible type: \ref stat, \ref empty_stat (the default)
+            - \p opt::memory_model - C++ memory ordering model.
+                List of all available memory ordering see opt::memory_model.
+                Default is cds::opt::v:relaxed_ordering
+        */
+        template <CDS_DECL_OPTIONS7>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS7 >::type
+                ,CDS_OPTIONS7
+            >::type   type;
+#   endif
+        };
+
+    } // namespace fcpqueue
+
+    /// Flat-combining priority queue
+    /**
+        @ingroup cds_nonintrusive_priority_queue
+        @ingroup cds_flat_combining_container
+
+        \ref cds_flat_combining_description "Flat combining" sequential priority queue.
+        The class can be considered as a concurrent FC-based wrapper for \p std::priority_queue.
+
+        Template parameters:
+        - \p T - a value type stored in the queue
+        - \p PriorityQueue - sequential priority queue implementation, default is \p std::priority_queue<T>
+        - \p Traits - type traits of flat combining, default is \p fcpqueue::type_traits.
+            \p fcpqueue::make_traits metafunction can be used to construct specialized \p %type_traits
+    */
+    template <typename T,
+        class PriorityQueue = std::priority_queue<T>,
+        typename Traits = fcpqueue::type_traits
+    >
+    class FCPriorityQueue
+#ifndef CDS_DOXYGEN_INVOKED
+        : public cds::algo::flat_combining::container
+#endif
+    {
+    public:
+        typedef T               value_type;          ///< Value type
+        typedef PriorityQueue   priority_queue_type; ///< Sequential priority queue class
+        typedef Traits          type_traits;         ///< Priority queue type traits
+
+        typedef typename type_traits::stat  stat;    ///< Internal statistics type
+
+    protected:
+        //@cond
+        // Priority queue operation IDs
+        enum fc_operation {
+            op_push = cds::algo::flat_combining::req_Operation,
+            op_push_move,
+            op_pop,
+            op_clear
+        };
+
+        // Flat combining publication list record
+        struct fc_record: public cds::algo::flat_combining::publication_record
+        {
+            union {
+                value_type const *  pValPush; // Value to push
+                value_type *        pValPop;  // Pop destination
+            };
+            bool            bEmpty; // true if the queue is empty
+        };
+        //@endcond
+
+        /// Flat combining kernel
+        typedef cds::algo::flat_combining::kernel< fc_record, type_traits > fc_kernel;
+
+    protected:
+        //@cond
+        fc_kernel               m_FlatCombining;
+        priority_queue_type     m_PQueue;
+        //@endcond
+
+    public:
+        /// Initializes empty priority queue object
+        FCPriorityQueue()
+        {}
+
+        /// Initializes empty priority queue object and gives flat combining parameters
+        FCPriorityQueue(
+            unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
+            ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
+            )
+            : m_FlatCombining( nCompactFactor, nCombinePassCount )
+        {}
+
+        /// Inserts a new element in the priority queue
+        /**
+            The function always returns \p true
+        */
+        bool push(
+            value_type const& val ///< Value to be copied to inserted element
+        )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPush = &val;
+
+            m_FlatCombining.combine( op_push, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onPush();
+            return true;
+        }
+
+#   ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        /// Inserts a new element in the priority queue (move semantics)
+        /**
+            The function always returns \p true
+        */
+        bool push(
+            value_type&& val ///< Value to be moved to inserted element
+        )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPush = &val;
+
+            m_FlatCombining.combine( op_push_move, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onPushMove();
+            return true;
+        }
+#   endif
+
+        /// Removes the top element from priority queue
+        /**
+            The function returns \p false if the queue is empty, \p true otherwise.
+            If the queue is empty \p val is not changed.
+        */
+        bool pop(
+            value_type& val ///< Target to be received the copy of top element
+        )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPop = &val;
+
+            m_FlatCombining.combine( op_pop, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onPop( pRec->bEmpty );
+            return !pRec->bEmpty;
+        }
+
+        /// Clears the priority queue
+        void clear()
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+
+           m_FlatCombining.combine( op_clear, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+        }
+
+        /// Returns the number of elements in the priority queue.
+        /**
+            Note that <tt>size() == 0</tt> does not mean that the queue is empty because
+            combining record can be in process.
+            To check emptiness use \ref empty function.
+        */
+        size_t size() const
+        {
+            return m_PQueue.size();
+        }
+
+        /// Checks if the priority queue is empty
+        /**
+            If the combining is in process the function waits while combining done.
+        */
+        bool empty() const
+        {
+            m_FlatCombining.wait_while_combining();
+            return m_PQueue.empty();
+        }
+
+        /// Internal statistics
+        stat const& statistics() const
+        {
+            return m_FlatCombining.statistics();
+        }
+
+    public: // flat combining cooperation, not for direct use!
+        //@cond
+        /*
+            The function is called by \ref cds::algo::flat_combining::kernel "flat combining kernel"
+            object if the current thread becomes a combiner. Invocation of the function means that
+            the priority queue should perform an action recorded in \p pRec.
+        */
+        void fc_apply( fc_record * pRec )
+        {
+            assert( pRec );
+
+            switch ( pRec->op() ) {
+            case op_push:
+                assert( pRec->pValPush );
+                m_PQueue.push( *(pRec->pValPush) );
+                break;
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            case op_push_move:
+                assert( pRec->pValPush );
+                m_PQueue.push( std::move( *(pRec->pValPush )) );
+                break;
+#       endif
+            case op_pop:
+                assert( pRec->pValPop );
+                pRec->bEmpty = m_PQueue.empty();
+                if ( !pRec->bEmpty ) {
+                    *(pRec->pValPop) = m_PQueue.top();
+                    m_PQueue.pop();
+                }
+                break;
+            case op_clear:
+                while ( !m_PQueue.empty() )
+                    m_PQueue.pop();
+                break;
+            default:
+                assert(false);
+                break;
+            }
+        }
+        //@endcond
+    };
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_FCPRIORITY_QUEUE_H
diff --git a/cds/container/fcqueue.h b/cds/container/fcqueue.h
new file mode 100644 (file)
index 0000000..b9eb75b
--- /dev/null
@@ -0,0 +1,393 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_FCQUEUE_H
+#define __CDS_CONTAINER_FCQUEUE_H
+
+#include <cds/algo/flat_combining.h>
+#include <cds/algo/elimination_opt.h>
+#include <queue>
+
+namespace cds { namespace container {
+
+    /// FCQueue related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace fcqueue {
+
+        /// FCQueue internal statistics
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat: public cds::algo::flat_combining::stat<Counter>
+        {
+            typedef cds::algo::flat_combining::stat<Counter>    flat_combining_stat; ///< Flat-combining statistics
+            typedef typename flat_combining_stat::counter_type  counter_type;        ///< Counter type
+
+            counter_type    m_nEnqueue     ;   ///< Count of enqueue operations
+            counter_type    m_nEnqMove     ;   ///< Count of enqueue operations with move semantics
+            counter_type    m_nDequeue     ;   ///< Count of success dequeue operations
+            counter_type    m_nFailedDeq   ;   ///< Count of failed dequeue operations (pop from empty queue)
+            counter_type    m_nCollided    ;   ///< How many pairs of enqueue/dequeue were collided, if elimination is enabled
+
+            //@cond
+            void    onEnqueue()               { ++m_nEnqueue; }
+            void    onEnqMove()               { ++m_nEnqMove; }
+            void    onDequeue( bool bFailed ) { if ( bFailed ) ++m_nFailedDeq; else ++m_nDequeue;  }
+            void    onCollide()               { ++m_nCollided; }
+            //@endcond
+        };
+
+        /// FCQueue dummy statistics, no overhead
+        struct empty_stat: public cds::algo::flat_combining::empty_stat
+        {
+            //@cond
+            void    onEnqueue()     {}
+            void    onEnqMove()     {}
+            void    onDequeue(bool) {}
+            void    onCollide()     {}
+            //@endcond
+        };
+
+        /// FCQueue type traits
+        struct type_traits: public cds::algo::flat_combining::type_traits
+        {
+            typedef empty_stat      stat;   ///< Internal statistics
+            static CDS_CONSTEXPR_CONST bool enable_elimination = false; ///< Enable \ref cds_elimination_description "elimination"
+        };
+
+        /// Metafunction converting option list to traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options are:
+            - \p opt::lock_type - mutex type, default is \p cds::lock::Spin
+            - \p opt::back_off - back-off strategy, defalt is \p cds::backoff::Default
+            - \p opt::allocator - allocator type, default is \ref CDS_DEFAULT_ALLOCATOR
+            - \p opt::stat - internal statistics, possible type: \ref stat, \ref empty_stat (the default)
+            - \p opt::memory_model - C++ memory ordering model.
+                List of all available memory ordering see opt::memory_model.
+                Default if cds::opt::v:relaxed_ordering
+            - \p opt::enable_elimination - enable/disable operation \ref cds_elimination_description "elimination"
+                By default, the elimination is disabled. For queue, the elimination is possible if the queue
+                is empty.
+        */
+        template <CDS_DECL_OPTIONS8>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS8 >::type
+                ,CDS_OPTIONS8
+            >::type   type;
+#   endif
+        };
+
+    } // namespace fcqueue
+
+    /// Flat-combining queue
+    /**
+        @ingroup cds_nonintrusive_queue
+        @ingroup cds_flat_combining_container
+
+        \ref cds_flat_combining_description "Flat combining" sequential queue.
+        The class can be considered as a concurrent FC-based wrapper for \p std::queue.
+
+        Template parameters:
+        - \p T - a value type stored in the queue
+        - \p Queue - sequential queue implementation, default is \p std::queue<T>
+        - \p Trats - type traits of flat combining, default is \p fcqueue::type_traits.
+            \p fcqueue::make_traits metafunction can be used to construct specialized \p %type_traits
+    */
+    template <typename T,
+        class Queue = std::queue<T>,
+        typename Traits = fcqueue::type_traits
+    >
+    class FCQueue
+#ifndef CDS_DOXYGEN_INVOKED
+        : public cds::algo::flat_combining::container
+#endif
+    {
+    public:
+        typedef T           value_type;     ///< Value type
+        typedef Queue       queue_type;     ///< Sequential queue class
+        typedef Traits      type_traits;    ///< Queue type traits
+
+        typedef typename type_traits::stat  stat;   ///< Internal statistics type
+        static CDS_CONSTEXPR_CONST bool c_bEliminationEnabled = type_traits::enable_elimination; ///< \p true if elimination is enabled
+
+    protected:
+        //@cond
+        /// Queue operation IDs
+        enum fc_operation {
+            op_enq = cds::algo::flat_combining::req_Operation, ///< Enqueue
+            op_enq_move,   ///< Enqueue (move semantics)
+            op_deq,         ///< Dequeue
+            op_clear        ///< Clear
+        };
+
+        /// Flat combining publication list record
+        struct fc_record: public cds::algo::flat_combining::publication_record
+        {
+            union {
+                value_type const *  pValEnq;  ///< Value to enqueue
+                value_type *        pValDeq;  ///< Dequeue destination
+            };
+            bool            bEmpty; ///< \p true if the queue is empty
+        };
+        //@endcond
+
+        /// Flat combining kernel
+        typedef cds::algo::flat_combining::kernel< fc_record, type_traits > fc_kernel;
+
+    protected:
+        //@cond
+        fc_kernel   m_FlatCombining;
+        queue_type  m_Queue;
+        //@endcond
+
+    public:
+        /// Initializes empty queue object
+        FCQueue()
+        {}
+
+        /// Initializes empty queue object and gives flat combining parameters
+        FCQueue(
+            unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
+            ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
+            )
+            : m_FlatCombining( nCompactFactor, nCombinePassCount )
+        {}
+
+        /// Inserts a new element at the end of the queue
+        /**
+            The content of the new element initialized to a copy of \p val.
+
+            The function always returns \p true
+        */
+        bool enqueue( value_type const& val )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValEnq = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_enq, pRec, *this );
+            else
+                m_FlatCombining.combine( op_enq, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onEnqueue();
+            return true;
+        }
+
+        /// Inserts a new element at the end of the queue (a synonym for \ref enqueue)
+        bool push( value_type const& val )
+        {
+            return enqueue( val );
+        }
+
+#   ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        /// Inserts a new element at the end of the queue (move semantics)
+        /**
+            \p val is moved to inserted element
+        */
+        bool enqueue( value_type&& val )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValEnq = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_enq_move, pRec, *this );
+            else
+                m_FlatCombining.combine( op_enq_move, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+
+            m_FlatCombining.internal_statistics().onEnqMove();
+            return true;
+        }
+
+        /// Inserts a new element at the end of the queue (move semantics, synonym for \p enqueue)
+        bool push( value_type&& val )
+        {
+            return enqueue( val );
+        }
+#   endif
+
+        /// Removes the next element from the queue
+        /**
+            \p val takes a copy of the element
+        */
+        bool dequeue( value_type& val )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValDeq = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_deq, pRec, *this );
+            else
+                m_FlatCombining.combine( op_deq, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+
+            m_FlatCombining.internal_statistics().onDequeue( pRec->bEmpty );
+            return !pRec->bEmpty;
+        }
+
+        /// Removes the next element from the queue (a synonym for \ref dequeue)
+        bool pop( value_type& val )
+        {
+            return dequeue( val );
+        }
+
+        /// Clears the queue
+        void clear()
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_clear, pRec, *this );
+            else
+                m_FlatCombining.combine( op_clear, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+        }
+
+        /// Returns the number of elements in the queue.
+        /**
+            Note that <tt>size() == 0</tt> is not mean that the queue is empty because
+            combining record can be in process.
+            To check emptiness use \ref empty function.
+        */
+        size_t size() const
+        {
+            return m_Queue.size();
+        }
+
+        /// Checks if the queue is empty
+        /**
+            If the combining is in process the function waits while combining done.
+        */
+        bool empty() const
+        {
+            m_FlatCombining.wait_while_combining();
+            return m_Queue.empty();
+        }
+
+        /// Internal statistics
+        stat const& statistics() const
+        {
+            return m_FlatCombining.statistics();
+        }
+
+    public: // flat combining cooperation, not for direct use!
+        //@cond
+        /// Flat combining supporting function. Do not call it directly!
+        /**
+            The function is called by \ref cds::algo::flat_combining::kernel "flat combining kernel"
+            object if the current thread becomes a combiner. Invocation of the function means that
+            the queue should perform an action recorded in \p pRec.
+        */
+        void fc_apply( fc_record * pRec )
+        {
+            assert( pRec );
+
+            switch ( pRec->op() ) {
+            case op_enq:
+                assert( pRec->pValEnq );
+                m_Queue.push( *(pRec->pValEnq ) );
+                break;
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            case op_enq_move:
+                assert( pRec->pValEnq );
+                m_Queue.push( std::move( *(pRec->pValEnq )) );
+                break;
+#       endif
+            case op_deq:
+                assert( pRec->pValDeq );
+                pRec->bEmpty = m_Queue.empty();
+                if ( !pRec->bEmpty ) {
+                    *(pRec->pValDeq) = m_Queue.front();
+                    m_Queue.pop();
+                }
+                break;
+            case op_clear:
+                while ( !m_Queue.empty() )
+                    m_Queue.pop();
+                break;
+            default:
+                assert(false);
+                break;
+            }
+        }
+
+        /// Batch-processing flat combining
+        void fc_process( typename fc_kernel::iterator itBegin, typename fc_kernel::iterator itEnd )
+        {
+            typedef typename fc_kernel::iterator fc_iterator;
+            for ( fc_iterator it = itBegin, itPrev = itEnd; it != itEnd; ++it ) {
+                switch ( it->op() ) {
+                case op_enq:
+                case op_enq_move:
+                case op_deq:
+                    if ( m_Queue.empty() ) {
+                        if ( itPrev != itEnd && collide( *itPrev, *it ))
+                            itPrev = itEnd;
+                        else
+                            itPrev = it;
+                    }
+                    break;
+                }
+            }
+        }
+        //@endcond
+
+    private:
+        //@cond
+        bool collide( fc_record& rec1, fc_record& rec2 )
+        {
+            switch ( rec1.op() ) {
+                case op_enq:
+                    if ( rec2.op() == op_deq ) {
+                        assert(rec1.pValEnq);
+                        assert(rec2.pValDeq);
+                        *rec2.pValDeq = *rec1.pValEnq;
+                        rec2.bEmpty = false;
+                        goto collided;
+                    }
+                    break;
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                case op_enq_move:
+                    if ( rec2.op() == op_deq ) {
+                        assert(rec1.pValEnq);
+                        assert(rec2.pValDeq);
+                        *rec2.pValDeq = std::move( *rec1.pValEnq );
+                        rec2.bEmpty = false;
+                        goto collided;
+                    }
+                    break;
+#       endif
+                case op_deq:
+                    switch ( rec2.op() ) {
+                    case op_enq:
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                    case op_enq_move:
+#       endif
+                        return collide( rec2, rec1 );
+                    }
+            }
+            return false;
+
+        collided:
+            m_FlatCombining.operation_done( rec1 );
+            m_FlatCombining.operation_done( rec2 );
+            m_FlatCombining.internal_statistics().onCollide();
+            return true;
+        }
+        //@endcond
+
+    };
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_FCQUEUE_H
diff --git a/cds/container/fcstack.h b/cds/container/fcstack.h
new file mode 100644 (file)
index 0000000..fb9cbbd
--- /dev/null
@@ -0,0 +1,369 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_FCSTACK_H
+#define __CDS_CONTAINER_FCSTACK_H
+
+#include <cds/algo/flat_combining.h>
+#include <cds/algo/elimination_opt.h>
+#include <stack>
+
+namespace cds { namespace container {
+
+    /// FCStack related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace fcstack {
+
+        /// FCStack internal statistics
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat: public cds::algo::flat_combining::stat<Counter>
+        {
+            typedef cds::algo::flat_combining::stat<Counter>    flat_combining_stat; ///< Flat-combining statistics
+            typedef typename flat_combining_stat::counter_type  counter_type;        ///< Counter type
+
+            counter_type    m_nPush     ;   ///< Count of push operations
+            counter_type    m_nPushMove ;   ///< Count of push operations with move semantics
+            counter_type    m_nPop      ;   ///< Count of success pop operations
+            counter_type    m_nFailedPop;   ///< Count of failed pop operations (pop from empty stack)
+            counter_type    m_nCollided ;   ///< How many pairs of push/pop were collided, if elimination is enabled
+
+            //@cond
+            void    onPush()               { ++m_nPush; }
+            void    onPushMove()           { ++m_nPushMove; }
+            void    onPop( bool bFailed )  { if ( bFailed ) ++m_nFailedPop; else ++m_nPop;  }
+            void    onCollide()            { ++m_nCollided; }
+            //@endcond
+        };
+
+        /// FCStack dummy statistics, no overhead
+        struct empty_stat: public cds::algo::flat_combining::empty_stat
+        {
+            //@cond
+            void    onPush()        {}
+            void    onPushMove()    {}
+            void    onPop(bool)     {}
+            void    onCollide()     {}
+            //@endcond
+        };
+
+        /// FCStack type traits
+        struct type_traits: public cds::algo::flat_combining::type_traits
+        {
+            typedef empty_stat      stat;   ///< Internal statistics
+            static CDS_CONSTEXPR_CONST bool enable_elimination = false; ///< Enable \ref cds_elimination_description "elimination"
+        };
+
+        /// Metafunction converting option list to traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options are:
+            - \p opt::lock_type - mutex type, default is \p cds::lock::Spin
+            - \p opt::back_off - back-off strategy, defalt is \p cds::backoff::Default
+            - \p opt::allocator - allocator type, default is \ref CDS_DEFAULT_ALLOCATOR
+            - \p opt::stat - internal statistics, possible type: \ref stat, \ref empty_stat (the default)
+            - \p opt::memory_model - C++ memory ordering model.
+                List of all available memory ordering see opt::memory_model.
+                Default if cds::opt::v:relaxed_ordering
+            - \p opt::enable_elimination - enable/disable operation \ref cds_elimination_description "elimination"
+                By default, the elimination is disabled.
+        */
+        template <CDS_DECL_OPTIONS8>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS8 >::type
+                ,CDS_OPTIONS8
+            >::type   type;
+#   endif
+        };
+
+    } // namespace fcstack
+
+    /// Flat-combining stack
+    /**
+        @ingroup cds_nonintrusive_stack
+        @ingroup cds_flat_combining_container
+
+        \ref cds_flat_combining_description "Flat combining" sequential stack.
+
+        Template parameters:
+        - \p T - a value type stored in the stack
+        - \p Stack - sequential stack implementation, default is \p std::stack<T>
+        - \p Trats - type traits of flat combining, default is \p fcstack::type_traits
+            \p fcstack::make_traits metafunction can be used to construct specialized \p %type_traits
+    */
+    template <typename T,
+        class Stack = std::stack<T>,
+        typename Traits = fcstack::type_traits
+    >
+    class FCStack
+#ifndef CDS_DOXYGEN_INVOKED
+        : public cds::algo::flat_combining::container
+#endif
+    {
+    public:
+        typedef T           value_type;     ///< Value type
+        typedef Stack       stack_type;     ///< Sequential stack class
+        typedef Traits      type_traits;    ///< Stack type traits
+
+        typedef typename type_traits::stat  stat;   ///< Internal statistics type
+        static CDS_CONSTEXPR_CONST bool c_bEliminationEnabled = type_traits::enable_elimination; ///< \p true if elimination is enabled
+
+    protected:
+        //@cond
+        /// Stack operation IDs
+        enum fc_operation {
+            op_push = cds::algo::flat_combining::req_Operation, ///< Push
+            op_push_move,   ///< Push (move semantics)
+            op_pop,         ///< Pop
+            op_clear        ///< Clear
+        };
+
+        /// Flat combining publication list record
+        struct fc_record: public cds::algo::flat_combining::publication_record
+        {
+            union {
+                value_type const *  pValPush; ///< Value to push
+                value_type *        pValPop;  ///< Pop destination
+            };
+            bool            bEmpty; ///< \p true if the stack is empty
+        };
+        //@endcond
+
+        /// Flat combining kernel
+        typedef cds::algo::flat_combining::kernel< fc_record, type_traits > fc_kernel;
+
+    protected:
+        //@cond
+        fc_kernel   m_FlatCombining;
+        stack_type  m_Stack;
+        //@endcond
+
+    public:
+        /// Initializes empty stack object
+        FCStack()
+        {}
+
+        /// Initializes empty stack object and gives flat combining parameters
+        FCStack(
+            unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
+            ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
+            )
+            : m_FlatCombining( nCompactFactor, nCombinePassCount )
+        {}
+
+        /// Inserts a new element at the top of stack
+        /**
+            The content of the new element initialized to a copy of \p val.
+        */
+        bool push( value_type const& val )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPush = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_push, pRec, *this );
+            else
+                m_FlatCombining.combine( op_push, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onPush();
+            return true;
+        }
+
+#   ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        /// Inserts a new element at the top of stack (move semantics)
+        /**
+            The content of the new element initialized to a copy of \p val.
+        */
+        bool push( value_type&& val )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPush = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_push_move, pRec, *this );
+            else
+                m_FlatCombining.combine( op_push_move, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+
+            m_FlatCombining.internal_statistics().onPushMove();
+            return true;
+        }
+#   endif
+
+        /// Removes the element on top of the stack
+        /**
+            \p val takes a copy of top element
+        */
+        bool pop( value_type& val )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pValPop = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_pop, pRec, *this );
+            else
+                m_FlatCombining.combine( op_pop, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+
+            m_FlatCombining.internal_statistics().onPop( pRec->bEmpty );
+            return !pRec->bEmpty;
+        }
+
+        /// Clears the stack
+        void clear()
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_clear, pRec, *this );
+            else
+                m_FlatCombining.combine( op_clear, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+        }
+
+        /// Returns the number of elements in the stack.
+        /**
+            Note that <tt>size() == 0</tt> is not mean that the stack is empty because
+            combining record can be in process.
+            To check emptiness use \ref empty function.
+        */
+        size_t size() const
+        {
+            return m_Stack.size();
+        }
+
+        /// Checks if the stack is empty
+        /**
+            If the combining is in process the function waits while combining done.
+        */
+        bool empty() const
+        {
+            m_FlatCombining.wait_while_combining();
+            return m_Stack.empty();
+        }
+
+        /// Internal statistics
+        stat const& statistics() const
+        {
+            return m_FlatCombining.statistics();
+        }
+
+
+    public: // flat combining cooperation, not for direct use!
+        //@cond
+        /// Flat combining supporting function. Do not call it directly!
+        /**
+            The function is called by \ref cds::algo::flat_combining::kernel "flat combining kernel"
+            object if the current thread becomes a combiner. Invocation of the function means that
+            the stack should perform an action recorded in \p pRec.
+        */
+        void fc_apply( fc_record * pRec )
+        {
+            assert( pRec );
+
+            switch ( pRec->op() ) {
+            case op_push:
+                assert( pRec->pValPush );
+                m_Stack.push( *(pRec->pValPush ) );
+                break;
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            case op_push_move:
+                assert( pRec->pValPush );
+                m_Stack.push( std::move( *(pRec->pValPush )) );
+                break;
+#       endif
+            case op_pop:
+                assert( pRec->pValPop );
+                pRec->bEmpty = m_Stack.empty();
+                if ( !pRec->bEmpty ) {
+                    *(pRec->pValPop) = m_Stack.top();
+                    m_Stack.pop();
+                }
+                break;
+            case op_clear:
+                while ( !m_Stack.empty() )
+                    m_Stack.pop();
+                break;
+            default:
+                assert(false);
+                break;
+            }
+        }
+
+        /// Batch-processing flat combining
+        void fc_process( typename fc_kernel::iterator itBegin, typename fc_kernel::iterator itEnd )
+        {
+            typedef typename fc_kernel::iterator fc_iterator;
+            for ( fc_iterator it = itBegin, itPrev = itEnd; it != itEnd; ++it ) {
+                switch ( it->op() ) {
+                case op_push:
+                case op_push_move:
+                case op_pop:
+                    if ( itPrev != itEnd && collide( *itPrev, *it ))
+                        itPrev = itEnd;
+                    else
+                        itPrev = it;
+                    break;
+                }
+            }
+        }
+        //@endcond
+
+    private:
+        //@cond
+        bool collide( fc_record& rec1, fc_record& rec2 )
+        {
+            switch ( rec1.op() ) {
+                case op_push:
+                    if ( rec2.op() == op_pop ) {
+                        assert(rec1.pValPush);
+                        assert(rec2.pValPop);
+                        *rec2.pValPop = *rec1.pValPush;
+                        rec2.bEmpty = false;
+                        goto collided;
+                    }
+                    break;
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                case op_push_move:
+                    if ( rec2.op() == op_pop ) {
+                        assert(rec1.pValPush);
+                        assert(rec2.pValPop);
+                        *rec2.pValPop = std::move( *rec1.pValPush );
+                        rec2.bEmpty = false;
+                        goto collided;
+                    }
+                    break;
+#       endif
+                case op_pop:
+                    switch ( rec2.op() ) {
+                    case op_push:
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                    case op_push_move:
+#       endif
+                        return collide( rec2, rec1 );
+                    }
+            }
+            return false;
+
+        collided:
+            m_FlatCombining.operation_done( rec1 );
+            m_FlatCombining.operation_done( rec2 );
+            m_FlatCombining.internal_statistics().onCollide();
+            return true;
+        }
+        //@endcond
+    };
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_FCSTACK_H
diff --git a/cds/container/lazy_kvlist_hp.h b/cds/container/lazy_kvlist_hp.h
new file mode 100644 (file)
index 0000000..4e6a76f
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_KVLIST_HP_H
+#define __CDS_CONTAINER_LAZY_KVLIST_HP_H
+
+#include <cds/container/lazy_list_base.h>
+#include <cds/intrusive/lazy_list_hp.h>
+#include <cds/container/details/make_lazy_kvlist.h>
+#include <cds/container/lazy_kvlist_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_LAZY_KVLIST_HP_H
diff --git a/cds/container/lazy_kvlist_hrc.h b/cds/container/lazy_kvlist_hrc.h
new file mode 100644 (file)
index 0000000..22a9d82
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_KVLIST_HRC_H
+#define __CDS_CONTAINER_LAZY_KVLIST_HRC_H
+
+#include <cds/container/lazy_list_base.h>
+#include <cds/intrusive/lazy_list_hrc.h>
+#include <cds/container/details/make_lazy_kvlist.h>
+#include <cds/container/lazy_kvlist_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_LAZY_KVLIST_HRC_H
diff --git a/cds/container/lazy_kvlist_impl.h b/cds/container/lazy_kvlist_impl.h
new file mode 100644 (file)
index 0000000..b6a9b86
--- /dev/null
@@ -0,0 +1,926 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_KVLIST_IMPL_H
+#define __CDS_CONTAINER_LAZY_KVLIST_IMPL_H
+
+#include <cds/ref.h>
+#include <cds/details/functor_wrapper.h>
+#include <cds/details/std/memory.h>
+#include <cds/container/details/guarded_ptr_cast.h>
+
+namespace cds { namespace container {
+
+    /// Lazy ordered list (key-value pair)
+    /** @ingroup cds_nonintrusive_list
+        \anchor cds_nonintrusive_LazyKVList_gc
+
+        This is key-value variation of non-intrusive LazyList.
+        Like standard container, this implementation split a value stored into two part -
+        constant key and alterable value.
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Template arguments:
+        - \p GC - garbage collector used
+        - \p Key - key type of an item stored in the list. It should be copy-constructible
+        - \p Value - value type stored in the list
+        - \p Traits - type traits, default is lazy_list::type_traits
+
+        It is possible to declare option-based list with cds::container::lazy_list::make_traits metafunction istead of \p Traits template
+        argument. For example, the following traits-based declaration of gc::HP lazy list
+        \code
+        #include <cds/container/lazy_kvlist_hp.h>
+        // Declare comparator for the item
+        struct my_compare {
+            int operator ()( int i1, int i2 )
+            {
+                return i1 - i2;
+            }
+        };
+
+        // Declare type_traits
+        struct my_traits: public cds::container::lazy_list::type_traits
+        {
+            typedef my_compare compare;
+        };
+
+        // Declare traits-based list
+        typedef cds::container::LazyKVList< cds::gc::HP, int, int, my_traits >     traits_based_list;
+        \endcode
+
+        is equivalent for the following option-based list
+        \code
+        #include <cds/container/lazy_kvlist_hp.h>
+
+        // my_compare is the same
+
+        // Declare option-based list
+        typedef cds::container::LazyKVList< cds::gc::HP, int, int,
+            typename cds::container::lazy_list::make_traits<
+                cds::container::opt::compare< my_compare >     // item comparator option
+            >::type
+        >     option_based_list;
+        \endcode
+
+        Template argument list \p Options of cds::container::lazy_list::make_traits metafunction are:
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::allocator - the allocator used for creating and freeing list's item. Default is \ref CDS_DEFAULT_ALLOCATOR macro.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        \par Usage
+        There are different specializations of this template for each garbage collecting schema used.
+        You should include appropriate .h-file depending on GC you are using:
+        - for gc::HP: \code #include <cds/container/lazy_kvlist_hp.h> \endcode
+        - for gc::PTB: \code #include <cds/container/lazy_kvlist_ptb.h> \endcode
+        - for gc::HRC: \code #include <cds/container/lazy_kvlist_hrc.h> \endcode
+        - for \ref cds_urcu_desc "RCU": \code #include <cds/container/lazy_kvlist_rcu.h> \endcode
+        - for gc::nogc: \code #include <cds/container/lazy_kvlist_nogc.h> \endcode
+    */
+    template <
+        typename GC,
+        typename Key,
+        typename Value,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = lazy_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class LazyKVList:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::LazyList< GC, implementation_defined, Traits >
+#else
+        protected details::make_lazy_kvlist< GC, Key, Value, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_lazy_kvlist< GC, Key, Value, Traits > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+#ifdef CDS_DOXYGEN_INVOKED
+        typedef Key                                 key_type        ;   ///< Key type
+        typedef Value                               mapped_type     ;   ///< Type of value stored in the list
+        typedef std::pair<key_type const, mapped_type> value_type   ;   ///< key/value pair stored in the list
+#else
+        typedef typename options::key_type          key_type;
+        typedef typename options::value_type        mapped_type;
+        typedef typename options::pair_type         value_type;
+#endif
+
+        typedef typename base_class::gc             gc              ;   ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename options::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;
+        typedef typename options::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::node_type      head_type;
+        //@endcond
+
+    public:
+        /// Guarded pointer
+        typedef cds::gc::guarded_ptr< gc, node_type, value_type, details::guarded_ptr_cast_map<node_type, value_type> > guarded_ptr;
+
+    private:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        class insert_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_functor ( Func f )
+                : base_class( f )
+            {}
+
+            void operator()( node_type& node )
+            {
+                base_class::get()( node.m_Data );
+            }
+        };
+
+        template <typename Func>
+        class ensure_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            ensure_functor( Func f )
+                : base_class(f)
+            {}
+
+            void operator ()( bool bNew, node_type& node, node_type& )
+            {
+                base_class::get()( bNew, node.m_Data );
+            }
+        };
+
+        template <typename Func>
+        class find_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_functor( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q&  )
+            {
+                base_class::get()( node.m_Data );
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func m_func;
+
+            erase_functor( Func f )
+                : m_func( f )
+            {}
+
+            void operator ()( node_type const & node )
+            {
+                cds::unref(m_func)( const_cast<value_type&>(node.m_Data) );
+            }
+        };
+#   endif // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename K>
+        static node_type * alloc_node(const K& key)
+        {
+            return cxx_allocator().New( key );
+        }
+
+        template <typename K, typename V>
+        static node_type * alloc_node( const K& key, const V& val )
+        {
+            return cxx_allocator().New( key, val );
+        }
+
+#ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>(args)... );
+        }
+#endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return *base_class::head();
+        }
+
+        head_type const& head() const
+        {
+            return *base_class::head();
+        }
+
+        head_type& tail()
+        {
+            return *base_class::tail();
+        }
+
+        head_type const& tail() const
+        {
+            return *base_class::tail();
+        }
+
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& pNode )
+                : iterator_base( const_cast<head_type *>(&pNode) )
+            {}
+            iterator_type( head_type const * pNode )
+                : iterator_base( const_cast<head_type *>(pNode) )
+            {}
+
+            friend class LazyKVList;
+
+        public:
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::reference  value_ref;
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::pointer    value_ptr;
+
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::reference  pair_ref;
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::pointer    pair_ptr;
+
+            iterator_type()
+            {}
+
+            iterator_type( iterator_type const& src )
+                : iterator_base( src )
+            {}
+
+            key_type const& key() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.first;
+            }
+
+            value_ref val() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.second;
+            }
+
+            pair_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Data) : null_ptr<pair_ptr>();
+            }
+
+            pair_ref operator *() const
+            {
+                typename iterator_base::value_ref p = iterator_base::operator *();
+                return p.m_Data;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for lazy list has some features:
+            - it has no post-increment operator
+            - to protect the value, the iterator contains a GC-specific guard + another guard is required locally for increment operator.
+              For some GC (gc::HP, gc::HRC), a guard is limited resource per thread, so an exception (or assertion) "no free guard"
+              may be thrown if a limit of guard count per thread is exceeded.
+            - The iterator cannot be moved across thread boundary since it contains GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the list.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use the iterator on the concurrent container
+            for debug purpose only.
+
+            The iterator interface to access item data:
+            - <tt> operator -> </tt> - returns a pointer to \ref value_type for iterator
+            - <tt> operator *</tt> - returns a reference (a const reference for \p const_iterator) to \ref value_type for iterator
+            - <tt> const key_type& key() </tt> - returns a key reference for iterator
+            - <tt> mapped_type& val() </tt> - retuns a value reference for iterator (const reference for \p const_iterator)
+
+            For both functions the iterator should not be equal to <tt> end() </tt>
+        */
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            iterator it( head() );
+            ++it ;  // skip dummy head
+            return it;
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value equals to <tt>NULL</tt>.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( tail() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            const_iterator it( head() );
+            ++it;   // skip dummy head
+            return it;
+        }
+        const_iterator cbegin()
+        {
+            const_iterator it( head() );
+            ++it;   // skip dummy head
+            return it;
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator( tail());
+        }
+        const_iterator cend()
+        {
+            return const_iterator( tail());
+        }
+        //@}
+
+    public:
+        /// Default constructor
+        /**
+            Initializes empty list
+        */
+        LazyKVList()
+        {}
+
+        /// List destructor
+        /**
+            Clears the list
+        */
+        ~LazyKVList()
+        {
+            clear();
+        }
+
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( const K& key )
+        {
+            return insert_at( head(), key );
+        }
+
+        /// Inserts new node with a key and a value
+        /**
+            The function creates a node with \p key and value \p val, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( const K& key, const V& val )
+        {
+            // We cannot use insert with functor here
+            // because we cannot lock inserted node for updating
+            // Therefore, we use separate function
+            return insert_at( head(), key, val );
+        }
+
+        /// Inserts new node and initializes it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the list's item inserted. <tt>item.second</tt> is a reference to item's value that may be changed.
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this list's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the list;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            return insert_key_at( head(), key, func );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            return emplace_at( head(), std::forward<Args>(args)... );
+        }
+#   endif
+
+        /// Ensures that the \p key exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the list, then the new item created from \p key
+            is inserted into the list (note that in this case the \ref key_type should be
+            copy-constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref mapped_type;
+            however, \p func must guarantee that during changing no any other modifications
+            could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( const K& key, Func f )
+        {
+            return ensure_at( head(), key, f );
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_LazyKVList_hp_erase_val
+
+            Returns \p true if \p key is found and has been deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            return erase_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_hp_erase_val "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less>
+        bool erase_with( K const& key, Less pred )
+        {
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_LazyKVList_hp_erase_func
+            The function searches an item with key \p key, calls \p f functor with item found
+            and deletes it. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& val) { ... }
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            Returns \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+            return erase_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_hp_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Extracts the item from the list with specified \p key
+        /** \anchor cds_nonintrusive_LazyKVList_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the list, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p K that can be not the same as \p key_type.
+
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::LazyKVList< cds::gc::HP, int, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                theList.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard and frees the item
+            }
+            \endcode
+        */
+        template <typename K>
+        bool extract( guarded_ptr& dest, K const& key )
+        {
+            return extract_at( head(), dest.guard(), key, intrusive_key_comparator() );
+        }
+
+        /// Extracts the item from the list with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_hp_extract "extract(guarded_ptr&, K const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less>
+        bool extract_with( guarded_ptr& dest, K const& key, Less pred )
+        {
+            return extract_at( head(), dest.guard(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_LazyKVList_hp_find_val
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise
+        */
+        template <typename Q>
+        bool find( Q const& key )
+        {
+            return find_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_hp_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& key, Less pred )
+        {
+            return find_at( head(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p key and performs an action with it
+        /** \anchor cds_nonintrusive_LazyKVList_hp_find_func
+            The function searches an item with key equal to \p key and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change <tt>item.second</tt> that is reference to value of node.
+            Note that the function is only guarantee that \p item cannot be deleted during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& key, Func f )
+        {
+            return find_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_hp_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& key, Less pred, Func f )
+        {
+            return find_at( head(), key, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_nonintrusive_LazyKVList_hp_get
+            The function searches the item with key equal to \p key
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p key is found, and \p false otherwise.
+            If \p key is not found the \p ptr parameter is not changed.
+
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::LazyKVList< cds::gc::HP, int, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                if ( theList.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard and frees the item
+            }
+            \endcode
+
+            Note the compare functor specified for class \p Traits template parameter
+            should accept a parameter of type \p K that can be not the same as \p key_type.
+        */
+        template <typename K>
+        bool get( guarded_ptr& ptr, K const& key )
+        {
+            return get_at( head(), ptr.guard(), key, intrusive_key_comparator() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_hp_get "get(guarded_ptr& ptr, K const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less>
+        bool get_with( guarded_ptr& ptr, K const& key, Less pred )
+        {
+            return get_at( head(), ptr.guard(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        bool insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p( pNode );
+
+            if ( base_class::insert_at( &refHead, *p )) {
+                p.release();
+                return true;
+            }
+
+            return false;
+        }
+
+        template <typename K>
+        bool insert_at( head_type& refHead, const K& key )
+        {
+            return insert_node_at( refHead, alloc_node( key ));
+        }
+
+        template <typename K, typename V>
+        bool insert_at( head_type& refHead, const K& key, const V& val )
+        {
+            return insert_node_at( refHead, alloc_node( key, val ));
+        }
+
+        template <typename K, typename Func>
+        bool insert_key_at( head_type& refHead, const K& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert_at( &refHead, *pNode, [&f](node_type& node){ cds::unref(f)( node.m_Data ); } ))
+#   else
+            insert_functor<Func>  wrapper( f );
+            if ( base_class::insert_at( &refHead, *pNode, cds::ref(wrapper) ))
+#   endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        bool emplace_at( head_type& refHead, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<Args>(args)... ));
+        }
+#   endif
+
+        template <typename K, typename Compare>
+        bool erase_at( head_type& refHead, K const& key, Compare cmp )
+        {
+            return base_class::erase_at( &refHead, key, cmp );
+        }
+
+        template <typename K, typename Compare, typename Func>
+        bool erase_at( head_type& refHead, K const& key, Compare cmp, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_at( &refHead, key, cmp, [&f](node_type const & node){cds::unref(f)( const_cast<value_type&>(node.m_Data)); });
+#   else
+            erase_functor<Func> wrapper( f );
+            return base_class::erase_at( &refHead, key, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename K, typename Compare>
+        bool extract_at( head_type& refHead, typename gc::Guard& dest, K const& key, Compare cmp )
+        {
+            return base_class::extract_at( &refHead, dest, key, cmp );
+        }
+
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure_at( head_type& refHead, const K& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode,
+                [&f]( bool bNew, node_type& node, node_type& ){ cds::unref(f)( bNew, node.m_Data ); });
+#   else
+            ensure_functor<Func> wrapper( f );
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode, cds::ref(wrapper));
+#   endif
+            if ( ret.first && ret.second )
+                pNode.release();
+
+            return ret;
+        }
+
+        template <typename K, typename Compare>
+        bool find_at( head_type& refHead, K const& key, Compare cmp )
+        {
+            return base_class::find_at( &refHead, key, cmp );
+        }
+
+        template <typename K, typename Compare, typename Func>
+        bool find_at( head_type& refHead, K& key, Compare cmp, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_at( &refHead, key, cmp, [&f]( node_type& node, K& ){ cds::unref(f)( node.m_Data ); });
+#   else
+            find_functor<Func>  wrapper( f );
+            return base_class::find_at( &refHead, key, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename K, typename Compare>
+        bool get_at( head_type& refHead, typename gc::Guard& guard, K const& key, Compare cmp )
+        {
+            return base_class::get_at( &refHead, guard, key, cmp );
+        }
+
+        //@endcond
+    };
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_LAZY_KVLIST_IMPL_H
diff --git a/cds/container/lazy_kvlist_nogc.h b/cds/container/lazy_kvlist_nogc.h
new file mode 100644 (file)
index 0000000..73f572d
--- /dev/null
@@ -0,0 +1,621 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_KVLIST_NOGC_H
+#define __CDS_CONTAINER_LAZY_KVLIST_NOGC_H
+
+#include <cds/container/lazy_list_base.h>
+#include <cds/intrusive/lazy_list_nogc.h>
+#include <cds/container/details/make_lazy_kvlist.h>
+#include <cds/details/functor_wrapper.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+
+        template <typename K, typename T, class Traits>
+        struct make_lazy_kvlist_nogc: public make_lazy_kvlist<gc::nogc, K, T, Traits>
+        {
+            typedef make_lazy_kvlist<cds::gc::nogc, K, T, Traits>  base_maker;
+            typedef typename base_maker::node_type node_type;
+
+            struct type_traits: public base_maker::type_traits
+            {
+                typedef typename base_maker::node_deallocator    disposer;
+            };
+
+            typedef intrusive::LazyList<cds::gc::nogc, node_type, type_traits>  type;
+        };
+
+    }   // namespace details
+    //@endcond
+
+    /// Lazy ordered list (key-value pair, template specialization for gc::nogc)
+    /** @ingroup cds_nonintrusive_list
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        See \ref cds_nonintrusive_LazyList_gc "LazyList" for description of template parameters.
+
+        The interface of the specialization is a little different.
+    */
+    template <
+        typename Key,
+        typename Value,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = lazy_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class LazyKVList<gc::nogc, Key, Value, Traits>:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::LazyList< gc::nogc, implementation_defined, Traits >
+#else
+        protected details::make_lazy_kvlist_nogc< Key, Value, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_lazy_kvlist_nogc< Key, Value, Traits > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+#ifdef CDS_DOXYGEN_INVOKED
+        typedef Key                                 key_type        ;   ///< Key type
+        typedef Value                               mapped_type     ;   ///< Type of value stored in the list
+        typedef std::pair<key_type const, mapped_type> value_type   ;   ///< key/value pair stored in the list
+#else
+        typedef typename options::key_type          key_type;
+        typedef typename options::value_type        mapped_type;
+        typedef typename options::pair_type         value_type;
+#endif
+        typedef typename base_class::gc             gc              ;   ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename options::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;
+        typedef typename options::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::node_type      head_type;
+        //@endcond
+
+    private:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct ensure_functor
+        {
+            node_type * m_pItemFound;
+
+            ensure_functor()
+                : m_pItemFound( null_ptr<node_type *>() )
+            {}
+
+            void operator ()(bool, node_type& item, node_type& )
+            {
+                m_pItemFound = &item;
+            }
+        };
+
+        template <typename Func>
+        class find_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_functor( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q&  )
+            {
+                base_class::get()( node.m_Data );
+            }
+        };
+#   endif   // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename K>
+        static node_type * alloc_node(const K& key)
+        {
+            return cxx_allocator().New( key );
+        }
+
+        template <typename K, typename V>
+        static node_type * alloc_node( const K& key, const V& val )
+        {
+            return cxx_allocator().New( key, val );
+        }
+
+#ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>(args)... );
+        }
+#endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return base_class::m_Head;
+        }
+
+        head_type const& head() const
+        {
+            return base_class::m_Head;
+        }
+
+        head_type& tail()
+        {
+            return base_class::m_Tail;
+        }
+
+        head_type const& tail() const
+        {
+            return base_class::m_Tail;
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& refNode )
+                : iterator_base( const_cast<head_type *>( &refNode ))
+            {}
+
+            explicit iterator_type( const iterator_base& it )
+                : iterator_base( it )
+            {}
+
+            friend class LazyKVList;
+
+        protected:
+            explicit iterator_type( node_type& pNode )
+                : iterator_base( &pNode )
+            {}
+
+        public:
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::reference  value_ref;
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::pointer    value_ptr;
+
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::reference  pair_ref;
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::pointer    pair_ptr;
+
+            iterator_type()
+                : iterator_base()
+            {}
+
+            iterator_type( const iterator_type& src )
+                : iterator_base( src )
+            {}
+
+            key_type const& key() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.first;
+            }
+
+            value_ref val() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.second;
+            }
+
+            pair_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Data) : null_ptr<pair_ptr>();
+            }
+
+            pair_ref operator *() const
+            {
+                typename iterator_base::value_ref p = iterator_base::operator *();
+                return p.m_Data;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            /// Post-increment
+            iterator_type operator ++(int)
+            {
+                return iterator_base::operator ++(0);
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for lazy list based on gc::nogc has pre- and post-increment operators.
+
+            The iterator interface to access item data:
+            - <tt> operator -> </tt> - returns a pointer to \ref value_type for iterator
+            - <tt> operator *</tt> - returns a reference (a const reference for \p const_iterator) to \ref value_type for iterator
+            - <tt> const key_type& key() </tt> - returns a key reference for iterator
+            - <tt> mapped_type& val() </tt> - retuns a value reference for iterator (const reference for \p const_iterator)
+
+            For both functions the iterator should not be equal to <tt> end() </tt>
+        */
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            iterator it( head() );
+            ++it ;  // skip dummy head
+            return it;
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value equals to <tt>NULL</tt>.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( tail());
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            const_iterator it( head() );
+            ++it ;  // skip dummy head
+            return it;
+        }
+        const_iterator cbegin()
+        {
+            const_iterator it( head() );
+            ++it ;  // skip dummy head
+            return it;
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator( tail());
+        }
+        const_iterator cend()
+        {
+            return const_iterator( tail());
+        }
+        //@}
+
+    protected:
+        //@cond
+        iterator node_to_iterator( node_type * pNode )
+        {
+            if ( pNode )
+                return iterator( *pNode );
+            return end();
+        }
+        //@endcond
+
+    public:
+        /// Default constructor
+        /**
+            Initialize empty list
+        */
+        LazyKVList()
+        {}
+
+        /// List desctructor
+        /**
+            Clears the list
+        */
+        ~LazyKVList()
+        {
+            clear();
+        }
+
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K>
+        iterator insert( const K& key )
+        {
+            return node_to_iterator( insert_at( head(), key ));
+        }
+
+        /// Inserts new node with a key and a value
+        /**
+            The function creates a node with \p key and value \p val, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K, typename V>
+        iterator insert( const K& key, const V& val )
+        {
+            // We cannot use insert with functor here
+            // because we cannot lock inserted node for updating
+            // Therefore, we use separate function
+            return node_to_iterator( insert_at( head(), key, val ));
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code void func( value_type& item ) ; endcode
+            or
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the list's item inserted. <tt>item.second</tt> is a reference to item's value that may be changed.
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this list's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if the inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the list;
+            - if inserting is successful, initialize the value of item by calling \p f functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K, typename Func>
+        iterator insert_key( const K& key, Func func )
+        {
+            return node_to_iterator( insert_key_at( head(), key, func ));
+        }
+
+        /// Ensures that the key \p key exists in the list
+        /**
+            The operation inserts new item if the key \p key is not found in the list.
+            Otherwise, the function returns an iterator that points to item found.
+
+            Returns <tt> std::pair<iterator, bool>  </tt> where \p first is an iterator pointing to
+            item found or inserted, \p second is true if new item has been added or \p false if the item
+            already is in the list.
+        */
+        template <typename K>
+        std::pair<iterator, bool> ensure( const K& key )
+        {
+            std::pair< node_type *, bool > ret = ensure_at( head(), key );
+            return std::make_pair( node_to_iterator( ret.first ), ret.second );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        iterator emplace( Args&&... args )
+        {
+            return node_to_iterator( emplace_at( head(), std::forward<Args>(args)... ));
+        }
+#   endif
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_LazyKVList_nogc_find
+            The function searches the item with key equal to \p key
+            and returns an iterator pointed to item found if the key is found,
+            and \ref end() otherwise
+        */
+        template <typename Q>
+        iterator find( Q const& key )
+        {
+            return node_to_iterator( find_at( head(), key, intrusive_key_comparator() ) );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_nogc_find "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        iterator find_with( Q const& key, Less pred )
+        {
+            return node_to_iterator( find_at( head(), key, typename options::template less_wrapper<Less>::type() ) );
+        }
+
+        /// Check if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        node_type * insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p( pNode );
+            if ( base_class::insert_at( &refHead, *p ))
+                return p.release();
+
+            return null_ptr<node_type *>();
+        }
+
+        template <typename K>
+        node_type * insert_at( head_type& refHead, const K& key )
+        {
+            return insert_node_at( refHead, alloc_node( key ));
+        }
+
+        template <typename K, typename V>
+        node_type * insert_at( head_type& refHead, const K& key, const V& val )
+        {
+            return insert_node_at( refHead, alloc_node( key, val ));
+        }
+
+        template <typename K, typename Func>
+        node_type * insert_key_at( head_type& refHead, const K& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+            if ( base_class::insert_at( &refHead, *pNode )) {
+                cds::unref(f)( pNode->m_Data );
+                return pNode.release();
+            }
+
+            return null_ptr<node_type *>();
+        }
+
+
+        template <typename K>
+        std::pair< node_type *, bool > ensure_at( head_type& refHead, const K& key )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+            node_type * pItemFound = null_ptr<node_type *>();
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode, [&pItemFound](bool, node_type& item, node_type&){ pItemFound = &item; } );
+#       else
+            ensure_functor func;
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode, boost::ref(func) );
+            pItemFound = func.m_pItemFound;
+#       endif
+            if ( ret.first && ret.second )
+                pNode.release();
+
+            assert( pItemFound != null_ptr<node_type *>() );
+            return std::make_pair( pItemFound, ret.second );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        node_type * emplace_at( head_type& refHead, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<Args>(args)... ));
+        }
+#endif
+
+        template <typename K, typename Compare>
+        node_type * find_at( head_type& refHead, const K& key, Compare cmp )
+        {
+            return base_class::find_at( &refHead, key, cmp );
+        }
+
+        /*
+        template <typename K, typenam Compare, typename Func>
+        bool find_at( head_type& refHead, K& key, Compare cmp, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_at( &refHead, key, cmp, [&f]( node_type& node, K const& ){ cds::unref(f)( node.m_Data ); });
+#       else
+            find_functor<Func>  wrapper( f );
+            return base_class::find_at( &refHead, key, cmp, cds::ref(wrapper) );
+#       endif
+        }
+        */
+        //@endcond
+    };
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_LAZY_KVLIST_NOGC_H
diff --git a/cds/container/lazy_kvlist_ptb.h b/cds/container/lazy_kvlist_ptb.h
new file mode 100644 (file)
index 0000000..cdfd1c1
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_KVLIST_PTB_H
+#define __CDS_CONTAINER_LAZY_KVLIST_PTB_H
+
+#include <cds/container/lazy_list_base.h>
+#include <cds/intrusive/lazy_list_ptb.h>
+#include <cds/container/details/make_lazy_kvlist.h>
+#include <cds/container/lazy_kvlist_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_LAZY_KVLIST_PTB_H
diff --git a/cds/container/lazy_kvlist_rcu.h b/cds/container/lazy_kvlist_rcu.h
new file mode 100644 (file)
index 0000000..bbb592f
--- /dev/null
@@ -0,0 +1,947 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_KVLIST_RCU_H
+#define __CDS_CONTAINER_LAZY_KVLIST_RCU_H
+
+#include <cds/container/lazy_list_base.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/container/details/make_lazy_kvlist.h>
+#include <cds/ref.h>
+#include <cds/details/functor_wrapper.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    /// Lazy ordered list (key-value pair), template specialization for \ref cds_urcu_desc "RCU"
+    /** @ingroup cds_nonintrusive_list
+        \anchor cds_nonintrusive_LazyKVList_rcu
+
+        This is key-value variation of non-intrusive LazyList.
+        Like standard container, this implementation split a value stored into two part -
+        constant key and alterable value.
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Template arguments:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p Key - key type of an item stored in the list. It should be copy-constructible
+        - \p Value - value type stored in the list
+        - \p Traits - type traits, default is lazy_list::type_traits
+
+        It is possible to declare option-based list with cds::container::lazy_list::make_traits metafunction istead of \p Traits template
+        argument. For example, the following traits-based declaration of gc::HP lazy list
+        @note Before including <tt><cds/container/lazy_kvlist_rcu.h></tt> you should include appropriate RCU header file,
+        see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+        \code
+        #include <cds/urcu/general_threaded.h>
+        #include <cds/container/lazy_kvlist_rcu.h>
+        // Declare comparator for the item
+        struct my_compare {
+            int operator ()( int i1, int i2 )
+            {
+                return i1 - i2;
+            }
+        };
+
+        // Declare type_traits
+        struct my_traits: public cds::container::lazy_list::type_traits
+        {
+            typedef my_compare compare;
+        };
+
+        // Declare traits-based list
+        typedef cds::container::LazyKVList< cds::urcu::gc< cds::urcu::general_threaded<> >, int, int, my_traits >     traits_based_list;
+        \endcode
+
+        is equivalent for the following option-based list
+        \code
+        #include <cds/urcu/general_threaded.h>
+        #include <cds/container/lazy_kvlist_rcu.h>
+
+        // my_compare is the same
+
+        // Declare option-based list
+        typedef cds::container::LazyKVList< cds::urcu::gc< cds::urcu::general_threaded<> >, int, int,
+            typename cds::container::lazy_list::make_traits<
+                cds::container::opt::compare< my_compare >     // item comparator option
+            >::type
+        >     option_based_list;
+        \endcode
+
+        Template argument list \p Options of cds::container::lazy_list::make_traits metafunction are:
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::allocator - the allocator used for creating and freeing list's item. Default is \ref CDS_DEFAULT_ALLOCATOR macro.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - opt::rcu_check_deadlock - a deadlock checking policy. Default is opt::v::rcu_throw_deadlock
+    */
+    template <
+        typename RCU,
+        typename Key,
+        typename Value,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = lazy_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class LazyKVList< cds::urcu::gc<RCU>, Key, Value, Traits >:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::LazyList< cds::urcu::gc<RCU>, implementation_defined, Traits >
+#else
+        protected details::make_lazy_kvlist< cds::urcu::gc<RCU>, Key, Value, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_lazy_kvlist< cds::urcu::gc<RCU>, Key, Value, Traits > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+#ifdef CDS_DOXYGEN_INVOKED
+        typedef Key                                 key_type        ;   ///< Key type
+        typedef Value                               mapped_type     ;   ///< Type of value stored in the list
+        typedef std::pair<key_type const, mapped_type> value_type   ;   ///< key/value pair stored in the list
+#else
+        typedef typename options::key_type          key_type;
+        typedef typename options::value_type        mapped_type;
+        typedef typename options::pair_type         value_type;
+#endif
+
+        typedef typename base_class::gc             gc              ;   ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename options::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename base_class::rcu_check_deadlock rcu_check_deadlock ; ///< RCU deadlock checking policy
+
+        typedef typename gc::scoped_lock    rcu_lock ;  ///< RCU scoped lock
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = base_class::c_bExtractLockExternal; ///< Group of \p extract_xxx functions require external locking
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;
+        typedef typename options::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::node_type      head_type;
+        //@endcond
+
+    public:
+        /// pointer to extracted node
+        typedef cds::urcu::exempt_ptr< gc, node_type, value_type, typename options::type_traits::disposer,
+            cds::urcu::details::conventional_exempt_pair_cast<node_type, value_type>
+        > exempt_ptr;
+
+    private:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        class insert_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_functor ( Func f )
+                : base_class( f )
+            {}
+
+            void operator()( node_type& node )
+            {
+                base_class::get()( node.m_Data );
+            }
+        };
+
+        template <typename Func>
+        class ensure_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            ensure_functor( Func f )
+                : base_class(f)
+            {}
+
+            void operator ()( bool bNew, node_type& node, node_type& )
+            {
+                base_class::get()( bNew, node.m_Data );
+            }
+        };
+
+        template <typename Func>
+        class find_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_functor( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q&  )
+            {
+                base_class::get()( node.m_Data );
+            }
+        };
+
+        struct empty_find_functor
+        {
+            template <typename Q>
+            void operator ()( node_type& node, Q& val ) const
+            {}
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func m_func;
+
+            erase_functor( Func f )
+                : m_func( f )
+            {}
+
+            void operator ()( node_type const & node )
+            {
+                cds::unref(m_func)( const_cast<value_type&>(node.m_Data) );
+            }
+        };
+#   endif // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename K>
+        static node_type * alloc_node(const K& key)
+        {
+            return cxx_allocator().New( key );
+        }
+
+        template <typename K, typename V>
+        static node_type * alloc_node( const K& key, const V& val )
+        {
+            return cxx_allocator().New( key, val );
+        }
+
+#ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>(args)... );
+        }
+#endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return base_class::m_Head;
+        }
+
+        head_type& head() const
+        {
+            return const_cast<head_type&>( base_class::m_Head );
+        }
+
+        head_type& tail()
+        {
+            return base_class::m_Tail;
+        }
+
+        head_type& tail() const
+        {
+            return const_cast<head_type&>( base_class::m_Tail );
+        }
+
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& pNode )
+                : iterator_base( const_cast<head_type *>(&pNode) )
+            {}
+            iterator_type( head_type const * pNode )
+                : iterator_base( const_cast<head_type *>(pNode) )
+            {}
+
+            friend class LazyKVList;
+
+        public:
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::reference  value_ref;
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::pointer    value_ptr;
+
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::reference  pair_ref;
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::pointer    pair_ptr;
+
+            iterator_type()
+            {}
+
+            iterator_type( iterator_type const& src )
+                : iterator_base( src )
+            {}
+
+            key_type const& key() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.first;
+            }
+
+            value_ref val() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.second;
+            }
+
+            pair_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Data) : null_ptr<pair_ptr>();
+            }
+
+            pair_ref operator *() const
+            {
+                typename iterator_base::value_ref p = iterator_base::operator *();
+                return p.m_Data;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            iterator it( head() );
+            ++it ;  // skip dummy head
+            return it;
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value pointing to dummy tail node.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( tail() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            const_iterator it( head() );
+            ++it;   // skip dummy head
+            return it;
+        }
+        const_iterator cbegin()
+        {
+            const_iterator it( head() );
+            ++it;   // skip dummy head
+            return it;
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator( tail());
+        }
+        const_iterator cend()
+        {
+            return const_iterator( tail());
+        }
+        //@}
+
+    public:
+        /// Default constructor
+        /**
+            Initializes empty list
+        */
+        LazyKVList()
+        {}
+
+        /// List destructor
+        /**
+            Clears the list
+        */
+        ~LazyKVList()
+        {
+            clear();
+        }
+
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            The function makes RCU lock internally.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( const K& key )
+        {
+            return insert_at( head(), key );
+        }
+
+        /// Inserts new node with a key and a value
+        /**
+            The function creates a node with \p key and value \p val, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            The function makes RCU lock internally.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( const K& key, const V& val )
+        {
+            return insert_at( head(), key, val );
+        }
+
+        /// Inserts new node and initializes it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the list's item inserted. <tt>item.second</tt> is a reference to item's value that may be changed.
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this list's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the list;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            The function makes RCU lock internally.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            return insert_key_at( head(), key, func );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            The function makes RCU lock internally.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            return emplace_at( head(), std::forward<Args>(args)... );
+        }
+#   endif
+
+        /// Ensures that the \p key exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the list, then the new item created from \p key
+            is inserted into the list (note that in this case the \ref key_type should be
+            copy-constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref mapped_type;
+            however, \p func must guarantee that during changing no any other modifications
+            could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            The function makes RCU lock internally.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( const K& key, Func f )
+        {
+            return ensure_at( head(), key, f );
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_LazyKVList_rcu_erase
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns \p true if \p key is found and has been deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            return erase_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_rcu_erase "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less>
+        bool erase_with( K const& key, Less pred )
+        {
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_LazyKVList_rcu_erase_func
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& val) { ... }
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+            return erase_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_rcu_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Extracts an item from the list
+        /**
+        @anchor cds_nonintrusive_LazyKVList_rcu_extract
+            The function searches an item with key equal to \p key in the list,
+            unlinks it from the list, and returns pointer to an item found in \p dest argument.
+            If \p key is not found the function returns \p false.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the list
+            and returns a pointer to item found.
+            You should lock RCU before calling this function.
+
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/container/lazy_kvlist_rcu.h>
+
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::container::LazyKVList< rcu, int, Foo > rcu_lazy_list;
+
+            rcu_lazy_list theList;
+            // ...
+
+            rcu_lazy_list::exempt_ptr p;
+            {
+                // first, we should lock RCU
+                rcu_lazy_list::rcu_lock sl;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theList.extract( p, 10 )) {
+                    // do something with p
+                    ...
+                }
+            }
+            // Outside RCU lock section we may safely release extracted pointer.
+            // release() passes the pointer to RCU reclamation cycle.
+            p.release();
+            \endcode
+        */
+        template <typename K>
+        bool extract( exempt_ptr& dest, K const& key )
+        {
+            dest = extract_at( head(), key, intrusive_key_comparator() );
+            return !dest.empty();
+        }
+
+        /// Extracts an item from the list using \p pred predicate for searching
+        /**
+            This function is the analog for \ref cds_nonintrusive_LazyKVList_rcu_extract "extract(exempt_ptr&, K const&)".
+            The \p pred is a predicate used for key comparing.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as \ref key_comparator.
+        */
+        template <typename K, typename Less>
+        bool extract_with( exempt_ptr& dest, K const& key, Less pred )
+        {
+            dest = extract_at( head(), key, typename options::template less_wrapper<Less>::type() );
+            return !dest.empty();
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_LazyKVList_rcu_find_val
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise
+
+            The function applies RCU lock internally.
+        */
+        template <typename Q>
+        bool find( Q const& key ) const
+        {
+            return find_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_rcu_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& key, Less pred ) const
+        {
+            return find_at( head(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p key and performs an action with it
+        /** \anchor cds_nonintrusive_LazyKVList_rcu_find_func
+            The function searches an item with key equal to \p key and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change <tt>item.second</tt> that is reference to value of node.
+            Note that the function is only guarantee that \p item cannot be deleted during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& key, Func f ) const
+        {
+            return find_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_rcu_find_func "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& key, Less pred, Func f ) const
+        {
+            return find_at( head(), key, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_nonintrusive_LazyKVList_rcu_get
+            The function searches the item with \p key and returns the pointer to item found.
+            If \p key is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p K that can be not the same as \p key_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::container::LazyKVList< cds::urcu::gc< cds::urcu::general_buffered<> >, int, foo, my_traits > ord_list;
+            ord_list theList;
+            // ...
+            {
+                // Lock RCU
+                ord_list::rcu_lock lock;
+
+                ord_list::value_type * pVal = theList.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be freed at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename K>
+        value_type * get( K const& key ) const
+        {
+            return get_at( head(), key, intrusive_key_comparator());
+        }
+
+        /// Finds \p key and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyKVList_rcu_get "get(K const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less>
+        value_type * get_with( K const& key, Less pred ) const
+        {
+            return get_at( head(), key, typename options::template less_wrapper<Less>::type());
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        bool insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p( pNode );
+
+            if ( base_class::insert_at( &refHead, *p )) {
+                p.release();
+                return true;
+            }
+
+            return false;
+        }
+
+        template <typename K>
+        bool insert_at( head_type& refHead, const K& key )
+        {
+            return insert_node_at( refHead, alloc_node( key ));
+        }
+
+        template <typename K, typename V>
+        bool insert_at( head_type& refHead, const K& key, const V& val )
+        {
+            return insert_node_at( refHead, alloc_node( key, val ));
+        }
+
+        template <typename K, typename Func>
+        bool insert_key_at( head_type& refHead, const K& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert_at( &refHead, *pNode, [&f](node_type& node){ cds::unref(f)( node.m_Data ); } ))
+#   else
+            insert_functor<Func>  wrapper( f );
+            if ( base_class::insert_at( &refHead, *pNode, cds::ref(wrapper) ))
+#   endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        bool emplace_at( head_type& refHead, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<Args>(args)... ));
+        }
+#   endif
+
+        template <typename K, typename Compare>
+        bool erase_at( head_type& refHead, K const& key, Compare cmp )
+        {
+            return base_class::erase_at( &refHead, key, cmp );
+        }
+
+        template <typename K, typename Compare, typename Func>
+        bool erase_at( head_type& refHead, K const & key, Compare cmp, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_at( &refHead, key, cmp, [&f](node_type const & node){cds::unref(f)( const_cast<value_type&>(node.m_Data)); });
+#   else
+            erase_functor<Func> wrapper( f );
+            return base_class::erase_at( &refHead, key, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure_at( head_type& refHead, const K& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode,
+                [&f]( bool bNew, node_type& node, node_type& ){ cds::unref(f)( bNew, node.m_Data ); });
+#   else
+            ensure_functor<Func> wrapper( f );
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode, cds::ref(wrapper));
+#   endif
+            if ( ret.first && ret.second )
+                pNode.release();
+
+            return ret;
+        }
+
+        template <typename K, typename Compare>
+        node_type * extract_at( head_type& refHead, K const& key, Compare cmp )
+        {
+            return base_class::extract_at( &refHead, key, cmp );
+        }
+
+        template <typename K, typename Compare>
+        bool find_at( head_type& refHead, K const& key, Compare cmp ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_at( &refHead, key, cmp, [](node_type&, K const&) {} );
+#       else
+            return base_class::find_at( &refHead, key, cmp, empty_find_functor() );
+#       endif
+        }
+
+        template <typename K, typename Compare, typename Func>
+        bool find_at( head_type& refHead, K& key, Compare cmp, Func f ) const
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_at( &refHead, key, cmp, [&f]( node_type& node, K& ){ cds::unref(f)( node.m_Data ); });
+#   else
+            find_functor<Func>  wrapper( f );
+            return base_class::find_at( &refHead, key, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename K, typename Compare>
+        value_type * get_at( head_type& refHead, K const& val, Compare cmp ) const
+        {
+            node_type * pNode = base_class::get_at( &refHead, val, cmp );
+            return pNode ? &pNode->m_Data : null_ptr<value_type *>();
+        }
+
+        //@endcond
+    };
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_LAZY_KVLIST_RCU_H
diff --git a/cds/container/lazy_list_base.h b/cds/container/lazy_list_base.h
new file mode 100644 (file)
index 0000000..099c907
--- /dev/null
@@ -0,0 +1,127 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_LIST_BASE_H
+#define __CDS_CONTAINER_LAZY_LIST_BASE_H
+
+#include <cds/container/base.h>
+#include <cds/intrusive/lazy_list_base.h>
+#include <cds/urcu/options.h>
+
+namespace cds { namespace container {
+
+    /// LazyList ordered list related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace lazy_list {
+        /// Lazy list default type traits
+        /**
+            Either \p compare or \p less or both must be specified.
+        */
+        struct type_traits
+        {
+            /// allocator used to allocate new node
+            typedef CDS_DEFAULT_ALLOCATOR   allocator;
+
+            /// Key comparison functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+            */
+            typedef opt::none                       compare;
+
+            /// specifies binary predicate used for key comparison.
+            /**
+                Default is \p std::less<T>.
+            */
+            typedef opt::none                       less;
+
+            /// Lock type used to lock modifying items
+            /**
+                Default is cds::lock::Spin
+            */
+            typedef cds::lock::Spin                 lock_type;
+
+            /// back-off strategy used
+            /**
+                If the option is not specified, the cds::backoff::Default is used.
+            */
+            typedef cds::backoff::Default           back_off;
+
+            /// Item counter
+            /**
+                The type for item counting feature.
+                Default is no item counter (\ref atomicity::empty_item_counter)
+            */
+            typedef atomicity::empty_item_counter     item_counter;
+
+            /// Link fields checking feature
+            /**
+                Default is \ref intrusive::opt::debug_check_link
+            */
+            static const opt::link_check_type link_checker = opt::debug_check_link;
+
+            /// C++ memory ordering model
+            /**
+                List of available memory ordering see opt::memory_model
+            */
+            typedef opt::v::relaxed_ordering        memory_model;
+
+            /// RCU deadlock checking policy (only for \ref cds_intrusive_LazyList_rcu "RCU-based LazyList")
+            /**
+                List of available options see opt::rcu_check_deadlock
+            */
+            typedef opt::v::rcu_throw_deadlock      rcu_check_deadlock;
+
+            //@cond
+            // LazyKVList: supporting for split-ordered list
+            // key accessor (opt::none = internal key type is equal to user key type)
+            typedef opt::none                       key_accessor;
+
+            // for internal use only!!!
+            typedef opt::none                       boundary_node_type;
+
+            //@endcond
+        };
+
+        /// Metafunction converting option list to traits for LazyList
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+
+            See \ref LazyList, \ref type_traits, \ref cds::opt::make_options.
+        */
+        template <CDS_DECL_OPTIONS12>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS12 >::type
+                ,CDS_OPTIONS12
+            >::type   type;
+#endif
+        };
+
+
+    } // namespace lazy_list
+
+    // Forward declarations
+    template <typename GC, typename T, typename Traits=lazy_list::type_traits>
+    class LazyList;
+
+    template <typename GC, typename Key, typename Value, typename Traits=lazy_list::type_traits>
+    class LazyKVList;
+
+    // Tag for selecting lazy list implementation
+    /**
+        This struct is empty and it is used only as a tag for selecting LazyList
+        as ordered list implementation in declaration of some classes.
+
+        See split_list::type_traits::ordered_list as an example.
+    */
+    struct lazy_list_tag
+    {};
+
+
+}}  // namespace cds::container
+
+
+#endif  // #ifndef __CDS_CONTAINER_LAZY_LIST_BASE_H
diff --git a/cds/container/lazy_list_hp.h b/cds/container/lazy_list_hp.h
new file mode 100644 (file)
index 0000000..66816a7
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_LIST_HP_H
+#define __CDS_CONTAINER_LAZY_LIST_HP_H
+
+#include <cds/container/lazy_list_base.h>
+#include <cds/intrusive/lazy_list_hp.h>
+#include <cds/container/details/make_lazy_list.h>
+#include <cds/container/lazy_list_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_LAZY_LIST_HP_H
diff --git a/cds/container/lazy_list_hrc.h b/cds/container/lazy_list_hrc.h
new file mode 100644 (file)
index 0000000..d63bbd1
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_LIST_HRC_H
+#define __CDS_CONTAINER_LAZY_LIST_HRC_H
+
+#include <cds/container/lazy_list_base.h>
+#include <cds/intrusive/lazy_list_hrc.h>
+#include <cds/container/details/make_lazy_list.h>
+#include <cds/container/lazy_list_impl.h>
+
+#endif // #ifndef __CDS_CONTAINER_LAZY_LIST_HRC_H
diff --git a/cds/container/lazy_list_impl.h b/cds/container/lazy_list_impl.h
new file mode 100644 (file)
index 0000000..6279319
--- /dev/null
@@ -0,0 +1,963 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_LIST_IMPL_H
+#define __CDS_CONTAINER_LAZY_LIST_IMPL_H
+
+#include <cds/details/std/memory.h>
+#include <cds/container/details/guarded_ptr_cast.h>
+
+namespace cds { namespace container {
+
+    /// Lazy ordered list
+    /** @ingroup cds_nonintrusive_list
+        \anchor cds_nonintrusive_LazyList_gc
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Source:
+        - [2005] Steve Heller, Maurice Herlihy, Victor Luchangco, Mark Moir, William N. Scherer III, and Nir Shavit
+        "A Lazy Concurrent List-Based Set Algorithm"
+
+        The lazy list is based on an optimistic locking scheme for inserts and removes,
+        eliminating the need to use the equivalent of an atomically markable
+        reference. It also has a novel wait-free membership \p find operation
+        that does not need to perform cleanup operations and is more efficient.
+
+        It is non-intrusive version of cds::intrusive::LazyList class
+
+        Template arguments:
+        - \p GC - garbage collector used
+        - \p T - type stored in the list. The type must be default- and copy-constructible.
+        - \p Traits - type traits, default is lazy_list::type_traits
+
+        Unlike standard container, this implementation does not divide type \p T into key and value part and
+        may be used as main building block for hash set algorithms.
+
+        The key is a function (or a part) of type \p T, and this function is specified by <tt> Traits::compare </tt> functor
+        or <tt> Traits::less </tt> predicate
+
+        LazyKVList is a key-value version of lazy non-intrusive list that is closer to the C++ std library approach.
+
+        It is possible to declare option-based list with cds::container::lazy_list::make_traits metafunction istead of \p Traits template
+        argument. For example, the following traits-based declaration of gc::HP lazy list
+        \code
+        #include <cds/container/lazy_list_hp.h>
+        // Declare comparator for the item
+        struct my_compare {
+            int operator ()( int i1, int i2 )
+            {
+                return i1 - i2;
+            }
+        };
+
+        // Declare type_traits
+        struct my_traits: public cds::container::lazy_list::type_traits
+        {
+            typedef my_compare compare;
+        };
+
+        // Declare traits-based list
+        typedef cds::container::LazyList< cds::gc::HP, int, my_traits >     traits_based_list;
+        \endcode
+
+        is equivalent for the following option-based list
+        \code
+        #include <cds/container/lazy_list_hp.h>
+
+        // my_compare is the same
+
+        // Declare option-based list
+        typedef cds::container::LazyList< cds::gc::HP, int,
+            typename cds::container::lazy_list::make_traits<
+                cds::container::opt::compare< my_compare >     // item comparator option
+            >::type
+        >     option_based_list;
+        \endcode
+
+        Template argument list \p Options of cds::container::lazy_list::make_traits metafunction are:
+        - opt::lock_type - lock type for per-node locking. Default is cds::lock::Spin. Note that <b>each</b> node
+            of the list has member of type \p lock_type, therefore, heavy-weighted locking primitive is not
+            acceptable as candidate for \p lock_type.
+        - opt::compare - key compare functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key compare. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::allocator - the allocator used for creating and freeing list's item. Default is \ref CDS_DEFAULT_ALLOCATOR macro.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        \par Usage
+        There are different specializations of this template for each garbage collecting schema used.
+        You should include appropriate .h-file depending on GC you are using:
+        - for gc::HP: \code #include <cds/container/lazy_list_hp.h> \endcode
+        - for gc::PTB: \code #include <cds/container/lazy_list_ptb.h> \endcode
+        - for gc::HRC: \code #include <cds/container/lazy_list_hrc.h> \endcode
+        - for \ref cds_urcu_desc "RCU": \code #include <cds/container/lazy_list_rcu.h> \endcode
+        - for gc::nogc: \code #include <cds/container/lazy_list_nogc.h> \endcode
+    */
+    template <
+        typename GC,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = lazy_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class LazyList:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::LazyList< GC, T, Traits >
+#else
+        protected details::make_lazy_list< GC, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_lazy_list< GC, T, Traits > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+        typedef T                                   value_type      ;   ///< Type of value stored in the list
+        typedef typename base_class::gc             gc              ;   ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename options::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;
+        typedef typename options::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::node_type      head_type;
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        typedef typename base_class::empty_erase_functor    empty_erase_functor;
+#   endif
+        //@endcond
+
+    public:
+        /// Guarded pointer
+        typedef cds::gc::guarded_ptr< gc, node_type, value_type, details::guarded_ptr_cast_set<node_type, value_type> > guarded_ptr;
+
+    private:
+        //@cond
+        static value_type& node_to_value( node_type& n )
+        {
+            return n.m_Value;
+        }
+        static value_type const& node_to_value( node_type const& n )
+        {
+            return n.m_Value;
+        }
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        struct insert_functor
+        {
+            Func        m_func;
+
+            insert_functor ( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type& node )
+            {
+                cds::unref(m_func)( node_to_value(node) );
+            }
+        };
+
+        template <typename Q, typename Func>
+        struct ensure_functor
+        {
+            Func        m_func;
+            const Q&    m_arg;
+
+            ensure_functor( const Q& arg, Func f )
+                : m_func(f)
+                , m_arg( arg )
+            {}
+
+            void operator ()( bool bNew, node_type& node, node_type& )
+            {
+                cds::unref(m_func)( bNew, node_to_value(node), m_arg );
+            }
+        };
+
+        template <typename Func>
+        struct find_functor
+        {
+            Func    m_func;
+
+            find_functor( Func f )
+                : m_func(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q& val )
+            {
+                cds::unref(m_func)( node_to_value(node), val );
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type const& node )
+            {
+                cds::unref(m_func)( node_to_value(node) );
+            }
+        };
+#   endif   // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename Q>
+        static node_type * alloc_node( Q const& v )
+        {
+            return cxx_allocator().New( v );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>(args)... );
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return *base_class::head();
+        }
+
+        head_type const& head() const
+        {
+            return *base_class::head();
+        }
+
+        head_type& tail()
+        {
+            return *base_class::tail();
+        }
+
+        head_type const&  tail() const
+        {
+            return *base_class::tail();
+        }
+        //@endcond
+
+    protected:
+                //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& pNode )
+                : iterator_base( const_cast<head_type *>( &pNode ))
+            {}
+
+            iterator_type( head_type const * pNode )
+                : iterator_base( const_cast<head_type *>( pNode ))
+            {}
+
+            friend class LazyList;
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+            iterator_type()
+            {}
+
+            iterator_type( const iterator_type& src )
+                : iterator_base( src )
+            {}
+
+            value_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Value) : null_ptr<value_ptr>();
+            }
+
+            value_ref operator *() const
+            {
+                return (iterator_base::operator *()).m_Value;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for lazy list has some features:
+            - it has no post-increment operator
+            - to protect the value, the iterator contains a GC-specific guard + another guard is required locally for increment operator.
+              For some GC (gc::HP, gc::HRC), a guard is limited resource per thread, so an exception (or assertion) "no free guard"
+              may be thrown if a limit of guard count per thread is exceeded.
+            - The iterator cannot be moved across thread boundary since it contains GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the list.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use the iterator on the concurrent container
+            for debug purpose only.
+        */
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            iterator it( head() );
+            ++it        ;   // skip dummy head node
+            return it;
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( tail() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            const_iterator it( head() );
+            ++it        ;   // skip dummy head node
+            return it;
+        }
+        const_iterator cbegin()
+        {
+            const_iterator it( head() );
+            ++it        ;   // skip dummy head node
+            return it;
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator( tail() );
+        }
+        const_iterator cend()
+        {
+            return const_iterator( tail() );
+        }
+        //@}
+
+    public:
+        /// Default constructor
+        /**
+            Initializes empty list
+        */
+        LazyList()
+        {}
+
+        /// List desctructor
+        /**
+            Clears the list
+        */
+        ~LazyList()
+        {
+            clear();
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the list.
+
+            The type \p Q should contain as minimum the complete key of the node.
+            The object of \ref value_type should be constructible from \p val of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            return insert_at( head(), val );
+        }
+
+        /// Inserts new node
+        /**
+            This function inserts new node with default-constructed value and then it calls
+            \p func functor with signature
+            \code void func( value_type& itemValue ) ;\endcode
+
+            The argument \p itemValue of user-defined functor \p func is the reference
+            to the list's item inserted. User-defined functor \p func should guarantee that during changing
+            item's value no any other changes could be made on this list's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if the inserting is success.
+
+            The type \p Q should contain the complete key of the node.
+            The object of \ref value_type should be constructible from \p key of type \p Q.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key with initializing key-fields only;
+            - insert new item into the list;
+            - if inserting is successful, initialize non-key fields of item by calling \p f functor
+
+            This can be useful if complete initialization of object of \p value_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& key, Func func )
+        {
+            return insert_at( head(), key, func );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            return emplace_at( head(), std::forward<Args>(args)... );
+        }
+#   endif
+
+        /// Ensures that the \p key exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the list, then the new item created from \p key
+            is inserted into the list. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+            - \p val - argument \p key passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( Q const& key, Func f )
+        {
+            return ensure_at( head(), key, f );
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_LazyList_hp_erase_val
+            Since the key of LazyList's item type \p T is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( head(), key, intrusive_key_comparator(), [](value_type const&){} );
+#       else
+            return erase_at( head(), key, intrusive_key_comparator(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_hp_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), [](value_type const&){} );
+#       else
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_LazyList_hp_erase_func
+            The function searches an item with key \p key, calls \p f functor with item found
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(const value_type& val) { ... }
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            Since the key of LazyList's item type \p T is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+
+            See also: \ref erase
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+            return erase_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_hp_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Extracts the item from the list with specified \p key
+        /** \anchor cds_nonintrusive_LazyList_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the list, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::LazyList< cds::gc::HP, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                theList.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard and frees the item
+            }
+            \endcode
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& dest, Q const& key )
+        {
+            return extract_at( head(), dest.guard(), key, intrusive_key_comparator() );
+        }
+
+        /// Extracts the item from the list with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_hp_extract "extract(guarded_ptr&, Q const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& dest, Q const& key, Less pred )
+        {
+            return extract_at( head(), dest.guard(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_LazyList_hp_find_val
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise
+        */
+        template <typename Q>
+        bool find( Q const& key )
+        {
+            return find_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_hp_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& key, Less pred )
+        {
+            return find_at( head(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p val and performs an action with it
+        /** \anchor cds_nonintrusive_LazyList_hp_find_func
+            The function searches an item with key equal to \p val and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the function is only guarantee
+            that \p item cannot be deleted during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_at( head(), val, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_hp_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_at( head(), val, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Finds the key \p val and performs an action with it
+        /** \anchor cds_nonintrusive_LazyList_hp_find_cfunc
+            The function searches an item with key equal to \p val and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_at( head(), val, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_hp_find_cfunc "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_at( head(), val, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_nonintrusive_LazyList_hp_get
+            The function searches the item with key equal to \p val
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p val is found, and \p false otherwise.
+            If \p val is not found the \p ptr parameter is not changed.
+
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::LazyList< cds::gc::HP, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                if ( theList.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard and frees the item
+            }
+            \endcode
+
+            Note the compare functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& ptr, Q const& val )
+        {
+            return get_at( head(), ptr.guard(), val, intrusive_key_comparator() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_hp_get "get( guarded_ptr& ptr, Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& ptr, Q const& val, Less pred )
+        {
+            return get_at( head(), ptr.guard(), val, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        bool insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p( pNode );
+
+            if ( base_class::insert_at( &refHead, *pNode )) {
+                p.release();
+                return true;
+            }
+
+            return false;
+        }
+
+        template <typename Q>
+        bool insert_at( head_type& refHead, const Q& val )
+        {
+            return insert_node_at( refHead, alloc_node( val ));
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        bool emplace_at( head_type& refHead, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<Args>(args)... ));
+        }
+#   endif
+
+        template <typename Q, typename Func>
+        bool insert_at( head_type& refHead, const Q& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            if ( base_class::insert_at( &refHead, *pNode, [&f,n2v](node_type& node){ cds::unref(f)( n2v(node) ); } ))
+#       else
+            if ( base_class::insert_at( &refHead, *pNode, [&f](node_type& node){ cds::unref(f)( node_to_value(node) ); } ))
+#       endif
+#   else
+            insert_functor<Func>  wrapper( f );
+            if ( base_class::insert_at( &refHead, *pNode, cds::ref(wrapper) ))
+#   endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( head_type& refHead, const Q& key, Compare cmp, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type const& (* n2v)( node_type const& ) = node_to_value;
+            return base_class::erase_at( &refHead, key, cmp, [&f,n2v](node_type const& node){ cds::unref(f)( n2v(node) ); } );
+#       else
+            return base_class::erase_at( &refHead, key, cmp, [&f](node_type const& node){ cds::unref(f)( node_to_value(node) ); } );
+#       endif
+#   else
+            erase_functor<Func> wrapper( f );
+            return base_class::erase_at( &refHead, key, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename Q, typename Compare>
+        bool extract_at( head_type& refHead, typename gc::Guard& dest, Q const& key, Compare cmp )
+        {
+            return base_class::extract_at( &refHead, dest, key, cmp );
+        }
+
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure_at( head_type& refHead, const Q& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode,
+                [&f, &key, n2v](bool bNew, node_type& node, node_type&){cds::unref(f)( bNew, n2v(node), key ); });
+#       else
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode,
+                [&f, &key](bool bNew, node_type& node, node_type&){cds::unref(f)( bNew, node_to_value(node), key ); });
+#       endif
+#   else
+            ensure_functor<Q, Func> wrapper( key, f );
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode, cds::ref(wrapper));
+#   endif
+            if ( ret.first && ret.second )
+                pNode.release();
+
+            return ret;
+        }
+
+        template <typename Q, typename Compare>
+        bool find_at( head_type& refHead, Q const& key, Compare cmp )
+        {
+            return base_class::find_at( &refHead, key, cmp );
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_at( head_type& refHead, Q& val, Compare cmp, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            return base_class::find_at( &refHead, val, cmp, [&f,n2v](node_type& node, Q& val){ cds::unref(f)( n2v(node), val ); });
+#       else
+            return base_class::find_at( &refHead, val, cmp, [&f](node_type& node, Q& val){ cds::unref(f)( node_to_value(node), val ); });
+#       endif
+#   else
+            find_functor<Func>  wrapper( f );
+            return base_class::find_at( &refHead, val, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename Q, typename Compare>
+        bool get_at( head_type& refHead, typename gc::Guard& guard, Q const& key, Compare cmp )
+        {
+            return base_class::get_at( &refHead, guard, key, cmp );
+        }
+
+        //@endcond
+    };
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_LAZY_LIST_IMPL_H
diff --git a/cds/container/lazy_list_nogc.h b/cds/container/lazy_list_nogc.h
new file mode 100644 (file)
index 0000000..b10f44c
--- /dev/null
@@ -0,0 +1,467 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_LIST_NOGC_H
+#define __CDS_CONTAINER_LAZY_LIST_NOGC_H
+
+#include <cds/container/lazy_list_base.h>
+#include <cds/intrusive/lazy_list_nogc.h>
+#include <cds/container/details/make_lazy_list.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+
+        template <typename T, class Traits>
+        struct make_lazy_list_nogc: public make_lazy_list<gc::nogc, T, Traits>
+        {
+            typedef make_lazy_list<cds::gc::nogc, T, Traits>  base_maker;
+            typedef typename base_maker::node_type node_type;
+
+            struct type_traits: public base_maker::type_traits
+            {
+                typedef typename base_maker::node_deallocator    disposer;
+            };
+
+            typedef intrusive::LazyList<cds::gc::nogc, node_type, type_traits>  type;
+        };
+
+    }   // namespace details
+    //@endcond
+
+    /// Lazy ordered single-linked list (template specialization for gc::nogc)
+    /** @ingroup cds_nonintrusive_list
+        \anchor cds_nonintrusive_LazyList_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        See \ref cds_nonintrusive_LazyList_gc "LazyList" for description of template parameters.
+
+        The interface of the specialization is a little different.
+    */
+    template <typename T, typename Traits>
+    class LazyList<gc::nogc, T, Traits>:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::LazyList< gc::nogc, T, Traits >
+#else
+        protected details::make_lazy_list_nogc< T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_lazy_list_nogc< T, Traits > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+        typedef T                                   value_type      ;   ///< Type of value stored in the list
+        typedef typename base_class::gc             gc              ;   ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename options::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;
+        typedef typename options::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::node_type      head_type;
+        //@endcond
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct ensure_functor
+        {
+            node_type * m_pItemFound;
+
+            ensure_functor()
+                : m_pItemFound( null_ptr<node_type *>() )
+            {}
+
+            void operator ()(bool, node_type& item, node_type& )
+            {
+                m_pItemFound = &item;
+            }
+        };
+#   endif
+        //@endcond
+
+    protected:
+        //@cond
+        static node_type * alloc_node()
+        {
+            return cxx_allocator().New();
+        }
+
+        static node_type * alloc_node( value_type const& v )
+        {
+            return cxx_allocator().New( v );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>(args)... );
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return base_class::m_Head;
+        }
+
+        head_type const& head() const
+        {
+            return base_class::m_Head;
+        }
+
+        head_type& tail()
+        {
+            return base_class::m_Tail;
+        }
+
+        head_type const& tail() const
+        {
+            return base_class::m_Tail;
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& pNode )
+                : iterator_base( const_cast<head_type *>(&pNode) )
+            {}
+
+            explicit iterator_type( const iterator_base& it )
+                : iterator_base( it )
+            {}
+
+            friend class LazyList;
+
+        protected:
+            explicit iterator_type( node_type& pNode )
+                : iterator_base( &pNode )
+            {}
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+            iterator_type()
+            {}
+
+            iterator_type( const iterator_type& src )
+                : iterator_base( src )
+            {}
+
+            value_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Value) : null_ptr<value_ptr>();
+            }
+
+            value_ref operator *() const
+            {
+                return (iterator_base::operator *()).m_Value;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            /// Post-increment
+            iterator_type operator ++(int)
+            {
+                return iterator_base::operator ++(0);
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            iterator it( head() );
+            ++it    ;   // skip dummy head node
+            return it;
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( tail());
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            const_iterator it( head() );
+            ++it    ;   // skip dummy head node
+            return it;
+        }
+        const_iterator cbegin()
+        {
+            const_iterator it( head() );
+            ++it    ;   // skip dummy head node
+            return it;
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator( tail());
+        }
+        const_iterator cend()
+        {
+            return const_iterator( tail());
+        }
+        //@}
+
+    protected:
+        //@cond
+        iterator node_to_iterator( node_type * pNode )
+        {
+            if ( pNode )
+                return iterator( *pNode );
+            return end();
+        }
+        //@endcond
+
+    public:
+        /// Default constructor
+        /**
+            Initialize empty list
+        */
+        LazyList()
+        {}
+
+        /// List desctructor
+        /**
+            Clears the list
+        */
+        ~LazyList()
+        {
+            clear();
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the list if the list does not contain
+            an item with key equal to \p val.
+
+            Return an iterator pointing to inserted item if success \ref end() otherwise
+        */
+        template <typename Q>
+        iterator insert( Q const& val )
+        {
+            return node_to_iterator( insert_at( head(), val ) );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Return an iterator pointing to inserted item if success \ref end() otherwise
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        iterator emplace( Args&&... args )
+        {
+            return node_to_iterator( emplace_at( head(), std::forward<Args>(args)... ));
+        }
+#   endif
+
+        /// Ensures that the item \p val exists in the list
+        /**
+            The operation inserts new item if the key \p val is not found in the list.
+            Otherwise, the function returns an iterator that points to item found.
+
+            Returns <tt> std::pair<iterator, bool>  </tt> where \p first is an iterator pointing to
+            item found or inserted, \p second is true if new item has been added or \p false if the item
+            already is in the list.
+        */
+        template <typename Q>
+        std::pair<iterator, bool> ensure( Q const& val )
+        {
+            std::pair< node_type *, bool > ret = ensure_at( head(), val );
+            return std::make_pair( node_to_iterator( ret.first ), ret.second );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_LazyList_nogc_find
+            The function searches the item with key equal to \p val
+            and returns an iterator pointed to item found if the key is found,
+            and \ref end() otherwise
+        */
+        template <typename Q>
+        iterator find( Q const& key )
+        {
+            return node_to_iterator( find_at( head(), key, intrusive_key_comparator() ));
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_nogc_find "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        iterator find_with( Q const& key, Less pred )
+        {
+            return node_to_iterator( find_at( head(), key, typename options::template less_wrapper<Less>::type() ));
+        }
+
+        /// Check if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        node_type * insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p( pNode );
+            if ( base_class::insert_at( &refHead, *p ))
+                return p.release();
+
+            return null_ptr<node_type *>();
+        }
+
+        template <typename Q>
+        node_type * insert_at( head_type& refHead, Q const& val )
+        {
+            return insert_node_at( refHead, alloc_node( val ));
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        node_type * emplace_at( head_type& refHead, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<Args>(args)... ));
+        }
+#   endif
+        template <typename Q>
+        std::pair< node_type *, bool > ensure_at( head_type& refHead, Q const& val )
+        {
+            scoped_node_ptr pNode( alloc_node( val ));
+            node_type * pItemFound = null_ptr<node_type *>();
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode,
+                [&pItemFound](bool, node_type& item, node_type&){ pItemFound = &item; });
+#   else
+            ensure_functor func;
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode, boost::ref(func) );
+            pItemFound = func.m_pItemFound;
+#   endif
+            assert( pItemFound != null_ptr<node_type *>() );
+
+            if ( ret.first && ret.second )
+                pNode.release();
+
+            return std::make_pair( pItemFound, ret.second );
+        }
+
+        template <typename Q, typename Compare>
+        node_type * find_at( head_type& refHead, Q const& key, Compare cmp )
+        {
+            return base_class::find_at( &refHead, key, cmp );
+        }
+
+        //@endcond
+    };
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_LAZY_LIST_NOGC_H
diff --git a/cds/container/lazy_list_ptb.h b/cds/container/lazy_list_ptb.h
new file mode 100644 (file)
index 0000000..4fed114
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_LIST_PTB_H
+#define __CDS_CONTAINER_LAZY_LIST_PTB_H
+
+#include <cds/container/lazy_list_base.h>
+#include <cds/intrusive/lazy_list_ptb.h>
+#include <cds/container/details/make_lazy_list.h>
+#include <cds/container/lazy_list_impl.h>
+
+#endif // #ifndef __CDS_CONTAINER_LAZY_LIST_PTB_H
diff --git a/cds/container/lazy_list_rcu.h b/cds/container/lazy_list_rcu.h
new file mode 100644 (file)
index 0000000..4332a8f
--- /dev/null
@@ -0,0 +1,997 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_LAZY_LIST_RCU_H
+#define __CDS_CONTAINER_LAZY_LIST_RCU_H
+
+#include <cds/container/lazy_list_base.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/details/binary_functor_wrapper.h>
+#include <cds/details/std/memory.h>
+#include <cds/container/details/make_lazy_list.h>
+
+namespace cds { namespace container {
+
+    /// Lazy ordered list (template specialization for \ref cds_urcu_desc "RCU")
+    /** @ingroup cds_nonintrusive_list
+        \anchor cds_nonintrusive_LazyList_rcu
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Source:
+        - [2005] Steve Heller, Maurice Herlihy, Victor Luchangco, Mark Moir, William N. Scherer III, and Nir Shavit
+            "A Lazy Concurrent List-Based Set Algorithm"
+
+        The lazy list is based on an optimistic locking scheme for inserts and removes,
+        eliminating the need to use the equivalent of an atomically markable
+        reference. It also has a novel wait-free membership \p find operation
+        that does not need to perform cleanup operations and is more efficient.
+
+        It is non-intrusive version of cds::intrusive::LazyList class
+
+        Template arguments:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p T - type stored in the list. The type must be default- and copy-constructible.
+        - \p Traits - type traits, default is lazy_list::type_traits
+
+        The implementation does not divide type \p T into key and value part and
+        may be used as main building block for hash set containers.
+        The key is a function (or a part) of type \p T, and this function is specified by <tt> Traits::compare </tt> functor
+        or <tt> Traits::less </tt> predicate
+
+        \ref cds_nonintrusive_LazyKVList_rcu "LazyKVList" is a key-value version
+        of lazy non-intrusive list that is closer to the C++ std library approach.
+
+        @note Before including <tt><cds/container/lazy_list_rcu.h></tt> you should include
+        appropriate RCU header file, see \ref cds_urcu_gc "RCU type" for list
+        of existing RCU class and corresponding header files.
+
+        It is possible to declare option-based list with cds::container::lazy_list::make_traits metafunction istead of \p Traits template
+        argument. For example, the following traits-based declaration of gc::HP lazy list
+        \code
+        #include <cds/urcu/general_instant.h>
+        #include <cds/container/lazy_list_rcu.h>
+        // Declare comparator for the item
+        struct my_compare {
+            int operator ()( int i1, int i2 )
+            {
+                return i1 - i2;
+            }
+        };
+
+        // Declare type_traits
+        struct my_traits: public cds::container::lazy_list::type_traits
+        {
+            typedef my_compare compare;
+        };
+
+        // Declare traits-based list
+        typedef cds::container::LazyList< cds::urcu::gc< cds::urcu::general_instant<> >, int, my_traits >     traits_based_list;
+        \endcode
+
+        is equivalent for the following option-based list
+        \code
+        #include <cds/urcu/general_instant.h>
+        #include <cds/container/lazy_list_rcu.h>
+
+        // my_compare is the same
+
+        // Declare option-based list
+        typedef cds::container::LazyList< cds::urcu::gc< cds::urcu::general_instant<> >, int,
+            typename cds::container::lazy_list::make_traits<
+                cds::container::opt::compare< my_compare >     // item comparator option
+            >::type
+        >     option_based_list;
+        \endcode
+
+        Template argument list \p Options of cds::container::lazy_list::make_traits metafunction are:
+        - opt::lock_type - lock type for per-node locking. Default is cds::lock::Spin. Note that <b>each</b> node
+            of the list has member of type \p lock_type, therefore, heavy-weighted locking primitive is not
+            acceptable as candidate for \p lock_type.
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::allocator - the allocator used for creating and freeing list's item. Default is \ref CDS_DEFAULT_ALLOCATOR macro.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - opt::rcu_check_deadlock - a deadlock checking policy. Default is opt::v::rcu_throw_deadlock
+    */
+    template <
+        typename RCU,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = lazy_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class LazyList< cds::urcu::gc<RCU>, T, Traits >:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::LazyList< cds::urcu::gc<RCU>, T, Traits >
+#else
+        protected details::make_lazy_list< cds::urcu::gc<RCU>, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_lazy_list< cds::urcu::gc<RCU>, T, Traits > maker;
+        typedef typename maker::type  base_class;
+        //@endcond
+
+    public:
+        typedef T                                   value_type      ;   ///< Type of value stored in the list
+        typedef typename base_class::gc             gc              ;   ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename maker::allocator_type      allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename maker::key_comparator      key_comparator  ;   ///< key compare functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename base_class::rcu_check_deadlock rcu_check_deadlock ; ///< Deadlock checking policy
+
+        typedef typename gc::scoped_lock    rcu_lock ;  ///< RCU scoped lock
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = base_class::c_bExtractLockExternal; ///< Group of \p extract_xxx functions require external locking
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename maker::cxx_allocator       cxx_allocator;
+        typedef typename maker::node_deallocator    node_deallocator;
+        typedef typename maker::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::node_type      head_type;
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        typedef typename base_class::empty_erase_functor    empty_erase_functor;
+#   endif
+        //@endcond
+
+    public:
+        typedef cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::type_traits::disposer > exempt_ptr; ///< pointer to extracted node
+
+    private:
+        //@cond
+        static value_type& node_to_value( node_type& n )
+        {
+            return n.m_Value;
+        }
+        static value_type const& node_to_value( node_type const& n )
+        {
+            return n.m_Value;
+        }
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        struct insert_functor
+        {
+            Func        m_func;
+
+            insert_functor ( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type& node )
+            {
+                cds::unref(m_func)( node_to_value(node) );
+            }
+        };
+
+        template <typename Q, typename Func>
+        struct ensure_functor
+        {
+            Func        m_func;
+            Q const&    m_arg;
+
+            ensure_functor( Q const& arg, Func f )
+                : m_func(f)
+                , m_arg( arg )
+            {}
+
+            void operator ()( bool bNew, node_type& node, node_type& )
+            {
+                cds::unref(m_func)( bNew, node_to_value(node), m_arg );
+            }
+        };
+
+        template <typename Func>
+        struct find_functor
+        {
+            Func    m_func;
+
+            find_functor( Func f )
+                : m_func(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q& val )
+            {
+                cds::unref(m_func)( node_to_value(node), val );
+            }
+        };
+
+        struct empty_find_functor
+        {
+            template <typename Q>
+            void operator ()( node_type& node, Q& val ) const
+            {}
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type const& node )
+            {
+                cds::unref(m_func)( node_to_value(node) );
+            }
+        };
+#   endif   // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename Q>
+        static node_type * alloc_node( Q const& v )
+        {
+            return cxx_allocator().New( v );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>(args)... );
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return base_class::m_Head;
+        }
+
+        head_type& head() const
+        {
+            return const_cast<head_type&>( base_class::m_Head );
+        }
+
+        head_type& tail()
+        {
+            return base_class::m_Tail;
+        }
+
+        head_type const&  tail() const
+        {
+            return base_class::m_Tail;
+        }
+        //@endcond
+
+    protected:
+                //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& pNode )
+                : iterator_base( const_cast<head_type *>( &pNode ))
+            {}
+
+            iterator_type( head_type const * pNode )
+                : iterator_base( const_cast<head_type *>( pNode ))
+            {}
+
+            friend class LazyList;
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+            iterator_type()
+            {}
+
+            iterator_type( iterator_type const& src )
+                : iterator_base( src )
+            {}
+
+            value_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Value) : null_ptr<value_ptr>();
+            }
+
+            value_ref operator *() const
+            {
+                return (iterator_base::operator *()).m_Value;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            iterator it( head() );
+            ++it        ;   // skip dummy head node
+            return it;
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( tail() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            const_iterator it( head() );
+            ++it        ;   // skip dummy head node
+            return it;
+        }
+        const_iterator cbegin()
+        {
+            const_iterator it( head() );
+            ++it        ;   // skip dummy head node
+            return it;
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator( tail() );
+        }
+        const_iterator cend()
+        {
+            return const_iterator( tail() );
+        }
+        //@}
+
+    public:
+        /// Default constructor
+        /**
+            Initializes empty list
+        */
+        LazyList()
+        {}
+
+        /// List desctructor
+        /**
+            Clears the list
+        */
+        ~LazyList()
+        {
+            clear();
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the list.
+
+            The type \p Q should contain as minimum the complete key of the node.
+            The object of \ref value_type should be constructible from \p val of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            The function makes RCU lock internally.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            return insert_at( head(), val );
+        }
+
+        /// Inserts new node
+        /**
+            This function inserts new node with default-constructed value and then it calls
+            \p func functor with signature
+            \code void func( value_type& itemValue ) ;\endcode
+
+            The argument \p itemValue of user-defined functor \p func is the reference
+            to the list's item inserted. User-defined functor \p func should guarantee that during changing
+            item's value no any other changes could be made on this list's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if the inserting is success.
+
+            The type \p Q should contain the complete key of the node.
+            The object of \ref value_type should be constructible from \p key of type \p Q.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key with initializing key-fields only;
+            - insert new item into the list;
+            - if inserting is successful, initialize non-key fields of item by calling \p f functor
+
+            This can be useful if complete initialization of object of \p value_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            The function makes RCU lock internally.
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& key, Func func )
+        {
+            return insert_at( head(), key, func );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            The function makes RCU lock internally.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            return emplace_at( head(), std::forward<Args>(args)... );
+        }
+#   endif
+
+        /// Ensures that the \p key exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the list, then the new item created from \p key
+            is inserted into the list. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, Q const& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, Q const& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+            - \p val - argument \p key passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            The function applies RCU lock internally.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( Q const& key, Func f )
+        {
+            return ensure_at( head(), key, f );
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_LazyList_rcu_erase
+            Since the key of LazyList's item type \p T is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( head(), key, intrusive_key_comparator(), [](value_type const&){} );
+#       else
+            return erase_at( head(), key, intrusive_key_comparator(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_rcu_erase "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( head(), key, typename maker::template less_wrapper<Less>::type(), [](value_type const&){} );
+#       else
+            return erase_at( head(), key, typename maker::template less_wrapper<Less>::type(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_LazyList_rcu_erase_func
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type const& val) { ... }
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            Since the key of LazyList's item type \p T is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+            return erase_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_rcu_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+            return erase_at( head(), key, typename maker::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Extracts an item from the list
+        /**
+        @anchor cds_nonintrusive_LazyList_rcu_extract
+            The function searches an item with key equal to \p key in the list,
+            unlinks it from the list, and returns pointer to an item found in \p dest argument.
+            If the item with the key equal to \p key is not found the function returns \p false.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the list
+            and returns a pointer to item found.
+            You should lock RCU before calling this function.
+
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/container/lazy_list_rcu.h>
+
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::container::LazyList< rcu, Foo > rcu_lazy_list;
+
+            rcu_lazy_list theList;
+            // ...
+
+            rcu_lazy_list::exempt_ptr p;
+            {
+                // first, we should lock RCU
+                rcu_lazy_list::rcu_lock sl;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theList.extract( p, 10 )) {
+                    // do something with p
+                    ...
+                }
+            }
+            // Outside RCU lock section we may safely release extracted pointer.
+            // release() passes the pointer to RCU reclamation cycle.
+            p.release();
+            \endcode
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& dest, Q const& key )
+        {
+            dest = extract_at( head(), key, intrusive_key_comparator() );
+            return !dest.empty();
+        }
+
+        /// Extracts an item from the list using \p pred predicate for searching
+        /**
+            This function is the analog for \ref cds_nonintrusive_LazyList_rcu_extract "extract(exempt_ptr&, Q const&)".
+
+            The \p pred is a predicate used for key comparing.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as \ref key_comparator.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& dest, Q const& key, Less pred )
+        {
+            dest = extract_at( head(), key, typename maker::template less_wrapper<Less>::type() );
+            return !dest.empty();
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_LazyList_rcu_find_val
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+
+            The function makes RCU lock internally.
+        */
+        template <typename Q>
+        bool find( Q const& key ) const
+        {
+            return find_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_rcu_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& key, Less pred ) const
+        {
+            return find_at( head(), key, typename maker::template less_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p val and performs an action with it
+        /** \anchor cds_nonintrusive_LazyList_rcu_find_func
+            The function searches an item with key equal to \p val and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the function is only guarantee
+            that \p item cannot be deleted during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            The function makes RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f ) const
+        {
+            return find_at( head(), val, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_rcu_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f ) const
+        {
+            return find_at( head(), val, typename maker::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Finds the key \p val and performs an action with it
+        /** \anchor cds_nonintrusive_LazyList_rcu_find_cfunc
+            The function searches an item with key equal to \p val and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function makes RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f ) const
+        {
+            return find_at( head(), val, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_rcu_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f ) const
+        {
+            return find_at( head(), val, typename maker::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_nonintrusive_LazyList_rcu_get
+            The function searches the item with key equal to \p val and returns the pointer to item found.
+            If \p val is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::container::LazyList< cds::urcu::gc< cds::urcu::general_buffered<> >, foo, my_traits > ord_list;
+            ord_list theList;
+            // ...
+            {
+                // Lock RCU
+                ord_list::rcu_lock lock;
+
+                foo * pVal = theList.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be freed at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename Q>
+        value_type * get( Q const& val ) const
+        {
+            return get_at( head(), val, intrusive_key_comparator());
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_LazyList_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& val, Less pred ) const
+        {
+            return get_at( head(), val, typename maker::template less_wrapper<Less>::type());
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        bool insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p( pNode );
+
+            if ( base_class::insert_at( &refHead, *pNode )) {
+                p.release();
+                return true;
+            }
+
+            return false;
+        }
+
+        template <typename Q>
+        bool insert_at( head_type& refHead, Q const& val )
+        {
+            return insert_node_at( refHead, alloc_node( val ));
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        bool emplace_at( head_type& refHead, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<Args>(args)... ));
+        }
+#   endif
+
+        template <typename Q, typename Func>
+        bool insert_at( head_type& refHead, Q const& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            if ( base_class::insert_at( &refHead, *pNode, [&f,n2v](node_type& node){ cds::unref(f)( n2v(node) ); } ))
+#       else
+            if ( base_class::insert_at( &refHead, *pNode, [&f](node_type& node){ cds::unref(f)( node_to_value(node) ); } ))
+#       endif
+#   else
+            insert_functor<Func>  wrapper( f );
+            if ( base_class::insert_at( &refHead, *pNode, cds::ref(wrapper) ))
+#   endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( head_type& refHead, Q const& key, Compare cmp, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type const& (* n2v)( node_type const& ) = node_to_value;
+            return base_class::erase_at( &refHead, key, cmp, [&f,n2v](node_type const& node){ cds::unref(f)( n2v(node) ); } );
+#       else
+            return base_class::erase_at( &refHead, key, cmp, [&f](node_type const& node){ cds::unref(f)( node_to_value(node) ); } );
+#       endif
+#   else
+            erase_functor<Func> wrapper( f );
+            return base_class::erase_at( &refHead, key, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename Q, typename Compare>
+        node_type * extract_at( head_type& refHead, Q const& key, Compare cmp )
+        {
+            return base_class::extract_at( &refHead, key, cmp );
+        }
+
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure_at( head_type& refHead, Q const& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode,
+                [&f, &key, n2v](bool bNew, node_type& node, node_type&){cds::unref(f)( bNew, n2v(node), key ); });
+#       else
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode,
+                [&f, &key](bool bNew, node_type& node, node_type&){cds::unref(f)( bNew, node_to_value(node), key ); });
+#       endif
+#   else
+            ensure_functor<Q, Func> wrapper( key, f );
+            std::pair<bool, bool> ret = base_class::ensure_at( &refHead, *pNode, cds::ref(wrapper));
+#   endif
+            if ( ret.first && ret.second )
+                pNode.release();
+
+            return ret;
+        }
+
+        template <typename Q, typename Compare>
+        bool find_at( head_type& refHead, Q const& key, Compare cmp ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_at( &refHead, key, cmp, [](node_type&, Q const &) {} );
+#       else
+            return base_class::find_at( &refHead, key, cmp, empty_find_functor() );
+#       endif
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_at( head_type& refHead, Q& val, Compare cmp, Func f ) const
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            return base_class::find_at( &refHead, val, cmp, [&f,n2v](node_type& node, Q& val){ cds::unref(f)( n2v(node), val ); });
+#       else
+            return base_class::find_at( &refHead, val, cmp, [&f](node_type& node, Q& val){ cds::unref(f)( node_to_value(node), val ); });
+#       endif
+#   else
+            find_functor<Func>  wrapper( f );
+            return base_class::find_at( &refHead, val, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename Q, typename Compare>
+        value_type * get_at( head_type& refHead, Q const& val, Compare cmp ) const
+        {
+            node_type * pNode = base_class::get_at( &refHead, val, cmp );
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+
+        //@endcond
+    };
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_LAZY_LIST_RCU_H
diff --git a/cds/container/michael_deque.h b/cds/container/michael_deque.h
new file mode 100644 (file)
index 0000000..1d80e50
--- /dev/null
@@ -0,0 +1,493 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_DEQUE_H
+#define __CDS_CONTAINER_MICHAEL_DEQUE_H
+
+#include <cds/intrusive/michael_deque.h>
+#include <cds/details/trivial_assign.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+        template <typename GC, typename T, CDS_DECL_OPTIONS7>
+        struct make_michael_deque
+        {
+            typedef GC gc;
+            typedef T   value_type;
+
+            struct default_options
+            {
+                typedef cds::backoff::empty                         back_off;
+                typedef cds::atomicity::empty_item_counter          item_counter;
+                typedef cds::intrusive::michael_deque::dummy_stat   stat;
+                typedef cds::opt::v::relaxed_ordering               memory_model;
+                enum { alignment = cds::opt::cache_line_alignment };
+                typedef CDS_DEFAULT_ALLOCATOR           allocator;
+            };
+
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< default_options, CDS_OPTIONS7 >::type
+                ,CDS_OPTIONS7
+            >::type   options;
+
+            struct node_type : public cds::intrusive::michael_deque::node< gc >
+            {
+                value_type  m_value;
+                node_type()
+                {}
+                node_type(const value_type& val)
+                    : m_value( val )
+                {}
+#       ifdef CDS_EMPLACE_SUPPORT
+                template <typename... Args>
+                node_type( Args&&... args )
+                    : m_value( std::forward<Args>(args)...)
+                {}
+#       endif
+            };
+
+            typedef typename options::allocator::template rebind<node_type>::other allocator_type;
+            typedef cds::details::Allocator< node_type, allocator_type >           cxx_allocator;
+
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_allocator().Delete( pNode );
+                }
+            };
+
+            typedef cds::intrusive::MichaelDeque< gc,
+                node_type
+                ,cds::intrusive::opt::hook<
+                    cds::intrusive::michael_deque::base_hook< cds::opt::gc<gc> >
+                >
+                ,cds::opt::back_off< typename options::back_off >
+                ,cds::intrusive::opt::disposer< node_deallocator >
+                ,cds::opt::item_counter< typename options::item_counter >
+                ,cds::opt::stat< typename options::stat >
+                ,cds::opt::alignment< options::alignment >
+                ,cds::opt::memory_model< typename options::memory_model >
+            > type;
+        };
+    }
+    //@endcond
+
+    /// Michael's deque
+    /** @ingroup cds_nonintrusive_deque
+
+        Implementation of Michael's deque algorithm.
+
+        \par Source:
+            [2003] Maged Michael "CAS-based Lock-free Algorithm for Shared Deque"
+
+        <b>Short description</b> (from Michael's paper)
+
+            The deque is represented as a doubly-linked list. Each node in the list contains two link pointers,
+            \p pRight and \p pLeft, and a data field. A shared variable, \p Anchor, holds the two anchor
+            pointers to the leftmost and rightmost nodes in the list, if any, and a three-value
+            status tag. Anchor must fit in a memory block that can be read and manipulated
+            using CAS or LL/SC, atomically. Initially both anchor pointers have null values
+            and the status tag holds the value stable, indicating an empty deque.
+
+            The status tag serves to indicate if the deque is in an unstable state. When
+            a process finds the deque in an unstable state, it must first attempt to take it
+            to a stable state before attempting its own operation.
+
+            The algorithm can use 64bit CAS. Instead of a pointer the node contains two
+            31bit link indices + one bit for status tag;
+            this trick allows use 64bit CAS to manipulate \p Anchor. Internal mapper
+            (based on intrusive::MichaelHashSet intrusive container)
+            reflects link indices to item pointers. The maximum number of item in
+            the deque is limited by <tt>2**31 - 1</tt> that is practically unbounded.
+
+        Template arguments:
+        - \p GC - garbage collector type: gc::HP, gc::PTB. Note that gc::HRC is <b>NOT</b> supported for this container.
+        - \p T is a type stored in the queue. It should be default-constructible, copy-constructible, assignable type.
+        - \p Options - options
+
+        Permissible \p Options:
+        - opt::allocator - allocator (like \p std::allocator). Default is \ref CDS_DEFAULT_ALLOCATOR.
+            Used for item allocation.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that means no item counting feature
+        - opt::stat - the type to gather internal statistics.
+            Possible option value are: \ref intrusive::michael_deque::stat, \ref intrusive::michael_deque::dummy_stat,
+            user-provided class that supports intrusive::michael_deque::stat interface.
+            Default is \ref intrusive::michael_deque::dummy_stat.
+        - opt::alignment - the alignment for internal deque data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+    */
+    template <typename GC, typename T, CDS_DECL_OPTIONS7>
+    class MichaelDeque:
+#ifdef CDS_DOXYGEN_INVOKED
+        intrusive::MichaelDeque< GC, intrusive::michael_deque::node< T >, Options... >
+#else
+        details::make_michael_deque< GC, T, CDS_OPTIONS7 >::type
+#endif
+    {
+        //@cond
+        typedef details::make_michael_deque< GC, T, CDS_OPTIONS7 > options;
+        typedef typename options::type base_class;
+        //@endcond
+
+    public:
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS7>
+        struct rebind {
+            typedef MichaelDeque< GC2, T2, CDS_OTHER_OPTIONS7> other   ;   ///< Rebinding result
+        };
+
+    public:
+        typedef T value_type ; ///< Value type stored in the deque
+
+        typedef typename base_class::gc                 gc              ; ///< Garbage collector used
+        typedef typename base_class::back_off           back_off        ; ///< Back-off strategy used
+        typedef typename options::allocator_type        allocator_type  ; ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename options::options::item_counter item_counter    ; ///< Item counting policy used
+        typedef typename options::options::stat         stat            ; ///< Internal statistics policy used
+        typedef typename base_class::memory_model       memory_model    ; ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        typedef typename options::node_type  node_type   ;   ///< queue node type (derived from intrusive::single_link::node)
+
+        //@cond
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;   // deallocate node
+        typedef typename base_class::node_traits    node_traits;
+        //@endcond
+
+    protected:
+        ///@cond
+        static node_type * alloc_node()
+        {
+            return cxx_allocator().New();
+        }
+        static node_type * alloc_node( const value_type& val )
+        {
+            return cxx_allocator().New( val );
+        }
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>(args)... );
+        }
+#   endif
+        static void free_node( node_type * p )
+        {
+            node_deallocator()( p );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        bool push_node_back( node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>());
+            scoped_node_ptr p(pNode);
+
+            if ( base_class::push_back( *pNode ) ) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        bool push_node_front( node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>());
+            scoped_node_ptr p(pNode);
+
+            if ( base_class::push_front( *pNode ) ) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+        //@endcond
+
+    public:
+        /// Default constructor
+        /**
+            Initializes the deque object that can contain up to <tt>2**16 - 1</tt> items
+        */
+        MichaelDeque()
+        {}
+
+        /// Constructor
+        /**
+            Initializes the deque object with estimated item count \p nMaxItemCount.
+            \p nLoadFactor is a parameter of internal memory mapper based on intrusive::MichaelHashSet;
+            see MichaelHashSet ctor for details
+        */
+        MichaelDeque( unsigned int nMaxItemCount, unsigned int nLoadFactor = 4 )
+            : base_class( nMaxItemCount, nLoadFactor )
+            {}
+
+        /// Destructor clears the deque
+        ~MichaelDeque()
+        {}
+
+    public:
+        /// Push back (right) side
+        /**
+            Push new item \p val to right side of the deque.
+        */
+        bool push_back( value_type const& val )
+        {
+            return push_node_back( alloc_node( val ));
+        }
+
+        /// Push back (right) side using copy functor
+        /**
+            \p Func is a functor called to copy value \p data of type \p Type
+            which may be differ from type \p T stored in the deque.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(T& dest, Type const& data)
+                {
+                    // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool push_back( Type const& val, Func f )
+        {
+            scoped_node_ptr p( alloc_node());
+            unref(f)( p->m_value, val );
+            if ( base_class::push_back( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Push back (right side) data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if the oprration successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace_back( Args&&... args )
+        {
+            return push_node_back( alloc_node( std::forward<Args>(args)... ));
+        }
+#   endif
+
+        /// Push front (left) side
+        /**
+            Push new item \p val to left side of the deque.
+        */
+        bool push_front( value_type const& val )
+        {
+            return push_node_front( alloc_node( val ));
+        }
+
+        /// Push front side using copy functor
+        /**
+            \p Func is a functor called to copy value \p data of type \p Type
+            which may be differ from type \p T stored in the deque.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(T& dest, Type const& data)
+                {
+                    // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool push_front( Type const& val, Func f )
+        {
+            scoped_node_ptr p( alloc_node());
+            unref(f)( p->m_value, val );
+            if ( base_class::push_front( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Push front (left side) data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if the operation successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace_front( Args&&... args )
+        {
+            return push_node_front( alloc_node( std::forward<Args>(args)... ));
+        }
+#   endif
+
+        /// Pops back side, no return value
+        /**
+            The function returns \p true if the deque has not been empty (in other words, an item has been popped),
+            otherwise the function returns \p false.
+        */
+        bool pop_back()
+        {
+            return base_class::pop_back() != null_ptr<node_type *>();
+        }
+
+        /// Pops back side a value using copy functor
+        /**
+            \p Func is a functor called to copy value popped to \p dest of type \p Type
+            which may be differ from type \p T stored in the deque.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(Type& dest, T const& data)
+                {
+                    // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool pop_back( Type& dest, Func f )
+        {
+            typename base_class::pop_result res;
+            if ( base_class::do_pop_back( res )) {
+                unref(f)( dest, node_traits::to_value_ptr( res.pPopped )->m_value );
+                base_class::dispose_result( res );
+                return true;
+            }
+            return false;
+        }
+
+
+        /// Pops back side, store value popped into \p dest
+        /**
+            If deque is not empty, the function returns \p true, \p dest contains copy of
+            value popped. The assignment operator for type \ref value_type is invoked.
+            If deque is empty, the function returns \p false, \p dest is unchanged.
+        */
+        bool pop_back( value_type& dest )
+        {
+            typedef cds::details::trivial_assign<value_type, value_type> functor;
+            return pop_back( dest, functor() );
+        }
+
+        /// Pops front side, no return value
+        /**
+            The function returns \p true if the deque has not been empty (in other words, an item has been popped),
+            otherwise the function returns \p false.
+        */
+        bool pop_front()
+        {
+            return base_class::pop_front() != null_ptr<node_type *>();
+        }
+
+        /// Pops front side a value using copy functor
+        /**
+            \p Func is a functor called to copy value popped to \p dest of type \p Type
+            which may be differ from type \p T stored in the deque.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(Type& dest, T const& data)
+                {
+                    // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool pop_front( Type& dest, Func f )
+        {
+            typename base_class::pop_result res;
+            if ( base_class::do_pop_front( res )) {
+                unref(f)( dest, node_traits::to_value_ptr( res.pPopped )->m_value );
+                base_class::dispose_result( res );
+                return true;
+            }
+            return false;
+        }
+
+
+        /// Pops front side, store value popped into \p dest
+        /**
+            If deque is not empty, the function returns \p true, \p dest contains copy of
+            value popped. The assignment operator for type \ref value_type is invoked.
+            If deque is empty, the function returns \p false, \p dest is unchanged.
+        */
+        bool pop_front( value_type& dest )
+        {
+            typedef cds::details::trivial_assign<value_type, value_type> functor;
+            return pop_front( dest, functor() );
+        }
+
+        /// Returns deque's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact does not mean that the deque
+            is empty. To check deque emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Checks if the dequeue is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Clear the deque
+        /**
+            The function repeatedly calls \ref pop_back until it returns \p NULL.
+        */
+        void clear()
+        {
+            return base_class::clear();
+        }
+
+        /// Returns reference to internal statistics
+        const stat& statistics() const
+        {
+            return base_class::statistics();
+        }
+    };
+
+}}  // namespace cds::container
+
+
+#endif // #ifndef __CDS_CONTAINER_MICHAEL_DEQUE_H
diff --git a/cds/container/michael_kvlist_hp.h b/cds/container/michael_kvlist_hp.h
new file mode 100644 (file)
index 0000000..4f315b7
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_KVLIST_HP_H
+#define __CDS_CONTAINER_MICHAEL_KVLIST_HP_H
+
+#include <cds/container/michael_list_base.h>
+#include <cds/intrusive/michael_list_hp.h>
+#include <cds/container/details/make_michael_kvlist.h>
+#include <cds/container/michael_kvlist_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_MICHAEL_KVLIST_HP_H
diff --git a/cds/container/michael_kvlist_hrc.h b/cds/container/michael_kvlist_hrc.h
new file mode 100644 (file)
index 0000000..50143e5
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_KVLIST_HRC_H
+#define __CDS_CONTAINER_MICHAEL_KVLIST_HRC_H
+
+#include <cds/container/michael_list_base.h>
+#include <cds/intrusive/michael_list_hrc.h>
+#include <cds/container/details/make_michael_kvlist.h>
+#include <cds/container/michael_kvlist_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_MICHAEL_KVLIST_HRC_H
diff --git a/cds/container/michael_kvlist_impl.h b/cds/container/michael_kvlist_impl.h
new file mode 100644 (file)
index 0000000..02cd37f
--- /dev/null
@@ -0,0 +1,911 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_KVLIST_IMPL_H
+#define __CDS_CONTAINER_MICHAEL_KVLIST_IMPL_H
+
+#include <cds/ref.h>
+#include <cds/details/functor_wrapper.h>
+#include <cds/details/std/memory.h>
+#include <cds/container/details/guarded_ptr_cast.h>
+
+namespace cds { namespace container {
+
+    /// Michael's ordered list (key-value pair)
+    /** @ingroup cds_nonintrusive_list
+        \anchor cds_nonintrusive_MichaelKVList_gc
+
+        This is key-value variation of non-intrusive MichaelList.
+        Like standard container, this implementation split a value stored into two part -
+        constant key and alterable value.
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Template arguments:
+        - \p GC - garbage collector used
+        - \p Key - key type of an item stored in the list. It should be copy-constructible
+        - \p Value - value type stored in a list
+        - \p Traits - type traits, default is michael_list::type_traits
+
+        It is possible to declare option-based list with cds::container::michael_list::make_traits metafunction istead of \p Traits template
+        argument. For example, the following traits-based declaration of gc::HP Michael's list
+        \code
+        #include <cds/container/michael_kvlist_hp.h>
+        // Declare comparator for the item
+        struct my_compare {
+            int operator ()( int i1, int i2 )
+            {
+                return i1 - i2;
+            }
+        };
+
+        // Declare type_traits
+        struct my_traits: public cds::container::michael_list::type_traits
+        {
+            typedef my_compare compare;
+        };
+
+        // Declare traits-based list
+        typedef cds::container::MichaelKVList< cds::gc::HP, int, int, my_traits >     traits_based_list;
+        \endcode
+
+        is equivalent for the following option-based list
+        \code
+        #include <cds/container/michael_kvlist_hp.h>
+
+        // my_compare is the same
+
+        // Declare option-based list
+        typedef cds::container::MichaelKVList< cds::gc::HP, int, int,
+            typename cds::container::michael_list::make_traits<
+                cds::container::opt::compare< my_compare >     // item comparator option
+            >::type
+        >     option_based_list;
+        \endcode
+
+        Template argument list \p Options of cds::container::michael_list::make_traits metafunction are:
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::allocator - the allocator used for creating and freeing list's item. Default is \ref CDS_DEFAULT_ALLOCATOR macro.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        \par Usage
+        There are different specializations of this template for each garbage collecting schema used.
+        You should include appropriate .h-file depending on GC you are using:
+        - for gc::HP: \code #include <cds/container/michael_kvlist_hp.h> \endcode
+        - for gc::PTB: \code #include <cds/container/michael_kvlist_ptb.h> \endcode
+        - for gc::HRC: \code #include <cds/container/michael_kvlist_hrc.h> \endcode
+        - for \ref cds_urcu_desc "RCU": \code #include <cds/container/michael_kvlist_rcu.h> \endcode
+        - for gc::nogc: \code #include <cds/container/michael_kvlist_nogc.h> \endcode
+    */
+    template <
+        typename GC,
+        typename Key,
+        typename Value,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = michael_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class MichaelKVList:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::MichaelList< GC, implementation_defined, Traits >
+#else
+        protected details::make_michael_kvlist< GC, Key, Value, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_michael_kvlist< GC, Key, Value, Traits > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+#ifdef CDS_DOXYGEN_INVOKED
+        typedef Key                                 key_type        ;   ///< Key type
+        typedef Value                               mapped_type     ;   ///< Type of value stored in the list
+        typedef std::pair<key_type const, mapped_type> value_type   ;   ///< key/value pair stored in the list
+#else
+        typedef typename options::key_type          key_type;
+        typedef typename options::value_type        mapped_type;
+        typedef typename options::pair_type         value_type;
+#endif
+
+        typedef typename base_class::gc             gc              ;   ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename options::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;
+        typedef typename options::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::atomic_node_ptr head_type;
+        //@endcond
+
+    public:
+        /// Guarded pointer
+        typedef cds::gc::guarded_ptr< gc, node_type, value_type, details::guarded_ptr_cast_map<node_type, value_type> > guarded_ptr;
+
+    private:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        class insert_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_functor ( Func f )
+                : base_class( f )
+            {}
+
+            void operator()( node_type& node )
+            {
+                base_class::get()( node.m_Data );
+            }
+        };
+
+        template <typename Func>
+        class ensure_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            ensure_functor( Func f )
+                : base_class(f)
+            {}
+
+            void operator ()( bool bNew, node_type& node, node_type& )
+            {
+                base_class::get()( bNew, node.m_Data );
+            }
+        };
+
+        template <typename Func>
+        class find_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_functor( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q&  )
+            {
+                base_class::get()( node.m_Data );
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func m_func;
+
+            erase_functor( Func f )
+                : m_func( f )
+            {}
+
+            void operator ()( node_type const & node )
+            {
+                cds::unref(m_func)( const_cast<value_type&>(node.m_Data) );
+            }
+        };
+#   endif // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename K>
+        static node_type * alloc_node(const K& key)
+        {
+            return cxx_allocator().New( key );
+        }
+
+        template <typename K, typename V>
+        static node_type * alloc_node( const K& key, const V& val )
+        {
+            return cxx_allocator().New( key, val );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename K, typename... Args>
+        static node_type * alloc_node( K&& key, Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<K>(key), std::forward<Args>(args)...);
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return base_class::m_pHead;
+        }
+
+        head_type const& head() const
+        {
+            return base_class::m_pHead;
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& pNode )
+                : iterator_base( pNode )
+            {}
+
+            friend class MichaelKVList;
+
+        public:
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::reference  value_ref;
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::pointer    value_ptr;
+
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::reference  pair_ref;
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::pointer    pair_ptr;
+
+            iterator_type()
+            {}
+
+            iterator_type( iterator_type const& src )
+                : iterator_base( src )
+            {}
+
+            key_type const& key() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.first;
+            }
+
+            pair_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Data) : null_ptr<pair_ptr>();
+            }
+
+            pair_ref operator *() const
+            {
+                typename iterator_base::value_ref p = iterator_base::operator *();
+                return p.m_Data;
+            }
+
+            value_ref val() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.second;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for Michael's list has some features:
+            - it has no post-increment operator
+            - to protect the value, the iterator contains a GC-specific guard + another guard is required locally for increment operator.
+              For some GC (gc::HP, gc::HRC), a guard is limited resource per thread, so an exception (or assertion) "no free guard"
+              may be thrown if a limit of guard count per thread is exceeded.
+            - The iterator cannot be moved across thread boundary since it contains GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the list.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use the iterator on the concurrent container
+            for debug purpose only.
+
+            The iterator interface to access item data:
+            - <tt> operator -> </tt> - returns a pointer to \ref value_type for iterator
+            - <tt> operator *</tt> - returns a reference (a const reference for \p const_iterator) to \ref value_type for iterator
+            - <tt> const key_type& key() </tt> - returns a key reference for iterator
+            - <tt> mapped_type& val() </tt> - retuns a value reference for iterator (const reference for \p const_iterator)
+
+            For both functions the iterator should not be equal to <tt> end() </tt>
+        */
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( head() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value equals to <tt>NULL</tt>.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            return const_iterator( head() );
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( head() );
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+        const_iterator cend()
+        {
+            return const_iterator();
+        }
+        //@}
+
+    public:
+        /// Default constructor
+        /**
+            Initializes empty list
+        */
+        MichaelKVList()
+        {}
+
+        /// List desctructor
+        /**
+            Clears the list
+        */
+        ~MichaelKVList()
+        {
+            clear();
+        }
+
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( const K& key )
+        {
+            return insert_at( head(), key );
+        }
+
+        /// Inserts new node with a key and a value
+        /**
+            The function creates a node with \p key and value \p val, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( const K& key, const V& val )
+        {
+            // We cannot use insert with functor here
+            // because we cannot lock inserted node for updating
+            // Therefore, we use separate function
+            return insert_at( head(), key, val );
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the list's item inserted. <tt>item.second</tt> is a reference to item's value that may be changed.
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this list's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the list;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            return insert_key_at( head(), key, func );
+        }
+
+        /// Ensures that the \p key exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the list, then the new item created from \p key
+            is inserted into the list (note that in this case the \ref key_type should be
+            copy-constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref mapped_type;
+            however, \p func must guarantee that during changing no any other modifications
+            could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( const K& key, Func f )
+        {
+            return ensure_at( head(), key, f );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            return emplace_at( head(), std::forward<K>(key), std::forward<Args>(args)... );
+        }
+#   endif
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_MichaelKVList_hp_erase_val
+
+            Returns \p true if \p key is found and has been deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            return erase_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_hp_erase_val "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less>
+        bool erase_with( K const& key, Less pred )
+        {
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_MichaelKVList_hp_erase_func
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& val) { ... }
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            Return \p true if key is found and deleted, \p false otherwise
+
+            See also: \ref erase
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+            return erase_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_hp_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Extracts the item from the list with specified \p key
+        /** \anchor cds_nonintrusive_MichaelKVList_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the list, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p K that can be not the same as \p key_type.
+
+            The \ref disposer specified in \p Traits class template parameter is called automatically
+            by garbage collector \p GC specified in class' template parameters when returned \ref guarded_ptr object
+            will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::MichaelKVList< cds::gc::HP, int, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                theList.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        template <typename K>
+        bool extract( guarded_ptr& dest, K const& key )
+        {
+            return extract_at( head(), dest.guard(), key, intrusive_key_comparator() );
+        }
+
+        /// Extracts the item from the list with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_hp_extract "extract(guarded_ptr&, K const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less>
+        bool extract_with( guarded_ptr& dest, K const& key, Less pred )
+        {
+            return extract_at( head(), dest.guard(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_MichaelKVList_hp_find_val
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise
+        */
+        template <typename Q>
+        bool find( Q const& key )
+        {
+            return find_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_hp_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& key, Less pred )
+        {
+            return find_at( head(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p key and performs an action with it
+        /** \anchor cds_nonintrusive_MichaelKVList_hp_find_func
+            The function searches an item with key equal to \p key and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change <tt>item.second</tt> that is reference to value of node.
+            Note that the function is only guarantee that \p item cannot be deleted during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& key, Func f )
+        {
+            return find_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_hp_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& key, Less pred, Func f )
+        {
+            return find_at( head(), key, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Finds the \p key and return the item found
+        /** \anchor cds_nonintrusive_MichaelKVList_hp_get
+            The function searches the item with key equal to \p key
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p key is found, and \p false otherwise.
+            If \p key is not found the \p ptr parameter is not changed.
+
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC automatically when returned \ref guarded_ptr object
+            will be destroyed or released.
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::MichaelKVList< cds::gc::HP, int, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                if ( theList.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for class \p Traits template parameter
+            should accept a parameter of type \p K that can be not the same as \p key_type.
+        */
+        template <typename K>
+        bool get( guarded_ptr& ptr, K const& key )
+        {
+            return get_at( head(), ptr.guard(), key, intrusive_key_comparator() );
+        }
+
+        /// Finds the \p key and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_hp_get "get( guarded_ptr& ptr, K const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less>
+        bool get_with( guarded_ptr& ptr, K const& key, Less pred )
+        {
+            return get_at( head(), ptr.guard(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        bool insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p( pNode );
+            if ( base_class::insert_at( refHead, *pNode )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        template <typename K>
+        bool insert_at( head_type& refHead, const K& key )
+        {
+            return insert_node_at( refHead, alloc_node( key ));
+        }
+
+        template <typename K, typename V>
+        bool insert_at( head_type& refHead, const K& key, const V& val )
+        {
+            return insert_node_at( refHead, alloc_node( key, val ));
+        }
+
+        template <typename K, typename Func>
+        bool insert_key_at( head_type& refHead, const K& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert_at( refHead, *pNode, [&f](node_type& node){ cds::unref(f)( node.m_Data ); }))
+#       else
+            insert_functor<Func>  wrapper( f );
+            if ( base_class::insert_at( refHead, *pNode, cds::ref(wrapper) ))
+#       endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename K, typename... Args>
+        bool emplace_at( head_type& refHead, K&& key, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<K>(key), std::forward<Args>(args)... ));
+        }
+#   endif
+
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure_at( head_type& refHead, const K& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode,
+                [&f]( bool bNew, node_type& node, node_type& ){ cds::unref(f)( bNew, node.m_Data ); });
+#       else
+            ensure_functor<Func> wrapper( f );
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode, cds::ref(wrapper));
+#       endif
+            if ( ret.first && ret.second )
+                pNode.release();
+
+            return ret;
+        }
+
+        template <typename K, typename Compare>
+        bool erase_at( head_type& refHead, K const& key, Compare cmp )
+        {
+            return base_class::erase_at( refHead, key, cmp );
+        }
+
+        template <typename K, typename Compare, typename Func>
+        bool erase_at( head_type& refHead, K const& key, Compare cmp, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_at( refHead, key, cmp, [&f]( node_type const & node ){ cds::unref(f)( const_cast<value_type&>(node.m_Data)); });
+#       else
+            erase_functor<Func> wrapper( f );
+            return base_class::erase_at( refHead, key, cmp, cds::ref(wrapper) );
+#       endif
+        }
+        template <typename K, typename Compare>
+        bool extract_at( head_type& refHead, typename gc::Guard& dest, K const& key, Compare cmp )
+        {
+            return base_class::extract_at( refHead, dest, key, cmp );
+        }
+
+        template <typename K, typename Compare>
+        bool find_at( head_type& refHead, K const& key, Compare cmp )
+        {
+            return base_class::find_at( refHead, key, cmp );
+        }
+
+        template <typename K, typename Compare, typename Func>
+        bool find_at( head_type& refHead, K& key, Compare cmp, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_at( refHead, key, cmp, [&f](node_type& node, K const&){ cds::unref(f)( node.m_Data ); });
+#       else
+            find_functor<Func>  wrapper( f );
+            return base_class::find_at( refHead, key, cmp, cds::ref(wrapper) );
+#       endif
+        }
+
+        template <typename K, typename Compare>
+        bool get_at( head_type& refHead, typename gc::Guard& guard, K const& key, Compare cmp )
+        {
+            return base_class::get_at( refHead, guard, key, cmp );
+        }
+
+        //@endcond
+    };
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_MICHAEL_KVLIST_IMPL_H
diff --git a/cds/container/michael_kvlist_nogc.h b/cds/container/michael_kvlist_nogc.h
new file mode 100644 (file)
index 0000000..e814a3b
--- /dev/null
@@ -0,0 +1,602 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_KVLIST_NOGC_H
+#define __CDS_CONTAINER_MICHAEL_KVLIST_NOGC_H
+
+#include <cds/container/michael_list_base.h>
+#include <cds/intrusive/michael_list_nogc.h>
+#include <cds/container/details/make_michael_kvlist.h>
+#include <cds/details/functor_wrapper.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+
+        template <typename K, typename T, class Traits>
+        struct make_michael_kvlist_nogc: public make_michael_kvlist<gc::nogc, K, T, Traits>
+        {
+            typedef make_michael_kvlist<cds::gc::nogc, K, T, Traits>  base_maker;
+            typedef typename base_maker::node_type node_type;
+
+            struct type_traits: public base_maker::type_traits
+            {
+                typedef typename base_maker::node_deallocator    disposer;
+            };
+
+            typedef intrusive::MichaelList<cds::gc::nogc, node_type, type_traits>  type;
+        };
+
+    }   // namespace details
+    //@endcond
+
+    /// Michael's ordered list (key-value pair, template specialization for gc::nogc)
+    /** @ingroup cds_nonintrusive_list
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        See \ref cds_nonintrusive_MichaelList_gc "MichaelList" for description of template parameters.
+
+        The interface of the specialization is a little different.
+    */
+    template <
+        typename Key,
+        typename Value,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = michael_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class MichaelKVList<gc::nogc, Key, Value, Traits>:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::MichaelList< gc::nogc, implementation_defined, Traits >
+#else
+        protected details::make_michael_kvlist_nogc< Key, Value, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_michael_kvlist_nogc< Key, Value, Traits > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+#ifdef CDS_DOXYGEN_INVOKED
+        typedef Key                                 key_type        ;   ///< Key type
+        typedef Value                               mapped_type     ;   ///< Type of value stored in the list
+        typedef std::pair<key_type const, mapped_type> value_type   ;   ///< key/value pair stored in the list
+#else
+        typedef typename options::key_type          key_type;
+        typedef typename options::value_type        mapped_type;
+        typedef typename options::pair_type         value_type;
+#endif
+
+        typedef typename base_class::gc             gc              ;   ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename options::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;
+        typedef typename options::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::atomic_node_ptr head_type;
+        //@endcond
+
+    private:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct ensure_functor
+        {
+            node_type * m_pItemFound;
+
+            ensure_functor()
+                : m_pItemFound( null_ptr<node_type *>() )
+            {}
+
+            void operator ()(bool, node_type& item, node_type& )
+            {
+                m_pItemFound = &item;
+            }
+        };
+
+        template <typename Func>
+        class find_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_functor( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q&  )
+            {
+                base_class::get()( node.m_Data );
+            }
+        };
+#   endif
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename K>
+        static node_type * alloc_node(const K& key)
+        {
+            return cxx_allocator().New( key );
+        }
+
+        template <typename K, typename V>
+        static node_type * alloc_node( const K& key, const V& val )
+        {
+            return cxx_allocator().New( key, val );
+        }
+
+#ifdef CDS_EMPLACE_SUPPORT
+        template <typename K, typename... Args>
+        static node_type * alloc_node( K&& key, Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<K>(key), std::forward<Args>(args)... );
+        }
+#endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return base_class::m_pHead;
+        }
+
+        head_type const& head() const
+        {
+            return base_class::m_pHead;
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& refNode )
+                : iterator_base( refNode )
+            {}
+
+            explicit iterator_type( const iterator_base& it )
+                : iterator_base( it )
+            {}
+
+            friend class MichaelKVList;
+
+        protected:
+            explicit iterator_type( node_type& pNode )
+                : iterator_base( &pNode )
+            {}
+
+        public:
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::reference  value_ref;
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::pointer    value_ptr;
+
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::reference  pair_ref;
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::pointer    pair_ptr;
+
+            iterator_type()
+                : iterator_base()
+            {}
+
+            iterator_type( const iterator_type& src )
+                : iterator_base( src )
+            {}
+
+            key_type const& key() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.first;
+            }
+
+            value_ref val() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.second;
+            }
+
+            pair_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Data) : null_ptr<pair_ptr>();
+            }
+
+            pair_ref operator *() const
+            {
+                typename iterator_base::value_ref p = iterator_base::operator *();
+                return p.m_Data;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            /// Post-increment
+            iterator_type operator ++(int)
+            {
+                return iterator_base::operator ++(0);
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for Michael's list based on gc::nogc has pre- and post-increment operators.
+
+            The iterator interface to access item data:
+            - <tt> operator -> </tt> - returns a pointer to \ref value_type for iterator
+            - <tt> operator *</tt> - returns a reference (a const reference for \p const_iterator) to \ref value_type for iterator
+            - <tt> const key_type& key() </tt> - returns a key reference for iterator
+            - <tt> mapped_type& val() </tt> - retuns a value reference for iterator (const reference for \p const_iterator)
+
+            For both functions the iterator should not be equal to <tt> end() </tt>
+        */
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( head() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value equals to <tt>NULL</tt>.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            return const_iterator( head() );
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( head() );
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+        const_iterator cend()
+        {
+            return const_iterator();
+        }
+        //@}
+
+    protected:
+        //@cond
+        iterator node_to_iterator( node_type * pNode )
+        {
+            if ( pNode )
+                return iterator( *pNode );
+            return end();
+        }
+        //@endcond
+
+    public:
+        /// Default constructor
+        /**
+            Initialize empty list
+        */
+        MichaelKVList()
+        {}
+
+        /// List desctructor
+        /**
+            Clears the list
+        */
+        ~MichaelKVList()
+        {
+            clear();
+        }
+
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K>
+        iterator insert( const K& key )
+        {
+            return node_to_iterator( insert_at( head(), key ));
+        }
+
+        /// Inserts new node with a key and a value
+        /**
+            The function creates a node with \p key and value \p val, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K, typename V>
+        iterator insert( const K& key, const V& val )
+        {
+            // We cannot use insert with functor here
+            // because we cannot lock inserted node for updating
+            // Therefore, we use separate function
+            return node_to_iterator( insert_at( head(), key, val ));
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code void func( value_type& item );
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the list's item inserted. <tt>item.second</tt> is a reference to item's value that may be changed.
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this list's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if the inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the list;
+            - if inserting is successful, initialize the value of item by calling \p f functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K, typename Func>
+        iterator insert_key( const K& key, Func func )
+        {
+            return node_to_iterator( insert_key_at( head(), key, func ));
+        }
+
+        /// Ensures that the key \p key exists in the list
+        /**
+            The operation inserts new item if the key \p key is not found in the list.
+            Otherwise, the function returns an iterator that points to item found.
+
+            Returns <tt> std::pair<iterator, bool>  </tt> where \p first is an iterator pointing to
+            item found or inserted, \p second is true if new item has been added or \p false if the item
+            already is in the list.
+        */
+        template <typename K>
+        std::pair<iterator, bool> ensure( const K& key )
+        {
+            std::pair< node_type *, bool > ret = ensure_at( head(), key );
+            return std::make_pair( node_to_iterator( ret.first ), ret.second );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        iterator emplace( K&& key, Args&&... args )
+        {
+            return node_to_iterator( emplace_at( head(), std::forward<K>(key), std::forward<Args>(args)... ));
+        }
+#   endif
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_MichaelKVList_nogc_find
+
+            The function searches the item with key equal to \p key
+            and returns an iterator pointed to item found if the key is found,
+            and \ref end() otherwise
+        */
+        template <typename Q>
+        iterator find( Q const& key )
+        {
+            return node_to_iterator( find_at( head(), key, intrusive_key_comparator() ) );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_nogc_find "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        iterator find_with( Q const& key, Less pred )
+        {
+            return node_to_iterator( find_at( head(), key, typename options::template less_wrapper<Less>::type() ) );
+        }
+
+        /// Check if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        node_type * insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p( pNode );
+            if ( base_class::insert_at( refHead, *pNode ))
+                return p.release();
+            return null_ptr<node_type *>();
+        }
+
+        template <typename K>
+        node_type * insert_at( head_type& refHead, const K& key )
+        {
+            return insert_node_at( refHead, alloc_node( key ));
+        }
+
+        template <typename K, typename V>
+        node_type * insert_at( head_type& refHead, const K& key, const V& val )
+        {
+            return insert_node_at( refHead, alloc_node( key, val ));
+        }
+
+        template <typename K, typename Func>
+        node_type * insert_key_at( head_type& refHead, const K& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+            if ( base_class::insert_at( refHead, *pNode )) {
+                cds::unref(f)( pNode->m_Data );
+                return pNode.release();
+            }
+            return null_ptr<node_type *>();
+        }
+
+        template <typename K>
+        std::pair< node_type *, bool > ensure_at( head_type& refHead, const K& key )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+            node_type * pItemFound = null_ptr<node_type *>();
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode, [&pItemFound](bool, node_type& item, node_type&){ pItemFound = &item; });
+#       else
+            ensure_functor func;
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode, boost::ref(func) );
+            pItemFound = func.m_pItemFound;
+#       endif
+            assert( pItemFound != null_ptr<node_type *>() );
+
+            if ( ret.first && ret.second )
+                pNode.release();
+            return std::make_pair( pItemFound, ret.second );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename K, typename... Args>
+        node_type * emplace_at( head_type& refHead, K&& key, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<K>(key), std::forward<Args>(args)... ));
+        }
+#endif
+
+        template <typename K, typename Compare>
+        node_type * find_at( head_type& refHead, K const& key, Compare cmp )
+        {
+            return base_class::find_at( refHead, key, cmp );
+        }
+
+        /*
+        template <typename K, typename Compare typename Func>
+        bool find_at( head_type& refHead, K& key, Compare cmp, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_at( refHead, key, cmp, [&f]( node_type& node, K const& ){ cds::unref(f)( node.m_Data ); });
+#       else
+            find_functor<Func>  wrapper( f );
+            return base_class::find_at( refHead, key, cmp, cds::ref(wrapper) );
+#       endif
+        }
+        */
+        //@endcond
+    };
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_MICHAEL_KVLIST_NOGC_H
diff --git a/cds/container/michael_kvlist_ptb.h b/cds/container/michael_kvlist_ptb.h
new file mode 100644 (file)
index 0000000..04170ad
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_KVLIST_PTB_H
+#define __CDS_CONTAINER_MICHAEL_KVLIST_PTB_H
+
+#include <cds/container/michael_list_base.h>
+#include <cds/intrusive/michael_list_ptb.h>
+#include <cds/container/details/make_michael_kvlist.h>
+#include <cds/container/michael_kvlist_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_MICHAEL_KVLIST_PTB_H
diff --git a/cds/container/michael_kvlist_rcu.h b/cds/container/michael_kvlist_rcu.h
new file mode 100644 (file)
index 0000000..175df49
--- /dev/null
@@ -0,0 +1,929 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_KVLIST_RCU_H
+#define __CDS_CONTAINER_MICHAEL_KVLIST_RCU_H
+
+#include <cds/container/michael_list_base.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/container/details/make_michael_kvlist.h>
+#include <cds/ref.h>
+#include <cds/details/functor_wrapper.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    /// Michael's ordered list (key-value pair), template specialization for \ref cds_urcu_desc "RCU"
+    /** @ingroup cds_nonintrusive_list
+        \anchor cds_nonintrusive_MichaelKVList_rcu
+
+        This is key-value variation of non-intrusive \ref cds_nonintrusive_MichaelList_rcu "MichaelList".
+        Like standard container, this implementation split a value stored into two part -
+        constant key and alterable value.
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Template arguments:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p Key - key type of an item stored in the list. It should be copy-constructible
+        - \p Value - value type stored in a list
+        - \p Traits - type traits, default is michael_list::type_traits
+
+        @note Before including <tt><cds/container/michael_kvlist_rcu.h></tt> you should include appropriate RCU header file,
+        see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+
+        It is possible to declare option-based list with cds::container::michael_list::make_traits metafunction istead of \p Traits template
+        argument. For example, the following traits-based declaration of Michael's list
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/container/michael_kvlist_rcu.h>
+        // Declare comparator for the item
+        struct my_compare {
+            int operator ()( int i1, int i2 )
+            {
+                return i1 - i2;
+            }
+        };
+
+        // Declare type_traits
+        struct my_traits: public cds::container::michael_list::type_traits
+        {
+            typedef my_compare compare;
+        };
+
+        // Declare traits-based list
+        typedef cds::container::MichaelKVList< cds::urcu::gc< cds::urcu::general_buffered<> >, int, int, my_traits > traits_based_list;
+        \endcode
+
+        is equivalent for the following option-based list
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/container/michael_kvlist_rcu.h>
+
+        // my_compare is the same
+
+        // Declare option-based list
+        typedef cds::container::MichaelKVList< cds::urcu::gc< cds::urcu::general_buffered<> >, int, int,
+            typename cds::container::michael_list::make_traits<
+                cds::container::opt::compare< my_compare >     // item comparator option
+            >::type
+        >     option_based_list;
+        \endcode
+
+        Template argument list \p Options of cds::container::michael_list::make_traits metafunction are:
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::allocator - the allocator used for creating and freeing list's item. Default is \ref CDS_DEFAULT_ALLOCATOR macro.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - opt::rcu_check_deadlock - a deadlock checking policy. Default is opt::v::rcu_throw_deadlock
+    */
+    template <
+        typename RCU,
+        typename Key,
+        typename Value,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = michael_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class MichaelKVList< cds::urcu::gc<RCU>, Key, Value, Traits >:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::MichaelList< cds::urcu::gc<RCU>, implementation_defined, Traits >
+#else
+        protected details::make_michael_kvlist< cds::urcu::gc<RCU>, Key, Value, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_michael_kvlist< cds::urcu::gc<RCU>, Key, Value, Traits > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+#ifdef CDS_DOXYGEN_INVOKED
+        typedef Key                                 key_type        ;   ///< Key type
+        typedef Value                               mapped_type     ;   ///< Type of value stored in the list
+        typedef std::pair<key_type const, mapped_type> value_type   ;   ///< key/value pair stored in the list
+#else
+        typedef typename options::key_type          key_type;
+        typedef typename options::value_type        mapped_type;
+        typedef typename options::pair_type         value_type;
+#endif
+
+        typedef typename base_class::gc             gc              ;   ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename options::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename base_class::rcu_check_deadlock rcu_check_deadlock ; ///< RCU deadlock checking policy
+
+        typedef typename gc::scoped_lock    rcu_lock ;  ///< RCU scoped lock
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = base_class::c_bExtractLockExternal; ///< Group of \p extract_xxx functions require external locking
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;
+        typedef typename options::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::atomic_node_ptr head_type;
+        //@endcond
+
+    public:
+        /// pointer to extracted node
+        typedef cds::urcu::exempt_ptr< gc, node_type, value_type, typename options::type_traits::disposer,
+            cds::urcu::details::conventional_exempt_pair_cast<node_type, value_type>
+        > exempt_ptr;
+
+    private:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        class insert_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_functor ( Func f )
+                : base_class( f )
+            {}
+
+            void operator()( node_type& node )
+            {
+                base_class::get()( node.m_Data );
+            }
+        };
+
+        template <typename Func>
+        class ensure_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            ensure_functor( Func f )
+                : base_class(f)
+            {}
+
+            void operator ()( bool bNew, node_type& node, node_type& )
+            {
+                base_class::get()( bNew, node.m_Data );
+            }
+        };
+
+        template <typename Func>
+        class find_functor: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_functor( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q&  )
+            {
+                base_class::get()( node.m_Data );
+            }
+        };
+
+        struct empty_find_functor
+        {
+            template <typename Q>
+            void operator ()( node_type& node, Q& val ) const
+            {}
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func m_func;
+
+            erase_functor( Func f )
+                : m_func( f )
+            {}
+
+            void operator ()( node_type const & node )
+            {
+                cds::unref(m_func)( const_cast<value_type&>(node.m_Data) );
+            }
+        };
+#   endif // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename K>
+        static node_type * alloc_node(const K& key)
+        {
+            return cxx_allocator().New( key );
+        }
+
+        template <typename K, typename V>
+        static node_type * alloc_node( const K& key, const V& val )
+        {
+            return cxx_allocator().New( key, val );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename K, typename... Args>
+        static node_type * alloc_node( K&& key, Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<K>(key), std::forward<Args>(args)...);
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return base_class::m_pHead;
+        }
+
+        head_type& head() const
+        {
+            return const_cast<head_type&>( base_class::m_pHead );
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& pNode )
+                : iterator_base( pNode )
+            {}
+
+            friend class MichaelKVList;
+
+        public:
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::reference  value_ref;
+            typedef typename cds::details::make_const_type<mapped_type, IsConst>::pointer    value_ptr;
+
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::reference  pair_ref;
+            typedef typename cds::details::make_const_type<value_type,  IsConst>::pointer    pair_ptr;
+
+            iterator_type()
+            {}
+
+            iterator_type( iterator_type const& src )
+                : iterator_base( src )
+            {}
+
+            key_type const& key() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.first;
+            }
+
+            pair_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Data) : null_ptr<pair_ptr>();
+            }
+
+            pair_ref operator *() const
+            {
+                typename iterator_base::value_ref p = iterator_base::operator *();
+                return p.m_Data;
+            }
+
+            value_ref val() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                assert( p != null_ptr<typename iterator_base::value_ptr>() );
+                return p->m_Data.second;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( head() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value equals to <tt>NULL</tt>.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            return const_iterator( head() );
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( head() );
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+        const_iterator cend()
+        {
+            return const_iterator();
+        }
+        //@}
+
+    public:
+        /// Default constructor
+        /**
+            Initializes empty list
+        */
+        MichaelKVList()
+        {}
+
+        /// List desctructor
+        /**
+            Clears the list
+        */
+        ~MichaelKVList()
+        {
+            clear();
+        }
+
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            The function makes RCU lock internally.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( const K& key )
+        {
+            return insert_at( head(), key );
+        }
+
+        /// Inserts new node with a key and a value
+        /**
+            The function creates a node with \p key and value \p val, and then inserts the node created into the list.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            The function makes RCU lock internally.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( const K& key, const V& val )
+        {
+            return insert_at( head(), key, val );
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the list's item inserted. <tt>item.second</tt> is a reference to item's value that may be changed.
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this list's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the list;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            The function makes RCU lock internally.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            return insert_key_at( head(), key, func );
+        }
+
+        /// Ensures that the \p key exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the list, then the new item created from \p key
+            is inserted into the list (note that in this case the \ref key_type should be
+            copy-constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref mapped_type;
+            however, \p func must guarantee that during changing no any other modifications
+            could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            The function makes RCU lock internally.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( const K& key, Func f )
+        {
+            return ensure_at( head(), key, f );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            The function makes RCU lock internally.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            return emplace_at( head(), std::forward<K>(key), std::forward<Args>(args)... );
+        }
+#   endif
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_MichaelKVList_rcu_erase
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns \p true if \p key is found and has been deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            return erase_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_rcu_erase "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less>
+        bool erase_with( K const& key, Less pred )
+        {
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_MichaelKVList_rcu_erase_func
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& val) { ... }
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+
+            See also: \ref erase
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+            return erase_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_rcu_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Extracts an item from the list
+        /**
+        @anchor cds_nonintrusive_MichaelKVList_rcu_extract
+            The function searches an item with key equal to \p key in the list,
+            unlinks it from the list, and returns pointer to an item found in \p dest argument.
+            If \p key is not found the function returns \p false.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the list
+            and returns a pointer to item found.
+            You should lock RCU before calling this function.
+
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/container/michael_kvlist_rcu.h>
+
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::container::MichaelKVList< rcu, int, Foo > rcu_michael_list;
+
+            rcu_michael_list theList;
+            // ...
+
+            rcu_michael_list::exempt_ptr p;
+            {
+                // first, we should lock RCU
+                rcu_michael_list::rcu_lock sl;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theList.extract( p, 10 )) {
+                    // do something with p
+                    ...
+                }
+            }
+            // Outside RCU lock section we may safely release extracted pointer.
+            // release() passes the pointer to RCU reclamation cycle.
+            p.release();
+            \endcode
+        */
+        template <typename K>
+        bool extract( exempt_ptr& dest, K const& key )
+        {
+            dest = extract_at( head(), key, intrusive_key_comparator() );
+            return !dest.empty();
+        }
+
+        /// Extracts an item from the list using \p pred predicate for searching
+        /**
+            This function is the analog for \ref cds_nonintrusive_MichaelKVList_rcu_extract "extract(exempt_ptr&, K const&)".
+            The \p pred is a predicate used for key comparing.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as \ref key_comparator.
+        */
+        template <typename K, typename Less>
+        bool extract_with( exempt_ptr& dest, K const& key, Less pred )
+        {
+            dest = extract_at( head(), key, typename options::template less_wrapper<Less>::type() );
+            return !dest.empty();
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_MichaelKVList_rcu_find_val
+
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise
+
+            The function makes RCU lock internally.
+        */
+        template <typename Q>
+        bool find( Q const& key ) const
+        {
+            return find_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_rcu_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& key, Less pred ) const
+        {
+            return find_at( head(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p key and performs an action with it
+        /** \anchor cds_nonintrusive_MichaelKVList_rcu_find_func
+            The function searches an item with key equal to \p key and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change <tt>item.second</tt> that is reference to value of node.
+            Note that the function is only guarantee that \p item cannot be deleted during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function makes RCU lock internally.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& key, Func f ) const
+        {
+            return find_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_rcu_find_func "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& key, Less pred, Func f ) const
+        {
+            return find_at( head(), key, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_nonintrusive_MichaelKVList_rcu_get
+            The function searches the item with \p key and returns the pointer to item found.
+            If \p key is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p K that can be not the same as \p key_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::container::MichaelKVList< cds::urcu::gc< cds::urcu::general_buffered<> >, int, foo, my_traits > ord_list;
+            ord_list theList;
+            // ...
+            {
+                // Lock RCU
+                ord_list::rcu_lock lock;
+
+                ord_list::value_type * pVal = theList.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be freed at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename K>
+        value_type * get( K const& key ) const
+        {
+            return get_at( head(), key, intrusive_key_comparator());
+        }
+
+        /// Finds \p key and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelKVList_rcu_get "get(K const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename K, typename Less>
+        value_type * get_with( K const& key, Less pred ) const
+        {
+            return get_at( head(), key, typename options::template less_wrapper<Less>::type());
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        bool insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p( pNode );
+            if ( base_class::insert_at( refHead, *pNode )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        template <typename K>
+        bool insert_at( head_type& refHead, const K& key )
+        {
+            return insert_node_at( refHead, alloc_node( key ));
+        }
+
+        template <typename K, typename V>
+        bool insert_at( head_type& refHead, const K& key, const V& val )
+        {
+            return insert_node_at( refHead, alloc_node( key, val ));
+        }
+
+        template <typename K, typename Func>
+        bool insert_key_at( head_type& refHead, const K& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert_at( refHead, *pNode, [&f](node_type& node){ cds::unref(f)( node.m_Data ); }))
+#       else
+            insert_functor<Func>  wrapper( f );
+            if ( base_class::insert_at( refHead, *pNode, cds::ref(wrapper) ))
+#       endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename K, typename... Args>
+        bool emplace_at( head_type& refHead, K&& key, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<K>(key), std::forward<Args>(args)... ));
+        }
+#   endif
+
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure_at( head_type& refHead, const K& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode,
+                [&f]( bool bNew, node_type& node, node_type& ){ cds::unref(f)( bNew, node.m_Data ); });
+#       else
+            ensure_functor<Func> wrapper( f );
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode, cds::ref(wrapper));
+#       endif
+            if ( ret.first && ret.second )
+                pNode.release();
+
+            return ret;
+        }
+
+        template <typename K, typename Compare>
+        bool erase_at( head_type& refHead, K const& key, Compare cmp )
+        {
+            return base_class::erase_at( refHead, key, cmp );
+        }
+
+        template <typename K, typename Compare, typename Func>
+        bool erase_at( head_type& refHead, K const& key, Compare cmp, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_at( refHead, key, cmp, [&f]( node_type const & node ){ cds::unref(f)( const_cast<value_type&>(node.m_Data)); });
+#       else
+            erase_functor<Func> wrapper( f );
+            return base_class::erase_at( refHead, key, cmp, cds::ref(wrapper) );
+#       endif
+        }
+
+        template <typename K, typename Compare>
+        node_type * extract_at( head_type& refHead, K const& key, Compare cmp )
+        {
+            return base_class::extract_at( refHead, key, cmp );
+        }
+
+        template <typename K, typename Compare>
+        bool find_at( head_type& refHead, K const& key, Compare cmp ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_at( refHead, key, cmp, [](node_type&, K const&) {} );
+#       else
+            return base_class::find_at( refHead, key, cmp, empty_find_functor() );
+#       endif
+        }
+
+        template <typename K, typename Compare, typename Func>
+        bool find_at( head_type& refHead, K& key, Compare cmp, Func f ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_at( refHead, key, cmp, [&f](node_type& node, K const&){ cds::unref(f)( node.m_Data ); });
+#       else
+            find_functor<Func>  wrapper( f );
+            return base_class::find_at( refHead, key, cmp, cds::ref(wrapper) );
+#       endif
+        }
+
+        template <typename K, typename Compare>
+        value_type * get_at( head_type& refHead, K const& val, Compare cmp ) const
+        {
+            node_type * pNode = base_class::get_at( refHead, val, cmp );
+            return pNode ? &pNode->m_Data : null_ptr<value_type *>();
+        }
+
+        //@endcond
+    };
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_MICHAEL_KVLIST_RCU_H
diff --git a/cds/container/michael_list_base.h b/cds/container/michael_list_base.h
new file mode 100644 (file)
index 0000000..78099ce
--- /dev/null
@@ -0,0 +1,112 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_LIST_BASE_H
+#define __CDS_CONTAINER_MICHAEL_LIST_BASE_H
+
+#include <cds/container/base.h>
+#include <cds/intrusive/michael_list_base.h>
+#include <cds/urcu/options.h>
+
+namespace cds { namespace container {
+
+    /// MichaelList ordered list related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace michael_list {
+        /// Michael list default type traits
+        struct type_traits
+        {
+            typedef CDS_DEFAULT_ALLOCATOR   allocator       ;   ///< allocator used to allocate new node
+
+            /// Key comparison functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+            */
+            typedef opt::none                       compare;
+
+            /// specifies binary predicate used for key comparison.
+            /**
+                Default is \p std::less<T>.
+            */
+            typedef opt::none                       less;
+
+            /// back-off strategy used
+            /**
+                If the option is not specified, the cds::backoff::empty is used.
+            */
+            typedef cds::backoff::empty             back_off;
+
+            /// Item counter
+            /**
+                The type for item counting feature.
+                Default is no item counter (\ref atomicity::empty_item_counter)
+            */
+            typedef atomicity::empty_item_counter     item_counter;
+
+            /// Link fields checking feature
+            /**
+                Default is \ref intrusive::opt::debug_check_link
+            */
+            static const opt::link_check_type link_checker = opt::debug_check_link;
+
+            /// C++ memory ordering model
+            /**
+                List of available memory ordering see opt::memory_model
+            */
+            typedef opt::v::relaxed_ordering        memory_model;
+
+            /// RCU deadlock checking policy (only for \ref cds_intrusive_MichaelList_rcu "RCU-based MichaelList")
+            /**
+                List of available options see opt::rcu_check_deadlock
+            */
+            typedef opt::v::rcu_throw_deadlock      rcu_check_deadlock;
+
+            //@cond
+            // MichaelKVList: supporting for split-ordered list
+            // key accessor (opt::none = internal key type is equal to user key type)
+            typedef opt::none                       key_accessor;
+            //@endcond
+        };
+
+        /// Metafunction converting option list to MichaelList traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+
+            See \ref MichaelList, \ref type_traits, \ref cds::opt::make_options.
+        */
+        template <CDS_DECL_OPTIONS9>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS9 >::type
+                ,CDS_OPTIONS9
+            >::type   type;
+#endif
+        };
+
+
+    } // namespace michael_list
+
+    // Forward declarations
+    template <typename GC, typename T, typename Traits=michael_list::type_traits>
+    class MichaelList;
+
+    template <typename GC, typename Key, typename Value, typename Traits=michael_list::type_traits>
+    class MichaelKVList;
+
+    // Tag for selecting Michael's list implementation
+    /**
+        This struct is empty and it is used only as a tag for selecting MichaelList
+        as ordered list implementation in declaration of some classes.
+
+        See split_list::type_traits::ordered_list as an example.
+    */
+    struct michael_list_tag
+    {};
+
+}}  // namespace cds::container
+
+
+#endif  // #ifndef __CDS_CONTAINER_MICHAEL_LIST_BASE_H
diff --git a/cds/container/michael_list_hp.h b/cds/container/michael_list_hp.h
new file mode 100644 (file)
index 0000000..f1ae1a8
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_LIST_HP_H
+#define __CDS_CONTAINER_MICHAEL_LIST_HP_H
+
+#include <cds/container/michael_list_base.h>
+#include <cds/intrusive/michael_list_hp.h>
+#include <cds/container/details/make_michael_list.h>
+#include <cds/container/michael_list_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_MICHAEL_LIST_HP_H
diff --git a/cds/container/michael_list_hrc.h b/cds/container/michael_list_hrc.h
new file mode 100644 (file)
index 0000000..01cb993
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_LIST_HRC_H
+#define __CDS_CONTAINER_MICHAEL_LIST_HRC_H
+
+#include <cds/container/michael_list_base.h>
+#include <cds/intrusive/michael_list_hrc.h>
+#include <cds/container/details/make_michael_list.h>
+#include <cds/container/michael_list_impl.h>
+
+#endif // #ifndef __CDS_CONTAINER_MICHAEL_LIST_HRC_H
diff --git a/cds/container/michael_list_impl.h b/cds/container/michael_list_impl.h
new file mode 100644 (file)
index 0000000..739bbc5
--- /dev/null
@@ -0,0 +1,935 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_LIST_IMPL_H
+#define __CDS_CONTAINER_MICHAEL_LIST_IMPL_H
+
+#include <cds/details/std/memory.h>
+#include <cds/container/details/guarded_ptr_cast.h>
+
+namespace cds { namespace container {
+
+    /// Michael's ordered list
+    /** @ingroup cds_nonintrusive_list
+        \anchor cds_nonintrusive_MichaelList_gc
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Source:
+        - [2002] Maged Michael "High performance dynamic lock-free hash tables and list-based sets"
+
+        This class is non-intrusive version of cds::intrusive::MichaelList class
+
+        Template arguments:
+        - \p GC - garbage collector used
+        - \p T - type stored in the list. The type must be default- and copy-constructible.
+        - \p Traits - type traits, default is michael_list::type_traits
+
+        Unlike standard container, this implementation does not divide type \p T into key and value part and
+        may be used as a main building block for hash set algorithms.
+        The key is a function (or a part) of type \p T, and this function is specified by <tt>Traits::compare</tt> functor
+        or <tt>Traits::less</tt> predicate
+
+        MichaelKVList is a key-value version of Michael's non-intrusive list that is closer to the C++ std library approach.
+
+        It is possible to declare option-based list with cds::container::michael_list::make_traits metafunction istead of \p Traits template
+        argument. For example, the following traits-based declaration of gc::HP Michael's list
+        \code
+        #include <cds/container/michael_list_hp.h>
+        // Declare comparator for the item
+        struct my_compare {
+            int operator ()( int i1, int i2 )
+            {
+                return i1 - i2;
+            }
+        };
+
+        // Declare type_traits
+        struct my_traits: public cds::container::michael_list::type_traits
+        {
+            typedef my_compare compare;
+        };
+
+        // Declare traits-based list
+        typedef cds::container::MichaelList< cds::gc::HP, int, my_traits >     traits_based_list;
+        \endcode
+
+        is equivalent for the following option-based list
+        \code
+        #include <cds/container/michael_list_hp.h>
+
+        // my_compare is the same
+
+        // Declare option-based list
+        typedef cds::container::MichaelList< cds::gc::HP, int,
+            typename cds::container::michael_list::make_traits<
+                cds::container::opt::compare< my_compare >     // item comparator option
+            >::type
+        >     option_based_list;
+        \endcode
+
+        Template argument list \p Options of cds::container::michael_list::make_traits metafunction are:
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::allocator - the allocator used for creating and freeing list's item. Default is \ref CDS_DEFAULT_ALLOCATOR macro.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        \par Usage
+        There are different specializations of this template for each garbage collecting schema used.
+        You should include appropriate .h-file depending on GC you are using:
+        - for gc::HP: \code #include <cds/container/michael_list_hp.h> \endcode
+        - for gc::PTB: \code #include <cds/container/michael_list_ptb.h> \endcode
+        - for gc::HRC: \code #include <cds/container/michael_list_hrc.h> \endcode
+        - for \ref cds_urcu_desc "RCU": \code #include <cds/container/michael_list_rcu.h> \endcode
+        - for gc::nogc: \code #include <cds/container/michael_list_nogc.h> \endcode
+    */
+    template <
+        typename GC,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = michael_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class MichaelList:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::MichaelList< GC, T, Traits >
+#else
+        protected details::make_michael_list< GC, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_michael_list< GC, T, Traits > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+        typedef T                                   value_type      ;   ///< Type of value stored in the list
+        typedef typename base_class::gc             gc              ;   ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename options::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;
+        typedef typename options::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::atomic_node_ptr head_type;
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        typedef typename base_class::empty_erase_functor    empty_erase_functor;
+#   endif
+        //@endcond
+
+    public:
+        /// Guarded pointer
+        typedef cds::gc::guarded_ptr< gc, node_type, value_type, details::guarded_ptr_cast_set<node_type, value_type> > guarded_ptr;
+
+    private:
+        //@cond
+        static value_type& node_to_value( node_type& n )
+        {
+            return n.m_Value;
+        }
+        static value_type const& node_to_value( node_type const& n )
+        {
+            return n.m_Value;
+        }
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        struct insert_functor
+        {
+            Func        m_func;
+
+            insert_functor ( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type& node )
+            {
+                cds::unref(m_func)( node_to_value(node) );
+            }
+        };
+
+        template <typename Q, typename Func>
+        struct ensure_functor
+        {
+            Func        m_func;
+            Q const&    m_arg;
+
+            ensure_functor( Q const& arg, Func f )
+                : m_func(f)
+                , m_arg( arg )
+            {}
+
+            void operator ()( bool bNew, node_type& node, node_type& )
+            {
+                cds::unref(m_func)( bNew, node_to_value(node), m_arg );
+            }
+        };
+
+        template <typename Func>
+        struct find_functor
+        {
+            Func    m_func;
+
+            find_functor( Func f )
+                : m_func(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q& val )
+            {
+                cds::unref(m_func)( node_to_value(node), val );
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type const& node )
+            {
+                cds::unref(m_func)( node_to_value(node) );
+            }
+        };
+#endif  // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename Q>
+        static node_type * alloc_node( Q const& v )
+        {
+            return cxx_allocator().New( v );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>(args)... );
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return base_class::m_pHead;
+        }
+
+        head_type const& head() const
+        {
+            return base_class::m_pHead;
+        }
+        //@endcond
+
+    protected:
+                //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& pNode )
+                : iterator_base( pNode )
+            {}
+
+            friend class MichaelList;
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+            iterator_type()
+            {}
+
+            iterator_type( iterator_type const& src )
+                : iterator_base( src )
+            {}
+
+            value_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Value) : reinterpret_cast<value_ptr>(NULL);
+            }
+
+            value_ref operator *() const
+            {
+                return (iterator_base::operator *()).m_Value;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for Michael's list has some features:
+            - it has no post-increment operator
+            - to protect the value, the iterator contains a GC-specific guard + another guard is required locally for increment operator.
+              For some GC (gc::HP, gc::HRC), a guard is limited resource per thread, so an exception (or assertion) "no free guard"
+              may be thrown if a limit of guard count per thread is exceeded.
+            - The iterator cannot be moved across thread boundary since it contains GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the list.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use the iterator on the concurrent container
+            for debug purpose only.
+        */
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( head() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value equals to <tt>NULL</tt>.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            return const_iterator( head() );
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( head() );
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+        const_iterator cend()
+        {
+            return const_iterator();
+        }
+        //@}
+
+    public:
+        /// Default constructor
+        /**
+            Initialize empty list
+        */
+        MichaelList()
+        {}
+
+        /// List destructor
+        /**
+            Clears the list
+        */
+        ~MichaelList()
+        {
+            clear();
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the list.
+
+            The type \p Q should contain as minimum the complete key of the node.
+            The object of \ref value_type should be constructible from \p val of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            return insert_at( head(), val );
+        }
+
+        /// Inserts new node
+        /**
+            This function inserts new node with default-constructed value and then it calls
+            \p func functor with signature
+            \code void func( value_type& itemValue ) ;\endcode
+
+            The argument \p itemValue of user-defined functor \p func is the reference
+            to the list's item inserted. User-defined functor \p func should guarantee that during changing
+            item's value no any other changes could be made on this list's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if the inserting is success.
+
+            The type \p Q should contain the complete key of the node.
+            The object of \ref value_type should be constructible from \p key of type \p Q.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key with initializing key-fields only;
+            - insert new item into the list;
+            - if inserting is successful, initialize non-key fields of item by calling \p f functor
+
+            This can be useful if complete initialization of object of \p value_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& key, Func func )
+        {
+            return insert_at( head(), key, func );
+        }
+
+        /// Ensures that the \p key exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the list, then the new item created from \p key
+            is inserted into the list. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+            - \p val - argument \p key passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( Q const& key, Func f )
+        {
+            return ensure_at( head(), key, f );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            return emplace_at( head(), std::forward<Args>(args)... );
+        }
+#   endif
+
+        /// Delete \p key from the list
+        /** \anchor cds_nonintrusive_MichealList_hp_erase_val
+            Since the key of MichaelList's item type \p T is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( head(), key, intrusive_key_comparator(), [](value_type const&){} );
+#       else
+            return erase_at( head(), key, intrusive_key_comparator(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichealList_hp_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), [](value_type const&){} );
+#       else
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_MichaelList_hp_erase_func
+            The function searches an item with key \p key, calls \p f functor with item found
+            and deletes it. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(const value_type& val) { ... }
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            Since the key of MichaelList's item type \p T is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+
+            See also: \ref erase
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+            return erase_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_hp_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Extracts the item from the list with specified \p key
+        /** \anchor cds_nonintrusive_MichaelList_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the list, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::MichaelList< cds::gc::HP, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                theList.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard and frees the item
+            }
+            \endcode
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& dest, Q const& key )
+        {
+            return extract_at( head(), dest.guard(), key, intrusive_key_comparator() );
+        }
+
+        /// Extracts the item from the list with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_hp_extract "extract(guarded_ptr&, Q const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& dest, Q const& key, Less pred )
+        {
+            return extract_at( head(), dest.guard(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_MichaelList_hp_find_val
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise
+        */
+        template <typename Q>
+        bool find( Q const& key )
+        {
+            return find_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_hp_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& key, Less pred )
+        {
+            return find_at( head(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Find the key \p val and perform an action with it
+        /** \anchor cds_nonintrusive_MichaelList_hp_find_func
+            The function searches an item with key equal to \p val and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the function is only guarantee
+            that \p item cannot be deleted during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_at( head(), val, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_hp_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_at( head(), val, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Find the key \p val and perform an action with it
+        /** \anchor cds_nonintrusive_MichaelList_hp_find_cfunc
+            The function searches an item with key equal to \p val and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the function is only guarantee
+            that \p item cannot be deleted during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_at( head(), val, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_hp_find_cfunc "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_at( head(), val, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_nonintrusive_MichaelList_hp_get
+            The function searches the item with key equal to \p val
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p val is found, and \p false otherwise.
+            If \p val is not found the \p ptr parameter is not changed.
+
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::MichaelList< cds::gc::HP, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                if ( theList.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard and frees the item
+            }
+            \endcode
+
+            Note the compare functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& ptr, Q const& val )
+        {
+            return get_at( head(), ptr.guard(), val, intrusive_key_comparator() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_hp_get "get( guarded_ptr& ptr, Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& ptr, Q const& val, Less pred )
+        {
+            return get_at( head(), ptr.guard(), val, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Check if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomics::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        bool insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != NULL );
+            scoped_node_ptr p(pNode);
+            if ( base_class::insert_at( refHead, *pNode )) {
+                p.release();
+                return true;
+            }
+
+            return false;
+        }
+
+        template <typename Q>
+        bool insert_at( head_type& refHead, Q const& val )
+        {
+            return insert_node_at( refHead, alloc_node( val ));
+        }
+
+        template <typename Q, typename Func>
+        bool insert_at( head_type& refHead, Q const& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5,4.6,4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            if ( base_class::insert_at( refHead, *pNode, [&f, n2v]( node_type& node ) { cds::unref(f)( n2v(node) ); } ))
+#       else
+            if ( base_class::insert_at( refHead, *pNode, [&f]( node_type& node ) { cds::unref(f)( node_to_value(node) ); } ))
+#       endif
+#   else
+            insert_functor<Func>  wrapper( f );
+            if ( base_class::insert_at( refHead, *pNode, cds::ref(wrapper) ))
+#   endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        bool emplace_at( head_type& refHead, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<Args>(args) ... ));
+        }
+#   endif
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( head_type& refHead, Q const& key, Compare cmp, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type const& (* n2v)( node_type const& ) = node_to_value;
+            return base_class::erase_at( refHead, key, cmp, [&f,n2v](node_type const& node){ cds::unref(f)( n2v(node) ); } );
+#       else
+            return base_class::erase_at( refHead, key, cmp, [&f](node_type const& node){ cds::unref(f)( node_to_value(node) ); } );
+#       endif
+#   else
+            erase_functor<Func> wrapper( f );
+            return base_class::erase_at( refHead, key, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename Q, typename Compare>
+        bool extract_at( head_type& refHead, typename gc::Guard& dest, Q const& key, Compare cmp )
+        {
+            return base_class::extract_at( refHead, dest, key, cmp );
+        }
+
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure_at( head_type& refHead, Q const& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode,
+                [&f, &key, n2v](bool bNew, node_type& node, node_type&){ cds::unref(f)( bNew, n2v(node), key ); });
+#       else
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode,
+                [&f, &key](bool bNew, node_type& node, node_type&){ cds::unref(f)( bNew, node_to_value(node), key ); });
+#       endif
+#   else
+            ensure_functor<Q, Func> wrapper( key, f );
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode, cds::ref(wrapper));
+#   endif
+            if ( ret.first && ret.second )
+                pNode.release();
+
+            return ret;
+        }
+
+        template <typename Q, typename Compare>
+        bool find_at( head_type& refHead, Q const& key, Compare cmp )
+        {
+            return base_class::find_at( refHead, key, cmp );
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_at( head_type& refHead, Q& val, Compare cmp, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            return base_class::find_at( refHead, val, cmp, [&f, n2v](node_type& node, Q& v){ cds::unref(f)( n2v(node), v ); });
+#       else
+            return base_class::find_at( refHead, val, cmp, [&f](node_type& node, Q& v){ cds::unref(f)( node_to_value(node), v ); });
+#       endif
+#   else
+            find_functor<Func>  wrapper( f );
+            return base_class::find_at( refHead, val, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename Q, typename Compare>
+        bool get_at( head_type& refHead, typename gc::Guard& guard, Q const& key, Compare cmp )
+        {
+            return base_class::get_at( refHead, guard, key, cmp );
+        }
+
+        //@endcond
+    };
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_MICHAEL_LIST_IMPL_H
diff --git a/cds/container/michael_list_nogc.h b/cds/container/michael_list_nogc.h
new file mode 100644 (file)
index 0000000..bd07cff
--- /dev/null
@@ -0,0 +1,450 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_LIST_NOGC_H
+#define __CDS_CONTAINER_MICHAEL_LIST_NOGC_H
+
+#include <cds/container/michael_list_base.h>
+#include <cds/intrusive/michael_list_nogc.h>
+#include <cds/container/details/make_michael_list.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+
+        template <typename T, class Traits>
+        struct make_michael_list_nogc: public make_michael_list<gc::nogc, T, Traits>
+        {
+            typedef make_michael_list<cds::gc::nogc, T, Traits>  base_maker;
+            typedef typename base_maker::node_type node_type;
+
+            struct type_traits: public base_maker::type_traits
+            {
+                typedef typename base_maker::node_deallocator    disposer;
+            };
+
+            typedef intrusive::MichaelList<cds::gc::nogc, node_type, type_traits>  type;
+        };
+
+    }   // namespace details
+    //@endcond
+
+    /// Michael's lock-free ordered single-linked list (template specialization for gc::nogc)
+    /** @ingroup cds_nonintrusive_list
+        \anchor cds_nonintrusive_MichaelList_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        See \ref cds_nonintrusive_MichaelList_gc "MichaelList" for description of template parameters.
+
+        The interface of the specialization is a little different.
+    */
+    template <typename T, typename Traits>
+    class MichaelList<gc::nogc, T, Traits>:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::MichaelList< gc::nogc, T, Traits >
+#else
+        protected details::make_michael_list_nogc< T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_michael_list_nogc< T, Traits > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+        typedef T                                   value_type      ;   ///< Type of value stored in the list
+        typedef typename base_class::gc             gc              ;   ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename options::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;
+        typedef typename options::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::atomic_node_ptr head_type;
+        //@endcond
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct ensure_functor
+        {
+            node_type * m_pItemFound;
+
+            ensure_functor()
+                : m_pItemFound( NULL )
+            {}
+
+            void operator ()(bool, node_type& item, node_type& )
+            {
+                m_pItemFound = &item;
+            }
+        };
+#   endif
+        //@endcond
+
+    protected:
+        //@cond
+        static node_type * alloc_node()
+        {
+            return cxx_allocator().New();
+        }
+
+        static node_type * alloc_node( value_type const& v )
+        {
+            return cxx_allocator().New( v );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>(args)... );
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return base_class::m_pHead;
+        }
+
+        head_type const& head() const
+        {
+            return base_class::m_pHead;
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& pNode )
+                : iterator_base( pNode )
+            {}
+
+            explicit iterator_type( const iterator_base& it )
+                : iterator_base( it )
+            {}
+
+            friend class MichaelList;
+
+        protected:
+            explicit iterator_type( node_type& pNode )
+                : iterator_base( &pNode )
+            {}
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+            iterator_type()
+            {}
+
+            iterator_type( const iterator_type& src )
+                : iterator_base( src )
+            {}
+
+            value_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Value) : reinterpret_cast<value_ptr>(NULL);
+            }
+
+            value_ref operator *() const
+            {
+                return (iterator_base::operator *()).m_Value;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            /// Post-increment
+            iterator_type operator ++(int)
+            {
+                return iterator_base::operator ++(0);
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( head() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value equals to <tt>NULL</tt>.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            return const_iterator( head() );
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( head() );
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+        const_iterator cend()
+        {
+            return const_iterator();
+        }
+        //@}
+
+    protected:
+        //@cond
+        iterator node_to_iterator( node_type * pNode )
+        {
+            if ( pNode )
+                return iterator( *pNode );
+            return end();
+        }
+        //@endcond
+
+    public:
+        /// Default constructor
+        /**
+            Initialize empty list
+        */
+        MichaelList()
+        {}
+
+        /// List desctructor
+        /**
+            Clears the list
+        */
+        ~MichaelList()
+        {
+            clear();
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the list if the list does not contain
+            an item with key equal to \p val.
+
+            Return an iterator pointing to inserted item if success \ref end() otherwise
+        */
+        template <typename Q>
+        iterator insert( const Q& val )
+        {
+            return node_to_iterator( insert_at( head(), val ) );
+        }
+
+        /// Ensures that the item \p val exists in the list
+        /**
+            The operation inserts new item if the key \p val is not found in the list.
+            Otherwise, the function returns an iterator that points to item found.
+
+            Returns <tt> std::pair<iterator, bool>  </tt> where \p first is an iterator pointing to
+            item found or inserted, \p second is true if new item has been added or \p false if the item
+            already is in the list.
+        */
+        template <typename Q>
+        std::pair<iterator, bool> ensure( const Q& val )
+        {
+            std::pair< node_type *, bool > ret = ensure_at( head(), val );
+            return std::make_pair( node_to_iterator( ret.first ), ret.second );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Return an iterator pointing to inserted item if success \ref end() otherwise
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        iterator emplace( Args&&... args )
+        {
+            return node_to_iterator( emplace_at( head(), std::forward<Args>(args)... ));
+        }
+#   endif
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_MichaelList_nogc_find_val
+            The function searches the item with key equal to \p val
+            and returns an iterator pointed to item found if the key is found,
+            and \ref end() otherwise
+        */
+        template <typename Q>
+        iterator find( Q const& key )
+        {
+            return node_to_iterator( find_at( head(), key, intrusive_key_comparator() ));
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_nogc_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        iterator find_with( Q const& key, Less pred )
+        {
+            return node_to_iterator( find_at( head(), key, typename options::template less_wrapper<Less>::type() ));
+        }
+
+        /// Check if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomics::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        node_type * insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p(pNode);
+            if ( base_class::insert_at( refHead, *pNode ))
+                return p.release();
+
+            return null_ptr<node_type *>();
+        }
+
+        template <typename Q>
+        node_type * insert_at( head_type& refHead, const Q& val )
+        {
+            return insert_node_at( refHead, alloc_node( val ));
+        }
+
+        template <typename Q>
+        std::pair< node_type *, bool > ensure_at( head_type& refHead, const Q& val )
+        {
+            scoped_node_ptr pNode( alloc_node( val ));
+            node_type * pItemFound = null_ptr<node_type *>();
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode, [&pItemFound](bool, node_type& item, node_type&) { pItemFound = &item; });
+#   else
+            ensure_functor func;
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode, boost::ref(func) );
+            pItemFound = func.m_pItemFound;
+#   endif
+            assert( pItemFound != null_ptr<node_type *>() );
+
+            if ( ret.first && ret.second )
+                pNode.release();
+            return std::make_pair( pItemFound, ret.second );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        node_type * emplace_at( head_type& refHead, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<Args>(args)...));
+        }
+#   endif
+
+        template <typename Q, typename Compare>
+        node_type * find_at( head_type& refHead, Q const& key, Compare cmp )
+        {
+            return base_class::find_at( refHead, key, cmp );
+        }
+
+        //@endcond
+    };
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_MICHAEL_LIST_NOGC_H
diff --git a/cds/container/michael_list_ptb.h b/cds/container/michael_list_ptb.h
new file mode 100644 (file)
index 0000000..b1f3bfb
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_LIST_PTB_H
+#define __CDS_CONTAINER_MICHAEL_LIST_PTB_H
+
+#include <cds/container/michael_list_base.h>
+#include <cds/intrusive/michael_list_ptb.h>
+#include <cds/container/details/make_michael_list.h>
+#include <cds/container/michael_list_impl.h>
+
+#endif // #ifndef __CDS_CONTAINER_MICHAEL_LIST_PTB_H
diff --git a/cds/container/michael_list_rcu.h b/cds/container/michael_list_rcu.h
new file mode 100644 (file)
index 0000000..f16a487
--- /dev/null
@@ -0,0 +1,967 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_LIST_RCU_H
+#define __CDS_CONTAINER_MICHAEL_LIST_RCU_H
+
+#include <cds/container/michael_list_base.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/container/details/make_michael_list.h>
+#include <cds/details/binary_functor_wrapper.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    /// Michael's ordered list (template specialization for \ref cds_urcu_desc "RCU")
+    /** @ingroup cds_nonintrusive_list
+        \anchor cds_nonintrusive_MichaelList_rcu
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Source:
+        - [2002] Maged Michael "High performance dynamic lock-free hash tables and list-based sets"
+
+        This class is non-intrusive version of \ref cds_intrusive_MichaelList_rcu "cds::intrusive::MichaelList" RCU specialization.
+
+        Template arguments:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p T - type stored in the list. The type must be default- and copy-constructible.
+        - \p Traits - type traits, default is michael_list::type_traits
+
+        The implementation does not divide type \p T into key and value part and
+        may be used as a main building block for hash set containers.
+        The key is a function (or a part) of type \p T, and this function is specified by <tt>Traits::compare</tt> functor
+        or <tt>Traits::less</tt> predicate.
+
+        \ref cds_nonintrusive_MichaelKVList_rcu "MichaelKVList" is a key-value version of Michael's
+        non-intrusive list that is closer to the C++ std library approach.
+
+        @note Before including <tt><cds/container/michael_list_rcu.h></tt> you should include appropriate RCU header file,
+        see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+
+        It is possible to declare option-based list with cds::container::michael_list::make_traits metafunction istead of \p Traits template
+        argument. For example, the following traits-based declaration of Michael's list
+
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/container/michael_list_rcu.h>
+        // Declare comparator for the item
+        struct my_compare {
+            int operator ()( int i1, int i2 )
+            {
+                return i1 - i2;
+            }
+        };
+
+        // Declare type_traits
+        struct my_traits: public cds::container::michael_list::type_traits
+        {
+            typedef my_compare compare;
+        };
+
+        // Declare traits-based list
+        typedef cds::container::MichaelList< cds::urcu::gc< cds::urcu::general_buffered<> >, int, my_traits >     traits_based_list;
+        \endcode
+
+        is equivalent for the following option-based list
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/container/michael_list_rcu.h>
+
+        // my_compare is the same
+
+        // Declare option-based list
+        typedef cds::container::MichaelList< cds::urcu::gc< cds::urcu::general_buffered<> >, int,
+            typename cds::container::michael_list::make_traits<
+                cds::container::opt::compare< my_compare >     // item comparator option
+            >::type
+        >     option_based_list;
+        \endcode
+
+        Template argument list \p Options of cds::container::michael_list::make_traits metafunction are:
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::allocator - the allocator used for creating and freeing list's item. Default is \ref CDS_DEFAULT_ALLOCATOR macro.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - opt::rcu_check_deadlock - a deadlock checking policy. Default is opt::v::rcu_throw_deadlock
+    */
+    template <
+        typename RCU,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = michael_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class MichaelList< cds::urcu::gc<RCU>, T, Traits > :
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::MichaelList< cds::urcu::gc<RCU>, T, Traits >
+#else
+        protected details::make_michael_list< cds::urcu::gc<RCU>, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_michael_list< cds::urcu::gc<RCU>, T, Traits > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+        typedef T                                   value_type      ;   ///< Type of value stored in the list
+        typedef typename base_class::gc             gc              ;   ///< RCU schema used
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename options::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename base_class::rcu_check_deadlock rcu_check_deadlock ; ///< RCU deadlock checking policy
+
+        typedef typename gc::scoped_lock    rcu_lock ;  ///< RCU scoped lock
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = base_class::c_bExtractLockExternal; ///< Group of \p extract_xxx functions require external locking
+
+    protected:
+        //@cond
+        typedef typename base_class::value_type     node_type;
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;
+        typedef typename options::type_traits::compare  intrusive_key_comparator;
+
+        typedef typename base_class::atomic_node_ptr      head_type;
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        typedef typename base_class::empty_erase_functor    empty_erase_functor;
+#   endif
+        //@endcond
+
+    public:
+        typedef cds::urcu::exempt_ptr< gc, node_type, value_type, typename options::type_traits::disposer > exempt_ptr; ///< pointer to extracted node
+
+    private:
+        //@cond
+        static value_type& node_to_value( node_type& n )
+        {
+            return n.m_Value;
+        }
+        static value_type const& node_to_value( node_type const& n )
+        {
+            return n.m_Value;
+        }
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        struct insert_functor
+        {
+            Func        m_func;
+
+            insert_functor ( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type& node )
+            {
+                cds::unref(m_func)( node_to_value(node) );
+            }
+        };
+
+        template <typename Q, typename Func>
+        struct ensure_functor
+        {
+            Func        m_func;
+            Q const&    m_arg;
+
+            ensure_functor( Q const& arg, Func f )
+                : m_func(f)
+                , m_arg( arg )
+            {}
+
+            void operator ()( bool bNew, node_type& node, node_type& )
+            {
+                cds::unref(m_func)( bNew, node_to_value(node), m_arg );
+            }
+        };
+
+        template <typename Func>
+        struct find_functor
+        {
+            Func    m_func;
+
+            find_functor( Func f )
+                : m_func(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q& val )
+            {
+                cds::unref(m_func)( node_to_value(node), val );
+            }
+        };
+
+        struct empty_find_functor
+        {
+            template <typename Q>
+            void operator ()( node_type& node, Q& val ) const
+            {}
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type const& node )
+            {
+                cds::unref(m_func)( node_to_value(node) );
+            }
+        };
+#endif  // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename Q>
+        static node_type * alloc_node( Q const& v )
+        {
+            return cxx_allocator().New( v );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>(args)... );
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        head_type& head()
+        {
+            return base_class::m_pHead;
+        }
+
+        head_type& head() const
+        {
+            return const_cast<head_type&>( base_class::m_pHead );
+        }
+        //@endcond
+
+    protected:
+                //@cond
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            typedef typename base_class::template iterator_type<IsConst>    iterator_base;
+
+            iterator_type( head_type const& pNode )
+                : iterator_base( pNode )
+            {}
+
+            friend class MichaelList;
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+            iterator_type()
+            {}
+
+            iterator_type( iterator_type const& src )
+                : iterator_base( src )
+            {}
+
+            value_ptr operator ->() const
+            {
+                typename iterator_base::value_ptr p = iterator_base::operator ->();
+                return p ? &(p->m_Value) : reinterpret_cast<value_ptr>(NULL);
+            }
+
+            value_ref operator *() const
+            {
+                return (iterator_base::operator *()).m_Value;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base::operator ++();
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator ==(i);
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base::operator !=(i);
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        typedef iterator_type<false>    iterator;
+
+        /// Const forward iterator
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( head() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value equals to <tt>NULL</tt>.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            return const_iterator( head() );
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( head() );
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+        const_iterator cend()
+        {
+            return const_iterator();
+        }
+        //@}
+
+    public:
+        /// Default constructor
+        /**
+            Initialize empty list
+        */
+        MichaelList()
+        {}
+
+        /// List destructor
+        /**
+            Clears the list
+        */
+        ~MichaelList()
+        {
+            clear();
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the list.
+
+            The type \p Q should contain as minimum the complete key of the node.
+            The object of \ref value_type should be constructible from \p val of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            The function makes RCU lock internally.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            return insert_at( head(), val );
+        }
+
+        /// Inserts new node
+        /**
+            This function inserts new node with default-constructed value and then it calls
+            \p func functor with signature
+            \code void func( value_type& itemValue ) ;\endcode
+
+            The argument \p itemValue of user-defined functor \p func is the reference
+            to the list's item inserted. User-defined functor \p func should guarantee that during changing
+            item's value no any other changes could be made on this list's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if the inserting is success.
+
+            The type \p Q should contain the complete key of the node.
+            The object of \ref value_type should be constructible from \p key of type \p Q.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key with initializing key-fields only;
+            - insert new item into the list;
+            - if inserting is successful, initialize non-key fields of item by calling \p f functor
+
+            This can be useful if complete initialization of object of \p value_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            The function makes RCU lock internally.
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& key, Func func )
+        {
+            return insert_at( head(), key, func );
+        }
+
+        /// Ensures that the \p key exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the list, then the new item created from \p key
+            is inserted into the list. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+            - \p val - argument \p key passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            The function makes RCU lock internally.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( Q const& key, Func f )
+        {
+            return ensure_at( head(), key, f );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            The function makes RCU lock internally.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics.
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            return emplace_at( head(), std::forward<Args>(args)... );
+        }
+#   endif
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_MichealList_rcu_erase_val
+            Since the key of MichaelList's item type \p T is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the value \p key of type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( head(), key, intrusive_key_comparator(),  [](value_type const&){} );
+#       else
+            return erase_at( head(), key, intrusive_key_comparator(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichealList_rcu_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), [](value_type const&){} );
+#       else
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes \p key from the list
+        /** \anchor cds_nonintrusive_MichaelList_rcu_erase_func
+            The function searches an item with key \p key, calls \p f functor with item found
+            and deletes it. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(const value_type& val) { ... }
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            Since the key of MichaelList's item type \p T is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+            return erase_at( head(), key, intrusive_key_comparator(), f );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_rcu_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+            return erase_at( head(), key, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Extracts an item from the list
+        /**
+        @anchor cds_nonintrusive_MichaelList_rcu_extract
+            The function searches an item with key equal to \p val in the list,
+            unlinks it from the list, and returns pointer to an item found in \p dest argument.
+            If the item with the key equal to \p val is not found the function returns \p false.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the list
+            and returns a pointer to item found.
+            You should lock RCU before calling this function.
+
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/container/michael_list_rcu.h>
+
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::container::MichaelList< rcu, Foo > rcu_michael_list;
+
+            rcu_michael_list theList;
+            // ...
+
+            rcu_michael_list::exempt_ptr p;
+            {
+                // first, we should lock RCU
+                rcu::scoped_lock sl;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theList.extract( p, 10 )) {
+                    // do something with p
+                    ...
+                }
+            }
+            // Outside RCU lock section we may safely release extracted pointer.
+            // release() passes the pointer to RCU reclamation cycle.
+            p.release();
+            \endcode
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& dest, Q const& val )
+        {
+            dest = extract_at( head(), val, intrusive_key_comparator() );
+            return !dest.empty();
+        }
+
+        /// Extracts an item from the list using \p pred predicate for searching
+        /**
+            This function is the analog for \ref cds_nonintrusive_MichaelList_rcu_extract "extract(exempt_ptr&, Q const&)".
+
+            The \p pred is a predicate used for key comparing.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as \ref key_comparator.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& dest, Q const& val, Less pred )
+        {
+            dest = extract_at( head(), val, typename options::template less_wrapper<Less>::type() );
+            return !dest.empty();
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_MichaelList_rcu_find_val
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+
+            The function makes RCU lock internally.
+        */
+        template <typename Q>
+        bool find( Q const& key ) const
+        {
+            return find_at( head(), key, intrusive_key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_rcu_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& key, Less pred ) const
+        {
+            return find_at( head(), key, typename options::template less_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p val and performs an action with it
+        /** \anchor cds_nonintrusive_MichaelList_rcu_find_func
+            The function searches an item with key equal to \p val and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the function is only guarantee
+            that \p item cannot be deleted during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            The function makes RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f ) const
+        {
+            return find_at( head(), val, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_rcu_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f ) const
+        {
+            return find_at( head(), val, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Finds the key \p val and performs an action with it
+        /** \anchor cds_nonintrusive_MichaelList_rcu_find_cfunc
+            The function searches an item with key equal to \p val and calls the functor \p f for the item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the function is only guarantee
+            that \p item cannot be deleted during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function makes RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f ) const
+        {
+            return find_at( head(), val, intrusive_key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_rcu_find_cfunc "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f ) const
+        {
+            return find_at( head(), val, typename options::template less_wrapper<Less>::type(), f );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_nonintrusive_MichaelList_rcu_get
+            The function searches the item with key equal to \p val and returns the pointer to item found.
+            If \p val is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::container::MichaelList< cds::urcu::gc< cds::urcu::general_buffered<> >, foo, my_traits > ord_list;
+            ord_list theList;
+            // ...
+            {
+                // Lock RCU
+                ord_list::rcu_lock lock;
+
+                foo * pVal = theList.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be freed at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename Q>
+        value_type * get( Q const& val ) const
+        {
+            return get_at( head(), val, intrusive_key_comparator());
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelList_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& val, Less pred ) const
+        {
+            return get_at( head(), val, typename options::template less_wrapper<Less>::type());
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomics::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use a real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Clears the list
+        /**
+            Post-condition: the list is empty
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+    protected:
+        //@cond
+        bool insert_node_at( head_type& refHead, node_type * pNode )
+        {
+            assert( pNode != NULL );
+            scoped_node_ptr p(pNode);
+            if ( base_class::insert_at( refHead, *pNode )) {
+                p.release();
+                return true;
+            }
+
+            return false;
+        }
+
+        template <typename Q>
+        bool insert_at( head_type& refHead, Q const& val )
+        {
+            return insert_node_at( refHead, alloc_node( val ));
+        }
+
+        template <typename Q, typename Func>
+        bool insert_at( head_type& refHead, Q const& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5,4.6,4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            if ( base_class::insert_at( refHead, *pNode, [&f, n2v]( node_type& node ) { cds::unref(f)( n2v(node) ); } ))
+#       else
+            if ( base_class::insert_at( refHead, *pNode, [&f]( node_type& node ) { cds::unref(f)( node_to_value(node) ); } ))
+#       endif
+#   else
+            insert_functor<Func>  wrapper( f );
+            if ( base_class::insert_at( refHead, *pNode, cds::ref(wrapper) ))
+#   endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        bool emplace_at( head_type& refHead, Args&&... args )
+        {
+            return insert_node_at( refHead, alloc_node( std::forward<Args>(args) ... ));
+        }
+#   endif
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( head_type& refHead, Q const& key, Compare cmp, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type const& (* n2v)( node_type const& ) = node_to_value;
+            return base_class::erase_at( refHead, key, cmp, [&f,n2v](node_type const& node){ cds::unref(f)( n2v(node) ); } );
+#       else
+            return base_class::erase_at( refHead, key, cmp, [&f](node_type const& node){ cds::unref(f)( node_to_value(node) ); } );
+#       endif
+#   else
+            erase_functor<Func> wrapper( f );
+            return base_class::erase_at( refHead, key, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure_at( head_type& refHead, Q const& key, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( key ));
+
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode,
+                [&f, &key, n2v](bool bNew, node_type& node, node_type&){ cds::unref(f)( bNew, n2v(node), key ); });
+#       else
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode,
+                [&f, &key](bool bNew, node_type& node, node_type&){ cds::unref(f)( bNew, node_to_value(node), key ); });
+#       endif
+#   else
+            ensure_functor<Q, Func> wrapper( key, f );
+            std::pair<bool, bool> ret = base_class::ensure_at( refHead, *pNode, cds::ref(wrapper));
+#   endif
+            if ( ret.first && ret.second )
+                pNode.release();
+
+            return ret;
+        }
+
+        template <typename Q, typename Compare>
+        node_type * extract_at( head_type& refHead, Q const& key, Compare cmp )
+        {
+            return base_class::extract_at( refHead, key, cmp );
+        }
+
+        template <typename Q, typename Compare>
+        bool find_at( head_type& refHead, Q const& key, Compare cmp ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_at( refHead, key, cmp, [](node_type&, Q const &) {} );
+#       else
+            return base_class::find_at( refHead, key, cmp, empty_find_functor() );
+#       endif
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_at( head_type& refHead, Q& val, Compare cmp, Func f ) const
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+#       ifdef CDS_BUG_STATIC_MEMBER_IN_LAMBDA
+            // GCC 4.5-4.7: node_to_value is unaccessible from lambda,
+            // like as MichaelList::node_to_value that requires to capture *this* despite on node_to_value is static function
+            value_type& (* n2v)( node_type& ) = node_to_value;
+            return base_class::find_at( refHead, val, cmp, [&f, n2v](node_type& node, Q& v){ cds::unref(f)( n2v(node), v ); });
+#       else
+            return base_class::find_at( refHead, val, cmp, [&f](node_type& node, Q& v){ cds::unref(f)( node_to_value(node), v ); });
+#       endif
+#   else
+            find_functor<Func>  wrapper( f );
+            return base_class::find_at( refHead, val, cmp, cds::ref(wrapper) );
+#   endif
+        }
+
+        template <typename Q, typename Compare>
+        value_type * get_at( head_type& refHead, Q const& val, Compare cmp ) const
+        {
+            node_type * pNode = base_class::get_at( refHead, val, cmp );
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+
+        //@endcond
+    };
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_MICHAEL_LIST_RCU_H
diff --git a/cds/container/michael_map.h b/cds/container/michael_map.h
new file mode 100644 (file)
index 0000000..a6c5d76
--- /dev/null
@@ -0,0 +1,820 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_MAP_H
+#define __CDS_CONTAINER_MICHAEL_MAP_H
+
+#include <cds/container/michael_map_base.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace container {
+
+    /// Michael's hash map
+    /** @ingroup cds_nonintrusive_map
+        \anchor cds_nonintrusive_MichaelHashMap_hp
+
+        Source:
+            - [2002] Maged Michael "High performance dynamic lock-free hash tables and list-based sets"
+
+        Michael's hash table algorithm is based on lock-free ordered list and it is very simple.
+        The main structure is an array \p T of size \p M. Each element in \p T is basically a pointer
+        to a hash bucket, implemented as a singly linked list. The array of buckets cannot be dynamically expanded.
+        However, each bucket may contain unbounded number of items.
+
+        Template parameters are:
+        - \p GC - Garbage collector used. You may use any \ref cds_garbage_collector "Garbage collector"
+            from the \p libcds library.
+            Note the \p GC must be the same as the GC used for \p OrderedList
+        - \p OrderedList - ordered key-value list implementation used as bucket for hash map, for example, MichaelKVList
+            or LazyKVList. The ordered list implementation specifies the \p Key and \p Value types stored in the hash-map,
+            the reclamation schema \p GC used by hash-map, the comparison functor for the type \p Key and other features
+            specific for the ordered list.
+        - \p Traits - type traits. See michael_map::type_traits for explanation.
+
+        Instead of defining \p Traits struct you may use option-based syntax with \p michael_map::make_traits metafunction
+        (this metafunction is a synonym for michael_set::make_traits).
+        For \p michael_map::make_traits the following option may be used:
+        - opt::hash - mandatory option, specifies hash functor.
+        - opt::item_counter - optional, specifies item counting policy. See michael_map::type_traits for explanation.
+        - opt::allocator - optional, bucket table allocator. Default is \ref CDS_DEFAULT_ALLOCATOR.
+
+        Many of the class function take a key argument of type \p K that in general is not \ref key_type.
+        \p key_type and an argument of template type \p K must meet the following requirements:
+        - \p key_type should be constructible from value of type \p K;
+        - the hash functor should be able to calculate correct hash value from argument \p key of type \p K:
+            <tt> hash( key_type(key) ) == hash( key ) </tt>
+        - values of type \p key_type and \p K should be comparable
+
+        There are the specializations:
+        - for \ref cds_urcu_desc "RCU" - declared in <tt>cd/container/michael_map_rcu.h</tt>,
+            see \ref cds_nonintrusive_MichaelHashMap_rcu "MichaelHashMap<RCU>".
+        - for \ref cds::gc::nogc declared in <tt>cds/container/michael_map_nogc.h</tt>,
+            see \ref cds_nonintrusive_MichaelHashMap_nogc "MichaelHashMap<gc::nogc>".
+
+        <b>Iterators</b>
+
+        The class supports a forward iterator (\ref iterator and \ref const_iterator).
+        The iteration is unordered.
+        The iterator object is thread-safe: the element pointed by the iterator object is guarded,
+        so, the element cannot be reclaimed while the iterator object is alive.
+        However, passing an iterator object between threads is dangerous.
+
+        \warning Due to concurrent nature of Michael's set it is not guarantee that you can iterate
+        all elements in the set: any concurrent deletion can exclude the element
+        pointed by the iterator from the set, and your iteration can be terminated
+        before end of the set. Therefore, such iteration is more suitable for debugging purpose only
+
+        Remember, each iterator object requires an additional hazard pointer, that may be
+        a limited resource for \p GC like as gc::HP and gc::HRC (for gc::PTB the count of
+        guards is unlimited).
+
+        The iterator class supports the following minimalistic interface:
+        \code
+        struct iterator {
+        // Default ctor
+        iterator();
+
+        // Copy ctor
+        iterator( iterator const& s);
+
+        value_type * operator ->() const;
+        value_type& operator *() const;
+
+        // Pre-increment
+        iterator& operator ++();
+
+        // Copy assignment
+        iterator& operator = (const iterator& src);
+
+        bool operator ==(iterator const& i ) const;
+        bool operator !=(iterator const& i ) const;
+        };
+        \endcode
+        Note, the iterator object returned by \ref end, \p cend member functions points to \p NULL and should not be dereferenced.
+
+        \anchor cds_nonintrusive_MichaelHashMap_how_touse
+        <b>How to use</b>
+
+        Suppose, you want to make \p int to \p int map for Hazard Pointer garbage collector. You should
+        choose suitable ordered list class that will be used as a bucket for the map; it may be MichaelKVList.
+        \code
+        #include <cds/container/michael_kvlist_hp.h>    // MichaelKVList for gc::HP
+        #include <cds/container/michael_map.h>          // MIchaelHashMap
+
+        // List traits based on std::less predicate
+        struct list_traits: public cds::container::michael_list::type_traits
+        {
+            typedef std::less<int>      less;
+        };
+
+        // Ordered list
+        typedef cds::container::MichaelKVList< cds::gc::HP, int, int, list_traits> int2int_list;
+
+        // Map traits
+        struct map_traits: public cds::container::michael_map::type_traits
+        {
+            struct hash {
+                size_t operator()( int i ) const
+                {
+                    return cds::opt::v::hash<int>()( i );
+                }
+            }
+        };
+
+        // Your map
+        typedef cds::container::MichaelHashMap< cds::gc::HP, int2int_list, map_traits > int2int_map;
+
+        // Now you can use int2int_map class
+
+        int main()
+        {
+            int2int_map theMap;
+
+            theMap.insert( 100 );
+            ...
+        }
+        \endcode
+
+        You may use option-based declaration:
+        \code
+        #include <cds/container/michael_kvlist_hp.h>    // MichaelKVList for gc::HP
+        #include <cds/container/michael_map.h>          // MIchaelHashMap
+
+        // Ordered list
+        typedef cds::container::MichaelKVList< cds::gc::HP, int, int,
+            typename cds::container::michael_list::make_traits<
+                cds::container::opt::less< std::less<int> >     // item comparator option
+            >::type
+        >  int2int_list;
+
+        // Map
+        typedef cds::container::MichaelHashMap< cds::gc::HP, int2int_list,
+            cds::container::michael_map::make_traits<
+                cc::opt::hash< cds::opt::v::hash<int> >
+            >
+        > int2int_map;
+        \endcode
+    */
+    template <
+        class GC,
+        class OrderedList,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = michael_map::type_traits
+#else
+        class Traits
+#endif
+    >
+    class MichaelHashMap
+    {
+    public:
+        typedef OrderedList bucket_type     ;   ///< type of ordered list used as a bucket implementation
+        typedef Traits      options         ;   ///< Traits template parameters
+
+        typedef typename bucket_type::key_type          key_type        ;   ///< key type
+        typedef typename bucket_type::mapped_type       mapped_type     ;   ///< value type
+        typedef typename bucket_type::value_type        value_type      ;   ///< key/value pair stored in the map
+
+        typedef GC                                      gc              ;   ///< Garbage collector
+        typedef typename bucket_type::key_comparator    key_comparator  ;   ///< key compare functor
+
+        /// Hash functor for \ref key_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+
+        /// Bucket table allocator
+        typedef cds::details::Allocator< bucket_type, typename options::allocator >  bucket_table_allocator;
+        typedef typename bucket_type::guarded_ptr      guarded_ptr; ///< Guarded pointer
+
+    protected:
+        item_counter    m_ItemCounter   ;   ///< Item counter
+        hash            m_HashFunctor   ;   ///< Hash functor
+
+        bucket_type *   m_Buckets       ;   ///< bucket table
+
+    private:
+        //@cond
+        const size_t    m_nHashBitmask;
+        //@endcond
+
+    protected:
+        /// Calculates hash value of \p key
+        template <typename Q>
+        size_t hash_value( Q const& key ) const
+        {
+            return m_HashFunctor( key ) & m_nHashBitmask;
+        }
+
+        /// Returns the bucket (ordered list) for \p key
+        template <typename Q>
+        bucket_type&    bucket( Q const& key )
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+
+    protected:
+        //@cond
+        /// Forward iterator
+        template <bool IsConst>
+        class iterator_type: private cds::intrusive::michael_set::details::iterator< bucket_type, IsConst >
+        {
+            typedef cds::intrusive::michael_set::details::iterator< bucket_type, IsConst >  base_class;
+            friend class MichaelHashMap;
+
+        protected:
+            typedef typename base_class::bucket_ptr     bucket_ptr;
+            typedef typename base_class::list_iterator  list_iterator;
+
+        public:
+            /// Value pointer type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::mapped_type, IsConst>::pointer   value_ptr;
+            /// Value reference type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::mapped_type, IsConst>::reference value_ref;
+
+            /// Key-value pair pointer type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::value_type, IsConst>::pointer   pair_ptr;
+            /// Key-value pair reference type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::value_type, IsConst>::reference pair_ref;
+
+        protected:
+            iterator_type( list_iterator const& it, bucket_ptr pFirst, bucket_ptr pLast )
+                : base_class( it, pFirst, pLast )
+            {}
+
+        public:
+            /// Default ctor
+            iterator_type()
+                : base_class()
+            {}
+
+            /// Copy ctor
+            iterator_type( const iterator_type& src )
+                : base_class( src )
+            {}
+
+            /// Dereference operator
+            pair_ptr operator ->() const
+            {
+                assert( base_class::m_pCurBucket != null_ptr<bucket_ptr>() );
+                return base_class::m_itList.operator ->();
+            }
+
+            /// Dereference operator
+            pair_ref operator *() const
+            {
+                assert( base_class::m_pCurBucket != null_ptr<bucket_ptr>() );
+                return base_class::m_itList.operator *();
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                base_class::operator++();
+                return *this;
+            }
+
+            /// Assignment operator
+            iterator_type& operator = (const iterator_type& src)
+            {
+                base_class::operator =(src);
+                return *this;
+            }
+
+            /// Returns current bucket (debug function)
+            bucket_ptr bucket() const
+            {
+                return base_class::bucket();
+            }
+
+            /// Equality operator
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i )
+            {
+                return base_class::operator ==( i );
+            }
+            /// Equality operator
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i )
+            {
+                return !( *this == i );
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        typedef iterator_type< false >    iterator;
+
+        /// Const forward iterator
+        typedef iterator_type< true >     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a map
+        /**
+            For empty map \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a map
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the map.
+            For empty map \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a map
+        //@{
+        const_iterator begin() const
+        {
+            return get_const_begin();
+        }
+        const_iterator cbegin()
+        {
+            return get_const_begin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a map
+        //@{
+        const_iterator end() const
+        {
+            return get_const_end();
+        }
+        const_iterator cend()
+        {
+            return get_const_end();
+        }
+        //@}
+
+    private:
+        //@cond
+        const_iterator get_const_begin() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[0]).begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+        const_iterator get_const_end() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[bucket_count() - 1]).end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+        //@endcond
+
+    public:
+        /// Initializes the map
+        /**
+            The Michael's hash map is non-expandable container. You should point the average count of items \p nMaxItemCount
+            when you create an object.
+            \p nLoadFactor parameter defines average count of items per bucket and it should be small number between 1 and 10.
+            Remember, since the bucket implementation is an ordered list, searching in the bucket is linear [<tt>O(nLoadFactor)</tt>].
+            Note, that many popular STL hash map implementation uses load factor 1.
+
+            The ctor defines hash table size as rounding <tt>nMacItemCount / nLoadFactor</tt> up to nearest power of two.
+        */
+        MichaelHashMap(
+            size_t nMaxItemCount,   ///< estimation of max item count in the hash map
+            size_t nLoadFactor      ///< load factor: estimation of max number of items in the bucket
+        ) : m_nHashBitmask( michael_map::details::init_hash_bitmask( nMaxItemCount, nLoadFactor ))
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename bucket_type::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ), "atomicity::empty_item_counter is not allowed as a item counter");
+
+            m_Buckets = bucket_table_allocator().NewArray( bucket_count() );
+        }
+
+        /// Clears hash map and destroys it
+        ~MichaelHashMap()
+        {
+            clear();
+            bucket_table_allocator().Delete( m_Buckets, bucket_count() );
+        }
+
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \p key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \p key_type.
+            - The \p mapped_type should be default-constructible.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( const K& key )
+        {
+            const bool bRet = bucket( key ).insert( key );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \p key_type should be constructible from \p key of type \p K.
+            - The \p mapped_type should be constructible from \p val of type \p V.
+
+            Returns \p true if \p val is inserted into the map, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( K const& key, V const& val )
+        {
+            const bool bRet = bucket( key ).insert( key, val );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted:
+                - <tt>item.first</tt> is a const reference to item's key that cannot be changed.
+                - <tt>item.second</tt> is a reference to item's value that may be changed.
+
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this map's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            const bool bRet = bucket( key ).insert_key( key, func );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+
+        /// Ensures that the \p key exists in the map
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the map, then the new item created from \p key
+            is inserted into the map (note that in this case the \p key_type should be
+            constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \p mapped_type;
+            however, \p func must guarantee that during changing no any other modifications
+            could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( K const& key, Func func )
+        {
+            std::pair<bool, bool> bRet = bucket( key ).ensure( key, func );
+            if ( bRet.first && bRet.second )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \p mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            \p key_type should be constructible from type \p K
+
+            Returns \p true if inserting successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            const bool bRet = bucket( key ).emplace( std::forward<K>(key), std::forward<Args>(args)... );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+#   endif
+
+        /// Deletes \p key from the map
+        /** \anchor cds_nonintrusive_MichaelMap_erase_val
+
+            Return \p true if \p key is found and deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            const bool bRet = bucket( key ).erase( key );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelMap_erase_val "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool erase_with( K const& key, Less pred )
+        {
+            const bool bRet = bucket( key ).erase_with( key, pred );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes \p key from the map
+        /** \anchor cds_nonintrusive_MichaelMap_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& item) { ... }
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+            const bool bRet = bucket( key ).erase( key, f );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelMap_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+            const bool bRet = bucket( key ).erase_with( key, pred, f );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Extracts the item with specified \p key
+        /** \anchor cds_nonintrusive_MichaelHashMap_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the set, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p K that may be not the same as \p key_type.
+
+            The extracted item is freed automatically when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::MichaelHashMap< your_template_args > michael_map;
+            michael_map theMap;
+            // ...
+            {
+                michael_map::guarded_ptr gp;
+                theMap.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        template <typename K>
+        bool extract( guarded_ptr& dest, K const& key )
+        {
+            const bool bRet = bucket( key ).extract( dest, key );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Extracts the item using compare functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelHashMap_hp_extract "extract(guarded_ptr&, K const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool extract_with( guarded_ptr& dest, K const& key, Less pred )
+        {
+            const bool bRet = bucket( key ).extract_with( dest, key, pred );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_MichaelMap_find_cfunc
+
+            The function searches the item with key equal to \p key and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change \p item.second. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the map's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename K, typename Func>
+        bool find( K const& key, Func f )
+        {
+            return bucket( key ).find( key, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelMap_find_cfunc "find(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool find_with( K const& key, Less pred, Func f )
+        {
+            return bucket( key ).find_with( key, pred, f );
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_MichaelMap_find_val
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+        */
+        template <typename K>
+        bool find( K const& key )
+        {
+            return bucket( key ).find( key );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelMap_find_val "find(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool find_with( K const& key, Less pred )
+        {
+            return bucket( key ).find_with( key, pred );
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_nonintrusive_MichaelHashMap_hp_get
+            The function searches the item with key equal to \p key
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p key is found, and \p false otherwise.
+            If \p key is not found the \p ptr parameter is not changed.
+
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::MichaeHashMap< your_template_params >  michael_map;
+            michael_map theMap;
+            // ...
+            {
+                michael_map::guarded_ptr gp;
+                if ( theMap.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for \p OrderedList template parameter
+            should accept a parameter of type \p K that can be not the same as \p key_type.
+        */
+        template <typename K>
+        bool get( guarded_ptr& ptr, K const& key )
+        {
+            return bucket( key ).get( ptr, key );
+        }
+
+        /// Finds \p key and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelHashMap_hp_get "get( guarded_ptr& ptr, K const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool get_with( guarded_ptr& ptr, K const& key, Less pred )
+        {
+            return bucket( key ).get_with( ptr, key, pred );
+        }
+
+        /// Clears the map (non-atomic)
+        /**
+            The function erases all items from the map.
+
+            The function is not atomic. It cleans up each bucket and then resets the item counter to zero.
+            If there are a thread that performs insertion while \p clear is working the result is undefined in general case:
+            <tt> empty() </tt> may return \p true but the map may contain item(s).
+            Therefore, \p clear may be used only for debugging purposes.
+        */
+        void clear()
+        {
+            for ( size_t i = 0; i < bucket_count(); ++i )
+                m_Buckets[i].clear();
+            m_ItemCounter.reset();
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+            Thus, the correct item counting is an important part of the map implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns the size of hash table
+        /**
+            Since MichaelHashMap cannot dynamically extend the hash table size,
+            the value returned is an constant depending on object initialization parameters;
+            see MichaelHashMap::MichaelHashMap for explanation.
+        */
+        size_t bucket_count() const
+        {
+            return m_nHashBitmask + 1;
+        }
+    };
+}}  // namespace cds::container
+
+#endif // ifndef __CDS_CONTAINER_MICHAEL_MAP_H
diff --git a/cds/container/michael_map_base.h b/cds/container/michael_map_base.h
new file mode 100644 (file)
index 0000000..976f2de
--- /dev/null
@@ -0,0 +1,36 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_MAP_BASE_H
+#define __CDS_CONTAINER_MICHAEL_MAP_BASE_H
+
+#include <cds/container/michael_set_base.h>
+
+namespace cds { namespace container {
+
+    /// MichaelHashMap related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace michael_map {
+        /// Type traits for MichaelHashMap class
+        typedef container::michael_set::type_traits  type_traits;
+
+        using container::michael_set::make_traits;
+
+        //@cond
+        namespace details {
+            using michael_set::details::init_hash_bitmask;
+        }
+        //@endcond
+
+    }   // namespace michael_map
+
+    //@cond
+    // Forward declarations
+    template <class GC, class OrderedList, class Traits = michael_map::type_traits>
+    class MichaelHashMap;
+    //@endcond
+
+}}  // namespace cds::container
+
+
+#endif  // ifndef __CDS_CONTAINER_MICHAEL_MAP_BASE_H
diff --git a/cds/container/michael_map_nogc.h b/cds/container/michael_map_nogc.h
new file mode 100644 (file)
index 0000000..7cb0f2d
--- /dev/null
@@ -0,0 +1,503 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_MAP_NOGC_H
+#define __CDS_CONTAINER_MICHAEL_MAP_NOGC_H
+
+#include <cds/container/michael_map_base.h>
+#include <cds/gc/nogc.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace container {
+
+    /// Michael's hash map (template specialization for gc::nogc)
+    /** @ingroup cds_nonintrusive_map
+        \anchor cds_nonintrusive_MichaelHashMap_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of map item.
+
+        See \ref cds_nonintrusive_MichaelHashMap_hp "MichaelHashMap" for description of template parameters.
+
+        The interface of the specialization is a little different.
+    */
+    template <
+        class OrderedList,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = michael_map::type_traits
+#else
+        class Traits
+#endif
+    >
+    class MichaelHashMap<gc::nogc, OrderedList, Traits>
+    {
+    public:
+        typedef OrderedList bucket_type     ;   ///< type of ordered list used as a bucket implementation
+        typedef Traits      options         ;   ///< Traits template parameters
+
+        typedef typename bucket_type::key_type          key_type        ;   ///< key type
+        typedef typename bucket_type::mapped_type       mapped_type     ;   ///< type of value stored in the list
+        typedef typename bucket_type::value_type        value_type      ;   ///< Pair used as the some functor's argument
+
+        typedef gc::nogc                                gc              ;   ///< No garbage collector
+        typedef typename bucket_type::key_comparator    key_comparator  ;   ///< key comparison functor
+
+        /// Hash functor for \ref key_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+
+        /// Bucket table allocator
+        typedef cds::details::Allocator< bucket_type, typename options::allocator >  bucket_table_allocator;
+
+    protected:
+        //@cond
+        typedef typename bucket_type::iterator          bucket_iterator;
+        typedef typename bucket_type::const_iterator    bucket_const_iterator;
+        //@endcond
+
+    protected:
+        item_counter    m_ItemCounter   ;   ///< Item counter
+        hash            m_HashFunctor   ;   ///< Hash functor
+
+        bucket_type *   m_Buckets       ;   ///< bucket table
+
+    private:
+        //@cond
+        const size_t    m_nHashBitmask;
+        //@endcond
+
+    protected:
+        /// Calculates hash value of \p key
+        size_t hash_value( key_type const & key ) const
+        {
+            return m_HashFunctor( key ) & m_nHashBitmask;
+        }
+
+        /// Returns the bucket (ordered list) for \p key
+        bucket_type&    bucket( key_type const& key )
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+
+    protected:
+            protected:
+        /// Forward iterator
+        /**
+            \p IsConst - constness boolean flag
+
+            The forward iterator for Michael's map is based on \p OrderedList forward iterator and has some features:
+            - it has no post-increment operator, only pre-increment
+            - it iterates items in unordered fashion
+        */
+        template <bool IsConst>
+        class iterator_type: private cds::intrusive::michael_set::details::iterator< bucket_type, IsConst >
+        {
+            //@cond
+            typedef cds::intrusive::michael_set::details::iterator< bucket_type, IsConst >  base_class;
+            friend class MichaelHashMap;
+            //@endcond
+
+        protected:
+            //@cond
+            //typedef typename base_class::bucket_type    bucket_type;
+            typedef typename base_class::bucket_ptr     bucket_ptr;
+            typedef typename base_class::list_iterator  list_iterator;
+
+            //typedef typename bucket_type::key_type      key_type;
+            //@endcond
+
+        public:
+            /// Value pointer type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::mapped_type, IsConst>::pointer   value_ptr;
+            /// Value reference type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::mapped_type, IsConst>::reference value_ref;
+
+            /// Key-value pair pointer type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::value_type, IsConst>::pointer   pair_ptr;
+            /// Key-value pair reference type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::value_type, IsConst>::reference pair_ref;
+
+        protected:
+            //@cond
+            iterator_type( list_iterator const& it, bucket_ptr pFirst, bucket_ptr pLast )
+                : base_class( it, pFirst, pLast )
+            {}
+            //@endcond
+
+        public:
+            /// Default ctor
+            iterator_type()
+                : base_class()
+            {}
+
+            /// Copy ctor
+            iterator_type( const iterator_type& src )
+                : base_class( src )
+            {}
+
+            /// Dereference operator
+            pair_ptr operator ->() const
+            {
+                assert( base_class::m_pCurBucket != null_ptr<bucket_ptr>() );
+                return base_class::m_itList.operator ->();
+            }
+
+            /// Dereference operator
+            pair_ref operator *() const
+            {
+                assert( base_class::m_pCurBucket != null_ptr<bucket_ptr>() );
+                return base_class::m_itList.operator *();
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                base_class::operator++();
+                return *this;
+            }
+
+            /// Assignment operator
+            iterator_type& operator = (const iterator_type& src)
+            {
+                base_class::operator =(src);
+                return *this;
+            }
+
+            /// Returns current bucket (debug function)
+            bucket_ptr bucket() const
+            {
+                return base_class::bucket();
+            }
+
+            /// Equality operator
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i )
+            {
+                return base_class::operator ==( i );
+            }
+            /// Equality operator
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i )
+            {
+                return !( *this == i );
+            }
+        };
+
+
+    public:
+        /// Forward iterator
+        typedef iterator_type< false >    iterator;
+
+        /// Const forward iterator
+        typedef iterator_type< true >     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a set
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        //@{
+        const_iterator begin() const
+        {
+            return get_const_begin();
+        }
+        const_iterator cbegin()
+        {
+            return get_const_begin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a set
+        //@{
+        const_iterator end() const
+        {
+            return get_const_end();
+        }
+        const_iterator cend()
+        {
+            return get_const_end();
+        }
+        //@}
+
+    private:
+        //@{
+        const_iterator get_const_begin() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[0]).begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+        const_iterator get_const_end() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[bucket_count() - 1]).end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+        //@}
+
+    public:
+        /// Initialize the map
+        /**
+            The Michael's hash map is non-expandable container. You should point the average count of items \p nMaxItemCount
+            when you create an object.
+            \p nLoadFactor parameter defines average count of items per bucket and it should be small number between 1 and 10.
+            Remember, since the bucket implementation is an ordered list, searching in the bucket is linear [<tt>O(nLoadFactor)</tt>].
+            Note, that many popular STL hash map implementation uses load factor 1.
+
+            The ctor defines hash table size as rounding <tt>nMacItemCount / nLoadFactor</tt> up to nearest power of two.
+        */
+        MichaelHashMap(
+            size_t nMaxItemCount,   ///< estimation of max item count in the hash set
+            size_t nLoadFactor      ///< load factor: estimation of max number of items in the bucket
+        ) : m_nHashBitmask( michael_map::details::init_hash_bitmask( nMaxItemCount, nLoadFactor ))
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename bucket_type::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ),"atomicity::empty_item_counter is not allowed as a item counter");
+
+            m_Buckets = bucket_table_allocator().NewArray( bucket_count() );
+        }
+
+        /// Clear hash set and destroy it
+        ~MichaelHashMap()
+        {
+            clear();
+            bucket_table_allocator().Delete( m_Buckets, bucket_count() );
+        }
+
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K>
+        iterator insert( const K& key )
+        {
+            bucket_type& refBucket = bucket( key );
+            bucket_iterator it = refBucket.insert( key );
+
+            if ( it != refBucket.end() ) {
+                ++m_ItemCounter;
+                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+            }
+
+            return end();
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K, typename V>
+        iterator insert( K const& key, V const& val )
+        {
+            bucket_type& refBucket = bucket( key );
+            bucket_iterator it = refBucket.insert( key, val );
+
+            if ( it != refBucket.end() ) {
+                ++m_ItemCounter;
+                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+            }
+
+            return end();
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted. <tt>item.second</tt> is a reference to item's value that may be changed.
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this map's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if the inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p f functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K, typename Func>
+        iterator insert_key( const K& key, Func func )
+        {
+            bucket_type& refBucket = bucket( key );
+            bucket_iterator it = refBucket.insert_key( key, func );
+
+            if ( it != refBucket.end() ) {
+                ++m_ItemCounter;
+                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+            }
+
+            return end();
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            \p key_type should be constructible from type \p K
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        iterator emplace( K&& key, Args&&... args )
+        {
+            bucket_type& refBucket = bucket( key );
+            bucket_iterator it = refBucket.emplace( std::forward<K>(key), std::forward<Args>(args)... );
+
+            if ( it != refBucket.end() ) {
+                ++m_ItemCounter;
+                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+            }
+
+            return end();
+        }
+#   endif
+
+        /// Ensures that the key \p key exists in the map
+        /**
+            The operation inserts new item if the key \p key is not found in the map.
+            Otherwise, the function returns an iterator that points to item found.
+
+            Returns <tt> std::pair<iterator, bool>  </tt> where \p first is an iterator pointing to
+            item found or inserted, \p second is true if new item has been added or \p false if the item
+            already is in the list.
+        */
+        template <typename K>
+        std::pair<iterator, bool> ensure( const K& key )
+        {
+            bucket_type& refBucket = bucket( key );
+            std::pair<bucket_iterator, bool> ret = refBucket.ensure( key );
+
+            if ( ret.second  )
+                ++m_ItemCounter;
+
+            return std::make_pair( iterator( ret.first, &refBucket, m_Buckets + bucket_count() ), ret.second );
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_MichaelMap_nogc_find
+
+            The function searches the item with key equal to \p key
+            and returns an iterator pointed to item found if the key is found,
+            and \ref end() otherwise
+        */
+        template <typename K>
+        iterator find( const K& key )
+        {
+            bucket_type& refBucket = bucket( key );
+            bucket_iterator it = refBucket.find( key );
+
+            if ( it != refBucket.end() )
+                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+
+            return end();
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelMap_nogc_find "find(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        iterator find_with( const K& key, Less pred )
+        {
+            bucket_type& refBucket = bucket( key );
+            bucket_iterator it = refBucket.find_with( key, pred );
+
+            if ( it != refBucket.end() )
+                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+
+            return end();
+        }
+
+        /// Clears the map (non-atomic)
+        /**
+            The function deletes all items from the map.
+            The function is not atomic. It cleans up each bucket and then resets the item counter to zero.
+            If there are a thread that performs insertion while \p clear is working the result is undefined in general case:
+            <tt> empty() </tt> may return \p true but the map may contain item(s).
+        */
+        void clear()
+        {
+            for ( size_t i = 0; i < bucket_count(); ++i )
+                m_Buckets[i].clear();
+            m_ItemCounter.reset();
+        }
+
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+            Thus, the correct item counting feature is an important part of Michael's map implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns the size of hash table
+        /**
+            Since MichaelHashMap cannot dynamically extend the hash table size,
+            the value returned is an constant depending on object initialization parameters;
+            see MichaelHashMap::MichaelHashMap for explanation.
+        */
+        size_t bucket_count() const
+        {
+            return m_nHashBitmask + 1;
+        }
+
+    };
+}} // namespace cds::container
+
+#endif // ifndef __CDS_CONTAINER_MICHAEL_MAP_NOGC_H
diff --git a/cds/container/michael_map_rcu.h b/cds/container/michael_map_rcu.h
new file mode 100644 (file)
index 0000000..eaabe39
--- /dev/null
@@ -0,0 +1,781 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_MAP_RCU_H
+#define __CDS_CONTAINER_MICHAEL_MAP_RCU_H
+
+#include <cds/container/michael_map_base.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace container {
+
+    /// Michael's hash map (template specialization for \ref cds_urcu_desc "RCU")
+    /** @ingroup cds_nonintrusive_map
+        \anchor cds_nonintrusive_MichaelHashMap_rcu
+
+        Source:
+            - [2002] Maged Michael "High performance dynamic lock-free hash tables and list-based sets"
+
+        Michael's hash table algorithm is based on lock-free ordered list and it is very simple.
+        The main structure is an array \p T of size \p M. Each element in \p T is basically a pointer
+        to a hash bucket, implemented as a singly linked list. The array of buckets cannot be dynamically expanded.
+        However, each bucket may contain unbounded number of items.
+
+        Template parameters are:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p OrderedList - ordered key-value list implementation used as bucket for hash map, for example, MichaelKVList.
+            The ordered list implementation specifies the \p Key and \p Value types stored in the hash-map, the reclamation
+            schema \p GC used by hash-map, the comparison functor for the type \p Key and other features specific for
+            the ordered list.
+        - \p Traits - type traits. See michael_map::type_traits for explanation.
+
+        Instead of defining \p Traits struct you may use option-based syntax with \p michael_map::make_traits metafunction
+        (this metafunction is a synonym for michael_set::make_traits).
+        For \p michael_map::make_traits the following option may be used:
+        - opt::hash - mandatory option, specifies hash functor.
+        - opt::item_counter - optional, specifies item counting policy. See michael_map::type_traits for explanation.
+        - opt::allocator - optional, bucket table allocator. Default is \ref CDS_DEFAULT_ALLOCATOR.
+
+        Many of the class function take a key argument of type \p K that in general is not \ref key_type.
+        \p key_type and an argument of template type \p K must meet the following requirements:
+        - \p key_type should be constructible from value of type \p K;
+        - the hash functor should be able to calculate correct hash value from argument \p key of type \p K:
+            <tt> hash( key_type(key) ) == hash( key ) </tt>
+        - values of type \p key_type and \p K should be comparable
+
+        <b>How to use</b>
+
+        The tips about how to use Michael's map see \ref cds_nonintrusive_MichaelHashMap_how_touse "MichaelHashMap".
+        Remember, that you should include RCU-related header file (for example, <tt>cds/urcu/general_buffered.h</tt>)
+        before including <tt>cds/container/michael_map_rcu.h</tt>.
+    */
+    template <
+        class RCU,
+        class OrderedList,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = michael_map::type_traits
+#else
+        class Traits
+#endif
+    >
+    class MichaelHashMap< cds::urcu::gc< RCU >, OrderedList, Traits >
+    {
+    public:
+        typedef OrderedList bucket_type     ;   ///< type of ordered list used as a bucket implementation
+        typedef Traits      options         ;   ///< Traits template parameters
+
+        typedef typename bucket_type::key_type          key_type        ;   ///< key type
+        typedef typename bucket_type::mapped_type       mapped_type     ;   ///< value type
+        typedef typename bucket_type::value_type        value_type      ;   ///< key/value pair stored in the list
+
+        typedef cds::urcu::gc< RCU >                    gc              ;   ///< RCU used as garbage collector
+        typedef typename bucket_type::key_comparator    key_comparator  ;   ///< key comparison functor
+
+        /// Hash functor for \ref key_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+
+        /// Bucket table allocator
+        typedef cds::details::Allocator< bucket_type, typename options::allocator >  bucket_table_allocator;
+
+        typedef typename bucket_type::rcu_lock      rcu_lock   ; ///< RCU scoped lock
+        typedef typename bucket_type::exempt_ptr    exempt_ptr ; ///< pointer to extracted node
+        /// Group of \p extract_xxx functions require external locking if underlying ordered list requires that
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = bucket_type::c_bExtractLockExternal;
+
+    protected:
+        item_counter    m_ItemCounter   ;   ///< Item counter
+        hash            m_HashFunctor   ;   ///< Hash functor
+
+        bucket_type *   m_Buckets       ;   ///< bucket table
+
+    private:
+        //@cond
+        const size_t    m_nHashBitmask;
+        //@endcond
+
+    protected:
+        /// Calculates hash value of \p key
+        template <typename Q>
+        size_t hash_value( Q const& key ) const
+        {
+            return m_HashFunctor( key ) & m_nHashBitmask;
+        }
+
+        /// Returns the bucket (ordered list) for \p key
+        //@{
+        template <typename Q>
+        bucket_type&    bucket( Q const& key )
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+        template <typename Q>
+        bucket_type const&    bucket( Q const& key ) const
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+        //@}
+    protected:
+        /// Forward iterator
+        /**
+            \p IsConst - constness boolean flag
+
+            The forward iterator for Michael's map is based on \p OrderedList forward iterator and has the following features:
+            - it has no post-increment operator, only pre-increment
+            - it iterates items in unordered fashion
+            - The iterator cannot be moved across thread boundary since it may contain GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the map.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use the iterator for the concurrent container
+            for debug purpose only.
+        */
+        template <bool IsConst>
+        class iterator_type: private cds::intrusive::michael_set::details::iterator< bucket_type, IsConst >
+        {
+            //@cond
+            typedef cds::intrusive::michael_set::details::iterator< bucket_type, IsConst >  base_class;
+            friend class MichaelHashMap;
+            //@endcond
+
+        protected:
+            //@cond
+            //typedef typename base_class::bucket_type    bucket_type;
+            typedef typename base_class::bucket_ptr     bucket_ptr;
+            typedef typename base_class::list_iterator  list_iterator;
+
+            //typedef typename bucket_type::key_type      key_type;
+            //@endcond
+
+        public:
+            /// Value pointer type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::mapped_type, IsConst>::pointer   value_ptr;
+            /// Value reference type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::mapped_type, IsConst>::reference value_ref;
+
+            /// Key-value pair pointer type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::value_type, IsConst>::pointer   pair_ptr;
+            /// Key-value pair reference type (const for const_iterator)
+            typedef typename cds::details::make_const_type<typename MichaelHashMap::value_type, IsConst>::reference pair_ref;
+
+        protected:
+            //@cond
+            iterator_type( list_iterator const& it, bucket_ptr pFirst, bucket_ptr pLast )
+                : base_class( it, pFirst, pLast )
+            {}
+            //@endcond
+
+        public:
+            /// Default ctor
+            iterator_type()
+                : base_class()
+            {}
+
+            /// Copy ctor
+            iterator_type( const iterator_type& src )
+                : base_class( src )
+            {}
+
+            /// Dereference operator
+            pair_ptr operator ->() const
+            {
+                assert( base_class::m_pCurBucket != null_ptr<bucket_ptr>() );
+                return base_class::m_itList.operator ->();
+            }
+
+            /// Dereference operator
+            pair_ref operator *() const
+            {
+                assert( base_class::m_pCurBucket != null_ptr<bucket_ptr>() );
+                return base_class::m_itList.operator *();
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                base_class::operator++();
+                return *this;
+            }
+
+            /// Assignment operator
+            iterator_type& operator = (const iterator_type& src)
+            {
+                base_class::operator =(src);
+                return *this;
+            }
+
+            /// Returns current bucket (debug function)
+            bucket_ptr bucket() const
+            {
+                return base_class::bucket();
+            }
+
+            /// Equality operator
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i )
+            {
+                return base_class::operator ==( i );
+            }
+            /// Equality operator
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i )
+            {
+                return !( *this == i );
+            }
+        };
+
+    public:
+        /// Forward iterator
+        typedef iterator_type< false >    iterator;
+
+        /// Const forward iterator
+        typedef iterator_type< true >     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a map
+        /**
+            For empty map \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a map
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the map.
+            For empty map \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a map
+        //@{
+        const_iterator begin() const
+        {
+            return get_const_begin();
+        }
+        const_iterator cbegin()
+        {
+            return get_const_begin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a map
+        //@{
+        const_iterator end() const
+        {
+            return get_const_end();
+        }
+        const_iterator cend()
+        {
+            return get_const_end();
+        }
+        //@}
+
+    private:
+        //@cond
+        const_iterator get_const_begin() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[0]).begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+        const_iterator get_const_end() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[bucket_count() - 1]).end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+        //@endcond
+
+    public:
+        /// Initializes the map
+        /**
+            The Michael's hash map is non-expandable container. You should point the average count of items \p nMaxItemCount
+            when you create an object.
+            \p nLoadFactor parameter defines average count of items per bucket and it should be small number between 1 and 10.
+            Remember, since the bucket implementation is an ordered list, searching in the bucket is linear [<tt>O(nLoadFactor)</tt>].
+            Note, that many popular STL hash map implementation uses load factor 1.
+
+            The ctor defines hash table size as rounding <tt>nMacItemCount / nLoadFactor</tt> up to nearest power of two.
+        */
+        MichaelHashMap(
+            size_t nMaxItemCount,   ///< estimation of max item count in the hash map
+            size_t nLoadFactor      ///< load factor: estimation of max number of items in the bucket
+        ) : m_nHashBitmask( michael_map::details::init_hash_bitmask( nMaxItemCount, nLoadFactor ))
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename bucket_type::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ), "atomicity::empty_item_counter is not allowed as a item counter");
+
+            m_Buckets = bucket_table_allocator().NewArray( bucket_count() );
+        }
+
+        /// Clears hash map and destroys it
+        ~MichaelHashMap()
+        {
+            clear();
+            bucket_table_allocator().Delete( m_Buckets, bucket_count() );
+        }
+
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            The function applies RCU lock internally.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( const K& key )
+        {
+            const bool bRet = bucket( key ).insert( key );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            The function applies RCU lock internally.
+
+            Returns \p true if \p val is inserted into the map, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( K const& key, V const& val )
+        {
+            const bool bRet = bucket( key ).insert( key, val );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted:
+                - <tt>item.first</tt> is a const reference to item's key that cannot be changed.
+                - <tt>item.second</tt> is a reference to item's value that may be changed.
+
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this map's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            The function applies RCU lock internally.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            const bool bRet = bucket( key ).insert_key( key, func );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+
+        /// Ensures that the \p key exists in the map
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the map, then the new item created from \p key
+            is inserted into the map (note that in this case the \ref key_type should be
+            constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref mapped_type;
+            however, \p func must guarantee that during changing no any other modifications
+            could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            The function applies RCU lock internally.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( K const& key, Func func )
+        {
+            std::pair<bool, bool> bRet = bucket( key ).ensure( key, func );
+            if ( bRet.first && bRet.second )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            \p key_type should be constructible from type \p K
+
+            Returns \p true if inserting successful, \p false otherwise.
+
+            The function applies RCU lock internally.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            const bool bRet = bucket( key ).emplace( std::forward<K>(key), std::forward<Args>(args)... );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+#   endif
+
+        /// Deletes \p key from the map
+        /** \anchor cds_nonintrusive_MichaelMap_rcu_erase_val
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if \p key is found and deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( const K& key )
+        {
+            const bool bRet = bucket( key ).erase( key );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelMap_rcu_erase_val "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less predicate has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool erase_with( const K& key, Less pred )
+        {
+            const bool bRet = bucket( key ).erase_with( key, pred );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes \p key from the map
+        /** \anchor cds_nonintrusive_MichaelMap_rcu_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& item) { ... }
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename K, typename Func>
+        bool erase( const K& key, Func f )
+        {
+            const bool bRet = bucket( key ).erase( key, f );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelMap_rcu_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( const K& key, Less pred, Func f )
+        {
+            const bool bRet = bucket( key ).erase_with( key, pred, f );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Extracts an item from the map
+        /** \anchor cds_nonintrusive_MichaelHashMap_rcu_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the map, places item pointer into \p dest argument, and returns \p true.
+            If the item is not found the function return \p false.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the map
+            and returns a pointer to item found.
+            You should lock RCU before calling of the function, and you should synchronize RCU
+            outside the RCU lock to free extracted item
+
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/container/michael_kvlist_rcu.h>
+            #include <cds/container/michael_map_rcu.h>
+
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::container::MichaelKVList< rcu, int, Foo > rcu_michael_list;
+            typedef cds::container::MichaelHashMap< rcu, rcu_michael_list, foo_traits > rcu_michael_map;
+
+            rcu_michael_map theMap;
+            // ...
+
+            rcu_michael_map::exempt_ptr p;
+            {
+                // first, we should lock RCU
+                rcu_michael_map::rcu_lock lock;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theMap.extract( p, 10 )) {
+                    // do something with p
+                    ...
+                }
+            }
+
+            // We may safely release p here
+            // release() passes the pointer to RCU reclamation cycle
+            p.release();
+            \endcode
+        */
+        template <typename K>
+        bool extract( exempt_ptr& dest, K const& key )
+        {
+            if ( bucket( key ).extract( dest, key )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Extracts an item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelHashMap_rcu_extract "extract(exempt_ptr&, K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool extract_with( exempt_ptr& dest, K const& key, Less pred )
+        {
+            if ( bucket( key ).extract_with( dest, key, pred )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_MichaelMap_rcu_find_cfunc
+
+            The function searches the item with key equal to \p key and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change \p item.second. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the map's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename K, typename Func>
+        bool find( K const& key, Func f ) const
+        {
+            return bucket( key ).find( key, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelMap_rcu_find_cfunc "find(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool find_with( K const& key, Less pred, Func f ) const
+        {
+            return bucket( key ).find_with( key, pred, f );
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_MichaelMap_rcu_find_val
+
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+
+            The function applies RCU lock internally.
+        */
+        template <typename K>
+        bool find( K const& key ) const
+        {
+            return bucket( key ).find( key );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelMap_rcu_find_val "find(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool find_with( K const& key, Less pred ) const
+        {
+            return bucket( key ).find_with( key, pred );
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_nonintrusive_MichaelHashMap_rcu_get
+            The function searches the item with key equal to \p key and returns the pointer to item found.
+            If \p key is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p K that can be not the same as \p key_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::container::MichaelHashMap< your_template_parameters > hash_map;
+            hash_map theMap;
+            // ...
+            {
+                // Lock RCU
+                hash_map::rcu_lock lock;
+
+                hash_map::value_type * = theMap.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be freed at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename K>
+        value_type * get( K const& key ) const
+        {
+            return bucket( key ).get( key );
+        }
+
+        /// Finds \p key and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelHashMap_rcu_get "get(K const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        value_type * get_with( K const& key, Less pred ) const
+        {
+            return bucket( key ).get_with( key, pred );
+        }
+
+        /// Clears the map (non-atomic)
+        /**
+            The function erases all items from the map.
+
+            The function is not atomic. It cleans up each bucket and then resets the item counter to zero.
+            If there are a thread that performs insertion while \p clear is working the result is undefined in general case:
+            <tt> empty() </tt> may return \p true but the map may contain item(s).
+            Therefore, \p clear may be used only for debugging purposes.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        void clear()
+        {
+            for ( size_t i = 0; i < bucket_count(); ++i )
+                m_Buckets[i].clear();
+            m_ItemCounter.reset();
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+            Thus, the correct item counting is an important part of the map implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns the size of hash table
+        /**
+            Since MichaelHashMap cannot dynamically extend the hash table size,
+            the value returned is an constant depending on object initialization parameters;
+            see MichaelHashMap::MichaelHashMap for explanation.
+        */
+        size_t bucket_count() const
+        {
+            return m_nHashBitmask + 1;
+        }
+    };
+}}  // namespace cds::container
+
+#endif // ifndef __CDS_CONTAINER_MICHAEL_MAP_RCU_H
diff --git a/cds/container/michael_set.h b/cds/container/michael_set.h
new file mode 100644 (file)
index 0000000..9bdcfae
--- /dev/null
@@ -0,0 +1,772 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_SET_H
+#define __CDS_CONTAINER_MICHAEL_SET_H
+
+#include <cds/container/michael_set_base.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace container {
+
+    /// Michael's hash set
+    /** @ingroup cds_nonintrusive_set
+        \anchor cds_nonintrusive_MichaelHashSet_hp
+
+        Source:
+            - [2002] Maged Michael "High performance dynamic lock-free hash tables and list-based sets"
+
+        Michael's hash table algorithm is based on lock-free ordered list and it is very simple.
+        The main structure is an array \p T of size \p M. Each element in \p T is basically a pointer
+        to a hash bucket, implemented as a singly linked list. The array of buckets cannot be dynamically expanded.
+        However, each bucket may contain unbounded number of items.
+
+        Template parameters are:
+        - \p GC - Garbage collector used. You may use any \ref cds_garbage_collector "Garbage collector"
+            from the \p libcds library.
+            Note the \p GC must be the same as the GC used for \p OrderedList
+        - \p OrderedList - ordered list implementation used as bucket for hash set, for example, MichaelList.
+            The ordered list implementation specifies the type \p T stored in the hash-set, the reclamation
+            schema \p GC used by hash-set, the comparison functor for the type \p T and other features specific for
+            the ordered list.
+        - \p Traits - type traits. See michael_set::type_traits for explanation.
+
+        Instead of defining \p Traits struct you may use option-based syntax with michael_set::make_traits metafunction.
+        For michael_set::make_traits the following option may be used:
+        - opt::hash - mandatory option, specifies hash functor.
+        - opt::item_counter - optional, specifies item counting policy. See michael_set::type_traits for explanation.
+        - opt::allocator - optional, bucket table allocator. Default is \ref CDS_DEFAULT_ALLOCATOR.
+
+        There are the specializations:
+        - for \ref cds_urcu_desc "RCU" - declared in <tt>cd/container/michael_set_rcu.h</tt>,
+            see \ref cds_nonintrusive_MichaelHashSet_rcu "MichaelHashSet<RCU>".
+        - for \ref cds::gc::nogc declared in <tt>cds/container/michael_set_nogc.h</tt>,
+            see \ref cds_nonintrusive_MichaelHashSet_nogc "MichaelHashSet<gc::nogc>".
+
+        \anchor cds_nonintrusive_MichaelHashSet_hash_functor
+        <b>Hash functor</b>
+
+        Some member functions of Michael's hash set accept the key parameter of type \p Q which differs from node type \p value_type.
+        It is expected that type \p Q contains full key of node type \p value_type, and if keys of type \p Q and \p value_type
+        are equal the hash values of these keys must be equal too.
+
+        The hash functor <tt>Traits::hash</tt> should accept parameters of both type:
+        \code
+        // Our node type
+        struct Foo {
+            std::string     key_    ;   // key field
+            // ... other fields
+        };
+
+        // Hash functor
+        struct fooHash {
+            size_t operator()( const std::string& s ) const
+            {
+                return std::hash( s );
+            }
+
+            size_t operator()( const Foo& f ) const
+            {
+                return (*this)( f.key_ );
+            }
+        };
+        \endcode
+
+        <b>Iterators</b>
+
+        The class supports a forward iterator (\ref iterator and \ref const_iterator).
+        The iteration is unordered.
+        The iterator object is thread-safe: the element pointed by the iterator object is guarded,
+        so, the element cannot be reclaimed while the iterator object is alive.
+        However, passing an iterator object between threads is dangerous.
+
+        \warning Due to concurrent nature of Michael's set it is not guarantee that you can iterate
+        all elements in the set: any concurrent deletion can exclude the element
+        pointed by the iterator from the set, and your iteration can be terminated
+        before end of the set. Therefore, such iteration is more suitable for debugging purpose only
+
+        Remember, each iterator object requires an additional hazard pointer, that may be
+        a limited resource for \p GC like as gc::HP and gc::HRC (for gc::PTB the count of
+        guards is unlimited).
+
+        The iterator class supports the following minimalistic interface:
+        \code
+        struct iterator {
+        // Default ctor
+        iterator();
+
+        // Copy ctor
+        iterator( iterator const& s);
+
+        value_type * operator ->() const;
+        value_type& operator *() const;
+
+        // Pre-increment
+        iterator& operator ++();
+
+        // Copy assignment
+        iterator& operator = (const iterator& src);
+
+        bool operator ==(iterator const& i ) const;
+        bool operator !=(iterator const& i ) const;
+        };
+        \endcode
+        Note, the iterator object returned by \ref end, \p cend member functions points to \p NULL and should not be dereferenced.
+
+        <b>How to use</b>
+
+        Suppose, we have the following type \p Foo that we want to store in our MichaelHashSet:
+        \code
+        struct Foo {
+            int     nKey    ;   // key field
+            int     nVal    ;   // value field
+        };
+        \endcode
+
+        To use \p %MichaelHashSet for \p Foo values, you should first choose suitable ordered list class
+        that will be used as a bucket for the set. We will use gc::PTB reclamation schema and
+        MichaelList as a bucket type. Also, for ordered list we should develop a comparator for our \p Foo
+        struct.
+        \code
+        #include <cds/container/michael_list_ptb.h>
+        #include <cds/container/michael_set.h>
+
+        namespace cc = cds::container;
+
+        // Foo comparator
+        struct Foo_cmp {
+            int operator ()(Foo const& v1, Foo const& v2 ) const
+            {
+                if ( std::less( v1.nKey, v2.nKey ))
+                    return -1;
+                return std::less(v2.nKey, v1.nKey) ? 1 : 0;
+            }
+        };
+
+        // Our ordered list
+        typedef cc::MichaelList< cds::gc::PTB, Foo,
+            typename cc::michael_list::make_traits<
+                cc::opt::compare< Foo_cmp >     // item comparator option
+            >::type
+        > bucket_list;
+
+        // Hash functor for Foo
+        struct foo_hash {
+            size_t operator ()( int i ) const
+            {
+                return std::hash( i );
+            }
+            size_t operator()( Foo const& i ) const
+            {
+                return std::hash( i.nKey );
+            }
+        };
+
+        // Declare set type.
+        // Note that \p GC template parameter of ordered list must be equal \p GC for the set.
+        typedef cc::MichaelHashSet< cds::gc::PTB, bucket_list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< foo_hash >
+            >::type
+        > foo_set;
+
+        // Set variable
+        foo_set fooSet;
+        \endcode
+    */
+    template <
+        class GC,
+        class OrderedList,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = michael_set::type_traits
+#else
+        class Traits
+#endif
+    >
+    class MichaelHashSet
+    {
+    public:
+        typedef OrderedList bucket_type     ;   ///< type of ordered list used as a bucket implementation
+        typedef Traits      options         ;   ///< Traits template parameters
+
+        typedef typename bucket_type::value_type        value_type      ;   ///< type of value stored in the list
+        typedef GC                                      gc              ;   ///< Garbage collector
+        typedef typename bucket_type::key_comparator    key_comparator  ;   ///< key comparison functor
+
+        /// Hash functor for \ref value_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+
+        /// Bucket table allocator
+        typedef cds::details::Allocator< bucket_type, typename options::allocator >  bucket_table_allocator;
+
+        typedef typename bucket_type::guarded_ptr      guarded_ptr; ///< Guarded pointer
+
+    protected:
+        item_counter    m_ItemCounter   ;   ///< Item counter
+        hash            m_HashFunctor   ;   ///< Hash functor
+
+        bucket_type *   m_Buckets       ;   ///< bucket table
+
+    private:
+        //@cond
+        const size_t    m_nHashBitmask;
+        //@endcond
+
+    protected:
+        /// Calculates hash value of \p key
+        template <typename Q>
+        size_t hash_value( Q const& key ) const
+        {
+            return m_HashFunctor( key ) & m_nHashBitmask;
+        }
+
+        /// Returns the bucket (ordered list) for \p key
+        template <typename Q>
+        bucket_type&    bucket( Q const& key )
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+
+    public:
+        /// Forward iterator
+        typedef michael_set::details::iterator< bucket_type, false >    iterator;
+
+        /// Const forward iterator
+        typedef michael_set::details::iterator< bucket_type, true >     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a set
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        //@{
+        const_iterator begin() const
+        {
+            return get_const_begin();
+        }
+        const_iterator cbegin()
+        {
+            return get_const_begin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a set
+        //@{
+        const_iterator end() const
+        {
+            return get_const_end();
+        }
+        const_iterator cend()
+        {
+            return get_const_end();
+        }
+        //@}
+
+    private:
+        //@cond
+        const_iterator get_const_begin() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[0]).begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+        const_iterator get_const_end() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[bucket_count() - 1]).end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+        //@endcond
+
+    public:
+        /// Initialize hash set
+        /**
+            The Michael's hash set is non-expandable container. You should point the average count of items \p nMaxItemCount
+            when you create an object.
+            \p nLoadFactor parameter defines average count of items per bucket and it should be small number between 1 and 10.
+            Remember, since the bucket implementation is an ordered list, searching in the bucket is linear [<tt>O(nLoadFactor)</tt>].
+            Note, that many popular STL hash map implementation uses load factor 1.
+
+            The ctor defines hash table size as rounding <tt>nMacItemCount / nLoadFactor</tt> up to nearest power of two.
+        */
+        MichaelHashSet(
+            size_t nMaxItemCount,   ///< estimation of max item count in the hash set
+            size_t nLoadFactor      ///< load factor: estimation of max number of items in the bucket
+        ) : m_nHashBitmask( michael_set::details::init_hash_bitmask( nMaxItemCount, nLoadFactor ))
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename bucket_type::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ), "atomicity::empty_item_counter is not allowed as a item counter");
+
+            m_Buckets = bucket_table_allocator().NewArray( bucket_count() );
+        }
+
+        /// Clear hash set and destroy it
+        ~MichaelHashSet()
+        {
+            clear();
+            bucket_table_allocator().Delete( m_Buckets, bucket_count() );
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the set.
+
+            The type \p Q should contain as minimum the complete key for the node.
+            The object of \ref value_type should be constructible from a value of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            const bool bRet = bucket( val ).insert( val );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-fields of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success. It may be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& val, Func f )
+        {
+            const bool bRet = bucket( val ).insert( val, f );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Ensures that the item exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p val key not found in the set, then the new item created from \p val
+            is inserted into the set. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p key passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( const Q& val, Func func )
+        {
+            std::pair<bool, bool> bRet = bucket( val ).ensure( val, func );
+            if ( bRet.first && bRet.second )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            bool bRet = bucket( value_type(std::forward<Args>(args)...) ).emplace( std::forward<Args>(args)... );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+#   endif
+
+        /// Deletes \p key from the set
+        /** \anchor cds_nonintrusive_MichaelSet_erase_val
+
+            Since the key of MichaelHashSet's item type \ref value_type is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The set item comparator should be able to compare the type \p value_type
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+            const bool bRet = bucket( key ).erase( key );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelSet_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+            const bool bRet = bucket( key ).erase_with( key, pred );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes \p key from the set
+        /** \anchor cds_nonintrusive_MichaelSet_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type const& val);
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Since the key of %MichaelHashSet's \p value_type is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+            const bool bRet = bucket( key ).erase( key, f );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelSet_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+            const bool bRet = bucket( key ).erase_with( key, pred, f );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Extracts the item with specified \p key
+        /** \anchor cds_nonintrusive_MichaelHashSet_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the set, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The extracted item is freed automatically when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::MichaelHashSet< your_template_args > michael_set;
+            michael_set theSet;
+            // ...
+            {
+                michael_set::guarded_ptr gp;
+                theSet.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& dest, Q const& key )
+        {
+            const bool bRet = bucket( key ).extract( dest, key );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Extracts the item using compare functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelHashSet_hp_extract "extract(guarded_ptr&, Q const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& dest, Q const& key, Less pred )
+        {
+            const bool bRet = bucket( key ).extract_with( dest, key, pred );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_nonintrusive_MichaelSet_find_func
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return bucket( val ).find( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelSet_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return bucket( val ).find_with( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_nonintrusive_MichaelSet_find_cfunc
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return bucket( val ).find( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelSet_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return bucket( val ).find_with( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_nonintrusive_MichaelSet_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \ref value_type.
+        */
+        template <typename Q>
+        bool find( Q const& val )
+        {
+            return bucket( val ).find( val );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelSet_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+            return bucket( val ).find_with( val, pred );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_nonintrusive_MichaelHashSet_hp_get
+            The function searches the item with key equal to \p val
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p val is found, and \p false otherwise.
+            If \p val is not found the \p ptr parameter is not changed.
+
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::MichaeHashSet< your_template_params >  michael_set;
+            michael_set theSet;
+            // ...
+            {
+                michael_set::guarded_ptr gp;
+                if ( theSet.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for \p OrderedList template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& ptr, Q const& val )
+        {
+            return bucket( val ).get( ptr, val );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelHashSet_hp_get "get( guarded_ptr& ptr, Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& ptr, Q const& val, Less pred )
+        {
+            return bucket( val ).get_with( ptr, val, pred );
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function erases all items from the set.
+
+            The function is not atomic. It cleans up each bucket and then resets the item counter to zero.
+            If there are a thread that performs insertion while \p clear is working the result is undefined in general case:
+            <tt> empty() </tt> may return \p true but the set may contain item(s).
+            Therefore, \p clear may be used only for debugging purposes.
+        */
+        void clear()
+        {
+            for ( size_t i = 0; i < bucket_count(); ++i )
+                m_Buckets[i].clear();
+            m_ItemCounter.reset();
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+            Thus, the correct item counting feature is an important part of Michael's set implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns the size of hash table
+        /**
+            Since MichaelHashSet cannot dynamically extend the hash table size,
+            the value returned is an constant depending on object initialization parameters;
+            see MichaelHashSet::MichaelHashSet for explanation.
+        */
+        size_t bucket_count() const
+        {
+            return m_nHashBitmask + 1;
+        }
+    };
+
+}} // namespace cds::container
+
+#endif // ifndef __CDS_CONTAINER_MICHAEL_SET_H
diff --git a/cds/container/michael_set_base.h b/cds/container/michael_set_base.h
new file mode 100644 (file)
index 0000000..41ea147
--- /dev/null
@@ -0,0 +1,44 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_SET_BASE_H
+#define __CDS_CONTAINER_MICHAEL_SET_BASE_H
+
+#include <cds/intrusive/michael_set_base.h>
+
+namespace cds { namespace container {
+
+    /// MichaelHashSet related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace michael_set {
+
+        /// Type traits for MichaelHashSet class (typedef for cds::intrusive::michael_set::type_traits)
+        typedef intrusive::michael_set::type_traits  type_traits;
+
+        /// Metafunction converting option list to traits struct
+        /**
+            This is a synonym for intrusive::michael_set::make_traits
+        */
+        template <CDS_DECL_OPTIONS3>
+        struct make_traits {
+            typedef typename intrusive::michael_set::make_traits<CDS_OPTIONS3>::type type  ;   ///< Result of metafunction
+        };
+
+        //@cond
+        namespace details {
+            using intrusive::michael_set::details::init_hash_bitmask;
+            using intrusive::michael_set::details::list_iterator_selector;
+            using intrusive::michael_set::details::iterator;
+        }
+        //@endcond
+    }
+
+    //@cond
+    // Forward declarations
+    template <class GC, class OrderedList, class Traits = michael_set::type_traits>
+    class MichaelHashSet;
+    //@endcond
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_MICHAEL_SET_BASE_H
diff --git a/cds/container/michael_set_nogc.h b/cds/container/michael_set_nogc.h
new file mode 100644 (file)
index 0000000..46b6058
--- /dev/null
@@ -0,0 +1,329 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_SET_NOGC_H
+#define __CDS_CONTAINER_MICHAEL_SET_NOGC_H
+
+#include <cds/container/michael_set_base.h>
+#include <cds/gc/nogc.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace container {
+
+    /// Michael's hash set (template specialization for gc::nogc)
+    /** @ingroup cds_nonintrusive_set
+        \anchor cds_nonintrusive_MichaelHashSet_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+
+        See \ref cds_nonintrusive_MichaelHashSet_hp "MichaelHashSet" for description of template parameters.
+        The template parameter \p OrderedList should be any gc::nogc-derived ordered list, for example,
+        \ref cds_nonintrusive_MichaelList_nogc "persistent MichaelList".
+
+        The interface of the specialization is a slightly different.
+    */
+    template <
+        class OrderedList,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = michael_set::type_traits
+#else
+        class Traits
+#endif
+    >
+    class MichaelHashSet< gc::nogc, OrderedList, Traits >
+    {
+    public:
+        typedef OrderedList bucket_type     ;   ///< type of ordered list used as a bucket implementation
+        typedef Traits      options         ;   ///< Traits template parameters
+
+        typedef typename bucket_type::value_type        value_type      ;   ///< type of value stored in the list
+        typedef gc::nogc                                gc              ;   ///< Garbage collector
+        typedef typename bucket_type::key_comparator    key_comparator  ;   ///< key comparison functor
+
+        /// Hash functor for \ref value_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+
+        /// Bucket table allocator
+        typedef cds::details::Allocator< bucket_type, typename options::allocator >  bucket_table_allocator;
+
+    protected:
+        //@cond
+        typedef typename bucket_type::iterator          bucket_iterator;
+        typedef typename bucket_type::const_iterator    bucket_const_iterator;
+        //@endcond
+
+    protected:
+        item_counter    m_ItemCounter   ;   ///< Item counter
+        hash            m_HashFunctor   ;   ///< Hash functor
+
+        bucket_type *   m_Buckets       ;   ///< bucket table
+
+    private:
+        //@cond
+        const size_t    m_nHashBitmask;
+        //@endcond
+
+    protected:
+        /// Calculates hash value of \p key
+        template <typename Q>
+        size_t hash_value( const Q& key ) const
+        {
+            return m_HashFunctor( key ) & m_nHashBitmask;
+        }
+
+        /// Returns the bucket (ordered list) for \p key
+        template <typename Q>
+        bucket_type&    bucket( const Q& key )
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for Michael's set is based on \p OrderedList forward iterator and has some features:
+            - it has no post-increment operator
+            - it iterates items in unordered fashion
+        */
+        typedef michael_set::details::iterator< bucket_type, false >    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef michael_set::details::iterator< bucket_type, true >     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a set
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        //@{
+        const_iterator begin() const
+        {
+            return get_const_begin();
+        }
+        const_iterator cbegin()
+        {
+            return get_const_begin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a set
+        //@{
+        const_iterator end() const
+        {
+            return get_const_end();
+        }
+        const_iterator cend()
+        {
+            return get_const_end();
+        }
+        //@}
+
+    private:
+        //@{
+        const_iterator get_const_begin() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[0]).begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+        const_iterator get_const_end() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[bucket_count() - 1]).end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+        //@}
+
+    public:
+        /// Initialize hash set
+        /**
+            See \ref cds_nonintrusive_MichaelHashSet_hp "MichaelHashSet" ctor for explanation
+        */
+        MichaelHashSet(
+            size_t nMaxItemCount,   ///< estimation of max item count in the hash set
+            size_t nLoadFactor      ///< load factor: estimation of max number of items in the bucket
+        ) : m_nHashBitmask( michael_set::details::init_hash_bitmask( nMaxItemCount, nLoadFactor ))
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename bucket_type::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ), "atomicity::empty_item_counter is not allowed as a item counter");
+
+            m_Buckets = bucket_table_allocator().NewArray( bucket_count() );
+        }
+
+        /// Clear hash set and destroy it
+        ~MichaelHashSet()
+        {
+            clear();
+            bucket_table_allocator().Delete( m_Buckets, bucket_count() );
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            Return an iterator pointing to inserted item if success, otherwise \ref end()
+        */
+        template <typename Q>
+        iterator insert( const Q& val )
+        {
+            bucket_type& refBucket = bucket( val );
+            bucket_iterator it = refBucket.insert( val );
+
+            if ( it != refBucket.end() ) {
+                ++m_ItemCounter;
+                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+            }
+
+            return end();
+        }
+
+#ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Return an iterator pointing to inserted item if success \ref end() otherwise
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        iterator emplace( Args&&... args )
+        {
+            bucket_type& refBucket = bucket( value_type(std::forward<Args>(args)...));
+            bucket_iterator it = refBucket.emplace( std::forward<Args>(args)... );
+
+            if ( it != refBucket.end() ) {
+                ++m_ItemCounter;
+                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+            }
+
+            return end();
+        }
+#endif
+
+        /// Ensures that the item \p val exists in the set
+        /**
+            The operation inserts new item if the key \p val is not found in the set.
+            Otherwise, the function returns an iterator that points to item found.
+
+            Returns <tt> std::pair<iterator, bool>  </tt> where \p first is an iterator pointing to
+            item found or inserted, \p second is true if new item has been added or \p false if the item
+            already is in the set.
+        */
+        template <typename Q>
+        std::pair<iterator, bool> ensure( const Q& val )
+        {
+            bucket_type& refBucket = bucket( val );
+            std::pair<bucket_iterator, bool> ret = refBucket.ensure( val );
+
+            if ( ret.first != refBucket.end() ) {
+                if ( ret.second )
+                    ++m_ItemCounter;
+                return std::make_pair( iterator( ret.first, &refBucket, m_Buckets + bucket_count() ), ret.second );
+            }
+
+            return std::make_pair( end(), ret.second );
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_MichealSet_nogc_find
+            The function searches the item with key equal to \p key
+            and returns an iterator pointed to item found if the key is found,
+            and \ref end() otherwise
+        */
+        template <typename Q>
+        iterator find( Q const& key )
+        {
+            bucket_type& refBucket = bucket( key );
+            bucket_iterator it = refBucket.find( key );
+            if ( it != refBucket.end() )
+                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+
+            return end();
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichealSet_nogc_find "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        iterator find_with( Q const& key, Less pred )
+        {
+            bucket_type& refBucket = bucket( key );
+            bucket_iterator it = refBucket.find_with( key, pred );
+            if ( it != refBucket.end() )
+                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+
+            return end();
+        }
+
+
+        /// Clears the set (non-atomic, not thread-safe)
+        /**
+            The function deletes all items from the set.
+            The function is not atomic and even not thread-safe.
+            It cleans up each bucket and then resets the item counter to zero.
+            If there are a thread that performs insertion while \p clear is working the result is undefined in general case:
+            <tt> empty() </tt> may return \p true but the set may contain item(s).
+        */
+        void clear()
+        {
+            for ( size_t i = 0; i < bucket_count(); ++i )
+                m_Buckets[i].clear();
+            m_ItemCounter.reset();
+        }
+
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+            Thus, the correct item counting feature is an important part of Michael's set implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns the size of hash table
+        /**
+            Since MichaelHashSet cannot dynamically extend the hash table size,
+            the value returned is an constant depending on object initialization parameters;
+            see MichaelHashSet::MichaelHashSet for explanation.
+        */
+        size_t bucket_count() const
+        {
+            return m_nHashBitmask + 1;
+        }
+    };
+
+}} // cds::container
+
+#endif // ifndef __CDS_CONTAINER_MICHAEL_SET_NOGC_H
diff --git a/cds/container/michael_set_rcu.h b/cds/container/michael_set_rcu.h
new file mode 100644 (file)
index 0000000..67d4eff
--- /dev/null
@@ -0,0 +1,754 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MICHAEL_SET_RCU_H
+#define __CDS_CONTAINER_MICHAEL_SET_RCU_H
+
+#include <cds/container/michael_set_base.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace container {
+
+    /// Michael's hash set (template specialization for \ref cds_urcu_desc "RCU")
+    /** @ingroup cds_nonintrusive_set
+        \anchor cds_nonintrusive_MichaelHashSet_rcu
+
+        Source:
+            - [2002] Maged Michael "High performance dynamic lock-free hash tables and list-based sets"
+
+        Michael's hash table algorithm is based on lock-free ordered list and it is very simple.
+        The main structure is an array \p T of size \p M. Each element in \p T is basically a pointer
+        to a hash bucket, implemented as a singly linked list. The array of buckets cannot be dynamically expanded.
+        However, each bucket may contain unbounded number of items.
+
+        Template parameters are:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p OrderedList - ordered list implementation used as bucket for hash set, for example, MichaelList.
+            The ordered list implementation specifies the type \p T stored in the hash-set,
+            the comparison functor for the type \p T and other features specific for
+            the ordered list.
+        - \p Traits - type traits. See michael_set::type_traits for explanation.
+
+        Instead of defining \p Traits struct you may use option-based syntax with michael_set::make_traits metafunction.
+        For michael_set::make_traits the following option may be used:
+        - opt::hash - mandatory option, specifies hash functor.
+        - opt::item_counter - optional, specifies item counting policy. See michael_set::type_traits for explanation.
+        - opt::allocator - optional, bucket table allocator. Default is \ref CDS_DEFAULT_ALLOCATOR.
+
+        \note About hash functor see \ref cds_nonintrusive_MichaelHashSet_hash_functor "MichaelSet".
+
+        <b>How to use</b>
+
+        Suppose, we have the following type \p Foo that we want to store in our MichaelHashSet:
+        \code
+        struct Foo {
+            int     nKey    ;   // key field
+            int     nVal    ;   // value field
+        };
+        \endcode
+
+        To use \p %MichaelHashSet for \p Foo values, you should first choose suitable ordered list class
+        that will be used as a bucket for the set. We will cds::urcu::general_buffered<> RCU type and
+        MichaelList as a bucket type.
+        You should include RCU-related header file (<tt>cds/urcu/general_buffered.h</tt> in this example)
+        before including <tt>cds/container/michael_set_rcu.h</tt>.
+        Also, for ordered list we should develop a comparator for our \p Foo struct.
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/container/michael_list_rcu.h>
+        #include <cds/container/michael_set_rcu.h>
+
+        namespace cc = cds::container;
+
+        // Foo comparator
+        struct Foo_cmp {
+            int operator ()(Foo const& v1, Foo const& v2 ) const
+            {
+                if ( std::less( v1.nKey, v2.nKey ))
+                    return -1;
+                return std::less(v2.nKey, v1.nKey) ? 1 : 0;
+            }
+        };
+
+        // Our ordered list
+        typedef cc::MichaelList< cds::urcu::gc< cds::urcu::general_buffered<> >, Foo,
+            typename cc::michael_list::make_traits<
+                cc::opt::compare< Foo_cmp >     // item comparator option
+            >::type
+        > bucket_list;
+
+        // Hash functor for Foo
+        struct foo_hash {
+            size_t operator ()( int i ) const
+            {
+                return std::hash( i );
+            }
+            size_t operator()( Foo const& i ) const
+            {
+                return std::hash( i.nKey );
+            }
+        };
+
+        // Declare set type.
+        // Note that \p RCU template parameter of ordered list must be equal \p RCU for the set.
+        typedef cc::MichaelHashSet< cds::urcu::gc< cds::urcu::general_buffered<> >, bucket_list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< foo_hash >
+            >::type
+        > foo_set;
+
+        // Set variable
+        foo_set fooSet;
+        \endcode
+    */
+    template <
+        class RCU,
+        class OrderedList,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = michael_set::type_traits
+#else
+        class Traits
+#endif
+    >
+    class MichaelHashSet< cds::urcu::gc< RCU >, OrderedList, Traits >
+    {
+    public:
+        typedef OrderedList bucket_type     ;   ///< type of ordered list used as a bucket implementation
+        typedef Traits      options         ;   ///< Traits template parameters
+
+        typedef typename bucket_type::value_type        value_type      ;   ///< type of value stored in the list
+        typedef cds::urcu::gc< RCU >                    gc              ;   ///< RCU used as garbage collector
+        typedef typename bucket_type::key_comparator    key_comparator  ;   ///< key comparing functor
+
+        /// Hash functor for \ref value_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+
+        /// Bucket table allocator
+        typedef cds::details::Allocator< bucket_type, typename options::allocator >  bucket_table_allocator;
+
+        typedef typename bucket_type::rcu_lock      rcu_lock   ; ///< RCU scoped lock
+        typedef typename bucket_type::exempt_ptr    exempt_ptr ; ///< pointer to extracted node
+        /// Group of \p extract_xxx functions require external locking if underlying ordered list requires that
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = bucket_type::c_bExtractLockExternal;
+
+    protected:
+        item_counter    m_ItemCounter   ;   ///< Item counter
+        hash            m_HashFunctor   ;   ///< Hash functor
+
+        bucket_type *   m_Buckets       ;   ///< bucket table
+
+    private:
+        //@cond
+        const size_t    m_nHashBitmask;
+        //@endcond
+
+    protected:
+        /// Calculates hash value of \p key
+        template <typename Q>
+        size_t hash_value( Q const& key ) const
+        {
+            return m_HashFunctor( key ) & m_nHashBitmask;
+        }
+
+        /// Returns the bucket (ordered list) for \p key
+        //@{
+        template <typename Q>
+        bucket_type&    bucket( Q const& key )
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+        template <typename Q>
+        bucket_type const&    bucket( Q const& key ) const
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+        //@}
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for Michael's set is based on \p OrderedList forward iterator and has some features:
+            - it has no post-increment operator
+            - it iterates items in unordered fashion
+            - The iterator cannot be moved across thread boundary since it may contain GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the set.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use the iterator for the concurrent container
+            for debug purpose only.
+        */
+        typedef michael_set::details::iterator< bucket_type, false >    iterator;
+
+        /// Const forward iterator
+        typedef michael_set::details::iterator< bucket_type, true >     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a set
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        //@{
+        const_iterator begin() const
+        {
+            return get_const_begin();
+        }
+        const_iterator cbegin()
+        {
+            return get_const_begin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a set
+        //@{
+        const_iterator end() const
+        {
+            return get_const_end();
+        }
+        const_iterator cend()
+        {
+            return get_const_end();
+        }
+        //@}
+
+    private:
+        //@cond
+        const_iterator get_const_begin() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[0]).begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+        const_iterator get_const_end() const
+        {
+            return const_iterator( const_cast<bucket_type const&>(m_Buckets[bucket_count() - 1]).end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+        //@endcond
+
+    public:
+        /// Initialize hash set
+        /**
+            The Michael's hash set is non-expandable container. You should point the average count of items \p nMaxItemCount
+            when you create an object.
+            \p nLoadFactor parameter defines average count of items per bucket and it should be small number between 1 and 10.
+            Remember, since the bucket implementation is an ordered list, searching in the bucket is linear [<tt>O(nLoadFactor)</tt>].
+            Note, that many popular STL hash map implementation uses load factor 1.
+
+            The ctor defines hash table size as rounding <tt>nMacItemCount / nLoadFactor</tt> up to nearest power of two.
+        */
+        MichaelHashSet(
+            size_t nMaxItemCount,   ///< estimation of max item count in the hash set
+            size_t nLoadFactor      ///< load factor: estimation of max number of items in the bucket
+        ) : m_nHashBitmask( michael_set::details::init_hash_bitmask( nMaxItemCount, nLoadFactor ))
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename bucket_type::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ), "atomicity::empty_item_counter is not allowed as a item counter");
+
+            m_Buckets = bucket_table_allocator().NewArray( bucket_count() );
+        }
+
+        /// Clear hash set and destroy it
+        ~MichaelHashSet()
+        {
+            clear();
+            bucket_table_allocator().Delete( m_Buckets, bucket_count() );
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the set.
+
+            The type \p Q should contain as minimum the complete key for the node.
+            The object of \ref value_type should be constructible from a value of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            The function applies RCU lock internally.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            const bool bRet = bucket( val ).insert( val );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-fields of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success. It may be passed by reference
+            using <tt>boost::ref</tt>
+
+            The function applies RCU lock internally.
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& val, Func f )
+        {
+            const bool bRet = bucket( val ).insert( val, f );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Ensures that the item exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p val key not found in the set, then the new item created from \p val
+            is inserted into the set. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p key passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            The function applies RCU lock internally.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( const Q& val, Func func )
+        {
+            std::pair<bool, bool> bRet = bucket( val ).ensure( val, func );
+            if ( bRet.first && bRet.second )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            The function applies RCU lock internally.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            bool bRet = bucket( value_type(std::forward<Args>(args)...) ).emplace( std::forward<Args>(args)... );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+#   endif
+
+        /// Deletes \p key from the set
+        /** \anchor cds_nonintrusive_MichealSet_rcu_erase_val
+
+            Since the key of MichaelHashSet's item type \ref value_type is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The set item comparator should be able to compare the type \p value_type
+            and the type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+            const bool bRet = bucket( key ).erase( key );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichealSet_rcu_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+            const bool bRet = bucket( key ).erase_with( key, pred );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes \p key from the set
+        /** \anchor cds_nonintrusive_MichealSet_rcu_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type const& val);
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Since the key of %MichaelHashSet's \p value_type is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+            const bool bRet = bucket( key ).erase( key, f );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichealSet_rcu_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+            const bool bRet = bucket( key ).erase_with( key, pred, f );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Extracts an item from the set
+        /** \anchor cds_nonintrusive_MichaelHashSet_rcu_extract
+            The function searches an item with key equal to \p val in the set,
+            unlinks it from the set, places item pointer into \p dest argument, and returns \p true.
+            If the item with the key equal to \p val is not found the function return \p false.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the set
+            and returns a pointer to item found.
+            You should lock RCU before calling of the function, and you should synchronize RCU
+            outside the RCU lock to free extracted item
+
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/container/michael_list_rcu.h>
+            #include <cds/container/michael_set_rcu.h>
+
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::container::MichaelList< rcu, Foo > rcu_michael_list;
+            typedef cds::container::MichaelHashSet< rcu, rcu_michael_list, foo_traits > rcu_michael_set;
+
+            rcu_michael_set theSet;
+            // ...
+
+            rcu_michael_set::exempt_ptr p;
+            {
+                // first, we should lock RCU
+                rcu_michael_set::rcu_lock lock;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theSet.extract( p, 10 )) {
+                    // do something with p
+                    ...
+                }
+            }
+
+            // We may safely release p here
+            // release() passes the pointer to RCU reclamation cycle
+            p.release();
+            \endcode
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& dest, Q const& val )
+        {
+            if ( bucket( val ).extract( dest, val )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Extracts an item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelHashSet_rcu_extract "extract(exempt_ptr&, Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& dest, Q const& val, Less pred )
+        {
+            if ( bucket( val ).extract_with( dest, val, pred )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_nonintrusive_MichealSet_rcu_find_func
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f ) const
+        {
+            return bucket( val ).find( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichealSet_rcu_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f ) const
+        {
+            return bucket( val ).find_with( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_nonintrusive_MichealSet_rcu_find_cfunc
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f ) const
+        {
+            return bucket( val ).find( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichealSet_rcu_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f ) const
+        {
+            return bucket( val ).find_with( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_nonintrusive_MichealSet_rcu_find_val
+
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \ref value_type.
+        */
+        template <typename Q>
+        bool find( Q const & val ) const
+        {
+            return bucket( val ).find( val );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichealSet_rcu_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const & val, Less pred ) const
+        {
+            return bucket( val ).find_with( val, pred );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_nonintrusive_MichaelHashSet_rcu_get
+            The function searches the item with key equal to \p val and returns the pointer to item found.
+            If \p val is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::container::MichaelHashSet< your_template_parameters > hash_set;
+            hash_set theSet;
+            // ...
+            {
+                // Lock RCU
+                hash_set::rcu_lock lock;
+
+                foo * pVal = theSet.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be freed at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename Q>
+        value_type * get( Q const& val ) const
+        {
+            return bucket( val ).get( val );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_MichaelHashSet_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& val, Less pred ) const
+        {
+            return bucket( val ).get_with( val, pred );
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function erases all items from the set.
+
+            The function is not atomic. It cleans up each bucket and then resets the item counter to zero.
+            If there are a thread that performs insertion while \p clear is working the result is undefined in general case:
+            <tt> empty() </tt> may return \p true but the set may contain item(s).
+            Therefore, \p clear may be used only for debugging purposes.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        void clear()
+        {
+            for ( size_t i = 0; i < bucket_count(); ++i )
+                m_Buckets[i].clear();
+            m_ItemCounter.reset();
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+            Thus, the correct item counting feature is an important part of Michael's set implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns the size of hash table
+        /**
+            Since MichaelHashSet cannot dynamically extend the hash table size,
+            the value returned is an constant depending on object initialization parameters;
+            see MichaelHashSet::MichaelHashSet for explanation.
+        */
+        size_t bucket_count() const
+        {
+            return m_nHashBitmask + 1;
+        }
+    };
+
+}} // namespace cds::container
+
+#endif // ifndef __CDS_CONTAINER_MICHAEL_SET_H
diff --git a/cds/container/moir_queue.h b/cds/container/moir_queue.h
new file mode 100644 (file)
index 0000000..fba2977
--- /dev/null
@@ -0,0 +1,339 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MOIR_QUEUE_H
+#define __CDS_CONTAINER_MOIR_QUEUE_H
+
+#include <cds/intrusive/moir_queue.h>
+#include <cds/intrusive/queue_stat.h>
+#include <cds/container/base.h>
+#include <cds/ref.h>
+#include <cds/details/trivial_assign.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+        template <typename GC, typename T, CDS_DECL_OPTIONS7>
+        struct make_moir_queue
+        {
+            typedef GC gc;
+            typedef T value_type;
+
+            struct default_options {
+                typedef cds::backoff::empty     back_off;
+                typedef CDS_DEFAULT_ALLOCATOR   allocator;
+                typedef atomicity::empty_item_counter item_counter;
+                typedef intrusive::queue_dummy_stat stat;
+                typedef opt::v::relaxed_ordering    memory_model;
+                enum { alignment = opt::cache_line_alignment };
+            };
+
+            typedef typename opt::make_options<
+                typename cds::opt::find_type_traits< default_options, CDS_OPTIONS7 >::type
+                ,CDS_OPTIONS7
+            >::type   options;
+
+            struct node_type: public intrusive::single_link::node< gc >
+            {
+                value_type  m_value;
+
+                node_type( const value_type& val )
+                    : m_value( val )
+                {}
+#           ifdef CDS_EMPLACE_SUPPORT
+                template <typename... Args>
+                node_type( Args&&... args )
+                    : m_value( std::forward<Args>(args)...)
+                {}
+#           else
+                node_type()
+                {}
+#           endif
+            };
+
+            typedef typename options::allocator::template rebind<node_type>::other allocator_type;
+            typedef cds::details::Allocator< node_type, allocator_type >           cxx_allocator;
+
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_allocator().Delete( pNode );
+                }
+            };
+
+            typedef intrusive::MoirQueue<
+                gc
+                ,node_type
+                ,intrusive::opt::hook<
+                    intrusive::single_link::base_hook< opt::gc<gc> >
+                >
+                ,opt::back_off< typename options::back_off >
+                ,intrusive::opt::disposer< node_deallocator >
+                ,opt::item_counter< typename options::item_counter >
+                ,opt::stat< typename options::stat >
+                ,opt::alignment< options::alignment >
+                ,opt::memory_model< typename options::memory_model >
+            >   type;
+        };
+    }
+    //@endcond
+
+    /// A variation of Michael & Scott's lock-free queue
+    /** @ingroup cds_nonintrusive_queue
+        It is non-intrusive version of intrusive::MoirQueue.
+
+        \p T is a type stored in the queue. It should be default-constructible, copy-constructible, assignable type.
+
+        \p Options description see MSQueue
+    */
+    template <typename GC, typename T, CDS_DECL_OPTIONS7>
+    class MoirQueue:
+#ifdef CDS_DOXYGEN_INVOKED
+        intrusive::MoirQueue< GC, intrusive::single_link::node< T >, Options... >
+#else
+        details::make_moir_queue< GC, T, CDS_OPTIONS7 >::type
+#endif
+    {
+        //@cond
+        typedef details::make_moir_queue< GC, T, CDS_OPTIONS7 > options;
+        typedef typename options::type base_class;
+        //@endcond
+
+    public:
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS7>
+        struct rebind {
+            typedef MoirQueue< GC2, T2, CDS_OTHER_OPTIONS7> other   ;   ///< Rebinding result
+        };
+
+    public:
+        typedef T value_type ; ///< Value type stored in the stack
+
+        typedef typename base_class::gc                 gc              ; ///< Garbage collector used
+        typedef typename base_class::back_off           back_off        ; ///< Back-off strategy used
+        typedef typename options::allocator_type        allocator_type  ; ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename options::options::item_counter item_counter    ; ///< Item counting policy used
+        typedef typename options::options::stat         stat            ; ///< Internal statistics policy used
+        typedef typename base_class::memory_model       memory_model    ; ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        typedef typename options::node_type  node_type   ;   ///< queue node type (derived from intrusive::single_link::node)
+
+        //@cond
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;   // deallocate node
+        typedef typename base_class::node_traits    node_traits;
+        //@endcond
+
+    protected:
+        ///@cond
+        static node_type * alloc_node()
+        {
+            return cxx_allocator().New();
+        }
+        static node_type * alloc_node( const value_type& val )
+        {
+            return cxx_allocator().New( val );
+        }
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node_move( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>( args )... );
+        }
+#   endif
+        static void free_node( node_type * p )
+        {
+            node_deallocator()( p );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+        //@endcond
+
+    public:
+        /// Initializes empty queue
+        MoirQueue()
+        {}
+
+        /// Destructor clears the queue
+        ~MoirQueue()
+        {}
+
+        /// Returns queue's item count (see \ref intrusive::MSQueue::size for explanation)
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns refernce to internal statistics
+        const stat& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Enqueues \p val value into the queue.
+        /**
+            The function makes queue node in dynamic memory calling copy constructor for \p val
+            and then it calls intrusive::MSQueue::enqueue.
+            Returns \p true if success, \p false otherwise.
+        */
+        bool enqueue( value_type const& val )
+        {
+            scoped_node_ptr p( alloc_node(val) );
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Enqueues \p data to queue using copy functor
+        /**
+            \p Func is a functor called to copy value \p data of type \p Type
+            which may be differ from type \p T stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(T& dest, SOURCE const& data)
+                {
+                    // // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool enqueue( const Type& data, Func f  )
+        {
+            scoped_node_ptr p( alloc_node());
+            unref(f)( node_traits::to_value_ptr( *p )->m_value, data );
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Dequeues a value using copy functor
+        /**
+            \p Func is a functor called to copy dequeued value to \p dest of type \p Type
+            which may be differ from type \p T stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(Type& dest, T const& data)
+                {
+                    // // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool dequeue( Type& dest, Func f )
+        {
+            typename base_class::dequeue_result res;
+            if ( base_class::do_dequeue( res )) {
+                unref(f)( dest, node_traits::to_value_ptr( *res.pNext )->m_value );
+
+                base_class::dispose_result( res );
+
+                return true;
+            }
+            return false;
+        }
+
+        /// Dequeues a value from the queue
+        /**
+            If queue is not empty, the function returns \p true, \p dest contains copy of
+            dequeued value. The assignment operator for type \ref value_type is invoked.
+            If queue is empty, the function returns \p false, \p dest is unchanged.
+        */
+        bool dequeue( value_type& dest )
+        {
+            typedef cds::details::trivial_assign<value_type, value_type> functor;
+            return dequeue( dest, functor() );
+        }
+
+        /// Synonym for \ref enqueue function
+        bool push( const value_type& val )
+        {
+            return enqueue( val );
+        }
+
+        /// Synonym for template version of \ref enqueue function
+        template <typename Type, typename Func>
+        bool push( const Type& data, Func f  )
+        {
+            return enqueue( data, f );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Enqueues data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr p( alloc_node_move( std::forward<Args>(args)... ));
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+
+        /// Synonym for \ref dequeue function
+        bool pop( value_type& dest )
+        {
+            return dequeue( dest );
+        }
+
+        /// Synonym for template version of \ref dequeue function
+        template <typename Type, typename Func>
+        bool pop( Type& dest, Func f )
+        {
+            return dequeue( dest, f );
+        }
+
+        /// Checks if the queue is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Clear the queue
+        /**
+            The function repeatedly calls \ref dequeue until it returns NULL.
+            The disposer defined in template \p Options is called for each item
+            that can be safely disposed.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+    };
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_MOIR_QUEUE_H
+
+
diff --git a/cds/container/mspriority_queue.h b/cds/container/mspriority_queue.h
new file mode 100644 (file)
index 0000000..6620f53
--- /dev/null
@@ -0,0 +1,337 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MSPRIORITY_QUEUE_H
+#define __CDS_CONTAINER_MSPRIORITY_QUEUE_H
+
+#include <cds/container/base.h>
+#include <cds/intrusive/mspriority_queue.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    /// MSPriorityQueue related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace mspriority_queue {
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Synonym for cds::intrusive::mspriority_queue::stat
+        typedef cds::intrusive::mspriority_queue::stat<> stat;
+
+        /// Synonym for cds::intrusive::mspriority_queue::empty_stat
+        typedef cds::intrusive::mspriority_queue::empty_stat empty_stat;
+#else
+        using cds::intrusive::mspriority_queue::stat;
+        using cds::intrusive::mspriority_queue::empty_stat;
+#endif
+
+        /// Type traits for MSPriorityQueue
+        /**
+            The type traits for cds::container::MSPriorityQueue is the same as for
+            cds::intrusive::MSPriorityQueue (see cds::intrusive::mspriority_queue::type_traits) 
+            plus some additional properties.
+        */
+        struct type_traits: public cds::intrusive::mspriority_queue::type_traits
+        {
+            /// The allocator use to allocate memory for values
+            typedef CDS_DEFAULT_ALLOCATOR   allocator;
+
+            /// Move policy
+            /**
+                The move policy used in MSPriorityQueue::pop functions
+                to move item's value.
+                Default is opt::v::assignment_move_policy.
+            */
+            typedef cds::opt::v::assignment_move_policy  move_policy;
+        };
+
+        /// Metafunction converting option list to traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+
+            See \ref MSPriorityQueue, \ref type_traits, \ref cds::opt::make_options.
+        */
+        template <CDS_DECL_OPTIONS9>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS9 >::type
+                ,CDS_OPTIONS9
+            >::type   type;
+#   endif
+        };
+    }   // namespace mspriority_queue
+
+    /// Michael & Scott array-based lock-based concurrent priority queue heap
+    /** @ingroup cds_nonintrusive_priority_queue
+        Source:
+            - [1996] G.Hunt, M.Michael, S. Parthasarathy, M.Scott
+                "An efficient algorithm for concurrent priority queue heaps"
+
+        \p %MSPriorityQueue augments the standard array-based heap data structure with
+        a mutual-exclusion lock on the heap's size and locks on each node in the heap.
+        Each node also has a tag that indicates whether
+        it is empty, valid, or in a transient state due to an update to the heap
+        by an inserting thread.
+        The algorithm allows concurrent insertions and deletions in opposite directions,
+        without risking deadlock and without the need for special server threads.
+        It also uses a "bit-reversal" technique to scatter accesses across the fringe
+        of the tree to reduce contention.
+        On large heaps the algorithm achieves significant performance improvements
+        over serialized single-lock algorithm, for various insertion/deletion
+        workloads. For small heaps it still performs well, but not as well as
+        single-lock algorithm.
+
+        Template parameters:
+        - \p T - type to be stored in the list. The priority is a part of \p T type.
+        - \p Traits - type traits. See mspriority_queue::type_traits for explanation.
+
+        It is possible to declare option-based queue with cds::container::mspriority_queue::make_traits
+        metafunction instead of \p Traits template argument.
+        Template argument list \p Options of \p %cds::container::mspriority_queue::make_traits metafunction are:
+        - opt::buffer - the buffer type for heap array. Possible type are: opt::v::static_buffer, opt::v::dynamic_buffer.
+            Default is \p %opt::v::dynamic_buffer.
+            You may specify any type of values for the buffer since at instantiation time
+            the \p buffer::rebind member metafunction is called to change the type of values stored in the buffer.
+        - opt::compare - priority compare functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for priority compare. Default is \p std::less<T>.
+        - opt::lock_type - lock type. Default is cds::lock::Spin.
+        - opt::back_off - back-off strategy. Default is cds::backoff::yield
+        - opt::allocator - allocator (like \p std::allocator) for the values of queue's items.
+            Default is \ref CDS_DEFAULT_ALLOCATOR
+        - opt::move_policy - policy for moving item's value. Default is opt::v::assignment_move_policy.
+            If the compiler supports move semantics it would be better to specify the move policy
+            based on the move semantics for type \p T.
+        - opt::stat - internal statistics. Available types: mspriority_queue::stat, mspriority_queue::empty_stat (the default)
+    */
+    template <typename T, class Traits>
+    class MSPriorityQueue: protected cds::intrusive::MSPriorityQueue< T, Traits >
+    {
+        //@cond
+        typedef cds::intrusive::MSPriorityQueue< T, Traits > base_class;
+        //@endcond
+    public:
+        typedef T           value_type  ;   ///< Value type stored in the queue
+        typedef Traits      traits      ;   ///< Traits template parameter
+
+        typedef typename base_class::key_comparator key_comparator; ///< priority comparing functor based on opt::compare and opt::less option setter.
+        typedef typename base_class::lock_type lock_type; ///< heap's size lock type
+        typedef typename base_class::back_off  back_off ; ///< Back-off strategy
+        typedef typename base_class::stat          stat ; ///< internal statistics type
+        typedef typename traits::allocator::template rebind<value_type>::other allocator_type; ///< Value allocator
+        typedef typename traits::move_policy move_policy; ///< Move policy for type \p T
+
+    protected:
+        //@cond
+        typedef cds::details::Allocator< value_type, allocator_type >  cxx_allocator;
+
+        struct value_deleter {
+            void operator()( value_type * p ) const
+            {
+                cxx_allocator().Delete( p );
+            }
+#       ifndef CDS_CXX11_LAMBDA_SUPPORT
+            void operator()( value_type& p ) const
+            {
+                cxx_allocator().Delete( &p );
+            }
+#       endif
+        };
+        typedef std::unique_ptr<value_type, value_deleter> scoped_ptr;
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        struct clear_wrapper
+        {
+            Func& func;
+            clear_wrapper( Func& f ): func(f) {}
+
+            void operator()( value_type& src ) const
+            {
+                cds::unref(func)( src );
+                value_deleter()( &src );
+            }
+        };
+#   endif
+
+        //@endcond
+
+    public:
+        /// Constructs empty priority queue
+        /**
+            For cds::opt::v::static_buffer the \p nCapacity parameter is ignored.
+        */
+        MSPriorityQueue( size_t nCapacity )
+            : base_class( nCapacity )
+        {}
+
+        /// Clears priority queue and destructs the object
+        ~MSPriorityQueue()
+        {
+            clear();
+        }
+
+        /// Inserts a item into priority queue
+        /**
+            If the priority queue is full, the function returns \p false,
+            no item has been added.
+            Otherwise, the function inserts the copy of \p val into the heap
+            and returns \p true.
+
+            The function use copy constructor to create new heap item from \p val.
+        */
+        bool push( value_type const& val )
+        {
+            scoped_ptr pVal( cxx_allocator().New( val ));
+            if ( base_class::push( *(pVal.get()) )) {
+                pVal.release();
+                return true;
+            }
+            return false;
+        }
+
+#ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts a item into priority queue
+        /**
+            If the priority queue is full, the function returns \p false,
+            no item has been added.
+            Otherwise, the function inserts a new item created from \p args arguments
+            into the heap and returns \p true.
+
+            The function is available only for compilers supporting variable template
+            and move semantics C++11 feature.
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_ptr pVal( cxx_allocator().MoveNew( std::forward<Args>(args)... ));
+            if ( base_class::push( *(pVal.get()) )) {
+                pVal.release();
+                return true;
+            }
+            return false;
+        }
+#endif
+
+        /// Extracts item with high priority
+        /**
+            If the priority queue is empty, the function returns \p false.
+            Otherwise, it returns \p true and \p dest contains the copy of extracted item.
+            The item is deleted from the heap.
+
+            The function uses \ref move_policy to move extracted value from the heap's top
+            to \p dest. 
+
+            The function is equivalent of such call:
+            \code
+                pop_with( dest, move_policy() );
+            \endcode
+        */
+        bool pop( value_type& dest )
+        {
+            return pop_with( dest, move_policy() );
+        }
+
+        /// Extracts item with high priority
+        /**
+            If the priority queue is empty, the function returns \p false.
+            Otherwise, it returns \p true and \p dest contains the copy of extracted item.
+            The item is deleted from the heap.
+
+            The function uses \p MoveFunc \p f to move extracted value from the heap's top
+            to \p dest. The interface of \p MoveFunc is:
+            \code
+            struct move_functor {
+                void operator()( Q& dest, T& src );
+            };
+            \endcode
+            In \p MoveFunc you may use move semantics for \p src argument
+            since \p src will be destroyed.
+        */
+        template <typename Q, typename MoveFunc>
+        bool pop_with( Q& dest, MoveFunc f )
+        {
+            value_type * pVal = base_class::pop();
+            if ( pVal ) {
+                cds::unref(f)( dest, *pVal );
+                cxx_allocator().Delete( pVal );
+                return true;
+            }
+            return false;
+        }
+
+        /// Clears the queue (not atomic)
+        /**
+            This function is no atomic, but thread-safe
+        */
+        void clear()
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            base_class::clear_with( []( value_type& src ) { cxx_allocator().Delete( &src ); });
+#       else
+            base_class::clear_with( value_deleter() );
+#       endif
+        }
+
+        /// Clears the queue (not atomic)
+        /**
+            This function is no atomic, but thread-safe.
+
+            For each item removed the functor \p f is called.
+            \p Func interface is:
+            \code
+                struct clear_functor
+                {
+                    void operator()( value_type& item );
+                };
+            \endcode
+            A lambda function or a function pointer can be used as \p f.
+        */
+        template <typename Func>
+        void clear_with( Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            base_class::clear_with( [&f]( value_type& val ) { cds::unref(f)(val); value_deleter()( &val ); } );
+#       else
+            clear_wrapper<Func> c(f);
+            base_class::clear_with( cds::ref(c));
+#       endif
+        }
+
+        /// Checks is the priority queue is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Checks if the priority queue is full
+        bool full() const
+        {
+            return base_class::full();
+        }
+
+        /// Returns current size of priority queue
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Return capacity of the priority queue
+        size_t capacity() const
+        {
+            return base_class::capacity();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+    };
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_MSPRIORITY_QUEUE_H
diff --git a/cds/container/msqueue.h b/cds/container/msqueue.h
new file mode 100644 (file)
index 0000000..29c3355
--- /dev/null
@@ -0,0 +1,345 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_MSQUEUE_H
+#define __CDS_CONTAINER_MSQUEUE_H
+
+#include <cds/intrusive/msqueue.h>
+#include <cds/container/base.h>
+#include <cds/ref.h>
+#include <cds/details/trivial_assign.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+        template <typename GC, typename T, CDS_DECL_OPTIONS7>
+        struct make_msqueue
+        {
+            typedef GC gc;
+            typedef T value_type;
+
+            struct default_options {
+                typedef cds::backoff::empty     back_off;
+                typedef CDS_DEFAULT_ALLOCATOR   allocator;
+                typedef atomicity::empty_item_counter item_counter;
+                typedef intrusive::queue_dummy_stat stat;
+                typedef opt::v::relaxed_ordering    memory_model;
+                enum { alignment = opt::cache_line_alignment };
+            };
+
+            typedef typename opt::make_options<
+                typename cds::opt::find_type_traits< default_options, CDS_OPTIONS7 >::type
+                ,CDS_OPTIONS7
+            >::type   options;
+
+            struct node_type: public intrusive::single_link::node< gc >
+            {
+                value_type  m_value;
+                node_type( const value_type& val )
+                    : m_value( val )
+                {}
+#           ifdef CDS_EMPLACE_SUPPORT
+                template <typename... Args>
+                node_type( Args&&... args )
+                    : m_value( std::forward<Args>(args)...)
+                {}
+#           else
+                node_type()
+                {}
+#           endif
+            };
+
+            typedef typename options::allocator::template rebind<node_type>::other allocator_type;
+            typedef cds::details::Allocator< node_type, allocator_type >           cxx_allocator;
+
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_allocator().Delete( pNode );
+                }
+            };
+
+            typedef intrusive::MSQueue< gc,
+                node_type
+                ,intrusive::opt::hook<
+                    intrusive::single_link::base_hook< opt::gc<gc> >
+                >
+                ,opt::back_off< typename options::back_off >
+                ,intrusive::opt::disposer< node_deallocator >
+                ,opt::item_counter< typename options::item_counter >
+                ,opt::stat< typename options::stat >
+                ,opt::alignment< options::alignment >
+                ,opt::memory_model< typename options::memory_model >
+            >   type;
+        };
+    }
+    //@endcond
+
+    /// Michael & Scott lock-free queue
+    /** @ingroup cds_nonintrusive_queue
+        It is non-intrusive version of Michael & Scott's queue algorithm based on intrusive implementation
+        intrusive::MSQueue.
+
+        Template arguments:
+        - \p GC - garbage collector type: gc::HP, gc::HRC, gc::PTB
+        - \p T is a type stored in the queue. It should be default-constructible, copy-constructible, assignable type.
+        - \p Options - options
+
+        Permissible \p Options:
+        - opt::allocator - allocator (like \p std::allocator). Default is \ref CDS_DEFAULT_ALLOCATOR
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::stat - the type to gather internal statistics.
+            Possible option value are: intrusive::queue_stat, intrusive::queue_dummy_stat,
+            user-provided class that supports intrusive::queue_stat interface.
+            Default is \ref intrusive::queue_dummy_stat.
+        - opt::alignment - the alignment for internal queue data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+    */
+    template <typename GC, typename T, CDS_DECL_OPTIONS7>
+    class MSQueue:
+#ifdef CDS_DOXYGEN_INVOKED
+        intrusive::MSQueue< GC, intrusive::single_link::node< T >, Options... >
+#else
+        details::make_msqueue< GC, T, CDS_OPTIONS7 >::type
+#endif
+    {
+        //@cond
+        typedef details::make_msqueue< GC, T, CDS_OPTIONS7 > options;
+        typedef typename options::type base_class;
+        //@endcond
+
+    public:
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS7>
+        struct rebind {
+            typedef MSQueue< GC2, T2, CDS_OTHER_OPTIONS7> other   ;   ///< Rebinding result
+        };
+
+    public:
+        typedef T value_type ; ///< Value type stored in the queue
+
+        typedef typename base_class::gc             gc              ; ///< Garbage collector used
+        typedef typename base_class::back_off       back_off        ; ///< Back-off strategy used
+        typedef typename options::allocator_type    allocator_type  ; ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename base_class::item_counter   item_counter    ; ///< Item counting policy used
+        typedef typename base_class::stat           stat            ; ///< Internal statistics policy used
+        typedef typename base_class::memory_model   memory_model    ; ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        typedef typename options::node_type  node_type   ;   ///< queue node type (derived from intrusive::single_link::node)
+
+        //@cond
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;   // deallocate node
+        typedef typename base_class::node_traits    node_traits;
+        //@endcond
+
+    protected:
+        ///@cond
+        static node_type * alloc_node()
+        {
+            return cxx_allocator().New();
+        }
+        static node_type * alloc_node( value_type const& val )
+        {
+            return cxx_allocator().New( val );
+        }
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node_move( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>( args )... );
+        }
+#   endif
+        static void free_node( node_type * p )
+        {
+            node_deallocator()( p );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+        //@endcond
+
+    public:
+        /// Initializes empty queue
+        MSQueue()
+        {}
+
+        /// Destructor clears the queue
+        ~MSQueue()
+        {}
+
+        /// Returns queue's item count (see \ref intrusive::MSQueue::size for explanation)
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns reference to internal statistics
+        const stat& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Enqueues \p val value into the queue.
+        /**
+            The function makes queue node in dynamic memory calling copy constructor for \p val
+            and then it calls intrusive::MSQueue::enqueue.
+            Returns \p true if success, \p false otherwise.
+        */
+        bool enqueue( value_type const& val )
+        {
+            scoped_node_ptr p( alloc_node(val) );
+            if ( base_class::enqueue( *p ) ) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Enqueues \p data to queue using copy functor
+        /**
+            \p Func is a functor called to copy value \p data of type \p Type
+            which may be differ from type \ref value_type stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(value_type& dest, Type const& data)
+                {
+                    // // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool enqueue( Type const& data, Func f  )
+        {
+            scoped_node_ptr p( alloc_node() );
+            unref(f)( p->m_value, data );
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Dequeues a value using copy functor
+        /**
+            \p Func is a functor called to copy dequeued value to \p dest of type \p Type
+            which may be differ from type \ref value_type stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(Type& dest, value_type const& data)
+                {
+                    // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool dequeue( Type& dest, Func f )
+        {
+            typename base_class::dequeue_result res;
+            if ( base_class::do_dequeue( res )) {
+                unref(f)( dest, node_traits::to_value_ptr( *res.pNext )->m_value );
+
+                base_class::dispose_result( res );
+
+                return true;
+            }
+            return false;
+        }
+
+        /// Dequeues a value from the queue
+        /**
+            If queue is not empty, the function returns \p true, \p dest contains copy of
+            dequeued value. The assignment operator for type \ref value_type is invoked.
+            If queue is empty, the function returns \p false, \p dest is unchanged.
+        */
+        bool dequeue( value_type& dest )
+        {
+            typedef cds::details::trivial_assign<value_type, value_type> functor;
+            return dequeue( dest, functor() );
+        }
+
+        /// Synonym for \ref enqueue function
+        bool push( value_type const& val )
+        {
+            return enqueue( val );
+        }
+
+        /// Synonym for template version of \ref enqueue function
+        template <typename Type, typename Func>
+        bool push( Type const& data, Func f  )
+        {
+            return enqueue( data, f );
+        }
+
+        /// Synonym for \ref dequeue function
+        bool pop( value_type& dest )
+        {
+            return dequeue( dest );
+        }
+
+        /// Synonym for template version of \ref dequeue function
+        template <typename Type, typename Func>
+        bool pop( Type& dest, Func f )
+        {
+            return dequeue( dest, f );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Enqueues data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr p( alloc_node_move( std::forward<Args>(args)... ) );
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Checks if the queue is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Clear the queue
+        /**
+            The function repeatedly calls \ref dequeue until it returns NULL.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+    };
+
+}}  // namespace cds::container
+
+#endif  // #ifndef __CDS_CONTAINER_MSQUEUE_H
diff --git a/cds/container/optimistic_queue.h b/cds/container/optimistic_queue.h
new file mode 100644 (file)
index 0000000..ca92861
--- /dev/null
@@ -0,0 +1,354 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_OPTIMISTIC_QUEUE_H
+#define __CDS_CONTAINER_OPTIMISTIC_QUEUE_H
+
+#include <cds/intrusive/optimistic_queue.h>
+#include <cds/container/base.h>
+#include <cds/ref.h>
+#include <cds/details/trivial_assign.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+        template <typename GC, typename T, CDS_DECL_OPTIONS7>
+        struct make_optimistic_queue
+        {
+            typedef GC gc;
+            typedef T value_type;
+
+            struct default_options {
+                typedef cds::backoff::empty     back_off;
+                typedef CDS_DEFAULT_ALLOCATOR   allocator;
+                typedef atomicity::empty_item_counter item_counter;
+                typedef intrusive::optimistic_queue::dummy_stat stat;
+                typedef opt::v::relaxed_ordering    memory_model;
+                enum { alignment = opt::cache_line_alignment };
+            };
+
+            typedef typename opt::make_options<
+                typename cds::opt::find_type_traits< default_options, CDS_OPTIONS7 >::type
+                ,CDS_OPTIONS7
+            >::type   options;
+
+            struct node_type: public intrusive::optimistic_queue::node< gc >
+            {
+                value_type  m_value;
+
+                node_type( value_type const& val )
+                    : m_value( val )
+                {}
+#           ifdef CDS_EMPLACE_SUPPORT
+                template <typename... Args>
+                node_type( Args&&... args )
+                    : m_value( std::forward<Args>(args)...)
+                {}
+#           else
+                node_type()
+                {}
+#           endif
+            };
+
+            typedef typename options::allocator::template rebind<node_type>::other allocator_type;
+            typedef cds::details::Allocator< node_type, allocator_type >           cxx_allocator;
+
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_allocator().Delete( pNode );
+                }
+            };
+
+            typedef intrusive::OptimisticQueue< gc,
+                node_type
+                ,intrusive::opt::hook<
+                    intrusive::optimistic_queue::base_hook< opt::gc<gc> >
+                >
+                ,opt::back_off< typename options::back_off >
+                ,intrusive::opt::disposer< node_deallocator >
+                ,opt::item_counter< typename options::item_counter >
+                ,opt::stat< typename options::stat >
+                ,opt::alignment< options::alignment >
+                ,opt::memory_model< typename options::memory_model >
+            >   type;
+        };
+    }   // namespace details
+    //@endcond
+
+    /// Optimistic queue
+    /** @ingroup cds_nonintrusive_queue
+        Implementation of Ladan-Mozes & Shavit optimistic queue algorithm.
+
+        \par Source:
+            [2008] Edya Ladan-Mozes, Nir Shavit "An Optimistic Approach to Lock-Free FIFO Queues"
+
+        Template arguments:
+        - \p GC - garbage collector type: gc::HP, gc::PTB. Note that gc::HRC is <b>not</b> supported
+        - \p T - type to be stored in the queue
+        - \p Options - options
+
+        \p Options are:
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::allocator - allocator (like \p std::allocator) used for nodes allocation. Default is \ref CDS_DEFAULT_ALLOCATOR
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::stat - the type to gather internal statistics for debugging and profiling purposes.
+            Possible option value are: intrusive::optimistic_queue::stat, intrusive::optimistic_queue::dummy_stat (the default),
+            user-provided class that supports intrusive::optimistic_queue::stat interface.
+            Generic option intrusive::queue_stat and intrusive::queue_dummy_stat are acceptable too, however,
+            they will be automatically converted to intrusive::optimistic_queue::stat and intrusive::optimistic_queue::dummy_stat
+            respectively.
+        - opt::alignment - the alignment for internal queue data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        <b>Warning</b> gc::HRC is not supported for this implementation.
+    */
+    template <typename GC, typename T, CDS_DECL_OPTIONS7>
+    class OptimisticQueue:
+#ifdef CDS_DOXYGEN_INVOKED
+        intrusive::OptimisticQueue< GC, intrusive::optimistic_queue::node< T >, Options... >
+#else
+        details::make_optimistic_queue< GC, T, CDS_OPTIONS7 >::type
+#endif
+    {
+        //@cond
+        typedef details::make_optimistic_queue< GC, T, CDS_OPTIONS7 > options;
+        typedef typename options::type base_class;
+        //@endcond
+
+    public:
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS7>
+        struct rebind {
+            typedef OptimisticQueue< GC2, T2, CDS_OTHER_OPTIONS7> other   ;   ///< Rebinding result
+        };
+
+    public:
+        typedef T value_type ; ///< Value type stored in the stack
+
+        typedef typename base_class::gc                 gc              ; ///< Garbage collector used
+        typedef typename base_class::back_off           back_off        ; ///< Back-off strategy used
+        typedef typename options::allocator_type        allocator_type  ; ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename options::options::item_counter item_counter    ; ///< Item counting policy used
+        typedef typename options::options::stat         stat            ; ///< Internal statistics policy used
+        typedef typename base_class::memory_model       memory_model    ; ///< Memory ordering. See cds::opt::memory_model option
+
+        static CDS_CONSTEXPR_CONST size_t c_nHazardPtrCount = base_class::c_nHazardPtrCount; ///< Count of hazard pointer required for the algorithm
+
+    protected:
+        typedef typename options::node_type  node_type   ;   ///< queue node type (derived from intrusive::optimistic_queue::node)
+
+        //@cond
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;   // deallocate node
+        typedef typename base_class::node_traits    node_traits;
+        //@endcond
+
+    protected:
+        ///@cond
+        static node_type * alloc_node()
+        {
+            return cxx_allocator().New();
+        }
+        static node_type * alloc_node( const value_type& val )
+        {
+            return cxx_allocator().New( val );
+        }
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node_move( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>( args )... );
+        }
+#   endif
+        static void free_node( node_type * p )
+        {
+            node_deallocator()( p );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+        //@endcond
+
+    public:
+        /// Initializes empty queue
+        OptimisticQueue()
+        {}
+
+        /// Destructor clears the queue
+        ~OptimisticQueue()
+        {}
+
+        /// Returns queue's item count (see \ref intrusive::OptimisticQueue::size for explanation)
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns reference to internal statistics
+        const stat& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Enqueues \p val value into the queue.
+        /**
+            The function makes queue node in dynamic memory calling copy constructor for \p val
+            and then it calls intrusive::OptimisticQueue::enqueue.
+            Returns \p true if success, \p false otherwise.
+        */
+        bool enqueue( const value_type& val )
+        {
+            scoped_node_ptr p( alloc_node(val));
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Enqueues \p data to queue using copy functor
+        /**
+            \p Func is a functor called to copy value \p data of type \p Type
+            which may be differ from type \p T stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(T& dest, SOURCE const& data)
+                {
+                    // // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool enqueue( const Type& data, Func f  )
+        {
+            scoped_node_ptr p( alloc_node() );
+            unref(f)( p->m_value, data );
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Enqueues data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr p( alloc_node_move( std::forward<Args>(args)... ));
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Dequeues a value using copy functor
+        /**
+            \p Func is a functor called to copy dequeued value to \p dest of type \p Type
+            which may be differ from type \p T stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(Type& dest, T const& data)
+                {
+                    // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool dequeue( Type& dest, Func f )
+        {
+            typename base_class::dequeue_result res;
+            if ( base_class::do_dequeue( res )) {
+                unref(f)( dest, node_traits::to_value_ptr( *res.pNext )->m_value );
+
+                base_class::dispose_result( res );
+
+                return true;
+            }
+            return false;
+        }
+
+        /// Dequeues a value from the queue
+        /**
+            If queue is not empty, the function returns \p true, \p dest contains copy of
+            dequeued value. The assignment operator for type \ref value_type is invoked.
+            If queue is empty, the function returns \p false, \p dest is unchanged.
+        */
+        bool dequeue( value_type& dest )
+        {
+            typedef cds::details::trivial_assign<value_type, value_type> functor;
+            return dequeue( dest, functor() );
+        }
+
+        /// Synonym for \ref enqueue function
+        bool push( const value_type& val )
+        {
+            return enqueue( val );
+        }
+
+        /// Synonym for template version of \ref enqueue function
+        template <typename Type, typename Func>
+        bool push( const Type& data, Func f  )
+        {
+            return enqueue( data, f );
+        }
+
+        /// Synonym for \ref dequeue function
+        bool pop( value_type& dest )
+        {
+            return dequeue( dest );
+        }
+
+        /// Synonym for template version of \ref dequeue function
+        template <typename Type, typename Func>
+        bool pop( Type& dest, Func f )
+        {
+            return dequeue( dest, f );
+        }
+
+        /// Checks if the queue is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Clear the queue
+        /**
+            The function repeatedly calls \ref dequeue until it returns NULL.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+    };
+
+}}  // namespace cds::container
+
+#endif //#ifndef __CDS_CONTAINER_OPTIMISTIC_QUEUE_H
diff --git a/cds/container/rwqueue.h b/cds/container/rwqueue.h
new file mode 100644 (file)
index 0000000..7533682
--- /dev/null
@@ -0,0 +1,362 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_RWQUEUE_H
+#define __CDS_CONTAINER_RWQUEUE_H
+
+#include <cds/opt/options.h>
+#include <cds/lock/spinlock.h>
+#include <cds/intrusive/queue_stat.h>
+#include <cds/details/allocator.h>
+#include <cds/details/trivial_assign.h>
+#include <cds/details/std/memory.h>
+#include <cds/ref.h>
+
+namespace cds { namespace container {
+
+    /// Michael & Scott blocking queue with fine-grained synchronization schema
+    /** @ingroup cds_nonintrusive_queue
+        The queue has two different locks: one for reading and one for writing.
+        Therefore, one writer and one reader can simultaneously access to the queue.
+        The queue does not require any garbage collector.
+
+        <b>Source</b>
+            - [1998] Maged Michael, Michael Scott "Simple, fast, and practical non-blocking
+                and blocking concurrent queue algorithms"
+
+        <b>Template arguments</b>
+        - \p T - type to be stored in the queue
+        - \p Options - options
+
+        \p Options are:
+        - opt::allocator - allocator (like \p std::allocator). Default is \ref CDS_DEFAULT_ALLOCATOR
+        - opt::lock_type - type of lock primitive. Default is cds::lock::Spin.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::stat - the type to gather internal statistics.
+            Possible option value are: queue_stat, queue_dummy_stat, user-provided class that supports queue_stat interface.
+            Default is \ref intrusive::queue_dummy_stat.
+            <tt>RWQueue</tt> uses only \p onEnqueue and \p onDequeue counter.
+        - opt::alignment - the alignment for \p lock_type to prevent false sharing. Default is opt::cache_line_alignment
+
+        This queue has no intrusive counterpart.
+    */
+    template <typename T, CDS_DECL_OPTIONS6>
+    class RWQueue
+    {
+        //@cond
+        struct default_options
+        {
+            typedef lock::Spin  lock_type;
+            typedef CDS_DEFAULT_ALLOCATOR   allocator;
+            typedef atomicity::empty_item_counter item_counter;
+            typedef intrusive::queue_dummy_stat stat;
+            enum { alignment = opt::cache_line_alignment };
+        };
+        //@endcond
+
+    public:
+        //@cond
+        typedef typename opt::make_options<
+            typename cds::opt::find_type_traits< default_options, CDS_OPTIONS6 >::type
+            ,CDS_OPTIONS6
+        >::type   options;
+        //@endcond
+
+    public:
+        /// Rebind template arguments
+        template <typename T2, CDS_DECL_OTHER_OPTIONS6>
+        struct rebind {
+            typedef RWQueue< T2, CDS_OTHER_OPTIONS6> other   ;   ///< Rebinding result
+        };
+
+    public:
+        typedef T   value_type  ;   ///< type of value stored in the queue
+
+        typedef typename options::lock_type lock_type   ;   ///< Locking primitive used
+
+    protected:
+        //@cond
+        /// Node type
+        struct node_type
+        {
+            node_type * volatile    m_pNext ;   ///< Pointer to the next node in queue
+            value_type              m_value ;   ///< Value stored in the node
+
+            node_type( value_type const& v )
+                : m_pNext(null_ptr<node_type *>())
+                , m_value(v)
+            {}
+
+            node_type()
+                : m_pNext( null_ptr<node_type *>() )
+            {}
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            template <typename... Args>
+            node_type( Args&&... args )
+                : m_pNext(null_ptr<node_type *>())
+                , m_value( std::forward<Args>(args)...)
+            {}
+#       endif
+        };
+        //@endcond
+
+    public:
+        typedef typename options::allocator::template rebind<node_type>::other allocator_type   ; ///< Allocator type used for allocate/deallocate the queue nodes
+        typedef typename options::item_counter item_counter ;   ///< Item counting policy used
+        typedef typename options::stat      stat        ;   ///< Internal statistics policy used
+
+    protected:
+        //@cond
+        typedef typename opt::details::alignment_setter< lock_type, options::alignment >::type aligned_lock_type;
+        typedef cds::lock::scoped_lock<lock_type>   auto_lock;
+        typedef cds::details::Allocator< node_type, allocator_type >  node_allocator;
+
+        item_counter    m_ItemCounter;
+        stat            m_Stat;
+
+        mutable aligned_lock_type   m_HeadLock;
+        node_type * m_pHead;
+        mutable aligned_lock_type   m_TailLock;
+        node_type * m_pTail;
+        //@endcond
+
+    protected:
+        //@cond
+        static node_type * alloc_node()
+        {
+            return node_allocator().New();
+        }
+
+        static node_type * alloc_node( T const& data )
+        {
+            return node_allocator().New( data );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node_move( Args&&... args )
+        {
+            return node_allocator().MoveNew( std::forward<Args>( args )... );
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            node_allocator().Delete( pNode );
+        }
+
+        bool enqueue_node( node_type * p )
+        {
+            assert( p != null_ptr<node_type *>());
+            {
+                auto_lock lock( m_TailLock );
+                m_pTail =
+                    m_pTail->m_pNext = p;
+            }
+            ++m_ItemCounter;
+            m_Stat.onEnqueue();
+            return true;
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+        //@endcond
+
+    public:
+        /// Makes empty queue
+        RWQueue()
+        {
+            node_type * pNode = alloc_node();
+            m_pHead =
+                m_pTail = pNode;
+        }
+
+        /// Destructor clears queue
+        ~RWQueue()
+        {
+            clear();
+            assert( m_pHead == m_pTail );
+            free_node( m_pHead );
+        }
+
+        /// Enqueues \p data. Always return \a true
+        bool enqueue( value_type const& data )
+        {
+            scoped_node_ptr p( alloc_node( data ));
+            if ( enqueue_node( p.get() )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Enqueues \p data to queue using copy functor
+        /**
+            \p Func is a functor called to copy value \p data of type \p Type
+            which may be differ from type \p T stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(T& dest, Type const& data)
+                {
+                    // // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool enqueue( Type const& data, Func f  )
+        {
+            scoped_node_ptr p( alloc_node());
+            unref(f)( p->m_value, data );
+            if ( enqueue_node( p.get() )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Enqueues data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr p( alloc_node_move( std::forward<Args>(args)... ));
+            if ( enqueue_node( p.get() )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Dequeues a value using copy functor
+        /**
+            \p Func is a functor called to copy dequeued value to \p dest of type \p Type
+            which may be differ from type \p T stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(Type& dest, T const& data)
+                {
+                    // // Copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool dequeue( Type& dest, Func f )
+        {
+            node_type * pNode;
+            {
+                auto_lock lock( m_HeadLock );
+                pNode = m_pHead;
+                node_type * pNewHead = pNode->m_pNext;
+                if ( pNewHead == null_ptr<node_type *>() )
+                    return false;
+                unref(f)( dest, pNewHead->m_value );
+                m_pHead = pNewHead;
+            }    // unlock here
+            --m_ItemCounter;
+            free_node( pNode );
+            m_Stat.onDequeue();
+            return true;
+        }
+
+        /** Dequeues a value to \p dest.
+
+            If queue is empty returns \a false, \p dest may be corrupted.
+            If queue is not empty returns \a true, \p dest contains the value dequeued
+        */
+        bool dequeue( value_type& dest )
+        {
+            typedef cds::details::trivial_assign<value_type, value_type> functor;
+            return dequeue( dest, functor() );
+        }
+
+        /// Synonym for \ref enqueue
+        bool push( value_type const& data )
+        {
+            return enqueue( data );
+        }
+
+        /// Synonym for template version of \ref enqueue function
+        template <typename Type, typename Func>
+        bool push( Type const& data, Func f  )
+        {
+            return enqueue( data, f );
+        }
+
+        /// Synonym for \ref dequeue
+        bool pop( value_type& data )
+        {
+            return dequeue( data );
+        }
+
+        /// Synonym for template version of \ref dequeue function
+        template <typename Type, typename Func>
+        bool pop( Type& dest, Func f )
+        {
+            return dequeue( dest, f );
+        }
+
+        /// Checks if queue is empty
+        bool empty() const
+        {
+            auto_lock lock( m_HeadLock );
+            return m_pHead->m_pNext == null_ptr<node_type *>();
+        }
+
+        /// Clears queue
+        void clear()
+        {
+            auto_lock lockR( m_HeadLock );
+            auto_lock lockW( m_TailLock );
+            while ( m_pHead->m_pNext != null_ptr<node_type *>() ) {
+                node_type * pHead = m_pHead;
+                m_pHead = m_pHead->m_pNext;
+                free_node( pHead );
+            }
+        }
+
+        /// Returns queue's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the queue
+            is empty. To check queue emptyness use \ref empty() method.
+        */
+        size_t    size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+        /// Returns reference to internal statistics
+        stat const& statistics() const
+        {
+            return m_Stat;
+        }
+
+    };
+
+}}  // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_RWQUEUE_H
diff --git a/cds/container/segmented_queue.h b/cds/container/segmented_queue.h
new file mode 100644 (file)
index 0000000..45b894b
--- /dev/null
@@ -0,0 +1,409 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SEGMENTED_QUEUE_H
+#define __CDS_CONTAINER_SEGMENTED_QUEUE_H
+
+#include <cds/intrusive/segmented_queue.h>
+#include <cds/details/trivial_assign.h>
+#include <cds/details/std/memory.h>
+#include <cds/ref.h>
+
+namespace cds { namespace container {
+
+    /// SegmentedQueue -related declarations
+    namespace segmented_queue {
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        /// SegmentedQueue internal statistics
+        typedef cds::intrusive::segmented_queue::stat stat;
+#   else
+        using cds::intrusive::segmented_queue::stat;
+#   endif
+
+        /// SegmentedQueue empty internal statistics (no overhead)
+        typedef cds::intrusive::segmented_queue::empty_stat empty_stat;
+
+        /// SegmentedQueue default type traits
+        struct type_traits {
+
+            /// Item allocator. Default is \ref CDS_DEFAULT_ALLOCATOR
+            typedef CDS_DEFAULT_ALLOCATOR   node_allocator;
+
+            /// Item counter, default is atomicity::item_counter
+            /**
+                The item counting is an essential part of segmented queue algorithm.
+                The \p empty() member function is based on checking <tt>size() == 0</tt>.
+                Therefore, dummy item counter like atomicity::empty_item_counter is not the proper counter.
+            */
+            typedef atomicity::item_counter item_counter;
+
+            /// Internal statistics, possible predefined types are \ref stat, \ref empty_stat (the default)
+            typedef segmented_queue::empty_stat        stat;
+
+            /// Memory model, default is opt::v::relaxed_ordering. See cds::opt::memory_model for the full list of possible types
+            typedef opt::v::relaxed_ordering  memory_model;
+
+            /// Alignment of critical data, default is cache line alignment. See cds::opt::alignment option specification
+            enum { alignment = opt::cache_line_alignment };
+
+            /// Segment allocator. Default is \ref CDS_DEFAULT_ALLOCATOR
+            typedef CDS_DEFAULT_ALLOCATOR allocator;
+
+            /// Lock type used to maintain an internal list of allocated segments
+            typedef cds::lock::Spin lock_type;
+
+            /// Random \ref cds::opt::permutation_generator "permutation generator" for sequence [0, quasi_factor)
+            typedef cds::opt::v::random2_permutation<int>    permutation_generator;
+        };
+
+         /// Metafunction converting option list to traits for SegmentedQueue
+        /**
+            The metafunction can be useful if a few fields in \ref type_traits should be changed.
+            For example:
+            \code
+            typedef cds::container::segmented_queue::make_traits<
+                cds::opt::item_counter< cds::atomicity::item_counter >
+            >::type my_segmented_queue_traits;
+            \endcode
+            This code creates \p %SegmentedQueue type traits with item counting feature,
+            all other \p type_traits members left unchanged.
+
+            \p Options are:
+            - \p opt::node_allocator - node allocator.
+            - \p opt::stat - internal statistics, possible type: \ref stat, \ref empty_stat (the default)
+            - \p opt::item_counter - item counting feature. Note that atomicity::empty_item_counetr is not suitable
+                for segmented queue.
+            - \p opt::memory_model - memory model, default is \p opt::v::relaxed_ordering.
+                See option description for the full list of possible models
+            - \p opt::alignment - the alignmentfor critical data, see option description for explanation
+            - \p opt::allocator - the allocator used to maintain segments.
+            - \p opt::lock_type - a mutual exclusion lock type used to maintain internal list of allocated
+                segments. Default is \p cds::opt::Spin, \p std::mutex is also suitable.
+            - \p opt::permutation_generator - a random permutation generator for sequence [0, quasi_factor),
+                default is cds::opt::v::random2_permutation<int>
+        */
+        template <CDS_DECL_OPTIONS9>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS9 >::type
+                ,CDS_OPTIONS9
+            >::type   type;
+#   endif
+        };
+
+    } // namespace segmented_queue
+
+    //@cond
+    namespace details {
+
+        template <typename GC, typename T, typename Traits>
+        struct make_segmented_queue
+        {
+            typedef GC      gc;
+            typedef T       value_type;
+            typedef Traits  original_type_traits;
+
+            typedef cds::details::Allocator< T, typename original_type_traits::node_allocator > cxx_node_allocator;
+            struct node_disposer {
+                void operator()( T * p )
+                {
+                    cxx_node_allocator().Delete( p );
+                }
+            };
+
+            struct intrusive_type_traits: public original_type_traits {
+                typedef node_disposer   disposer;
+            };
+
+            typedef cds::intrusive::SegmentedQueue< gc, value_type, intrusive_type_traits > type;
+        };
+
+    } // namespace details
+    //@endcond
+
+    /// Segmented queue
+    /** @ingroup cds_nonintrusive_queue
+
+        The queue is based on work
+        - [2010] Afek, Korland, Yanovsky "Quasi-Linearizability: relaxed consistency for improved concurrency"
+
+        In this paper the authors offer a relaxed version of linearizability, so-called quasi-linearizability,
+        that preserves some of the intuition, provides a flexible way to control the level of relaxation
+        and supports th implementation of more concurrent and scalable data structure.
+        Intuitively, the linearizability requires each run to be equivalent in some sense to a serial run
+        of the algorithm. This equivalence to some serial run imposes strong synchronization requirements
+        that in many cases results in limited scalability and synchronization bottleneck.
+
+        The general idea is that the queue maintains a linked list of segments, each segment is an array of
+        nodes in the size of the quasi factor, and each node has a deleted boolean marker, which states
+        if it has been dequeued. Each producer iterates over last segment in the linked list in some random
+        permutation order. Whet it finds an empty cell it performs a CAS operation attempting to enqueue its
+        new element. In case the entire segment has been scanned and no available cell is found (implying
+        that the segment is full), then it attempts to add a new segment to the list.
+
+        The dequeue operation is similar: the consumer iterates over the first segment in the linked list
+        in some random permutation order. When it finds an item which has not yet been dequeued, it performs
+        CAS on its deleted marker in order to "delete" it, if succeeded this item is considered dequeued.
+        In case the entire segment was scanned and all the nodes have already been dequeued (implying that
+        the segment is empty), then it attempts to remove this segment from the linked list and starts
+        the same process on the next segment. If there is no next segment, the queue is considered empty.
+
+        Based on the fact that most of the time threads do not add or remove segments, most of the work
+        is done in parallel on different cells in the segments. This ensures a controlled contention
+        depending on the segment size, which is quasi factor.
+
+        The segmented queue is an <i>unfair</i> queue since it violates the strong FIFO order but no more than
+        quasi factor. It means that the consumer dequeues any item from the current first segment.
+
+        Template parameters:
+        - \p GC - a garbage collector, possible types are cds::gc::HP, cds::gc::PTB
+        - \p T - the type of values stored in the queue
+        - \p Traits - queue type traits, default is segmented_queue::type_traits.
+            segmented_queue::make_traits metafunction can be used to construct your
+            type traits.
+    */
+    template <class GC, typename T, typename Traits = segmented_queue::type_traits >
+    class SegmentedQueue:
+#ifdef CDS_DOXYGEN_INVOKED
+        public cds::intrusive::SegmentedQueue< GC, T, Traits >
+#else
+        public details::make_segmented_queue< GC, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_segmented_queue< GC, T, Traits > maker;
+        typedef typename maker::type base_class;
+        //@endcond
+    public:
+        typedef GC  gc          ;   ///< Garbage collector
+        typedef T   value_type  ;   ///< type of the value stored in the queue
+        typedef Traits options  ;   ///< Queue's traits
+
+        typedef typename options::node_allocator node_allocator;   ///< Node allocator
+        typedef typename base_class::memory_model  memory_model;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename base_class::item_counter  item_counter;   ///< Item counting policy, see cds::opt::item_counter option setter
+        typedef typename base_class::stat          stat        ;   ///< Internal statistics policy
+        typedef typename base_class::lock_type     lock_type   ;   ///< Type of mutex for maintaining an internal list of allocated segments.
+        typedef typename base_class::permutation_generator permutation_generator; ///< Random permutation generator for sequence [0, quasi-factor)
+
+        static const size_t m_nHazardPtrCount = base_class::m_nHazardPtrCount ; ///< Count of hazard pointer required for the algorithm
+
+    protected:
+        //@cond
+        typedef typename maker::cxx_node_allocator  cxx_node_allocator;
+        typedef std::unique_ptr< value_type, typename maker::node_disposer >  scoped_node_ptr;
+
+        static value_type * alloc_node( value_type const& v )
+        {
+            return cxx_node_allocator().New( v );
+        }
+
+        static value_type * alloc_node()
+        {
+            return cxx_node_allocator().New();
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static value_type * alloc_node_move( Args&&... args )
+        {
+            return cxx_node_allocator().MoveNew( std::forward<Args>( args )... );
+        }
+#   endif
+
+        struct dummy_disposer {
+            void operator()( value_type * p )
+            {}
+        };
+        //@endcond
+
+    public:
+        /// Initializes the empty queue
+        SegmentedQueue(
+            size_t nQuasiFactor     ///< Quasi factor. If it is not a power of 2 it is rounded up to nearest power of 2. Minimum is 2.
+            )
+            : base_class( nQuasiFactor )
+        {}
+
+        /// Clears the queue and deletes all internal data
+        ~SegmentedQueue()
+        {}
+
+        /// Inserts a new element at last segment of the queue
+        /**
+            The function makes queue node in dynamic memory calling copy constructor for \p val
+            and then it calls intrusive::SEgmentedQueue::enqueue.
+            Returns \p true if success, \p false otherwise.
+        */
+        bool enqueue( value_type const& val )
+        {
+            scoped_node_ptr p( alloc_node(val) );
+            if ( base_class::enqueue( *p ) ) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Synonym for <tt>enqueue(value_type const&)</tt> function
+        bool push( value_type const& val )
+        {
+            return enqueue( val );
+        }
+
+        /// Inserts a new element at last segment of the queue using copy functor
+        /**
+            \p Func is a functor called to copy value \p data of type \p Q
+            which may be differ from type \ref value_type stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(value_type& dest, Q const& data)
+                {
+                    // // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+        */
+        template <typename Q, typename Func>
+        bool enqueue( Q const& data, Func f  )
+        {
+            scoped_node_ptr p( alloc_node() );
+            unref(f)( *p, data );
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Synonym for <tt>enqueue(Q const&, Func)</tt> function
+        template <typename Q, typename Func>
+        bool push( Q const& data, Func f )
+        {
+            return enqueue( data, f );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Enqueues data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr p( alloc_node_move( std::forward<Args>(args)... ) );
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Removes an element from first segment of the queue
+        /**
+            \p Func is a functor called to copy dequeued value to \p dest of type \p Q
+            which may be differ from type \ref value_type stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(Q& dest, value_type const& data)
+                {
+                    // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+        */
+        template <typename Q, typename Func>
+        bool dequeue( Q& dest, Func f )
+        {
+            value_type * p = base_class::dequeue();
+            if ( p ) {
+                unref(f)( dest, *p );
+                gc::template retire< typename maker::node_disposer >( p );
+                return true;
+            }
+            return false;
+        }
+
+        /// Synonym for <tt>dequeue( Q&, Func )</tt> function
+        template <typename Q, typename Func>
+        bool pop( Q& dest, Func f )
+        {
+            return dequeue( dest, f );
+        }
+
+        /// Dequeues a value from the queue
+        /**
+            If queue is not empty, the function returns \p true, \p dest contains copy of
+            dequeued value. The assignment operator for type \ref value_type is invoked.
+            If queue is empty, the function returns \p false, \p dest is unchanged.
+        */
+        bool dequeue( value_type& dest )
+        {
+            typedef cds::details::trivial_assign<value_type, value_type> functor;
+            return dequeue( dest, functor() );
+        }
+
+        /// Synonym for <tt>dequeue(value_type&)</tt> function
+        bool pop( value_type& dest )
+        {
+            return dequeue( dest );
+        }
+
+        /// Checks if the queue is empty
+        /**
+            The original segmented queue algorithm does not allow to check emptiness accurately
+            because \p empty() is unlinearizable.
+            This function tests queue's emptiness checking <tt>size() == 0</tt>,
+            so, the item counting feature is an essential part of queue's algorithm.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Clear the queue
+        /**
+            The function repeatedly calls \ref dequeue until it returns \p nullptr.
+            The disposer specified in \p Traits template argument is called for each removed item.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Returns queue's item count
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns reference to internal statistics
+        /**
+            The type of internal statistics is specified by \p Traits template argument.
+        */
+        const stat& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Returns quasi factor, a power-of-two number
+        size_t quasi_factor() const
+        {
+            return base_class::quasi_factor();
+        }
+    };
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_SEGMENTED_QUEUE_H
diff --git a/cds/container/skip_list_base.h b/cds/container/skip_list_base.h
new file mode 100644 (file)
index 0000000..c52f015
--- /dev/null
@@ -0,0 +1,299 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_BASE_H
+#define __CDS_CONTAINER_SKIP_LIST_BASE_H
+
+#include <cds/intrusive/skip_list_base.h>
+#include <cds/container/base.h>
+
+namespace cds { namespace container {
+
+    /// SkipListSet related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace skip_list {
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Typedef for intrusive::skip_list::random_level_generator template
+        struct random_level_generator {};
+#else
+        using cds::intrusive::skip_list::random_level_generator;
+#endif
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Typedef for intrusive::skip_list::xorshift class
+        class xorshift {};
+#else
+        using cds::intrusive::skip_list::xorshift;
+#endif
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Typedef for intrusive::skip_list::turbo_pascal class
+        class turbo_pascal {};
+#else
+        using cds::intrusive::skip_list::turbo_pascal;
+#endif
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Typedef for intrusive::skip_list::stat class
+        class stat {};
+#else
+        using cds::intrusive::skip_list::stat;
+#endif
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Typedef for intrusive::skip_list::empty_stat class
+        class empty_stat {};
+#else
+        using cds::intrusive::skip_list::empty_stat;
+#endif
+
+        /// Type traits for SkipListSet class
+        struct type_traits
+        {
+            /// Key comparison functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+            */
+            typedef opt::none                       compare;
+
+            /// specifies binary predicate used for key compare.
+            /**
+                Default is \p std::less<T>.
+            */
+            typedef opt::none                       less;
+
+            /// Item counter
+            /**
+                The type for item counting feature.
+                Default is no item counter (\ref atomicity::empty_item_counter)
+            */
+            typedef atomicity::empty_item_counter     item_counter;
+
+            /// C++ memory ordering model
+            /**
+                List of available memory ordering see opt::memory_model
+            */
+            typedef opt::v::relaxed_ordering        memory_model;
+
+            /// Random level generator
+            /**
+                The random level generator is an important part of skip-list algorithm.
+                The node height in the skip-list have a probabilistic distribution
+                where half of the nodes that have level \p i also have level <tt>i+1</tt>
+                (i = 0..30). The height of a node is in range [0..31].
+
+                See skip_list::random_level_generator option setter.
+            */
+            typedef turbo_pascal                    random_level_generator;
+
+            /// Allocator for skip-list nodes, \p std::allocator interface
+            typedef CDS_DEFAULT_ALLOCATOR           allocator;
+
+            /// back-off strategy used
+            /**
+                If the option is not specified, the cds::backoff::Default is used.
+            */
+            typedef cds::backoff::Default           back_off;
+
+            /// Internal statistics
+            typedef empty_stat                      stat;
+
+            /// RCU deadlock checking policy (for \ref cds_nonintrusive_SkipListSet_rcu "RCU-based SkipListSet")
+            /**
+                List of available options see opt::rcu_check_deadlock
+            */
+            typedef opt::v::rcu_throw_deadlock      rcu_check_deadlock;
+
+            //@cond
+            // For internal use only
+            typedef opt::none                       key_accessor;
+            //@endcond
+        };
+
+        /// Metafunction converting option list to SkipListSet traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options list see \ref SkipListSet.
+        */
+        template <CDS_DECL_OPTIONS10>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS10 >::type
+                ,CDS_OPTIONS10
+            >::type   type;
+#   endif
+        };
+
+        //@cond
+        namespace details {
+
+            template <typename Node, typename Traits>
+            class node_allocator
+            {
+            protected:
+                typedef Node node_type;
+                typedef Traits type_traits;
+
+                typedef typename node_type::tower_item_type node_tower_item;
+                typedef typename type_traits::allocator::template rebind<unsigned char>::other  tower_allocator_type;
+                typedef typename type_traits::allocator::template rebind<node_type>::other      node_allocator_type;
+
+                static size_t const c_nTowerItemSize = sizeof(node_tower_item);
+                static size_t const c_nNodePadding = sizeof(node_type) % c_nTowerItemSize;
+                static size_t const c_nNodeSize = sizeof(node_type) + (c_nNodePadding ? (c_nTowerItemSize - c_nNodePadding) : 0);
+
+                static CDS_CONSTEXPR size_t node_size( unsigned int nHeight ) CDS_NOEXCEPT
+                {
+                    return c_nNodeSize + (nHeight - 1) * c_nTowerItemSize;
+                }
+                static unsigned char * alloc_space( unsigned int nHeight )
+                {
+                    if ( nHeight > 1 ) {
+                        unsigned char * pMem = tower_allocator_type().allocate( node_size(nHeight) );
+
+                        // check proper alignments
+                        assert( (((uintptr_t) pMem) & (alignof(node_type) - 1)) == 0 );
+                        assert( (((uintptr_t) (pMem + c_nNodeSize)) & (alignof(node_tower_item) - 1)) == 0 );
+                        return pMem;
+                    }
+
+                    return reinterpret_cast<unsigned char *>( node_allocator_type().allocate(1));
+                }
+
+                static void free_space( unsigned char * p, unsigned int nHeight )
+                {
+                    assert( p != null_ptr<unsigned char *>() );
+                    if ( nHeight == 1 )
+                        node_allocator_type().deallocate( reinterpret_cast<node_type *>(p), 1 );
+                    else
+                        tower_allocator_type().deallocate( p, node_size(nHeight));
+                }
+
+            public:
+                template <typename Q>
+                node_type * New( unsigned int nHeight, Q const& v )
+                {
+                    unsigned char * pMem = alloc_space( nHeight );
+                    return new( pMem )
+                        node_type( nHeight, nHeight > 1 ? reinterpret_cast<node_tower_item *>( pMem + c_nNodeSize ) : null_ptr<node_tower_item *>(), v );
+                }
+
+#       ifdef CDS_EMPLACE_SUPPORT
+                template <typename... Args>
+                node_type * New( unsigned int nHeight, Args&&... args )
+                {
+                    unsigned char * pMem = alloc_space( nHeight );
+                    return new( pMem )
+                        node_type( nHeight, nHeight > 1 ? reinterpret_cast<node_tower_item *>( pMem + c_nNodeSize ): null_ptr<node_tower_item *>(),
+                        std::forward<Args>(args)... );
+                }
+#       endif
+
+                void Delete( node_type * p )
+                {
+                    assert( p != null_ptr<node_type *>() );
+
+                    unsigned int nHeight = p->height();
+                    node_allocator_type().destroy( p );
+                    free_space( reinterpret_cast<unsigned char *>(p), nHeight );
+                }
+            };
+
+            template <typename IntrusiveNode>
+            struct dummy_node_builder {
+                typedef IntrusiveNode intrusive_node_type;
+
+                template <typename RandomGen>
+                static intrusive_node_type * make_tower( intrusive_node_type * pNode, RandomGen& /*gen*/ ) { return pNode ; }
+                static intrusive_node_type * make_tower( intrusive_node_type * pNode, unsigned int /*nHeight*/ ) { return pNode ; }
+                static void dispose_tower( intrusive_node_type * pNode )
+                {
+                    pNode->release_tower();
+                }
+
+                struct node_disposer {
+                    void operator()( intrusive_node_type * pNode ) const {}
+                };
+            };
+
+            template <typename ForwardIterator>
+            class iterator
+            {
+                typedef ForwardIterator intrusive_iterator;
+                typedef typename intrusive_iterator::value_type node_type;
+                typedef typename node_type::stored_value_type   value_type;
+                static bool const c_isConst = intrusive_iterator::c_isConst;
+
+                typedef typename std::conditional< c_isConst, value_type const &, value_type &>::type   value_ref;
+
+                intrusive_iterator      m_It;
+
+            public: // for internal use only!!!
+                iterator( intrusive_iterator const& it )
+                    : m_It( it )
+                {}
+
+            public:
+                iterator()
+                    : m_It()
+                {}
+
+                iterator( iterator const& s)
+                    : m_It( s.m_It )
+                {}
+
+                value_type * operator ->() const
+                {
+                    return &( m_It.operator->()->m_Value );
+                }
+
+                value_ref operator *() const
+                {
+                    return m_It.operator*().m_Value;
+                }
+
+                /// Pre-increment
+                iterator& operator ++()
+                {
+                    ++m_It;
+                    return *this;
+                }
+
+                iterator& operator = (iterator const& src)
+                {
+                    m_It = src.m_It;
+                    return *this;
+                }
+
+                template <typename FwIt>
+                bool operator ==(iterator<FwIt> const& i ) const
+                {
+                    return m_It == i.m_It;
+                }
+                template <typename FwIt>
+                bool operator !=(iterator<FwIt> const& i ) const
+                {
+                    return !( *this == i );
+                }
+            };
+
+        } // namespace details
+        //@endcond
+
+    } // namespace skip_list
+
+    // Forward declaration
+    template <class GC, typename T, typename Traits = skip_list::type_traits >
+    class SkipListSet;
+
+    // Forward declaration
+    template <class GC, typename K, typename T, typename Traits = skip_list::type_traits >
+    class SkipListMap;
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_SKIP_LIST_BASE_H
diff --git a/cds/container/skip_list_map_hp.h b/cds/container/skip_list_map_hp.h
new file mode 100644 (file)
index 0000000..7665aa5
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_MAP_HP_H
+#define __CDS_CONTAINER_SKIP_LIST_MAP_HP_H
+
+#include <cds/container/skip_list_base.h>
+#include <cds/intrusive/skip_list_hp.h>
+#include <cds/container/details/make_skip_list_map.h>
+#include <cds/container/skip_list_map_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_SKIP_LIST_MAP_HP_H
diff --git a/cds/container/skip_list_map_hrc.h b/cds/container/skip_list_map_hrc.h
new file mode 100644 (file)
index 0000000..53d230e
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_MAP_HRC_H
+#define __CDS_CONTAINER_SKIP_LIST_MAP_HRC_H
+
+#include <cds/container/skip_list_base.h>
+#include <cds/intrusive/skip_list_hrc.h>
+#include <cds/container/details/make_skip_list_map.h>
+#include <cds/container/skip_list_map_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_SKIP_LIST_MAP_HRC_H
diff --git a/cds/container/skip_list_map_impl.h b/cds/container/skip_list_map_impl.h
new file mode 100644 (file)
index 0000000..a1c83ed
--- /dev/null
@@ -0,0 +1,803 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_MAP_IMPL_H
+#define __CDS_CONTAINER_SKIP_LIST_MAP_IMPL_H
+
+#include <cds/details/functor_wrapper.h>
+#include <cds/gc/guarded_ptr.h>
+#include <cds/container/details/guarded_ptr_cast.h>
+
+namespace cds { namespace container {
+
+    /// Lock-free skip-list map
+    /** @ingroup cds_nonintrusive_map
+        \anchor cds_nonintrusive_SkipListMap_hp
+
+        The implementation of well-known probabilistic data structure called skip-list
+        invented by W.Pugh in his papers:
+            - [1989] W.Pugh Skip Lists: A Probabilistic Alternative to Balanced Trees
+            - [1990] W.Pugh A Skip List Cookbook
+
+        A skip-list is a probabilistic data structure that provides expected logarithmic
+        time search without the need of rebalance. The skip-list is a collection of sorted
+        linked list. Nodes are ordered by key. Each node is linked into a subset of the lists.
+        Each list has a level, ranging from 0 to 32. The bottom-level list contains
+        all the nodes, and each higher-level list is a sublist of the lower-level lists.
+        Each node is created with a random top level (with a random height), and belongs
+        to all lists up to that level. The probability that a node has the height 1 is 1/2.
+        The probability that a node has the height N is 1/2 ** N (more precisely,
+        the distribution depends on an random generator provided, but our generators
+        have this property).
+
+        The lock-free variant of skip-list is implemented according to book
+            - [2008] M.Herlihy, N.Shavit "The Art of Multiprocessor Programming",
+                chapter 14.4 "A Lock-Free Concurrent Skiplist"
+
+        Template arguments:
+        - \p GC - Garbage collector used.
+        - \p K - type of a key to be stored in the list.
+        - \p T - type of a value to be stored in the list.
+        - \p Traits - type traits. See skip_list::type_traits for explanation.
+
+        It is possible to declare option-based list with cds::container::skip_list::make_traits metafunction istead of \p Traits template
+        argument.
+        Template argument list \p Options of cds::container::skip_list::make_traits metafunction are:
+        - opt::compare - key compare functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<K>.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - skip_list::random_level_generator - random level generator. Can be skip_list::xorshift, skip_list::turbo_pascal or
+            user-provided one. See skip_list::random_level_generator option description for explanation.
+            Default is \p %skip_list::turbo_pascal.
+        - opt::allocator - allocator for skip-list node. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used.
+        - opt::stat - internal statistics. Available types: skip_list::stat, skip_list::empty_stat (the default)
+
+        Like STL map class, %SkipListMap stores its key-value pair as <tt>std:pair< K const, T></tt>.
+
+        \warning The skip-list requires up to 67 hazard pointers that may be critical for some GCs for which
+            the guard count is limited (like as gc::HP, gc::HRC). Those GCs should be explicitly initialized with
+            hazard pointer enough: \code cds::gc::HP myhp( 67 ) \endcode. Otherwise an run-time exception may be raised
+            when you try to create skip-list object.
+
+        \note There are several specializations of \p %SkipListMap for each \p GC. You should include:
+        - <tt><cds/container/skip_list_map_hp.h></tt> for gc::HP garbage collector
+        - <tt><cds/container/skip_list_map_hrc.h></tt> for gc::HRC garbage collector
+        - <tt><cds/container/skip_list_map_ptb.h></tt> for gc::PTB garbage collector
+        - <tt><cds/container/skip_list_map_rcu.h></tt> for \ref cds_nonintrusive_SkipListMap_rcu "RCU type"
+        - <tt><cds/container/skip_list_map_nogc.h></tt> for \ref cds_nonintrusive_SkipListMap_nogc "non-deletable SkipListMap"
+
+        <b>Iterators</b>
+
+        The class supports a forward iterator (\ref iterator and \ref const_iterator).
+        The iteration is ordered.
+        The iterator object is thread-safe: the element pointed by the iterator object is guarded,
+        so, the element cannot be reclaimed while the iterator object is alive.
+        However, passing an iterator object between threads is dangerous.
+
+        \warning Due to concurrent nature of skip-list map it is not guarantee that you can iterate
+        all elements in the map: any concurrent deletion can exclude the element
+        pointed by the iterator from the map, and your iteration can be terminated
+        before end of the map. Therefore, such iteration is more suitable for debugging purpose only
+
+        Remember, each iterator object requires 2 additional hazard pointers, that may be
+        a limited resource for \p GC like as gc::HP and gc::HRC (however, for gc::PTB the count of
+        guards is unlimited).
+
+        The iterator class supports the following minimalistic interface:
+        \code
+        struct iterator {
+            // Default ctor
+            iterator();
+
+            // Copy ctor
+            iterator( iterator const& s);
+
+            value_type * operator ->() const;
+            value_type& operator *() const;
+
+            // Pre-increment
+            iterator& operator ++();
+
+            // Copy assignment
+            iterator& operator = (const iterator& src);
+
+            bool operator ==(iterator const& i ) const;
+            bool operator !=(iterator const& i ) const;
+        };
+        \endcode
+        Note, the iterator object returned by \ref end, \ cend member functions points to \p NULL and should not be dereferenced.
+
+    */
+    template <
+        typename GC,
+        typename Key,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = skip_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class SkipListMap:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::SkipListSet< GC, std::pair<Key const, T>, Traits >
+#else
+        protected details::make_skip_list_map< GC, Key, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_skip_list_map< GC, Key, T, Traits >    maker;
+        typedef typename maker::type base_class;
+        //@endcond
+    public:
+        typedef typename base_class::gc          gc  ; ///< Garbage collector used
+        typedef Key     key_type    ;   ///< Key type
+        typedef T       mapped_type ;   ///< Mapped type
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef std::pair< K const, T> value_type   ;   ///< Value type stored in the map
+#   else
+        typedef typename maker::value_type  value_type;
+#   endif
+        typedef Traits  options     ;   ///< Options specified
+
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator         allocator_type  ;   ///< Allocator type used for allocate/deallocate the skip-list nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename maker::key_comparator      key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::random_level_generator random_level_generator ; ///< random level generator
+        typedef typename options::stat              stat            ;   ///< internal statistics type
+
+    protected:
+        //@cond
+        typedef typename maker::node_type           node_type;
+        typedef typename maker::node_allocator      node_allocator;
+
+        typedef std::unique_ptr< node_type, typename maker::node_deallocator >    scoped_node_ptr;
+
+        //@endcond
+
+    public:
+        /// Guarded pointer
+        typedef cds::gc::guarded_ptr< gc, node_type, value_type, details::guarded_ptr_cast_set<node_type, value_type> > guarded_ptr;
+
+    protected:
+        //@cond
+        unsigned int random_level()
+        {
+            return base_class::random_level();
+        }
+        //@endcond
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor
+        {
+            void operator()( value_type& ) const
+            {}
+        };
+
+        template <typename Q>
+        class insert_value_functor
+        {
+            Q const&    m_val;
+        public:
+            insert_value_functor( Q const & v)
+                : m_val(v)
+            {}
+
+            void operator()( value_type& item )
+            {
+                item.second = m_val;
+            }
+        };
+
+        template <typename Func>
+        class insert_key_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_key_wrapper( Func f ): base_class(f) {}
+
+            void operator()( node_type& item )
+            {
+                base_class::get()( item.m_Value );
+            }
+        };
+
+        template <typename Func>
+        class ensure_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            ensure_wrapper( Func f) : base_class(f) {}
+
+            void operator()( bool bNew, node_type& item, node_type const& )
+            {
+                base_class::get()( bNew, item.m_Value );
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+
+        template <typename Func>
+        class find_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_wrapper( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator()( node_type& item, Q& val )
+            {
+                base_class::get()( item.m_Value, val );
+            }
+        };
+#   endif  // #ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    public:
+        /// Default ctor
+        SkipListMap()
+            : base_class()
+        {}
+
+        /// Destructor destroys the set object
+        ~SkipListMap()
+        {}
+
+    public:
+        /// Iterator type
+        typedef skip_list::details::iterator< typename base_class::iterator >  iterator;
+
+        /// Const iterator type
+        typedef skip_list::details::iterator< typename base_class::const_iterator >   const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a map
+        iterator begin()
+        {
+            return iterator( base_class::begin() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a map
+        //@{
+        const_iterator begin() const
+        {
+            return cbegin();
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( base_class::cbegin() );
+        }
+        //@}
+
+        /// Returns a forward iterator that addresses the location succeeding the last element in a map.
+        iterator end()
+        {
+            return iterator( base_class::end() );
+        }
+
+        /// Returns a forward const iterator that addresses the location succeeding the last element in a map.
+        //@{
+        const_iterator end() const
+        {
+            return cend();
+        }
+        const_iterator cend()
+        {
+            return const_iterator( base_class::cend() );
+        }
+        //@}
+
+    public:
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from a value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( K const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert_key( key, [](value_type&){} );
+#       else
+            return insert_key( key, empty_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref value_type should be constructible from \p val of type \p V.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( K const& key, V const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert_key( key, [&val](value_type& item) { item.second = val ; } );
+#       else
+            insert_value_functor<V> f(val);
+            return insert_key( key, cds::ref(f) );
+#       endif
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted:
+                - <tt>item.first</tt> is a const reference to item's key that cannot be changed.
+                - <tt>item.second</tt> is a reference to item's value that may be changed.
+
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p value_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            scoped_node_ptr pNode( node_allocator().New( random_level(), key ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *pNode, [&func]( node_type& item ) { cds::unref(func)( item.m_Value ); } ))
+#       else
+            insert_key_wrapper<Func> wrapper(func);
+            if ( base_class::insert( *pNode, cds::ref(wrapper) ))
+#endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            scoped_node_ptr pNode( node_allocator().New( random_level(), std::forward<K>(key), std::forward<Args>(args)... ));
+            if ( base_class::insert( *pNode )) {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+
+        /// Ensures that the \p key exists in the map
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the map, then the new item created from \p key
+            is inserted into the map (note that in this case the \ref key_type should be
+            constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref value_type.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( K const& key, Func func )
+        {
+            scoped_node_ptr pNode( node_allocator().New( random_level(), key ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> res = base_class::ensure( *pNode,
+                [&func](bool bNew, node_type& item, node_type const& ){ cds::unref(func)( bNew, item.m_Value ); }
+            );
+#       else
+            ensure_wrapper<Func> wrapper( func );
+            std::pair<bool, bool> res = base_class::ensure( *pNode, cds::ref(wrapper) );
+#       endif
+            if ( res.first && res.second )
+                pNode.release();
+            return res;
+        }
+
+        /// Delete \p key from the map
+        /** \anchor cds_nonintrusive_SkipListMap_erase_val
+
+            Return \p true if \p key is found and deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            return base_class::erase(key);
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_erase_val "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool erase_with( K const& key, Less pred )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >());
+        }
+
+        /// Delete \p key from the map
+        /** \anchor cds_nonintrusive_SkipListMap_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& item) { ... }
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase( key, [&f]( node_type& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase( key, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_with( key,
+                cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >(),
+                [&f]( node_type& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >(), cds::ref(wrapper));
+#       endif
+        }
+
+        /// Extracts the item from the map with specified \p key
+        /** \anchor cds_nonintrusive_SkipListMap_hp_extract
+            The function searches an item with key equal to \p key in the map,
+            unlinks it from the map, and returns it in \p ptr parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p K that can be not the same as \p key_type.
+
+            The item extracted is freed automatically by garbage collector \p GC
+            when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::SkipListMap< cds::gc::HP, int, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                if ( theList.extract( gp, 5 ) ) {
+                    // Deal with gp
+                    // ...
+                }
+                // Destructor of gp releases internal HP guard and frees the pointer
+            }
+            \endcode
+        */
+        template <typename K>
+        bool extract( guarded_ptr& ptr, K const& key )
+        {
+            return base_class::extract_( ptr.guard(), key, typename base_class::key_comparator() );
+        }
+
+        /// Extracts the item from the map with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_hp_extract "extract(K const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool extract_with( guarded_ptr& ptr, K const& key, Less pred )
+        {
+            typedef cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >  wrapped_less;
+            return base_class::extract_( ptr.guard(), key, cds::opt::details::make_comparator_from_less<wrapped_less>() );
+        }
+
+        /// Extracts an item with minimal key from the map
+        /**
+            The function searches an item with minimal key, unlinks it, and returns the item found in \p ptr parameter.
+            If the skip-list is empty the function returns \p false.
+
+            The item extracted is freed automatically by garbage collector \p GC
+            when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::continer::SkipListMap< cds::gc::HP, int, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                if ( theList.extract_min( gp )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of gp releases internal HP guard and then frees the pointer
+            }
+            \endcode
+        */
+        bool extract_min( guarded_ptr& ptr)
+        {
+            return base_class::extract_min_( ptr.guard() );
+        }
+
+        /// Extracts an item with maximal key from the map
+        /**
+            The function searches an item with maximal key, unlinks it, and returns the pointer to item found in \p ptr parameter.
+            If the skip-list is empty the function returns empty \p guarded_ptr.
+
+            The item found is freed by garbage collector \p GC automatically
+            when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::SkipListMap< cds::gc::HP, int, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                if ( theList.extract_max( gp )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of gp releases internal HP guard and then frees the pointer
+            }
+            \endcode
+        */
+        bool extract_max( guarded_ptr& dest )
+        {
+            return base_class::extract_max_( dest.guard() );
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_SkipListMap_find_cfunc
+
+            The function searches the item with key equal to \p key and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change \p item.second.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename K, typename Func>
+        bool find( K const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( key, [&f](node_type& item, K const& ) { cds::unref(f)( item.m_Value );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find( key, cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_find_cfunc "find(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool find_with( K const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( key,
+                cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >(),
+                [&f](node_type& item, K const& ) { cds::unref(f)( item.m_Value );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >(), cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_SkipListMap_find_val
+
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+        */
+        template <typename K>
+        bool find( K const& key )
+        {
+            return base_class::find( key );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_find_val "find(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool find_with( K const& key, Less pred )
+        {
+            return base_class::find_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >() );
+        }
+
+        /// Finds the key \p key and return the item found
+        /** \anchor cds_nonintrusive_SkipListMap_hp_get
+            The function searches the item with key equal to \p key
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p key is found, and \p false otherwise.
+            If \p key is not found the \p ptr parameter is not changed.
+
+            It is safe when a concurrent thread erases the item returned in \p ptr guarded pointer.
+            In this case the item will be freed later by garbage collector \p GC automatically
+            when \p guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::SkipListMap< cds::gc::HP, int, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                if ( theList.get( gp, 5 ) ) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for class \p Traits template parameter
+            should accept a parameter of type \p K that can be not the same as \p value_type.
+        */
+        template <typename K>
+        bool get( guarded_ptr& ptr, K const& key )
+        {
+            return base_class::get_with_( ptr.guard(), key, typename base_class::key_comparator() );
+        }
+
+        /// Finds the key \p key and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_hp_get "get( guarded_ptr& ptr, K const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool get_with( guarded_ptr& ptr, K const& key, Less pred )
+        {
+            typedef cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor > wrapped_less;
+            return base_class::get_with_( ptr.guard(), key, cds::opt::details::make_comparator_from_less< wrapped_less >());
+        }
+
+        /// Clears the map
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+    };
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_SKIP_LIST_MAP_IMPL_H
diff --git a/cds/container/skip_list_map_nogc.h b/cds/container/skip_list_map_nogc.h
new file mode 100644 (file)
index 0000000..cb402eb
--- /dev/null
@@ -0,0 +1,386 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_MAP_NOGC_H
+#define __CDS_CONTAINER_SKIP_LIST_MAP_NOGC_H
+
+#include <cds/container/skip_list_set_nogc.h>
+
+namespace cds { namespace container {
+    //@cond
+    namespace skip_list { namespace details {
+        struct map_key_accessor
+        {
+            template <typename NodeType>
+            typename NodeType::stored_value_type::first_type const& operator()( NodeType const& node ) const
+            {
+                return node.m_Value.first;
+            }
+        };
+    }} // namespace skip_list::details
+    //@endcond
+
+
+    /// Lock-free skip-list map (template specialization for gc::nogc)
+    /** @ingroup cds_nonintrusive_map
+        \anchor cds_nonintrusive_SkipListMap_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of map item.
+        See \ref cds_nonintrusive_SkipListMap_hp "SkipListMap" for detailed description.
+
+        Template arguments:
+        - \p K - type of a key to be stored in the list.
+        - \p T - type of a value to be stored in the list.
+        - \p Traits - type traits. See skip_list::type_traits for explanation.
+
+        It is possible to declare option-based list with cds::container::skip_list::make_traits metafunction istead of \p Traits template
+        argument.
+        Template argument list \p Options of cds::container::skip_list::make_traits metafunction are:
+        - opt::compare - key compare functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<K>.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - skip_list::random_level_generator - random level generator. Can be skip_list::xorshift, skip_list::turbo_pascal or
+            user-provided one. See skip_list::random_level_generator option description for explanation.
+            Default is \p %skip_list::turbo_pascal.
+        - opt::allocator - allocator for skip-list node. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used.
+        - opt::stat - internal statistics. Available types: skip_list::stat, skip_list::empty_stat (the default)
+    */
+    template <
+        typename Key,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = skip_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class SkipListMap< cds::gc::nogc, Key, T, Traits >:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected SkipListSet< cds::gc::nogc, std::pair< Key const, T >, Traits >
+#else
+        protected SkipListSet<
+            cds::gc::nogc
+            ,std::pair< Key const, T >
+            ,typename cds::opt::replace_key_accessor< Traits, skip_list::details::map_key_accessor >::type
+        >
+#endif
+    {
+        //@cond
+        typedef SkipListSet<
+            cds::gc::nogc
+            ,std::pair< Key const, T >
+            ,typename cds::opt::replace_key_accessor< Traits, skip_list::details::map_key_accessor >::type
+        > base_class;
+        //@endcond
+
+    public:
+        typedef typename base_class::gc gc  ; ///< Garbage collector used
+        typedef Key key_type      ;   ///< Key type
+        typedef T   mapped_type   ;   ///< Mapped type
+        typedef std::pair< key_type const, mapped_type> value_type  ;   ///< Key-value pair stored in the map
+        typedef Traits  options     ;   ///< Options specified
+
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename base_class::allocator_type allocator_type  ;   ///< Allocator type used for allocate/deallocate the skip-list nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename base_class::key_comparator key_comparator  ;   ///< key compare functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename base_class::stat           stat            ;   ///< internal statistics type
+        typedef typename base_class::random_level_generator random_level_generator  ;   ///< random level generator
+
+    protected:
+        //@cond
+        typedef typename base_class::node_type      node_type;
+        typedef typename base_class::node_allocator node_allocator;
+
+        /*
+        template <class Less>
+        struct less_wrapper {
+            typedef Less    less_op;
+
+            bool operator()( value_type const& v1, value_type const& v2 ) const
+            {
+                return less_op()( v1.first, v2.first);
+            }
+
+            template <typename Q>
+            bool operator()( value_type const& v1, Q const& v2 ) const
+            {
+                return less_op()( v1.first, v2 );
+            }
+
+            template <typename Q>
+            bool operator()( Q const& v1, value_type const& v2 ) const
+            {
+                return less_op()( v1, v2.first );
+            }
+        };
+        */
+        //@endcond
+
+    public:
+        /// Default constructor
+        SkipListMap()
+            : base_class()
+        {}
+
+        /// Destructor clears the map
+        ~SkipListMap()
+        {}
+
+    public:
+        /// Forward iterator
+        /**
+            Remember, the iterator <tt>operator -> </tt> and <tt>operator *</tt> returns \ref value_type pointer and reference.
+            To access item key and value use <tt>it->first</tt> and <tt>it->second</tt> respectively.
+        */
+        typedef typename base_class::iterator iterator;
+
+        /// Const forward iterator
+        typedef typename base_class::const_iterator const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a map
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return base_class::begin();
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a map
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return base_class::end();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a map
+        //@{
+        const_iterator begin() const
+        {
+            return base_class::begin();
+        }
+        const_iterator cbegin()
+        {
+            return base_class::cbegin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a map
+        //@{
+        const_iterator end() const
+        {
+            return base_class::end();
+        }
+        const_iterator cend()
+        {
+            return base_class::cend();
+        }
+        //@}
+
+    public:
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K>
+        iterator insert( K const& key )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::insert( std::make_pair( key, mapped_type() ) );
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K, typename V>
+        iterator insert( K const& key, V const& val )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::insert( std::make_pair( key, val ) );
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted. <tt>item.second</tt> is a reference to item's value that may be changed.
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this map's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if the inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p f functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K, typename Func>
+        iterator insert_key( K const& key, Func func )
+        {
+            iterator it = insert( key );
+            if ( it != end() )
+                cds::unref( func )( (*it) );
+            return it;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            \p key_type should be constructible from type \p K
+
+            Returns \p true if inserting successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        iterator emplace( K&& key, Args&&... args )
+        {
+            return base_class::emplace( std::forward<K>(key), std::move(mapped_type(std::forward<Args>(args)...)));
+        }
+#   endif
+
+        /// Ensures that the key \p key exists in the map
+        /**
+            The operation inserts new item if the key \p key is not found in the map.
+            Otherwise, the function returns an iterator that points to item found.
+
+            Returns <tt> std::pair<iterator, bool>  </tt> where \p first is an iterator pointing to
+            item found or inserted, \p second is true if new item has been added or \p false if the item
+            already is in the list.
+        */
+        template <typename K>
+        std::pair<iterator, bool> ensure( K const& key )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::ensure( std::make_pair( key, mapped_type() ));
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_SkipListMap_nogc_find_val
+
+            The function searches the item with key equal to \p key
+            and returns an iterator pointed to item found if the key is found,
+            and \ref end() otherwise
+        */
+        template <typename K>
+        iterator find( K const& key )
+        {
+            return base_class::find( key );
+        }
+
+        /// Finds the key \p key with comparing functor \p cmp
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_nogc_find_val "find(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename K, typename Less>
+        iterator find_with( K const& key, Less pred ) const
+        {
+            return base_class::find_with( key, pred );
+        }
+
+        /// Gets minimum key from the map
+        /**
+            If the map is empty the function returns \p NULL
+        */
+        value_type * get_min() const
+        {
+            return base_class::get_min();
+        }
+
+        /// Gets maximum key from the map
+        /**
+            The function returns \p NULL if the map is empty
+        */
+        value_type * get_max() const
+        {
+            return base_class::get_max();
+        }
+
+        /// Clears the map (non-atomic)
+        /**
+            The function is not atomic.
+            Finding and/or inserting is prohibited while clearing.
+            Otherwise an unpredictable result may be encountered.
+            Thus, \p clear() may be used only for debugging purposes.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+            Thus, the correct item counting feature is an important part of Michael's map implementation.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns maximum height of skip-list. The max height is a constant for each object and does not exceed 32.
+        static CDS_CONSTEXPR unsigned int max_height() CDS_NOEXCEPT
+        {
+            return base_class::max_height();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+    };
+
+}} // namespace cds::container
+
+
+#endif // #ifndef __CDS_CONTAINER_SKIP_LIST_MAP_NOGC_H
diff --git a/cds/container/skip_list_map_ptb.h b/cds/container/skip_list_map_ptb.h
new file mode 100644 (file)
index 0000000..60cda76
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_SET_PTB_H
+#define __CDS_CONTAINER_SKIP_LIST_SET_PTB_H
+
+#include <cds/container/skip_list_base.h>
+#include <cds/intrusive/skip_list_ptb.h>
+#include <cds/container/details/make_skip_list_map.h>
+#include <cds/container/skip_list_map_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_SKIP_LIST_SET_PTB_H
diff --git a/cds/container/skip_list_map_rcu.h b/cds/container/skip_list_map_rcu.h
new file mode 100644 (file)
index 0000000..f15309a
--- /dev/null
@@ -0,0 +1,807 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_MAP_RCU_H
+#define __CDS_CONTAINER_SKIP_LIST_MAP_RCU_H
+
+#include <cds/container/skip_list_base.h>
+#include <cds/intrusive/skip_list_rcu.h>
+#include <cds/container/details/make_skip_list_map.h>
+#include <cds/details/functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    /// Lock-free skip-list map (template specialization for \ref cds_urcu_desc "RCU")
+    /** @ingroup cds_nonintrusive_map
+        \anchor cds_nonintrusive_SkipListMap_rcu
+
+        The implementation of well-known probabilistic data structure called skip-list
+        invented by W.Pugh in his papers:
+            - [1989] W.Pugh Skip Lists: A Probabilistic Alternative to Balanced Trees
+            - [1990] W.Pugh A Skip List Cookbook
+
+        A skip-list is a probabilistic data structure that provides expected logarithmic
+        time search without the need of rebalance. The skip-list is a collection of sorted
+        linked list. Nodes are ordered by key. Each node is linked into a subset of the lists.
+        Each list has a level, ranging from 0 to 32. The bottom-level list contains
+        all the nodes, and each higher-level list is a sublist of the lower-level lists.
+        Each node is created with a random top level (with a random height), and belongs
+        to all lists up to that level. The probability that a node has the height 1 is 1/2.
+        The probability that a node has the height N is 1/2 ** N (more precisely,
+        the distribution depends on an random generator provided, but our generators
+        have this property).
+
+        The lock-free variant of skip-list is implemented according to book
+            - [2008] M.Herlihy, N.Shavit "The Art of Multiprocessor Programming",
+                chapter 14.4 "A Lock-Free Concurrent Skiplist"
+
+        Template arguments:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type".
+        - \p K - type of a key to be stored in the list.
+        - \p T - type of a value to be stored in the list.
+        - \p Traits - type traits. See skip_list::type_traits for explanation.
+
+        It is possible to declare option-based list with cds::container::skip_list::make_traits metafunction istead of \p Traits template
+        argument.
+        Template argument list \p Options of cds::container::skip_list::make_traits metafunction are:
+        - opt::compare - key compare functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<K>.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - skip_list::random_level_generator - random level generator. Can be skip_list::xorshift, skip_list::turbo_pascal or
+            user-provided one. See skip_list::random_level_generator option description for explanation.
+            Default is \p %skip_list::turbo_pascal.
+        - opt::allocator - allocator for skip-list node. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used.
+        - opt::stat - internal statistics. Available types: skip_list::stat, skip_list::empty_stat (the default)
+        - opt::rcu_check_deadlock - a deadlock checking policy. Default is opt::v::rcu_throw_deadlock
+
+        Like STL map class, \p %SkipListMap stores its key-value pair as <tt>std:pair< K const, T></tt>.
+
+        @note Before including <tt><cds/container/skip_list_map_rcu.h></tt> you should include appropriate RCU header file,
+        see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+
+        <b>Iterators</b>
+
+        The class supports a forward iterator (\ref iterator and \ref const_iterator).
+        The iteration is ordered.
+        You may iterate over skip-list set items only under RCU lock.
+        Only in this case the iterator is thread-safe since
+        while RCU is locked any set's item cannot be reclaimed.
+
+        The requirement of RCU lock during iterating means that deletion of the elements (i.e. \ref erase)
+        is not possible.
+
+        @warning The iterator object cannot be passed between threads
+
+        The iterator class supports the following minimalistic interface:
+        \code
+        struct iterator {
+            // Default ctor
+            iterator();
+
+            // Copy ctor
+            iterator( iterator const& s);
+
+            value_type * operator ->() const;
+            value_type& operator *() const;
+
+            // Pre-increment
+            iterator& operator ++();
+
+            // Copy assignment
+            iterator& operator = (const iterator& src);
+
+            bool operator ==(iterator const& i ) const;
+            bool operator !=(iterator const& i ) const;
+        };
+        \endcode
+        Note, the iterator object returned by \ref end, \p cend member functions points to \p NULL and should not be dereferenced.
+
+    */
+    template <
+        typename RCU,
+        typename Key,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = skip_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class SkipListMap< cds::urcu::gc< RCU >, Key, T, Traits >:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::SkipListSet< cds::urcu::gc< RCU >, std::pair<Key const, T>, Traits >
+#else
+        protected details::make_skip_list_map< cds::urcu::gc< RCU >, Key, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_skip_list_map< cds::urcu::gc< RCU >, Key, T, Traits >    maker;
+        typedef typename maker::type base_class;
+        //@endcond
+    public:
+        typedef typename base_class::gc          gc  ; ///< Garbage collector used
+        typedef Key     key_type    ;   ///< Key type
+        typedef T       mapped_type ;   ///< Mapped type
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef std::pair< K const, T> value_type   ;   ///< Value type stored in the map
+#   else
+        typedef typename maker::value_type  value_type;
+#   endif
+        typedef Traits  options     ;   ///< Options specified
+
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator         allocator_type  ;   ///< Allocator type used for allocate/deallocate the skip-list nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename maker::key_comparator      key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::random_level_generator random_level_generator ; ///< random level generator
+        typedef typename options::stat              stat            ;   ///< internal statistics type
+
+    protected:
+        //@cond
+        typedef typename maker::node_type           node_type;
+        typedef typename maker::node_allocator      node_allocator;
+
+        typedef std::unique_ptr< node_type, typename maker::node_deallocator >    scoped_node_ptr;
+        //@endcond
+
+    public:
+        typedef typename base_class::rcu_lock  rcu_lock;   ///< RCU scoped lock
+        /// Group of \p extract_xxx functions do not require external locking
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = base_class::c_bExtractLockExternal;
+
+        /// pointer to extracted node
+        typedef cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::intrusive_type_traits::disposer > exempt_ptr;
+
+    protected:
+        //@cond
+        unsigned int random_level()
+        {
+            return base_class::random_level();
+        }
+
+        value_type * to_value_ptr( node_type * pNode ) const CDS_NOEXCEPT
+        {
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+        //@endcond
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor
+        {
+            void operator()( value_type& ) const
+            {}
+        };
+
+        template <typename Q>
+        class insert_value_functor
+        {
+            Q const&    m_val;
+        public:
+            insert_value_functor( Q const& v)
+                : m_val(v)
+            {}
+
+            void operator()( value_type& item )
+            {
+                item.second = m_val;
+            }
+        };
+
+        template <typename Func>
+        class insert_key_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_key_wrapper( Func f ): base_class(f) {}
+
+            void operator()( node_type& item )
+            {
+                base_class::get()( item.m_Value );
+            }
+        };
+
+        template <typename Func>
+        class ensure_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            ensure_wrapper( Func f) : base_class(f) {}
+
+            void operator()( bool bNew, node_type& item, node_type const& )
+            {
+                base_class::get()( bNew, item.m_Value );
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+
+        template <typename Func>
+        class find_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_wrapper( Func f )
+                : base_class(f)
+            {}
+
+            template <typename Q>
+            void operator()( node_type& item, Q& val )
+            {
+                base_class::get()( item.m_Value, val );
+            }
+        };
+
+        template <typename Func>
+        struct extract_copy_wrapper
+        {
+            Func    m_func;
+            extract_copy_wrapper( Func f )
+                : m_func(f)
+            {}
+
+            template <typename Q>
+            void operator()( Q& dest, node_type& src )
+            {
+                cds::unref(m_func)(dest, src.m_Value);
+            }
+        };
+
+#   endif  // #ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    public:
+        /// Default ctor
+        SkipListMap()
+            : base_class()
+        {}
+
+        /// Destructor destroys the set object
+        ~SkipListMap()
+        {}
+
+    public:
+        /// Iterator type
+        typedef skip_list::details::iterator< typename base_class::iterator >  iterator;
+
+        /// Const iterator type
+        typedef skip_list::details::iterator< typename base_class::const_iterator >   const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a map
+        iterator begin()
+        {
+            return iterator( base_class::begin() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a map
+        //@{
+        const_iterator begin() const
+        {
+            return cbegin();
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( base_class::cbegin() );
+        }
+        //@}
+
+        /// Returns a forward iterator that addresses the location succeeding the last element in a map.
+        iterator end()
+        {
+            return iterator( base_class::end() );
+        }
+
+        /// Returns a forward const iterator that addresses the location succeeding the last element in a map.
+        //@{
+        const_iterator end() const
+        {
+            return cend();
+        }
+        const_iterator cend()
+        {
+            return const_iterator( base_class::cend() );
+        }
+        //@}
+
+    public:
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from a value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( K const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert_key( key, [](value_type&){} );
+#       else
+            return insert_key( key, empty_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref value_type should be constructible from \p val of type \p V.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( K const& key, V const& val )
+        {
+            /*
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert_key( key, [&val](value_type& item) { item.second = val ; } );
+#       else
+            insert_value_functor<V> f(val);
+            return insert_key( key, cds::ref(f) );
+#       endif
+            */
+            scoped_node_ptr pNode( node_allocator().New( random_level(), key, val ));
+            if ( base_class::insert( *pNode ))
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted:
+                - <tt>item.first</tt> is a const reference to item's key that cannot be changed.
+                - <tt>item.second</tt> is a reference to item's value that may be changed.
+
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p value_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            scoped_node_ptr pNode( node_allocator().New( random_level(), key ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *pNode, [&func]( node_type& item ) { cds::unref(func)( item.m_Value ); } ))
+#       else
+            insert_key_wrapper<Func> wrapper(func);
+            if ( base_class::insert( *pNode, cds::ref(wrapper) ))
+#endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            scoped_node_ptr pNode( node_allocator().New( random_level(), std::forward<K>(key), std::forward<Args>(args)... ));
+            if ( base_class::insert( *pNode )) {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+
+        /// Ensures that the \p key exists in the map
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the map, then the new item created from \p key
+            is inserted into the map (note that in this case the \ref key_type should be
+            constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref value_type.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( K const& key, Func func )
+        {
+            scoped_node_ptr pNode( node_allocator().New( random_level(), key ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> res = base_class::ensure( *pNode,
+                [&func](bool bNew, node_type& item, node_type const& ){ cds::unref(func)( bNew, item.m_Value ); }
+            );
+#       else
+            ensure_wrapper<Func> wrapper( func );
+            std::pair<bool, bool> res = base_class::ensure( *pNode, cds::ref(wrapper) );
+#       endif
+            if ( res.first && res.second )
+                pNode.release();
+            return res;
+        }
+
+        /// Delete \p key from the map
+        /**\anchor cds_nonintrusive_SkipListMap_rcu_erase_val
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if \p key is found and deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            return base_class::erase(key);
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_rcu_erase_val "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool erase_with( K const& key, Less pred )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >());
+        }
+
+        /// Delete \p key from the map
+        /** \anchor cds_nonintrusive_SkipListMap_rcu_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& item) { ... }
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase( key, [&f]( node_type& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase( key, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_rcu_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >(),
+                [&f]( node_type& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >(), cds::ref(wrapper));
+#       endif
+        }
+
+        /// Extracts the item from the map with specified \p key
+        /** \anchor cds_nonintrusive_SkipListMap_rcu_extract
+            The function searches an item with key equal to \p key in the map,
+            unlinks it from the set, and returns it in \p result parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor from \p Traits class' template argument
+            should accept a parameter of type \p K that can be not the same as \p key_type.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not free the item found.
+            The item will be implicitly freed when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        template <typename K>
+        bool extract( exempt_ptr& result, K const& key )
+        {
+            return base_class::do_extract( result, key );
+        }
+
+        /// Extracts the item from the map with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_rcu_extract "extract(exempt_ptr&, K const&)"
+            but \p pred predicate is used for key comparing.
+            \p Less has the semantics like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool extract_with( exempt_ptr& result, K const& key, Less pred )
+        {
+            return base_class::do_extract_with( result, key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >());
+        }
+
+        /// Extracts an item with minimal key from the map
+        /**
+            The function searches an item with minimal key, unlinks it, and returns the item found in \p result parameter.
+            If the skip-list is empty the function returns \p false.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not free the item found.
+            The item will be implicitly freed when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        bool extract_min( exempt_ptr& result )
+        {
+            return base_class::do_extract_min(result);
+        }
+
+        /// Extracts an item with maximal key from the map
+        /**
+            The function searches an item with maximal key, unlinks it from the set, and returns the item found
+            in \p result parameter. If the skip-list is empty the function returns \p false.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not free the item found.
+            The item will be implicitly freed when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        bool extract_max( exempt_ptr& result )
+        {
+            return base_class::do_extract_max(result);
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_SkipListMap_rcu_find_cfunc
+
+            The function searches the item with key equal to \p key and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change \p item.second.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename K, typename Func>
+        bool find( K const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( key, [&f](node_type& item, K const& ) { cds::unref(f)( item.m_Value );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find( key, cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_rcu_find_cfunc "find(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool find_with( K const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >(),
+                [&f](node_type& item, K const& ) { cds::unref(f)( item.m_Value );});
+#       else
+            find_wrapper<Func> wrapper(f);
+            return base_class::find_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >(), cds::ref(wrapper) );
+#       endif
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_SkipListMap_rcu_find_val
+
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+
+            The function applies RCU lock internally.
+        */
+        template <typename K>
+        bool find( K const& key )
+        {
+            return base_class::find( key );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_rcu_find_val "find(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool find_with( K const& key, Less pred )
+        {
+            return base_class::find_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >() );
+        }
+
+        /// Finds the key \p key and return the item found
+        /** \anchor cds_nonintrusive_SkipListMap_rcu_get
+            The function searches the item with key equal to \p key and returns the pointer to item found.
+            If \p key is not found it returns \p NULL.
+
+            Note the compare functor in \p Traits class' template argument
+            should accept a parameter of type \p K that can be not the same as \p key_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::container::SkipListMap< cds::urcu::gc< cds::urcu::general_buffered<> >, int, foo, my_traits > skip_list;
+            skip_list theList;
+            // ...
+            {
+                // Lock RCU
+                skip_list::rcu_lock lock;
+
+                skip_list::value_type * pVal = theList.get( 5 );
+                // Deal with pVal
+                //...
+
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be freed at any time after RCU unlocking
+            }
+            \endcode
+
+            After RCU unlocking the \p %force_dispose member function can be called manually,
+            see \ref force_dispose for explanation.
+        */
+        template <typename K>
+        value_type * get( K const& key )
+        {
+            return to_value_ptr( base_class::get( key ));
+        }
+
+        /// Finds the key \p key and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListMap_rcu_get "get(K const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref key_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        value_type * get_with( K const& key, Less pred )
+        {
+            return to_value_ptr( base_class::get_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::key_accessor >() ));
+        }
+
+        /// Clears the map
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Clears internal list of ready-to-delete items passing them to RCU reclamation cycle
+        /**
+            See \ref cds_intrusive_SkipListSet_rcu_force_dispose "intrusive SkipListSet" for explanation
+        */
+        void force_dispose()
+        {
+            return base_class::force_dispose();
+        }
+    };
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_SKIP_LIST_MAP_RCU_H
diff --git a/cds/container/skip_list_set_hp.h b/cds/container/skip_list_set_hp.h
new file mode 100644 (file)
index 0000000..4cd3cd0
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_SET_HP_H
+#define __CDS_CONTAINER_SKIP_LIST_SET_HP_H
+
+#include <cds/container/skip_list_base.h>
+#include <cds/intrusive/skip_list_hp.h>
+#include <cds/container/details/make_skip_list_set.h>
+#include <cds/container/skip_list_set_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_SKIP_LIST_SET_HP_H
diff --git a/cds/container/skip_list_set_hrc.h b/cds/container/skip_list_set_hrc.h
new file mode 100644 (file)
index 0000000..4b40362
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_SET_HRC_H
+#define __CDS_CONTAINER_SKIP_LIST_SET_HRC_H
+
+#include <cds/container/skip_list_base.h>
+#include <cds/intrusive/skip_list_hrc.h>
+#include <cds/container/details/make_skip_list_set.h>
+#include <cds/container/skip_list_set_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_SKIP_LIST_SET_HRC_H
diff --git a/cds/container/skip_list_set_impl.h b/cds/container/skip_list_set_impl.h
new file mode 100644 (file)
index 0000000..70abe85
--- /dev/null
@@ -0,0 +1,843 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_SET_IMPL_H
+#define __CDS_CONTAINER_SKIP_LIST_SET_IMPL_H
+
+#include <cds/details/binary_functor_wrapper.h>
+#include <cds/gc/guarded_ptr.h>
+#include <cds/container/details/guarded_ptr_cast.h>
+
+namespace cds { namespace container {
+
+    /// Lock-free skip-list set
+    /** @ingroup cds_nonintrusive_set
+        \anchor cds_nonintrusive_SkipListSet_hp
+
+        The implementation of well-known probabilistic data structure called skip-list
+        invented by W.Pugh in his papers:
+            - [1989] W.Pugh Skip Lists: A Probabilistic Alternative to Balanced Trees
+            - [1990] W.Pugh A Skip List Cookbook
+
+        A skip-list is a probabilistic data structure that provides expected logarithmic
+        time search without the need of rebalance. The skip-list is a collection of sorted
+        linked list. Nodes are ordered by key. Each node is linked into a subset of the lists.
+        Each list has a level, ranging from 0 to 32. The bottom-level list contains
+        all the nodes, and each higher-level list is a sublist of the lower-level lists.
+        Each node is created with a random top level (with a random height), and belongs
+        to all lists up to that level. The probability that a node has the height 1 is 1/2.
+        The probability that a node has the height N is 1/2 ** N (more precisely,
+        the distribution depends on an random generator provided, but our generators
+        have this property).
+
+        The lock-free variant of skip-list is implemented according to book
+            - [2008] M.Herlihy, N.Shavit "The Art of Multiprocessor Programming",
+                chapter 14.4 "A Lock-Free Concurrent Skiplist"
+
+        Template arguments:
+        - \p GC - Garbage collector used.
+        - \p T - type to be stored in the list.
+        - \p Traits - type traits. See skip_list::type_traits for explanation.
+
+        It is possible to declare option-based list with cds::container::skip_list::make_traits metafunction istead of \p Traits template
+        argument.
+        Template argument list \p Options of cds::container::skip_list::make_traits metafunction are:
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - skip_list::random_level_generator - random level generator. Can be skip_list::xorshift, skip_list::turbo_pascal or
+            user-provided one. See skip_list::random_level_generator option description for explanation.
+            Default is \p %skip_list::turbo_pascal.
+        - opt::allocator - allocator for skip-list node. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used.
+        - opt::stat - internal statistics. Available types: skip_list::stat, skip_list::empty_stat (the default)
+
+        \warning The skip-list requires up to 67 hazard pointers that may be critical for some GCs for which
+            the guard count is limited (like as gc::HP, gc::HRC). Those GCs should be explicitly initialized with
+            hazard pointer enough: \code cds::gc::HP myhp( 67 ) \endcode. Otherwise an run-time exception may be raised
+            when you try to create skip-list object.
+
+        \note There are several specializations of \p %SkipListSet for each \p GC. You should include:
+        - <tt><cds/container/skip_list_set_hp.h></tt> for gc::HP garbage collector
+        - <tt><cds/container/skip_list_set_hrc.h></tt> for gc::HRC garbage collector
+        - <tt><cds/container/skip_list_set_ptb.h></tt> for gc::PTB garbage collector
+        - <tt><cds/container/skip_list_set_rcu.h></tt> for \ref cds_nonintrusive_SkipListSet_rcu "RCU type"
+        - <tt><cds/container/skip_list_set_nogc.h></tt> for \ref cds_nonintrusive_SkipListSet_nogc "non-deletable SkipListSet"
+
+        <b>Iterators</b>
+
+        The class supports a forward iterator (\ref iterator and \ref const_iterator).
+        The iteration is ordered.
+        The iterator object is thread-safe: the element pointed by the iterator object is guarded,
+        so, the element cannot be reclaimed while the iterator object is alive.
+        However, passing an iterator object between threads is dangerous.
+
+        \warning Due to concurrent nature of skip-list set it is not guarantee that you can iterate
+        all elements in the set: any concurrent deletion can exclude the element
+        pointed by the iterator from the set, and your iteration can be terminated
+        before end of the set. Therefore, such iteration is more suitable for debugging purpose only
+
+        Remember, each iterator object requires 2 additional hazard pointers, that may be
+        a limited resource for \p GC like as gc::HP and gc::HRC (for gc::PTB the count of
+        guards is unlimited).
+
+        The iterator class supports the following minimalistic interface:
+        \code
+        struct iterator {
+            // Default ctor
+            iterator();
+
+            // Copy ctor
+            iterator( iterator const& s);
+
+            value_type * operator ->() const;
+            value_type& operator *() const;
+
+            // Pre-increment
+            iterator& operator ++();
+
+            // Copy assignment
+            iterator& operator = (const iterator& src);
+
+            bool operator ==(iterator const& i ) const;
+            bool operator !=(iterator const& i ) const;
+        };
+        \endcode
+        Note, the iterator object returned by \ref end, \p cend member functions points to \p NULL and should not be dereferenced.
+
+    */
+    template <
+        typename GC,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = skip_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class SkipListSet:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::SkipListSet< GC, T, Traits >
+#else
+        protected details::make_skip_list_set< GC, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_skip_list_set< GC, T, Traits >    maker;
+        typedef typename maker::type base_class;
+        //@endcond
+    public:
+        typedef typename base_class::gc          gc  ; ///< Garbage collector used
+        typedef T       value_type  ;   ///< @anchor cds_containewr_SkipListSet_value_type Value type stored in the set
+        typedef Traits  options     ;   ///< Options specified
+
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator         allocator_type  ;   ///< Allocator type used for allocate/deallocate the skip-list nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename maker::key_comparator      key_comparator  ;   ///< key comparison functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::random_level_generator random_level_generator ; ///< random level generator
+        typedef typename options::stat              stat            ;   ///< internal statistics type
+
+    protected:
+        //@cond
+        typedef typename maker::node_type           node_type;
+        typedef typename maker::node_allocator      node_allocator;
+
+        typedef std::unique_ptr< node_type, typename maker::node_deallocator >    scoped_node_ptr;
+        //@endcond
+
+    public:
+        /// Guarded pointer
+        typedef cds::gc::guarded_ptr< gc, node_type, value_type, details::guarded_ptr_cast_set<node_type, value_type> > guarded_ptr;
+
+    protected:
+        //@cond
+        unsigned int random_level()
+        {
+            return base_class::random_level();
+        }
+        //@endcond
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        struct insert_functor
+        {
+            Func        m_func;
+
+            insert_functor ( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+
+        template <typename Q, typename Func>
+        struct ensure_functor
+        {
+            Func        m_func;
+            Q const&    m_arg;
+
+            ensure_functor( Q const& arg, Func f )
+                : m_func(f)
+                , m_arg( arg )
+            {}
+
+            void operator ()( bool bNew, node_type& node, node_type& )
+            {
+                cds::unref(m_func)( bNew, node.m_Value, m_arg );
+            }
+        };
+
+        template <typename Func>
+        struct find_functor
+        {
+            Func    m_func;
+
+            find_functor( Func f )
+                : m_func(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q& val )
+            {
+                cds::unref(m_func)( node.m_Value, val );
+            }
+        };
+
+        struct copy_value_functor {
+            template <typename Q>
+            void operator()( Q& dest, value_type const& src ) const
+            {
+                dest = src;
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type const& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+#   endif  // ifndef CDS_CXX11_LAMBDA_SUPPORT
+
+        //@endcond
+
+    public:
+        /// Default ctor
+        SkipListSet()
+            : base_class()
+        {}
+
+        /// Destructor destroys the set object
+        ~SkipListSet()
+        {}
+
+    public:
+        /// Iterator type
+        typedef skip_list::details::iterator< typename base_class::iterator >  iterator;
+
+        /// Const iterator type
+        typedef skip_list::details::iterator< typename base_class::const_iterator >   const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        iterator begin()
+        {
+            return iterator( base_class::begin() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        const_iterator begin() const
+        {
+            return const_iterator( base_class::begin() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        const_iterator cbegin()
+        {
+            return const_iterator( base_class::cbegin() );
+        }
+
+        /// Returns a forward iterator that addresses the location succeeding the last element in a set.
+        iterator end()
+        {
+            return iterator( base_class::end() );
+        }
+
+        /// Returns a forward const iterator that addresses the location succeeding the last element in a set.
+        const_iterator end() const
+        {
+            return const_iterator( base_class::end() );
+        }
+
+        /// Returns a forward const iterator that addresses the location succeeding the last element in a set.
+        const_iterator cend()
+        {
+            return const_iterator( base_class::cend() );
+        }
+
+    public:
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the set.
+
+            The type \p Q should contain as minimum the complete key for the node.
+            The object of \ref value_type should be constructible from a value of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            scoped_node_ptr sp( node_allocator().New( random_level(), val ));
+            if ( base_class::insert( *sp.get() )) {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-fields of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success. It may be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& val, Func f )
+        {
+            scoped_node_ptr sp( node_allocator().New( random_level(), val ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *sp.get(), [&f]( node_type& val ) { cds::unref(f)( val.m_Value ); } ))
+#       else
+            insert_functor<Func> wrapper(f);
+            if ( base_class::insert( *sp, cds::ref(wrapper) ))
+#       endif
+            {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Ensures that the item exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p val key not found in the set, then the new item created from \p val
+            is inserted into the set. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p key passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( const Q& val, Func func )
+        {
+            scoped_node_ptr sp( node_allocator().New( random_level(), val ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> bRes = base_class::ensure( *sp,
+                [&func, &val](bool bNew, node_type& node, node_type&){ cds::unref(func)( bNew, node.m_Value, val ); });
+#       else
+            ensure_functor<Q, Func> wrapper( val, func );
+            std::pair<bool, bool> bRes = base_class::ensure( *sp, cds::ref(wrapper));
+#       endif
+            if ( bRes.first && bRes.second )
+                sp.release();
+            return bRes;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref cds_containewr_SkipListSet_value_type "value_type" constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr sp( node_allocator().New( random_level(), std::forward<Args>(args)... ));
+            if ( base_class::insert( *sp.get() )) {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_SkipListSet_erase_val
+
+            The set item comparator should be able to compare the type \p value_type
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+            return base_class::erase( key );
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >() );
+        }
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_SkipListSet_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type const& val);
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Since the key of \p value_type is not explicitly specified,
+            template parameter \p Q defines the key type to search in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+
+            See also: \ref erase
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase( key, [&f]( node_type const& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase( key, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(),
+                [&f]( node_type const& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(),
+                cds::ref(wrapper));
+#       endif
+        }
+
+        /// Extracts the item from the set with specified \p key
+        /** \anchor cds_nonintrusive_SkipListSet_hp_extract
+            The function searches an item with key equal to \p key in the set,
+            unlinks it from the set, and returns it in \p result parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The item extracted is freed automatically by garbage collector \p GC
+            when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::SkipListSet< cds::gc::HP, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                if ( theList.extract( gp, 5 ) ) {
+                    // Deal with gp
+                    // ...
+                }
+                // Destructor of gp releases internal HP guard and frees the pointer
+            }
+            \endcode
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& result, Q const& key )
+        {
+            return base_class::extract_( result.guard(), key, typename base_class::key_comparator() );
+        }
+
+        /// Extracts the item from the set with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_hp_extract "extract(Q const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& ptr, Q const& key, Less pred )
+        {
+            typedef cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >  wrapped_less;
+            return base_class::extract_( ptr.guard(), key, cds::opt::details::make_comparator_from_less<wrapped_less>() );
+        }
+
+        /// Extracts an item with minimal key from the set
+        /**
+            The function searches an item with minimal key, unlinks it, and returns the item found in \p result parameter.
+            If the skip-list is empty the function returns \p false.
+
+            The item extracted is freed automatically by garbage collector \p GC
+            when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::continer::SkipListSet< cds::gc::HP, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                if ( theList.extract_min( gp )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of gp releases internal HP guard and then frees the pointer
+            }
+            \endcode
+        */
+        bool extract_min( guarded_ptr& result)
+        {
+            return base_class::extract_min_( result.guard() );
+        }
+
+        /// Extracts an item with maximal key from the set
+        /**
+            The function searches an item with maximal key, unlinks it, and returns the pointer to item found in \p result parameter.
+            If the skip-list is empty the function returns \p false.
+
+            The item found is freed by garbage collector \p GC automatically
+            when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::SkipListSet< cds::gc::HP, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                if ( theList.extract_max( gp )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of gp releases internal HP guard and then frees the pointer
+            }
+            \endcode
+        */
+        bool extract_max( guarded_ptr& result )
+        {
+            return base_class::extract_max_( result.guard() );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_SkipListSet_find_func
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f]( node_type& node, Q& v ) { cds::unref(f)( node.m_Value, v ); });
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find( val, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(),
+                [&f]( node_type& node, Q& v ) { cds::unref(f)( node.m_Value, v ); } );
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find_with( val, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(), cds::ref(wrapper));
+#       endif
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_SkipListSet_find_cfunc
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f]( node_type& node, Q const& v ) { cds::unref(f)( node.m_Value, v ); });
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find( val, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less cmp, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(),
+                [&f]( node_type& node, Q const& v ) { cds::unref(f)( node.m_Value, v ); } );
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find_with( val, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(),
+                cds::ref(wrapper));
+#       endif
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_SkipListSet_find_val
+
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \ref value_type.
+        */
+        template <typename Q>
+        bool find( Q const& val )
+        {
+            return base_class::find( val );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+            return base_class::find_with( val, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >());
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_nonintrusive_SkipListSet_hp_get
+            The function searches the item with key equal to \p key
+            and assigns the item found to guarded pointer \p result.
+            The function returns \p true if \p key is found, and \p false otherwise.
+            If \p key is not found the \p result parameter is left unchanged.
+
+            It is safe when a concurrent thread erases the item returned in \p result guarded pointer.
+            In this case the item will be freed later by garbage collector \p GC automatically
+            when \p guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::SkipListSet< cds::gc::HP, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                if ( theList.get( gp, 5 ) ) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& result, Q const& key )
+        {
+            return base_class::get_with_( result.guard(), key, typename base_class::key_comparator() );
+        }
+
+        /// Finds \p key and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_hp_get "get( guarded_ptr&, Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& result, Q const& key, Less pred )
+        {
+            typedef cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >  wrapped_less;
+            return base_class::get_with_( result.guard(), key, cds::opt::details::make_comparator_from_less< wrapped_less >());
+        }
+
+        /// Clears the set (non-atomic).
+        /**
+            The function deletes all items from the set.
+            The function is not atomic, thus, in multi-threaded environment with parallel insertions
+            this sequence
+            \code
+            set.clear();
+            assert( set.empty() );
+            \endcode
+            the assertion could be raised.
+
+            For each item the \ref disposer provided by \p Traits template parameter will be called.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the set is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the set
+        /**
+            The value returned depends on item counter type provided by \p Traits template parameter.
+            If it is atomicity::empty_item_counter this function always returns 0.
+            Therefore, the function is not suitable for checking the set emptiness, use \ref empty
+            member function for this purpose.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+    };
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_SKIP_LIST_SET_IMPL_H
diff --git a/cds/container/skip_list_set_nogc.h b/cds/container/skip_list_set_nogc.h
new file mode 100644 (file)
index 0000000..0dcee9e
--- /dev/null
@@ -0,0 +1,423 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_SET_NOGC_H
+#define __CDS_CONTAINER_SKIP_LIST_SET_NOGC_H
+
+#include <cds/intrusive/skip_list_nogc.h>
+#include <cds/container/skip_list_base.h>
+#include <cds/details/binary_functor_wrapper.h>
+#include <cds/gc/nogc.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace container {
+    //@cond
+    namespace skip_list { namespace details {
+        struct set_key_accessor
+        {
+            template <typename NodeType>
+            typename NodeType::stored_value_type const& operator()( NodeType const& node ) const
+            {
+                return node.m_Value;
+            }
+        };
+    }} // namespace skip_list::details
+
+    namespace details {
+        template <typename T, typename Traits >
+        struct make_skip_list_set_nogc
+        {
+            typedef cds::gc::nogc   gc;
+            typedef T               value_type;
+            typedef Traits          type_traits;
+
+            typedef cds::intrusive::skip_list::node< gc >   intrusive_node_type;
+            struct node_type: public intrusive_node_type
+            {
+                typedef intrusive_node_type             base_class;
+                typedef typename base_class::atomic_ptr atomic_ptr;
+                typedef atomic_ptr                      tower_item_type;
+                typedef value_type                      stored_value_type;
+
+                value_type m_Value;
+                //atomic_ptr m_arrTower[] ;  // allocated together with node_type in single memory block
+
+                template <typename Q>
+                node_type( unsigned int nHeight, atomic_ptr * pTower, Q const& v )
+                    : m_Value(v)
+                {
+                    if ( nHeight > 1 ) {
+                        new (pTower) atomic_ptr[ nHeight - 1 ];
+                        base_class::make_tower( nHeight, pTower );
+                    }
+                }
+
+#       ifdef CDS_EMPLACE_SUPPORT
+                template <typename Q, typename... Args>
+                node_type( unsigned int nHeight, atomic_ptr * pTower, Q&& q, Args&&... args )
+                    : m_Value( std::forward<Q>(q), std::forward<Args>(args)... )
+                {
+                    if ( nHeight > 1 ) {
+                        new (pTower) atomic_ptr[ nHeight - 1 ];
+                        base_class::make_tower( nHeight, pTower );
+                    }
+                }
+#       endif
+
+            private:
+                node_type() ;   // no default ctor
+            };
+
+            typedef skip_list::details::node_allocator< node_type, type_traits> node_allocator;
+
+            struct node_deallocator {
+                void operator ()( node_type * pNode )
+                {
+                    node_allocator().Delete( pNode );
+                }
+            };
+
+            typedef skip_list::details::dummy_node_builder<intrusive_node_type> dummy_node_builder;
+
+            typedef typename type_traits::key_accessor key_accessor;
+            typedef typename opt::details::make_comparator< value_type, type_traits >::type key_comparator;
+
+            /*
+            template <typename Less>
+            struct less_wrapper {
+                typedef compare_wrapper< node_type, cds::opt::details::make_comparator_from_less<Less>, key_accessor >    type;
+            };
+            */
+
+            typedef typename cds::intrusive::skip_list::make_traits<
+                cds::opt::type_traits< type_traits >
+                ,cds::intrusive::opt::hook< intrusive::skip_list::base_hook< cds::opt::gc< gc > > >
+                ,cds::intrusive::opt::disposer< node_deallocator >
+                ,cds::intrusive::skip_list::internal_node_builder< dummy_node_builder >
+                ,cds::opt::compare< cds::details::compare_wrapper< node_type, key_comparator, key_accessor > >
+            >::type intrusive_type_traits;
+
+            typedef cds::intrusive::SkipListSet< gc, node_type, intrusive_type_traits>   type;
+        };
+    } // namespace details
+    //@endcond
+
+    /// Lock-free skip-list set (template specialization for gc::nogc)
+    /** @ingroup cds_nonintrusive_set
+        \anchor cds_nonintrusive_SkipListSet_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+        See \ref cds_nonintrusive_SkipListSet_hp "SkipListSet" for detailed description.
+
+        Template arguments:
+        - \p T - type to be stored in the list.
+        - \p Traits - type traits. See skip_list::type_traits for explanation.
+
+        It is possible to declare option-based list with cds::container::skip_list::make_traits metafunction istead of \p Traits template
+        argument. \p Options template arguments of cds::container::skip_list::make_traits metafunction are:
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - skip_list::random_level_generator - random level generator. Can be skip_list::xorshift, skip_list::turbo_pascal or
+            user-provided one. See skip_list::random_level_generator option description for explanation.
+            Default is \p %skip_list::turbo_pascal.
+        - opt::allocator - allocator for skip-list node. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used.
+        - opt::stat - internal statistics. Available types: skip_list::stat, skip_list::empty_stat (the default)
+    */
+    template <
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = skip_list::type_traits
+#else
+        class Traits
+#endif
+    >
+    class SkipListSet< gc::nogc, T, Traits >:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::SkipListSet< cds::gc::nogc, T, Traits >
+#else
+        protected details::make_skip_list_set_nogc< T, typename cds::opt::replace_key_accessor< Traits, skip_list::details::set_key_accessor >::type >::type
+#endif
+    {
+        //@cond
+        typedef details::make_skip_list_set_nogc< T, typename cds::opt::replace_key_accessor< Traits, skip_list::details::set_key_accessor >::type >    maker;
+        typedef typename maker::type base_class;
+        //@endcond
+    public:
+        typedef typename base_class::gc gc  ; ///< Garbage collector used
+        typedef T       value_type  ;   ///< Value type stored in the set
+        typedef Traits  options     ;   ///< Options specified
+
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator         allocator_type  ;   ///< Allocator type used for allocate/deallocate the skip-list nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename maker::key_comparator      key_comparator  ;   ///< key compare functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::stat              stat            ;   ///< internal statistics type
+        typedef typename base_class::random_level_generator random_level_generator  ;   ///< random level generator
+
+    protected:
+        //@cond
+        typedef typename maker::node_type           node_type;
+        typedef typename maker::node_allocator      node_allocator;
+        typedef typename std::conditional<
+            std::is_same< typename options::key_accessor, opt::none >::value,
+            skip_list::details::set_key_accessor,
+            typename options::key_accessor
+        >::type     key_accessor;
+
+        typedef std::unique_ptr< node_type, typename maker::node_deallocator >    scoped_node_ptr;
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct ensure_functor
+        {
+            node_type * pNode;
+            void operator ()( bool bNew, node_type& node, node_type& )
+            {
+                pNode = &node;
+            }
+        };
+
+        struct find_functor
+        {
+            node_type * pNode;
+
+            template <typename Q>
+            void operator ()( node_type& node, Q& )
+            {
+                pNode = &node;
+            }
+        };
+#   endif
+        //@endcond
+
+    public:
+        /// Iterator type
+        typedef skip_list::details::iterator< typename base_class::iterator >  iterator;
+
+        /// Const iterator type
+        typedef skip_list::details::iterator< typename base_class::const_iterator >   const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        iterator begin()
+        {
+            return iterator( base_class::begin() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        //@{
+        const_iterator begin() const
+        {
+            return const_iterator( base_class::begin() );
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( base_class::cbegin() );
+        }
+        //@}
+
+        /// Returns a forward iterator that addresses the location succeeding the last element in a set.
+        iterator end()
+        {
+            return iterator( base_class::end() );
+        }
+
+        /// Returns a forward const iterator that addresses the location succeeding the last element in a set.
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator( base_class::end() );
+        }
+        const_iterator cend()
+        {
+            return const_iterator( base_class::cend() );
+        }
+        //@}
+
+    protected:
+        //@cond
+        static iterator node_to_iterator( node_type * pNode )
+        {
+            assert( pNode );
+            return iterator( base_class::iterator::from_node( pNode ));
+        }
+        //@endcond
+
+    public:
+        /// Default ctor
+        SkipListSet()
+            : base_class()
+        {}
+
+        /// Destructor destroys the set object
+        ~SkipListSet()
+        {}
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            Return an iterator pointing to inserted item if success, otherwise \ref end()
+        */
+        template <typename Q>
+        iterator insert( const Q& val )
+        {
+            scoped_node_ptr sp( node_allocator().New( base_class::random_level(), val ));
+            if ( base_class::insert( *sp.get() )) {
+                return node_to_iterator( sp.release() );
+            }
+            return end();
+        }
+
+#ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Return an iterator pointing to inserted item if success \ref end() otherwise
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        iterator emplace( Args&&... args )
+        {
+            scoped_node_ptr sp( node_allocator().New( base_class::random_level(), std::forward<Args>(args)... ));
+            if ( base_class::insert( *sp.get() )) {
+                return node_to_iterator( sp.release() );
+            }
+            return end();
+        }
+#endif
+
+        /// Ensures that the item \p val exists in the set
+        /**
+            The operation inserts new item if the key \p val is not found in the set.
+            Otherwise, the function returns an iterator that points to item found.
+
+            Returns <tt> std::pair<iterator, bool>  </tt> where \p first is an iterator pointing to
+            item found or inserted, \p second is true if new item has been added or \p false if the item
+            already is in the set.
+        */
+        template <typename Q>
+        std::pair<iterator, bool> ensure( const Q& val )
+        {
+            scoped_node_ptr sp( node_allocator().New( base_class::random_level(), val ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            node_type * pNode;
+            std::pair<bool, bool> bRes = base_class::ensure( *sp, [&pNode](bool, node_type& item, node_type&) { pNode = &item; } );
+            if ( bRes.first && bRes.second )
+                sp.release();
+            assert( pNode );
+            return std::make_pair( node_to_iterator( pNode ), bRes.second );
+#       else
+            ensure_functor f;
+            std::pair<bool, bool> bRes = base_class::ensure( *sp, cds::ref(f) );
+            if ( bRes.first && bRes.second )
+                sp.release();
+            assert( f.pNode );
+            return std::make_pair( node_to_iterator( f.pNode ), bRes.second );
+#       endif
+        }
+
+        /// Searches \p key
+        /** \anchor cds_nonintrusive_SkipListSet_nogc_find_val
+
+            The function searches the item with key equal to \p key
+            and returns an iterator pointed to item found if the key is found,
+            and \ref end() otherwise
+        */
+        template <typename Q>
+        iterator find( Q const& key ) const
+        {
+            node_type * pNode = base_class::find( key );
+            if ( pNode )
+                return node_to_iterator( pNode );
+            return base_class::nonconst_end();
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_nogc_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        iterator find_with( Q const& key, Less pred ) const
+        {
+            node_type * pNode = base_class::find_with( key, cds::details::predicate_wrapper< node_type, Less, key_accessor>() );
+            if ( pNode )
+                return node_to_iterator( pNode );
+            return base_class::nonconst_end();
+        }
+
+        /// Gets minimum key from the set
+        /**
+            If the set is empty the function returns \p NULL
+        */
+        value_type * get_min() const
+        {
+            node_type * pNode = base_class::get_min();
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+
+        /// Gets maximum key from the set
+        /**
+            The function returns \p NULL if the set is empty
+        */
+        value_type * get_max() const
+        {
+            node_type * pNode = base_class::get_max();
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function is not atomic.
+            Finding and/or inserting is prohibited while clearing.
+            Otherwise an unpredictable result may be encountered.
+            Thus, \p clear() may be used only for debugging purposes.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the set is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the set
+        /**
+            The value returned depends on item counter type provided by \p Traits template parameter.
+            If it is atomicity::empty_item_counter this function always returns 0.
+            The function is not suitable for checking the set emptiness, use \ref empty
+            member function for this purpose.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns maximum height of skip-list. The max height is a constant for each object and does not exceed 32.
+        static CDS_CONSTEXPR unsigned int max_height() CDS_NOEXCEPT
+        {
+            return base_class::max_height();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+    };
+
+}} // cds::container
+
+#endif // ifndef __CDS_CONTAINER_SKIP_LIST_SET_NOGC_H
diff --git a/cds/container/skip_list_set_ptb.h b/cds/container/skip_list_set_ptb.h
new file mode 100644 (file)
index 0000000..502bbcc
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_MAP_PTB_H
+#define __CDS_CONTAINER_SKIP_LIST_MAP_PTB_H
+
+#include <cds/container/skip_list_base.h>
+#include <cds/intrusive/skip_list_ptb.h>
+#include <cds/container/details/make_skip_list_set.h>
+#include <cds/container/skip_list_set_impl.h>
+
+#endif  // #ifndef __CDS_CONTAINER_SKIP_LIST_MAP_PTB_H
diff --git a/cds/container/skip_list_set_rcu.h b/cds/container/skip_list_set_rcu.h
new file mode 100644 (file)
index 0000000..a94aba4
--- /dev/null
@@ -0,0 +1,883 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SKIP_LIST_SET_RCU_H
+#define __CDS_CONTAINER_SKIP_LIST_SET_RCU_H
+
+#include <cds/intrusive/skip_list_rcu.h>
+#include <cds/container/details/make_skip_list_set.h>
+
+namespace cds { namespace container {
+
+    /// Lock-free skip-list set (template specialization for \ref cds_urcu_desc "RCU")
+    /** @ingroup cds_nonintrusive_set
+        \anchor cds_nonintrusive_SkipListSet_rcu
+
+        The implementation of well-known probabilistic data structure called skip-list
+        invented by W.Pugh in his papers:
+            - [1989] W.Pugh Skip Lists: A Probabilistic Alternative to Balanced Trees
+            - [1990] W.Pugh A Skip List Cookbook
+
+        A skip-list is a probabilistic data structure that provides expected logarithmic
+        time search without the need of rebalance. The skip-list is a collection of sorted
+        linked list. Nodes are ordered by key. Each node is linked into a subset of the lists.
+        Each list has a level, ranging from 0 to 32. The bottom-level list contains
+        all the nodes, and each higher-level list is a sublist of the lower-level lists.
+        Each node is created with a random top level (with a random height), and belongs
+        to all lists up to that level. The probability that a node has the height 1 is 1/2.
+        The probability that a node has the height N is 1/2 ** N (more precisely,
+        the distribution depends on an random generator provided, but our generators
+        have this property).
+
+        The lock-free variant of skip-list is implemented according to book
+            - [2008] M.Herlihy, N.Shavit "The Art of Multiprocessor Programming",
+                chapter 14.4 "A Lock-Free Concurrent Skiplist"
+
+        Template arguments:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type".
+        - \p T - type to be stored in the list.
+        - \p Traits - type traits. See skip_list::type_traits for explanation.
+
+        It is possible to declare option-based list with cds::container::skip_list::make_traits metafunction istead of \p Traits template
+        argument.
+        Template argument list \p Options of cds::container::skip_list::make_traits metafunction are:
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - skip_list::random_level_generator - random level generator. Can be skip_list::xorshift, skip_list::turbo_pascal or
+            user-provided one. See skip_list::random_level_generator option description for explanation.
+            Default is \p %skip_list::turbo_pascal.
+        - opt::allocator - allocator for skip-list node. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used.
+        - opt::stat - internal statistics. Available types: skip_list::stat, skip_list::empty_stat (the default)
+        - opt::rcu_check_deadlock - a deadlock checking policy. Default is opt::v::rcu_throw_deadlock
+
+        @note Before including <tt><cds/container/skip_list_set_rcu.h></tt> you should include appropriate RCU header file,
+        see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+
+        <b>Iterators</b>
+
+        The class supports a forward iterator (\ref iterator and \ref const_iterator).
+        The iteration is ordered.
+
+        You may iterate over skip-list set items only under RCU lock.
+        Only in this case the iterator is thread-safe since
+        while RCU is locked any set's item cannot be reclaimed.
+
+        The requirement of RCU lock during iterating means that deletion of the elements (i.e. \ref erase)
+        is not possible.
+
+        @warning The iterator object cannot be passed between threads
+
+        Example how to use skip-list set iterators:
+        \code
+        // First, you should include the header for RCU type you have chosen
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/container/skip_list_set_rcu.h>
+
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        struct Foo {
+            // ...
+        };
+
+        // Traits for your skip-list.
+        // At least, you should define cds::opt::less or cds::opt::compare for Foo struct
+        struct my_traits: public cds::continer::skip_list::type_traits
+        {
+            // ...
+        };
+        typedef cds::container::SkipListSet< rcu_type, Foo, my_traits > my_skiplist_set;
+
+        my_skiplist_set theSet;
+
+        // ...
+
+        // Begin iteration
+        {
+            // Apply RCU locking manually
+            typename rcu_type::scoped_lock sl;
+
+            for ( auto it = theList.begin(); it != theList.end(); ++it ) {
+                // ...
+            }
+
+            // rcu_type::scoped_lock destructor releases RCU lock implicitly
+        }
+        \endcode
+
+        \warning Due to concurrent nature of skip-list set it is not guarantee that you can iterate
+        all elements in the set: any concurrent deletion can exclude the element
+        pointed by the iterator from the set, and your iteration can be terminated
+        before end of the set. Therefore, such iteration is more suitable for debugging purposes
+
+        The iterator class supports the following minimalistic interface:
+        \code
+        struct iterator {
+            // Default ctor
+            iterator();
+
+            // Copy ctor
+            iterator( iterator const& s);
+
+            value_type * operator ->() const;
+            value_type& operator *() const;
+
+            // Pre-increment
+            iterator& operator ++();
+
+            // Copy assignment
+            iterator& operator = (const iterator& src);
+
+            bool operator ==(iterator const& i ) const;
+            bool operator !=(iterator const& i ) const;
+        };
+        \endcode
+        Note, the iterator object returned by \ref end, \p cend member functions points to \p NULL and should not be dereferenced.
+    */
+    template <
+        typename RCU,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Traits = skip_list::type_traits
+#else
+        typename Traits
+#endif
+    >
+    class SkipListSet< cds::urcu::gc< RCU >, T, Traits >:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::SkipListSet< cds::urcu::gc< RCU >, T, Traits >
+#else
+        protected details::make_skip_list_set< cds::urcu::gc< RCU >, T, Traits >::type
+#endif
+    {
+        //@cond
+        typedef details::make_skip_list_set< cds::urcu::gc< RCU >, T, Traits >    maker;
+        typedef typename maker::type base_class;
+        //@endcond
+    public:
+        typedef typename base_class::gc gc  ; ///< Garbage collector used
+        typedef T       value_type  ;   ///< Value type stored in the set
+        typedef Traits  options     ;   ///< Options specified
+
+        typedef typename base_class::back_off       back_off        ;   ///< Back-off strategy used
+        typedef typename options::allocator         allocator_type  ;   ///< Allocator type used for allocate/deallocate the skip-list nodes
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counting policy used
+        typedef typename maker::key_comparator      key_comparator  ;   ///< key compare functor
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::random_level_generator random_level_generator ; ///< random level generator
+        typedef typename options::stat              stat            ;   ///< internal statistics type
+        typedef typename options::rcu_check_deadlock    rcu_check_deadlock ; ///< Deadlock checking policy
+
+    protected:
+        //@cond
+        typedef typename maker::node_type           node_type;
+        typedef typename maker::node_allocator      node_allocator;
+
+        typedef std::unique_ptr< node_type, typename maker::node_deallocator >    scoped_node_ptr;
+        //@endcond
+
+    public:
+        typedef typename base_class::rcu_lock  rcu_lock;   ///< RCU scoped lock
+        /// Group of \p extract_xxx functions do not require external locking
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = base_class::c_bExtractLockExternal;
+
+        /// pointer to extracted node
+        typedef cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::intrusive_type_traits::disposer > exempt_ptr;
+
+    protected:
+        //@cond
+        unsigned int random_level()
+        {
+            return base_class::random_level();
+        }
+
+        value_type * to_value_ptr( node_type * pNode ) const CDS_NOEXCEPT
+        {
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+        //@endcond
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        struct insert_functor
+        {
+            Func        m_func;
+
+            insert_functor ( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+
+        template <typename Q, typename Func>
+        struct ensure_functor
+        {
+            Func        m_func;
+            Q const&    m_arg;
+
+            ensure_functor( Q const& arg, Func f )
+                : m_func(f)
+                , m_arg( arg )
+            {}
+
+            void operator ()( bool bNew, node_type& node, node_type& )
+            {
+                cds::unref(m_func)( bNew, node.m_Value, m_arg );
+            }
+        };
+
+        template <typename Func>
+        struct find_functor
+        {
+            Func    m_func;
+
+            find_functor( Func f )
+                : m_func(f)
+            {}
+
+            template <typename Q>
+            void operator ()( node_type& node, Q& val )
+            {
+                cds::unref(m_func)( node.m_Value, val );
+            }
+        };
+
+        template <typename Func>
+        struct erase_functor
+        {
+            Func        m_func;
+
+            erase_functor( Func f )
+                : m_func(f)
+            {}
+
+            void operator()( node_type const& node )
+            {
+                cds::unref(m_func)( node.m_Value );
+            }
+        };
+
+        template <typename Func>
+        struct extract_copy_wrapper
+        {
+            Func    m_func;
+            extract_copy_wrapper( Func f )
+                : m_func(f)
+            {}
+
+            template <typename Q>
+            void operator()( Q& dest, node_type& src )
+            {
+                cds::unref(m_func)(dest, src.m_Value);
+            }
+        };
+
+        struct extract_assign_wrapper
+        {
+            template <typename Q>
+            void operator()( Q& dest, node_type& src ) const
+            {
+                dest = src.m_Value;
+            }
+        };
+#   endif  // ifndef CDS_CXX11_LAMBDA_SUPPORT
+
+        //@endcond
+
+    public:
+        /// Default ctor
+        SkipListSet()
+            : base_class()
+        {}
+
+        /// Destructor destroys the set object
+        ~SkipListSet()
+        {}
+
+    public:
+        /// Iterator type
+        typedef skip_list::details::iterator< typename base_class::iterator >  iterator;
+
+        /// Const iterator type
+        typedef skip_list::details::iterator< typename base_class::const_iterator >   const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        iterator begin()
+        {
+            return iterator( base_class::begin() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        //@{
+        const_iterator begin() const
+        {
+            return const_iterator( base_class::begin() );
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( base_class::cbegin() );
+        }
+        //@}
+
+        /// Returns a forward iterator that addresses the location succeeding the last element in a set.
+        iterator end()
+        {
+            return iterator( base_class::end() );
+        }
+
+        /// Returns a forward const iterator that addresses the location succeeding the last element in a set.
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator( base_class::end() );
+        }
+        const_iterator cend()
+        {
+            return const_iterator( base_class::cend() );
+        }
+        //@}
+
+    public:
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the set.
+
+            The type \p Q should contain as minimum the complete key for the node.
+            The object of \ref value_type should be constructible from a value of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            scoped_node_ptr sp( node_allocator().New( random_level(), val ));
+            if ( base_class::insert( *sp.get() )) {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-fields of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success. It may be passed by reference
+            using <tt>boost::ref</tt>
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& val, Func f )
+        {
+            scoped_node_ptr sp( node_allocator().New( random_level(), val ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *sp.get(), [&f]( node_type& val ) { cds::unref(f)( val.m_Value ); } ))
+#       else
+            insert_functor<Func> wrapper(f);
+            if ( base_class::insert( *sp, cds::ref(wrapper) ))
+#       endif
+            {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Ensures that the item exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p val key not found in the set, then the new item created from \p val
+            is inserted into the set. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p key passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( const Q& val, Func func )
+        {
+            scoped_node_ptr sp( node_allocator().New( random_level(), val ));
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> bRes = base_class::ensure( *sp,
+                [&func, &val](bool bNew, node_type& node, node_type&){ cds::unref(func)( bNew, node.m_Value, val ); });
+#       else
+            ensure_functor<Q, Func> wrapper( val, func );
+            std::pair<bool, bool> bRes = base_class::ensure( *sp, cds::ref(wrapper));
+#       endif
+            if ( bRes.first && bRes.second )
+                sp.release();
+            return bRes;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr sp( node_allocator().New( random_level(), std::forward<Args>(args)... ));
+            if ( base_class::insert( *sp.get() )) {
+                sp.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_SkipListSet_rcu_erase_val
+
+            The item comparator should be able to compare the type \p value_type
+            and the type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+            return base_class::erase( key );
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_rcu_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >());
+        }
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_SkipListSet_rcu_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type const& val);
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Since the key of MichaelHashSet's \p value_type is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the type \p T of list item
+            and the type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+
+            See also: \ref erase
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase( key, [&f]( node_type const& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase( key, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_rcu_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(),
+                [&f]( node_type const& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor<Func> wrapper(f);
+            return base_class::erase_with( key, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(), cds::ref(wrapper));
+#       endif
+        }
+
+        /// Extracts the item from the set with specified \p key
+        /** \anchor cds_nonintrusive_SkipListSet_rcu_extract
+            The function searches an item with key equal to \p key in the set,
+            unlinks it from the set, and returns it in \p result parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor from \p Traits class' template argument
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not free the item found.
+            The item will be implicitly freed when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see \p cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& result, Q const& key )
+        {
+            return base_class::do_extract( result, key );
+        }
+
+        /// Extracts the item from the set with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_rcu_extract "extract(exempt_ptr&, Q const&)"
+            but \p pred predicate is used for key comparing.
+            \p Less has the semantics like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& result, Q const& key, Less pred )
+        {
+            return base_class::do_extract_with( result, key, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >());
+        }
+
+        /// Extracts an item with minimal key from the set
+        /**
+            The function searches an item with minimal key, unlinks it, and returns the item found in \p result parameter.
+            If the skip-list is empty the function returns \p false.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not free the item found.
+            The item will be implicitly freed when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        bool extract_min( exempt_ptr& result )
+        {
+            return base_class::do_extract_min(result);
+        }
+
+        /// Extracts an item with maximal key from the set
+        /**
+            The function searches an item with maximal key, unlinks it from the set, and returns the item found
+            in \p result parameter. If the skip-list is empty the function returns \p false.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not free the item found.
+            The item will be implicitly freed when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        bool extract_max(exempt_ptr& result)
+        {
+            return base_class::do_extract_max(result);
+        }
+
+        /// Find the key \p val
+        /**
+            @anchor cds_nonintrusive_SkipListSet_rcu_find_func
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f]( node_type& node, Q& v ) { cds::unref(f)( node.m_Value, v ); });
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find( val, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_rcu_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(),
+                [&f]( node_type& node, Q& v ) { cds::unref(f)( node.m_Value, v ); } );
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find_with( val, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(),
+                cds::ref(wrapper));
+#       endif
+        }
+
+        /// Find the key \p val
+        /** @anchor cds_nonintrusive_SkipListSet_rcu_find_cfunc
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f]( node_type& node, Q const& v ) { cds::unref(f)( node.m_Value, v ); });
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find( val, cds::ref(wrapper));
+#       endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_rcu_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the semantics like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(),
+                [&f]( node_type& node, Q const& v ) { cds::unref(f)( node.m_Value, v ); } );
+#       else
+            find_functor<Func> wrapper(f);
+            return base_class::find_with( val, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >(),
+                cds::ref(wrapper));
+#       endif
+        }
+
+        /// Find the key \p val
+        /** @anchor cds_nonintrusive_SkipListSet_rcu_find_val
+
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that may be not the same as \ref value_type.
+
+            The function applies RCU lock internally.
+        */
+        template <typename Q>
+        bool find( Q const & val )
+        {
+            return base_class::find( val );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_rcu_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+            return base_class::find_with( val, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >());
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_nonintrusive_SkipListSet_rcu_get
+            The function searches the item with key equal to \p key and returns the pointer to item found.
+            If \p key is not found it returns \p NULL.
+
+            Note the compare functor in \p Traits class' template argument
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::container::SkipListSet< cds::urcu::gc< cds::urcu::general_buffered<> >, foo, my_traits > skip_list;
+            skip_list theList;
+            // ...
+            {
+                // Lock RCU
+                skip_list::rcu_lock lock;
+
+                foo * pVal = theList.get( 5 );
+                // Deal with pVal
+                //...
+
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be freed at any time after RCU unlocking
+            }
+            \endcode
+
+            After RCU unlocking the \p %force_dispose member function can be called manually,
+            see \ref force_dispose for explanation.
+        */
+        template <typename Q>
+        value_type * get( Q const& key )
+        {
+            return to_value_ptr( base_class::get( key ));
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_SkipListSet_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& val, Less pred )
+        {
+            return to_value_ptr( base_class::get_with( val, cds::details::predicate_wrapper< node_type, Less, typename maker::value_accessor >() ));
+        }
+
+        /// Clears the set (non-atomic).
+        /**
+            The function deletes all items from the set.
+            The function is not atomic, thus, in multi-threaded environment with parallel insertions
+            this sequence
+            \code
+            set.clear();
+            assert( set.empty() );
+            \endcode
+            the assertion could be raised.
+
+            For each item the \ref disposer provided by \p Traits template parameter will be called.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the set is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the set
+        /**
+            The value returned depends on item counter type provided by \p Traits template parameter.
+            If it is atomicity::empty_item_counter this function always returns 0.
+            Therefore, the function is not suitable for checking the set emptiness, use \ref empty
+            member function for this purpose.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+
+        /// Clears internal list of ready-to-delete items passing them to RCU reclamation cycle
+        /**
+            See \ref cds_intrusive_SkipListSet_rcu_force_dispose "intrusive SkipListSet" for explanation
+        */
+        void force_dispose()
+        {
+            return base_class::force_dispose();
+        }
+    };
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_SKIP_LIST_SET_RCU_H
diff --git a/cds/container/split_list_base.h b/cds/container/split_list_base.h
new file mode 100644 (file)
index 0000000..18c96eb
--- /dev/null
@@ -0,0 +1,176 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SPLIT_LIST_BASE_H
+#define __CDS_CONTAINER_SPLIT_LIST_BASE_H
+
+#include <cds/intrusive/split_list_base.h>
+
+namespace cds { namespace container {
+
+    // forward declaration
+    struct michael_list_tag;
+
+    /// SplitListSet related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace split_list {
+        using intrusive::split_list::dynamic_bucket_table;
+
+        //@cond
+        namespace details {
+
+            template <typename Key, typename Value, typename Traits, typename Opt>
+            struct wrap_map_traits_helper {
+                typedef Opt key_accessor;
+            };
+
+            template <typename Key, typename Value, typename Traits >
+            struct wrap_map_traits_helper<Key, Value, Traits, opt::none>
+            {
+                struct key_accessor
+                {
+                    typedef Key     key_type;
+                    key_type const & operator()( std::pair<Key const, Value> const & val ) const
+                    {
+                        return val.first;
+                    }
+                };
+            };
+
+            template <typename Key, typename Value, typename Traits>
+            struct wrap_map_traits: public Traits
+            {
+                typedef typename wrap_map_traits_helper<Key, Value, Traits, typename Traits::key_accessor>::key_accessor    key_accessor;
+            };
+
+            template <typename Value, typename Traits, typename Opt>
+            struct wrap_set_traits_helper {
+                typedef Opt key_accessor;
+            };
+
+            template <typename Value, typename Traits >
+            struct wrap_set_traits_helper<Value, Traits, opt::none>
+            {
+                struct key_accessor
+                {
+                    typedef Value     key_type;
+                    key_type const& operator()( Value const& val ) const
+                    {
+                        return val;
+                    }
+                };
+            };
+
+            template <typename Value, typename Traits>
+            struct wrap_set_traits: public Traits
+            {
+                typedef typename wrap_set_traits_helper<Value, Traits, typename Traits::key_accessor>::key_accessor key_accessor;
+            };
+        }  // namespace details
+        //@endcond
+
+
+        /// Type traits for SplitListSet class
+        /**
+            Note, the SplitListSet type traits is based on intrusive::split_list::type_traits.
+            Any member declared in intrusive::split_list::type_traits is also applied to
+            container::split_list::type_traits.
+        */
+        struct type_traits: public intrusive::split_list::type_traits
+        {
+            // Ordered list implementation
+            /**
+                This option selects appropriate ordered-list implementation for split-list.
+                It may be \ref michael_list_tag or \ref lazy_list_tag.
+            */
+            typedef michael_list_tag    ordered_list;
+
+            // Ordered list traits
+            /**
+                With this option you can specify type traits for selected ordered list class.
+                If this option is opt::none, the ordered list traits is combined with default
+                ordered list traits and split-list traits.
+
+                For \p michael_list_tag, the default traits is \ref container::michael_list::type_traits.
+
+                For \p lazy_list_tag, the default traits is \ref container::lazy_list::type_traits.
+            */
+            typedef opt::none           ordered_list_traits;
+
+            //@cond
+            typedef opt::none           key_accessor;
+            //@endcond
+        };
+
+        /// Option to select ordered list class for split-list
+        /**
+            This option selects appropriate ordered list class for containers based on split-list.
+            Template parameter \p Type may be \ref michael_list_tag or \ref lazy_list_tag.
+        */
+        template <class Type>
+        struct ordered_list
+        {
+            //@cond
+            template<class Base> struct pack: public Base
+            {
+                typedef Type ordered_list;
+            };
+            //@endcond
+        };
+
+        /// Option to specify ordered list type traits
+        /**
+            The \p Type template parameter specifies ordered list type traits.
+            It depends on type of ordered list selected.
+        */
+        template <class Type>
+        struct ordered_list_traits
+        {
+            //@cond
+            template<class Base> struct pack: public Base
+            {
+                typedef Type ordered_list_traits;
+            };
+            //@endcond
+        };
+
+        /// Metafunction converting option list to traits struct
+        /**
+            Available \p Options:
+            - split_list::ordered_list - a tag for ordered list implementation.
+                See split_list::ordered_list for possible values.
+            - split_list::ordered_list_traits - type traits for ordered list implementation.
+                For MichaelList use container::michael_list::type_traits,
+                for LazyList use container::lazy_list::type_traits.
+            - plus any option from intrusive::split_list::make_traits
+        */
+        template <CDS_DECL_OPTIONS8>
+        struct make_traits {
+            typedef typename cds::opt::make_options< type_traits, CDS_OPTIONS8>::type type  ;   ///< Result of metafunction
+        };
+    }   // namespace split_list
+
+    //@cond
+    // Forward declarations
+    template <class GC, class T, class Traits = split_list::type_traits>
+    class SplitListSet;
+
+    template <class GC, typename Key, typename Value, class Traits = split_list::type_traits>
+    class SplitListMap;
+    //@endcond
+
+    //@cond
+    // Forward declaration
+    namespace details {
+        template <typename GC, typename T, typename OrderedListTag, typename Traits>
+        struct make_split_list_set;
+
+        template <typename GC, typename Key, typename Value, typename OrderedListTag, typename Traits>
+        struct make_split_list_map;
+    }
+    //@endcond
+
+}}  // namespace cds::container
+
+
+#endif // #ifndef __CDS_CONTAINER_SPLIT_LIST_BASE_H
diff --git a/cds/container/split_list_map.h b/cds/container/split_list_map.h
new file mode 100644 (file)
index 0000000..d033d24
--- /dev/null
@@ -0,0 +1,660 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SPLIT_LIST_MAP_H
+#define __CDS_CONTAINER_SPLIT_LIST_MAP_H
+
+#include <cds/container/split_list_set.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    /// Split-ordered list map
+    /** @ingroup cds_nonintrusive_map
+        \anchor cds_nonintrusive_SplitListMap_hp
+
+        Hash table implementation based on split-ordered list algorithm discovered by Ori Shalev and Nir Shavit, see
+        - [2003] Ori Shalev, Nir Shavit "Split-Ordered Lists - Lock-free Resizable Hash Tables"
+        - [2008] Nir Shavit "The Art of Multiprocessor Programming"
+
+        See intrusive::SplitListSet for a brief description of the split-list algorithm.
+
+        Template parameters:
+        - \p GC - Garbage collector used
+        - \p Key - key type of an item stored in the map. It should be copy-constructible
+        - \p Value - value type stored in the map
+        - \p Traits - type traits, default is split_list::type_traits. Instead of declaring split_list::type_traits -based
+            struct you may apply option-based notation with split_list::make_traits metafunction.
+
+        There are the specializations:
+        - for \ref cds_urcu_desc "RCU" - declared in <tt>cd/container/split_list_map_rcu.h</tt>,
+            see \ref cds_nonintrusive_SplitListMap_rcu "SplitListMap<RCU>".
+        - for \ref cds::gc::nogc declared in <tt>cds/container/split_list_map_nogc.h</tt>,
+            see \ref cds_nonintrusive_SplitListMap_nogc "SplitListMap<gc::nogc>".
+
+        \par Usage
+
+        You should decide what garbage collector you want, and what ordered list you want to use. Split-ordered list
+        is original data structure based on an ordered list. Suppose, you want construct split-list map based on gc::HP GC
+        and MichaelList as ordered list implementation. Your map should map \p int key to <tt>std::string</tt> value.
+        So, you beginning your program with following include:
+        \code
+        #include <cds/container/michael_list_hp.h>
+        #include <cds/container/split_list_map.h>
+
+        namespace cc = cds::container;
+        \endcode
+        The inclusion order is important: first, include file for ordered-list implementation (for this example, <tt>cds/container/michael_list_hp.h</tt>),
+        then the header for split-list map <tt>cds/container/split_list_map.h</tt>.
+
+        Now, you should declare traits for split-list map. The main parts of traits are a hash functor for the map key and a comparing functor for ordered list.
+        We use <tt>std::hash<int></tt> as hash functor and <tt>std::less<int></tt> predicate as comparing functor.
+
+        The second attention: instead of using \p %MichaelList in \p %SplitListMap traits we use a tag <tt>cds::contaner::michael_list_tag</tt> for the Michael's list.
+        The split-list requires significant support from underlying ordered list class and it is not good idea to dive you
+        into deep implementation details of split-list and ordered list interrelations. The tag paradigm simplifies split-list interface.
+
+        \code
+        // SplitListMap traits
+        struct foo_set_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag   ordered_list    ;   // what type of ordered list we want to use
+            typedef std::hash<int>         hash            ;   // hash functor for the key stored in split-list map
+
+            // Type traits for our MichaelList class
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+            typedef std::less<int> less   ;   // use our std::less predicate as comparator to order list nodes
+            };
+        };
+        \endcode
+
+        Now you are ready to declare our map class based on SplitListMap:
+        \code
+        typedef cc::SplitListMap< cds::gc::PTB, int, std::string, foo_set_traits > int_string_map;
+        \endcode
+
+        You may use the modern option-based declaration instead of classic type-traits-based one:
+        \code
+        typedef cc:SplitListMap<
+            cs::gc::PTB             // GC used
+            ,int                    // key type
+            ,std::string            // value type
+            ,cc::split_list::make_traits<      // metafunction to build split-list traits
+                cc::split_list::ordered_list<cc::michael_list_tag>     // tag for underlying ordered list implementation
+                ,cc::opt::hash< std::hash<int> >        // hash functor
+                ,cc::split_list::ordered_list_traits<    // ordered list traits desired
+                    cc::michael_list::make_traits<    // metafunction to build lazy list traits
+                        cc::opt::less< std::less<int> >         // less-based compare functor
+                    >::type
+                >
+            >::type
+        >  int_string_map;
+        \endcode
+        In case of option-based declaration using split_list::make_traits metafunction the struct \p foo_set_traits is not required.
+
+        Now, the map of type \p int_string_map is ready to use in your program.
+
+        Note that in this example we show only mandatory type_traits parts, optional ones is the default and they are inherited
+        from cds::container::split_list::type_traits.
+        The <b>cds</b> library contains many other options for deep tuning of behavior of the split-list and
+        ordered-list containers.
+    */
+    template <
+        class GC,
+        typename Key,
+        typename Value,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = split_list::type_traits
+#else
+        class Traits
+#endif
+    >
+    class SplitListMap:
+        protected container::SplitListSet<
+            GC,
+            std::pair<Key const, Value>,
+            split_list::details::wrap_map_traits<Key, Value, Traits>
+        >
+    {
+        //@cond
+        typedef container::SplitListSet<
+            GC,
+            std::pair<Key const, Value>,
+            split_list::details::wrap_map_traits<Key, Value, Traits>
+        >  base_class;
+        //@endcond
+
+    public:
+        typedef typename base_class::gc gc              ;   ///< Garbage collector
+        typedef Key                     key_type        ;   ///< key type
+        typedef Value                   mapped_type     ;   ///< type of value stored in the map
+        typedef Traits                  options         ;   ///< \p Traits template argument
+
+        typedef std::pair<key_type const, mapped_type>  value_type  ;   ///< key-value pair type
+        typedef typename base_class::ordered_list       ordered_list;   ///< Underlying ordered list class
+        typedef typename base_class::key_comparator     key_comparator  ;   ///< key compare functor
+
+        typedef typename base_class::hash           hash            ;   ///< Hash functor for \ref key_type
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counter type
+
+    protected:
+        //@cond
+        typedef typename base_class::maker::type_traits::key_accessor key_accessor;
+        typedef typename base_class::node_type node_type;
+
+    public:
+        /// Guarded pointer
+        typedef cds::gc::guarded_ptr< gc, node_type, value_type, details::guarded_ptr_cast_set<node_type, value_type> > guarded_ptr;
+
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        class ensure_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            ensure_functor_wrapper() {}
+            ensure_functor_wrapper( Func f ): base_class(f) {}
+
+            template <typename Q>
+            void operator()( bool bNew, value_type& item, const Q& /*val*/ )
+            {
+                base_class::get()( bNew, item );
+            }
+        };
+
+        template <typename Func>
+        class find_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_functor_wrapper() {}
+            find_functor_wrapper( Func f ): base_class(f) {}
+
+            template <typename Q>
+            void operator()( value_type& pair, Q const& /*val*/ )
+            {
+                base_class::get()( pair );
+            }
+        };
+#   endif   // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    public:
+        /// Forward iterator (see SplitListSet::iterator)
+        /**
+            Remember, the iterator <tt>operator -> </tt> and <tt>operator *</tt> returns \ref value_type pointer and reference.
+            To access item key and value use <tt>it->first</tt> and <tt>it->second</tt> respectively.
+        */
+        typedef typename base_class::iterator iterator;
+
+        /// Const forward iterator (see SplitListSet::const_iterator)
+        typedef typename base_class::const_iterator const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a map
+        /**
+            For empty map \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return base_class::begin();
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a map
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the map.
+            For empty map \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return base_class::end();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a map
+        //@{
+        const_iterator begin() const
+        {
+            return base_class::begin();
+        }
+        const_iterator cbegin()
+        {
+            return base_class::cbegin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a map
+        //@{
+        const_iterator end() const
+        {
+            return base_class::end();
+        }
+        const_iterator cend()
+        {
+            return base_class::cend();
+        }
+        //@}
+
+    public:
+        /// Initializes split-ordered map of default capacity
+        /**
+            The default capacity is defined in bucket table constructor.
+            See intrusive::split_list::expandable_bucket_table, intrusive::split_list::static_bucket_table
+            which selects by intrusive::split_list::dynamic_bucket_table option.
+        */
+        SplitListMap()
+            : base_class()
+        {}
+
+        /// Initializes split-ordered map
+        SplitListMap(
+            size_t nItemCount           ///< estimate average item count
+            , size_t nLoadFactor = 1    ///< load factor - average item count per bucket. Small integer up to 10, default is 1.
+            )
+            : base_class( nItemCount, nLoadFactor )
+        {}
+
+    public:
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( K const& key )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::insert( std::make_pair( key, mapped_type() ) );
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            Returns \p true if \p val is inserted into the map, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( K const& key, V const& val )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::insert( std::make_pair(key, val) );
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted:
+                - <tt>item.first</tt> is a const reference to item's key that cannot be changed.
+                - <tt>item.second</tt> is a reference to item's value that may be changed.
+
+            It should be keep in mind that concurrent modifications of \p <tt>item.second</tt> may be possible.
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this \p item by concurrent threads.
+
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+        */
+        template <typename K, typename Func>
+        bool insert_key( K const& key, Func func )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::insert( std::make_pair( key, mapped_type() ), func );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            \p key_type should be constructible from type \p K
+
+            Returns \p true if inserting successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            return base_class::emplace( std::forward<K>(key), std::move(mapped_type(std::forward<Args>(args)...)));
+        }
+#   endif
+
+
+        /// Ensures that the \p key exists in the map
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the map, then the new item created from \p key
+            is inserted into the map (note that in this case the \ref key_type should be
+            constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref mapped_type;
+            however, \p func must guarantee that during changing no any other modifications
+            could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( K const& key, Func func )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::ensure( std::make_pair( key, mapped_type() ),
+                [&func](bool bNew, value_type& item, value_type const& /*val*/) {
+                    cds::unref(func)( bNew, item );
+                } );
+#   else
+            ensure_functor_wrapper<Func> fw( func );
+            return base_class::ensure( std::make_pair( key, mapped_type() ), cds::ref(fw) );
+#   endif
+        }
+
+        /// Deletes \p key from the map
+        /** \anchor cds_nonintrusive_SplitListMap_erase_val
+
+            Return \p true if \p key is found and deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            return base_class::erase( key );
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_erase_val "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool erase_with( K const& key, Less pred )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper<value_type, Less, key_accessor>() );
+        }
+
+        /// Deletes \p key from the map
+        /** \anchor cds_nonintrusive_SplitListMap_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface is:
+            \code
+            struct extractor {
+                void operator()(value_type& item) { ... }
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+            return base_class::erase( key, f );
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper<value_type, Less, key_accessor>(), f );
+        }
+
+        /// Extracts the item with specified \p key
+        /** \anchor cds_nonintrusive_SplitListMap_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the map, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p K that may be not the same as \p value_type.
+
+            The extracted item is freed automatically when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::SplitListMap< your_template_args > splitlist_map;
+            splitlist_map theMap;
+            // ...
+            {
+                splitlist_map::guarded_ptr gp;
+                theMap.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        template <typename K>
+        bool extract( guarded_ptr& dest, K const& key )
+        {
+            return base_class::extract_( dest.guard(), key );
+        }
+
+        /// Extracts the item using compare functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_hp_extract "extract(guarded_ptr&, K const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool extract_with( guarded_ptr& dest, K const& key, Less pred )
+        {
+            return base_class::extract_with_( dest.guard(), key, cds::details::predicate_wrapper<value_type, Less, key_accessor>() );
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_SplitListMap_find_cfunc
+
+            The function searches the item with key equal to \p key and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change \p item.second. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the map's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename K, typename Func>
+        bool find( K const& key, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( key, [&f](value_type& pair, K const&){ cds::unref(f)( pair ); } );
+#   else
+            find_functor_wrapper<Func> fw(f);
+            return base_class::find( key, cds::ref(fw) );
+#   endif
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_find_cfunc "find(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool find_with( K const& key, Less pred, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( key,
+                cds::details::predicate_wrapper<value_type, Less, key_accessor>(),
+                [&f](value_type& pair, K const&){ cds::unref(f)( pair ); } );
+#   else
+            find_functor_wrapper<Func> fw(f);
+            return base_class::find_with( key, cds::details::predicate_wrapper<value_type, Less, key_accessor>(), cds::ref(fw) );
+#   endif
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_SplitListMap_find_val
+
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+        */
+        template <typename K>
+        bool find( K const& key )
+        {
+            return base_class::find( key );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_find_val "find(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool find_with( K const& key, Less pred )
+        {
+            return base_class::find( key, cds::details::predicate_wrapper<value_type, Less, key_accessor>() );
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_nonintrusive_SplitListMap_hp_get
+            The function searches the item with key equal to \p key
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p key is found, and \p false otherwise.
+            If \p key is not found the \p ptr parameter is not changed.
+
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::SplitListMap< your_template_params >  splitlist_map;
+            splitlist_map theMap;
+            // ...
+            {
+                splitlist_map::guarded_ptr gp;
+                if ( theMap.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for split-list map
+            should accept a parameter of type \p K that can be not the same as \p value_type.
+        */
+        template <typename K>
+        bool get( guarded_ptr& ptr, K const& key )
+        {
+            return base_class::get_( ptr.guard(), key );
+        }
+
+        /// Finds \p key and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_hp_get "get( guarded_ptr&, K const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool get_with( guarded_ptr& ptr, K const& key, Less pred )
+        {
+            return base_class::get_with_( ptr.guard(), key, cds::details::predicate_wrapper<value_type, Less, key_accessor>() );
+        }
+
+        /// Clears the map (non-atomic)
+        /**
+            The function unlink all items from the map.
+            The function is not atomic and not lock-free and should be used for debugging only.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+            Thus, the correct item counting is an important part of the map implementation.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return base_class::size();
+        }
+    };
+
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_SPLIT_LIST_MAP_H
diff --git a/cds/container/split_list_map_nogc.h b/cds/container/split_list_map_nogc.h
new file mode 100644 (file)
index 0000000..af963c6
--- /dev/null
@@ -0,0 +1,289 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SPLIT_LIST_MAP_NOGC_H
+#define __CDS_CONTAINER_SPLIT_LIST_MAP_NOGC_H
+
+#include <cds/container/split_list_set_nogc.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    /// Split-ordered list map (template specialization for gc::nogc)
+    /** @ingroup cds_nonintrusive_map
+        \anchor cds_nonintrusive_SplitListMap_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+
+        See \ref cds_nonintrusive_SplitListMap_hp "SplitListMap" for description of template parameters.
+
+        The interface of the specialization is a slightly different.
+    */
+    template <
+        typename Key,
+        typename Value,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = split_list::type_traits
+#else
+        class Traits
+#endif
+    >
+    class SplitListMap<cds::gc::nogc, Key, Value, Traits>:
+        protected container::SplitListSet<
+            cds::gc::nogc,
+            std::pair<Key const, Value>,
+            split_list::details::wrap_map_traits<Key, Value, Traits>
+        >
+    {
+        //@cond
+        typedef container::SplitListSet<
+            cds::gc::nogc,
+            std::pair<Key const, Value>,
+            split_list::details::wrap_map_traits<Key, Value, Traits>
+        > base_class;
+        //@endcond
+    public:
+        typedef typename base_class::gc gc              ;   ///< Garbage collector
+        typedef Key                     key_type        ;   ///< key type
+        typedef Value                   mapped_type     ;   ///< type of value stored in the map
+
+        typedef std::pair<key_type const, mapped_type>  value_type  ;   ///< Pair type
+        typedef typename base_class::ordered_list       ordered_list;   ///< Underlying ordered list class
+        typedef typename base_class::key_comparator     key_comparator  ;   ///< key comparison functor
+
+        typedef typename base_class::hash           hash            ;   ///< Hash functor for \ref key_type
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counter type
+
+    protected:
+        //@cond
+        typedef typename base_class::options::type_traits::key_accessor key_accessor;
+        //@endcond
+
+    public:
+        /// Forward iterator (see SplitListSet::iterator)
+        /**
+            Remember, the iterator <tt>operator -> </tt> and <tt>operator *</tt> returns \ref value_type pointer and reference.
+            To access item key and value use <tt>it->first</tt> and <tt>it->second</tt> respectively.
+        */
+        typedef typename base_class::iterator iterator;
+
+        /// Const forward iterator (see SplitListSet::const_iterator)
+        typedef typename base_class::const_iterator const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a map
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return base_class::begin();
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a map
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return base_class::end();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a map
+        //@{
+        const_iterator begin() const
+        {
+            return base_class::begin();
+        }
+        const_iterator cbegin()
+        {
+            return base_class::cbegin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a map
+        //@{
+        const_iterator end() const
+        {
+            return base_class::end();
+        }
+        const_iterator cend()
+        {
+            return base_class::cend();
+        }
+        //@}
+
+    public:
+        /// Initialize split-ordered map of default capacity
+        /**
+            The default capacity is defined in bucket table constructor.
+            See intrusive::split_list::expandable_bucket_table, intrusive::split_list::static_ducket_table
+            which selects by intrusive::split_list::dynamic_bucket_table option.
+        */
+        SplitListMap()
+            : base_class()
+        {}
+
+        /// Initialize split-ordered map
+        SplitListMap(
+            size_t nItemCount           ///< estimate average item count
+            , size_t nLoadFactor = 1    ///< load factor - average item count per bucket. Small integer up to 10, default is 1.
+            )
+            : base_class( nItemCount, nLoadFactor )
+        {}
+
+    public:
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K>
+        iterator insert( K const& key )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::insert( std::make_pair( key, mapped_type() ) );
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K, typename V>
+        iterator insert( K const& key, V const& val )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::insert( std::make_pair( key, val ) );
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted. <tt>item.second</tt> is a reference to item's value that may be changed.
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this map's item by concurrent threads.
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if the inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p f functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            Returns an iterator pointed to inserted value, or \p end() if inserting is failed
+        */
+        template <typename K, typename Func>
+        iterator insert_key( const K& key, Func func )
+        {
+            iterator it = insert( key );
+            if ( it != end() )
+                cds::unref( func )( (*it) );
+            return it;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            \p key_type should be constructible from type \p K
+
+            Returns \p true if inserting successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        iterator emplace( K&& key, Args&&... args )
+        {
+            return base_class::emplace( std::forward<K>(key), std::move(mapped_type(std::forward<Args>(args)...)));
+        }
+#   endif
+
+        /// Ensures that the key \p key exists in the map
+        /**
+            The operation inserts new item if the key \p key is not found in the map.
+            Otherwise, the function returns an iterator that points to item found.
+
+            Returns <tt> std::pair<iterator, bool>  </tt> where \p first is an iterator pointing to
+            item found or inserted, \p second is true if new item has been added or \p false if the item
+            already is in the list.
+        */
+        template <typename K>
+        std::pair<iterator, bool> ensure( K const& key )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::ensure( std::make_pair( key, mapped_type() ));
+        }
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_SplitListMap_nogc_find
+
+            The function searches the item with key equal to \p key
+            and returns an iterator pointed to item found if the key is found,
+            and \ref end() otherwise
+        */
+        template <typename K>
+        iterator find( K const& key )
+        {
+            return base_class::find( key );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_nogc_find "find(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        iterator find_with( K const& key, Less pred )
+        {
+            return base_class::find_with( key, cds::details::predicate_wrapper<value_type, Less, key_accessor>() );
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+            Thus, the correct item counting feature is an important part of Michael's map implementation.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return base_class::size();
+        }
+    };
+}}  // namespace cds::container
+
+
+#endif // #ifndef __CDS_CONTAINER_SPLIT_LIST_MAP_NOGC_H
diff --git a/cds/container/split_list_map_rcu.h b/cds/container/split_list_map_rcu.h
new file mode 100644 (file)
index 0000000..e754477
--- /dev/null
@@ -0,0 +1,725 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SPLIT_LIST_MAP_RCU_H
+#define __CDS_CONTAINER_SPLIT_LIST_MAP_RCU_H
+
+#include <cds/container/split_list_set_rcu.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    /// Split-ordered list map (template specialization for \ref cds_urcu_desc "RCU")
+    /** @ingroup cds_nonintrusive_map
+        \anchor cds_nonintrusive_SplitListMap_rcu
+
+        Hash table implementation based on split-ordered list algorithm discovered by Ori Shalev and Nir Shavit, see
+        - [2003] Ori Shalev, Nir Shavit "Split-Ordered Lists - Lock-free Resizable Hash Tables"
+        - [2008] Nir Shavit "The Art of Multiprocessor Programming"
+
+        See intrusive::SplitListSet for a brief description of the split-list algorithm.
+
+        Template parameters:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p Key - key type of an item stored in the map. It should be copy-constructible
+        - \p Value - value type stored in the map
+        - \p Traits - type traits, default is split_list::type_traits. Instead of declaring split_list::type_traits -based
+            struct you may apply option-based notation with split_list::make_traits metafunction.
+
+        <b>Iterators</b>
+
+        The class supports a forward iterator (\ref iterator and \ref const_iterator).
+        The iteration is unordered.
+
+        You may iterate over split-list map items only under RCU lock.
+        Only in this case the iterator is thread-safe since
+        while RCU is locked any map's item cannot be reclaimed.
+
+        The requirement of RCU lock during iterating means that deletion of the elements (i.e. \ref erase)
+        is not possible.
+
+        @warning The iterator object cannot be passed between threads
+
+        \warning Due to concurrent nature of split-list map it is not guarantee that you can iterate
+        all elements in the map: any concurrent deletion can exclude the element
+        pointed by the iterator from the map, and your iteration can be terminated
+        before end of the map. Therefore, such iteration is more suitable for debugging purposes
+
+        The iterator class supports the following minimalistic interface:
+        \code
+        struct iterator {
+            // Default ctor
+            iterator();
+
+            // Copy ctor
+            iterator( iterator const& s);
+
+            value_type * operator ->() const;
+            value_type& operator *() const;
+
+            // Pre-increment
+            iterator& operator ++();
+
+            // Copy assignment
+            iterator& operator = (const iterator& src);
+
+            bool operator ==(iterator const& i ) const;
+            bool operator !=(iterator const& i ) const;
+        };
+        \endcode
+        Note, the iterator object returned by \ref end, \p cend member functions points to \p NULL and should not be dereferenced.
+
+        \par Usage
+
+        You should decide what garbage collector you want, and what ordered list you want to use. Split-ordered list
+        is original data structure based on an ordered list. Suppose, you want construct split-list map based on cds::urcu::general_buffered<> GC
+        and MichaelList as ordered list implementation. Your map should map \p int key to <tt>std::string</tt> value.
+        So, you beginning your program with following include:
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/container/michael_list_rcu.h>
+        #include <cds/container/split_list_map_rcu.h>
+
+        namespace cc = cds::container;
+        \endcode
+        The inclusion order is important:
+        - first, include one of \ref cds_urcu_gc "RCU implementation" (<tt>cds/urcu/general_buffered.h</tt> in our case)
+        - second, include file for ordered-list implementation (for this example, <tt>cds/container/michael_list_rcu.h</tt>),
+        - then, the header for RCU-based split-list map <tt>cds/container/split_list_map_rcu.h</tt>.
+
+        Now, you should declare traits for split-list map. The main parts of traits are a hash functor for the map key and a comparing functor for ordered list.
+        We use <tt>std::hash<int></tt> as hash functor and <tt>std::less<int></tt> predicate as comparing functor.
+
+        The second attention: instead of using %MichaelList in %SplitListMap traits we use a tag <tt>cds::contaner::michael_list_tag</tt>
+        for the Michael's list.
+        The split-list requires significant support from underlying ordered list class and it is not good idea to dive you
+        into deep implementation details of split-list and ordered list interrelations. The tag paradigm simplifies split-list interface.
+
+        \code
+        // SplitListMap traits
+        struct foo_set_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag   ordered_list    ;   // what type of ordered list we want to use
+            typedef std::hash<int>         hash            ;   // hash functor for the key stored in split-list map
+
+            // Type traits for our MichaelList class
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef std::less<int> less   ;   // use our std::less predicate as comparator to order list nodes
+            };
+        };
+        \endcode
+
+        Now you are ready to declare our map class based on \p %SplitListMap:
+        \code
+        typedef cc::SplitListMap< cds::urcu::gc<cds::urcu::general_buffered<> >, int, std::string, foo_set_traits > int_string_map;
+        \endcode
+
+        You may use the modern option-based declaration instead of classic type-traits-based one:
+        \code
+        typedef cc:SplitListMap<
+            cds::urcu::gc<cds::urcu::general_buffered<> >  // RCU type
+            ,int                    // key type
+            ,std::string            // value type
+            ,cc::split_list::make_traits<      // metafunction to build split-list traits
+                cc::split_list::ordered_list<cc::michael_list_tag>     // tag for underlying ordered list implementation
+                ,cc::opt::hash< std::hash<int> >        // hash functor
+                ,cc::split_list::ordered_list_traits<    // ordered list traits desired
+                    cc::michael_list::make_traits<    // metafunction to build lazy list traits
+                        cc::opt::less< std::less<int> >         // less-based compare functor
+                    >::type
+                >
+            >::type
+        >  int_string_map;
+        \endcode
+        In case of option-based declaration using split_list::make_traits metafunction the struct \p foo_set_traits is not required.
+
+        Now, the map of type \p int_string_map is ready to use in your program.
+
+        Note that in this example we show only mandatory type_traits parts, optional ones is the default and they are inherited
+        from cds::container::split_list::type_traits.
+        The <b>cds</b> library contains many other options for deep tuning of behavior of the split-list and
+        ordered-list containers.
+    */
+    template <
+        class RCU,
+        typename Key,
+        typename Value,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = split_list::type_traits
+#else
+        class Traits
+#endif
+    >
+    class SplitListMap< cds::urcu::gc< RCU >, Key, Value, Traits >:
+        protected container::SplitListSet<
+            cds::urcu::gc< RCU >,
+            std::pair<Key const, Value>,
+            split_list::details::wrap_map_traits<Key, Value, Traits>
+        >
+    {
+        //@cond
+        typedef container::SplitListSet<
+            cds::urcu::gc< RCU >,
+            std::pair<Key const, Value>,
+            split_list::details::wrap_map_traits<Key, Value, Traits>
+        >  base_class;
+        //@endcond
+
+    public:
+        typedef typename base_class::gc gc              ;   ///< Garbage collector
+        typedef Traits                  options         ;   ///< ]p Traits template argument
+        typedef Key                     key_type        ;   ///< key type
+        typedef Value                   mapped_type     ;   ///< type of value stored in the map
+
+        typedef std::pair<key_type const, mapped_type>  value_type  ;   ///< key-value pair type
+        typedef typename base_class::ordered_list       ordered_list;   ///< Underlying ordered list class
+        typedef typename base_class::key_comparator     key_comparator  ;   ///< key comparison functor
+
+        typedef typename base_class::hash           hash            ;   ///< Hash functor for \ref key_type
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counter type
+
+        typedef typename base_class::rcu_lock       rcu_lock    ; ///< RCU scoped lock
+        typedef typename base_class::exempt_ptr     exempt_ptr  ; ///< pointer to extracted node
+        /// Group of \p extract_xxx functions require external locking if underlying ordered list requires that
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = base_class::c_bExtractLockExternal;
+
+    protected:
+        //@cond
+        typedef typename base_class::maker::type_traits::key_accessor key_accessor;
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        class ensure_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            ensure_functor_wrapper() {}
+            ensure_functor_wrapper( Func f ): base_class(f) {}
+
+            template <typename Q>
+            void operator()( bool bNew, value_type& item, const Q& /*val*/ )
+            {
+                base_class::get()( bNew, item );
+            }
+        };
+
+        template <typename Func>
+        class find_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_functor_wrapper() {}
+            find_functor_wrapper( Func f ): base_class(f) {}
+
+            template <typename Q>
+            void operator()( value_type& pair, Q const& /*val*/ )
+            {
+                base_class::get()( pair );
+            }
+        };
+#   endif   // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    public:
+        /// Forward iterator
+        typedef typename base_class::iterator iterator;
+
+        /// Const forward iterator
+        typedef typename base_class::const_iterator const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a map
+        /**
+            For empty map \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return base_class::begin();
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a map
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the map.
+            For empty map \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return base_class::end();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a map
+        //@{
+        const_iterator begin() const
+        {
+            return base_class::begin();
+        }
+        const_iterator cbegin()
+        {
+            return base_class::cbegin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a map
+        //@{
+        const_iterator end() const
+        {
+            return base_class::end();
+        }
+        const_iterator cend()
+        {
+            return base_class::cend();
+        }
+        //@}
+
+    public:
+        /// Initializes split-ordered map of default capacity
+        /**
+            The default capacity is defined in bucket table constructor.
+            See intrusive::split_list::expandable_bucket_table, intrusive::split_list::static_bucket_table
+            which selects by intrusive::split_list::dynamic_bucket_table option.
+        */
+        SplitListMap()
+            : base_class()
+        {}
+
+        /// Initializes split-ordered map
+        SplitListMap(
+            size_t nItemCount           ///< estimate average item count
+            , size_t nLoadFactor = 1    ///< load factor - average item count per bucket. Small integer up to 10, default is 1.
+            )
+            : base_class( nItemCount, nLoadFactor )
+        {}
+
+    public:
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            The function applies RCU lock internally.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( K const& key )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::insert( std::make_pair( key, mapped_type() ) );
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            The function applies RCU lock internally.
+
+            Returns \p true if \p val is inserted into the map, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( K const& key, V const& val )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::insert( std::make_pair(key, val) );
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted:
+                - <tt>item.first</tt> is a const reference to item's key that cannot be changed.
+                - <tt>item.second</tt> is a reference to item's value that may be changed.
+
+            It should be keep in mind that concurrent modifications of \p <tt>item.second</tt> may be possible.
+            User-defined functor \p func should guarantee that during changing item's value no any other changes
+            could be made on this \p item by concurrent threads.
+
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+
+            The function applies RCU lock internally.
+        */
+        template <typename K, typename Func>
+        bool insert_key( K const& key, Func func )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+            return base_class::insert( std::make_pair( key, mapped_type() ), func );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            \p key_type should be constructible from type \p K
+
+            The function applies RCU lock internally.
+
+            Returns \p true if inserting successful, \p false otherwise.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            return base_class::emplace( std::forward<K>(key), std::move(mapped_type(std::forward<Args>(args)...)));
+        }
+#   endif
+
+        /// Ensures that the \p key exists in the map
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the map, then the new item created from \p key
+            is inserted into the map (note that in this case the \ref key_type should be
+            constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref mapped_type;
+            however, \p func must guarantee that during changing no any other modifications
+            could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            The function applies RCU lock internally.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( K const& key, Func func )
+        {
+            //TODO: pass arguments by reference (make_pair makes copy)
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::ensure( std::make_pair( key, mapped_type() ),
+                [&func](bool bNew, value_type& item, value_type const& /*val*/) {
+                    cds::unref(func)( bNew, item );
+                } );
+#   else
+            ensure_functor_wrapper<Func> fw( func );
+            return base_class::ensure( std::make_pair( key, mapped_type() ), cds::ref(fw) );
+#   endif
+        }
+
+        /// Deletes \p key from the map
+        /** \anchor cds_nonintrusive_SplitListMap_rcu_erase_val
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if \p key is found and deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            return base_class::erase( key );
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_rcu_erase_val "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool erase_with( K const& key, Less pred )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper<value_type, Less, key_accessor>() );
+        }
+
+        /// Deletes \p key from the map
+        /** \anchor cds_nonintrusive_SplitListMap_rcu_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface is:
+            \code
+            struct extractor {
+                void operator()(value_type& item) { ... }
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+            return base_class::erase( key, f );
+        }
+
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_rcu_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper<value_type, Less, key_accessor>(), f );
+        }
+
+        /// Extracts an item from the map
+        /** \anchor cds_nonintrusive_SplitListMap_rcu_extract
+            The function searches an item with key equal to \p key in the map,
+            unlinks it from the map, places item pointer into \p dest argument, and returns \p true.
+            If the item with the key equal to \p key is not found the function return \p false.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the map
+            and returns a pointer to item found.
+            You should lock RCU before calling of the function, and you should synchronize RCU
+            outside the RCU lock to free extracted item
+
+            \code
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::container::SplitListMap< rcu, int, Foo > splitlist_map;
+
+            splitlist_map theMap;
+            // ...
+
+            typename splitlist_map::exempt_ptr p;
+            {
+                // first, we should lock RCU
+                typename splitlist_map::rcu_lock lock;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theMap.extract( p, 10 )) {
+                    // do something with p
+                    ...
+                }
+            }
+
+            // We may safely release p here
+            // release() passes the pointer to RCU reclamation cycle
+            p.release();
+            \endcode
+        */
+        template <typename K>
+        bool extract( exempt_ptr& dest, K const& key )
+        {
+            return base_class::extract( dest, key );
+        }
+
+        /// Extracts an item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_rcu_extract "extract(exempt_ptr&, K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool extract_with( exempt_ptr& dest, K const& key, Less pred )
+        {
+            return base_class::extract_with( dest, key, cds::details::predicate_wrapper<value_type, Less, key_accessor>());
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_SplitListMap_rcu_find_cfunc
+
+            The function searches the item with key equal to \p key and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change \p item.second. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the map's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename K, typename Func>
+        bool find( K const& key, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( key, [&f](value_type& pair, K const&){ cds::unref(f)( pair ); } );
+#   else
+            find_functor_wrapper<Func> fw(f);
+            return base_class::find( key, cds::ref(fw) );
+#   endif
+        }
+
+        /// Finds the key \p key using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_rcu_find_cfunc "find(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less, typename Func>
+        bool find_with( K const& key, Less pred, Func f )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( key,
+                cds::details::predicate_wrapper<value_type, Less, key_accessor>(),
+                [&f](value_type& pair, K const&){ cds::unref(f)( pair ); } );
+#   else
+            find_functor_wrapper<Func> fw(f);
+            return base_class::find_with( key, cds::details::predicate_wrapper<value_type, Less, key_accessor>(), cds::ref(fw) );
+#   endif
+        }
+
+        /// Finds the key \p key
+        /** \anchor cds_nonintrusive_SplitListMap_rcu_find_val
+
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+
+            The function applies RCU lock internally.
+        */
+        template <typename K>
+        bool find( K const& key )
+        {
+            return base_class::find( key );
+        }
+
+        /// Finds the key \p key using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListMap_rcu_find_val "find(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        bool find_with( K const& key, Less pred )
+        {
+            return base_class::find_with( key, cds::details::predicate_wrapper<value_type, Less, key_accessor>() );
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_intrusive_SplitListMap_rcu_get
+            The function searches the item with key equal to \p key and returns the pointer to item found.
+            If \p key is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p K that can be not the same as \p value_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::container::SplitListMap< rcu, int, Foo > splitlist_map;
+            splitlist_map theMap;
+            // ...
+            {
+                // Lock RCU
+                typename splitlist_map::rcu_lock lock;
+
+                typename splitlist_map::value_type * pVal = theMap.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be retired by disposer at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename K>
+        value_type * get( K const& key )
+        {
+            return base_class::get( key );
+        }
+
+        /// Finds \p key with predicate specified and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListMap_rcu_get "get(K const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p K
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the map.
+        */
+        template <typename K, typename Less>
+        value_type * get_with( K const& key, Less pred )
+        {
+            return base_class::get_with( key, cds::details::predicate_wrapper<value_type, Less, key_accessor>());
+        }
+
+        /// Clears the map (non-atomic)
+        /**
+            The function unlink all items from the map.
+            The function is not atomic and not lock-free and should be used for debugging only.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+            Thus, the correct item counting is an important part of the map implementation.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return base_class::size();
+        }
+    };
+
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_SPLIT_LIST_MAP_RCU_H
diff --git a/cds/container/split_list_set.h b/cds/container/split_list_set.h
new file mode 100644 (file)
index 0000000..ffdb9a5
--- /dev/null
@@ -0,0 +1,892 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SPLIT_LIST_SET_H
+#define __CDS_CONTAINER_SPLIT_LIST_SET_H
+
+#include <cds/intrusive/split_list.h>
+#include <cds/container/details/make_split_list_set.h>
+#include <cds/details/functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    /// Split-ordered list set
+    /** @ingroup cds_nonintrusive_set
+        \anchor cds_nonintrusive_SplitListSet_hp
+
+        Hash table implementation based on split-ordered list algorithm discovered by Ori Shalev and Nir Shavit, see
+        - [2003] Ori Shalev, Nir Shavit "Split-Ordered Lists - Lock-free Resizable Hash Tables"
+        - [2008] Nir Shavit "The Art of Multiprocessor Programming"
+
+        See intrusive::SplitListSet for a brief description of the split-list algorithm.
+
+        Template parameters:
+        - \p GC - Garbage collector used
+        - \p T - type stored in the split-list. The type must be default- and copy-constructible.
+        - \p Traits - type traits, default is split_list::type_traits. Instead of declaring split_list::type_traits -based
+            struct you may apply option-based notation with split_list::make_traits metafunction.
+
+        There are the specializations:
+        - for \ref cds_urcu_desc "RCU" - declared in <tt>cd/container/split_list_set_rcu.h</tt>,
+            see \ref cds_nonintrusive_SplitListSet_rcu "SplitListSet<RCU>".
+        - for \ref cds::gc::nogc declared in <tt>cds/container/split_list_set_nogc.h</tt>,
+            see \ref cds_nonintrusive_SplitListSet_nogc "SplitListSet<gc::nogc>".
+
+        \par Usage
+
+        You should decide what garbage collector you want, and what ordered list you want to use. Split-ordered list
+        is original data structure based on an ordered list. Suppose, you want construct split-list set based on gc::PTB GC
+        and LazyList as ordered list implementation. So, you beginning your program with following include:
+        \code
+        #include <cds/container/lazy_list_ptb.h>
+        #include <cds/container/split_list_set.h>
+
+        namespace cc = cds::container;
+
+        // The data belonged to split-ordered list
+        sturuct foo {
+            int     nKey;   // key field
+            std::string strValue    ;   // value field
+        };
+        \endcode
+        The inclusion order is important: first, include header for ordered-list implementation (for this example, <tt>cds/container/lazy_list_ptb.h</tt>),
+        then the header for split-list set <tt>cds/container/split_list_set.h</tt>.
+
+        Now, you should declare traits for split-list set. The main parts of traits are a hash functor for the set and a comparing functor for ordered list.
+        Note that we define several function in <tt>foo_hash</tt> and <tt>foo_less</tt> functors for different argument types since we want call our \p %SplitListSet
+        object by the key of type <tt>int</tt> and by the value of type <tt>foo</tt>.
+
+        The second attention: instead of using \p %LazyList in \p %SplitListSet traits we use a tag <tt>cds::contaner::lazy_list_tag</tt> for the lazy list.
+        The split-list requires significant support from underlying ordered list class and it is not good idea to dive you
+        into deep implementation details of split-list and ordered list interrelations. The tag paradigm simplifies split-list interface.
+
+        \code
+        // foo hash functor
+        struct foo_hash {
+            size_t operator()( int key ) const { return std::hash( key ) ; }
+            size_t operator()( foo const& item ) const { return std::hash( item.nKey ) ; }
+        };
+
+        // foo comparator
+        struct foo_less {
+            bool operator()(int i, foo const& f ) const { return i < f.nKey ; }
+            bool operator()(foo const& f, int i ) const { return f.nKey < i ; }
+            bool operator()(foo const& f1, foo const& f2) const { return f1.nKey < f2.nKey; }
+        };
+
+        // SplitListSet traits
+        struct foo_set_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag   ordered_list    ;   // what type of ordered list we want to use
+            typedef foo_hash            hash            ;   // hash functor for our data stored in split-list set
+
+            // Type traits for our LazyList class
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef foo_less less   ;   // use our foo_less as comparator to order list nodes
+            };
+        };
+        \endcode
+
+        Now you are ready to declare our set class based on \p %SplitListSet:
+        \code
+        typedef cc::SplitListSet< cds::gc::PTB, foo, foo_set_traits > foo_set;
+        \endcode
+
+        You may use the modern option-based declaration instead of classic type-traits-based one:
+        \code
+        typedef cc:SplitListSet<
+            cs::gc::PTB             // GC used
+            ,foo                    // type of data stored
+            ,cc::split_list::make_traits<      // metafunction to build split-list traits
+                cc::split_list::ordered_list<cc::lazy_list_tag>     // tag for underlying ordered list implementation
+                ,cc::opt::hash< foo_hash >               // hash functor
+                ,cc::split_list::ordered_list_traits<    // ordered list traits desired
+                    cc::lazy_list::make_traits<    // metafunction to build lazy list traits
+                        cc::opt::less< foo_less >           // less-based compare functor
+                    >::type
+                >
+            >::type
+        >  foo_set;
+        \endcode
+        In case of option-based declaration using split_list::make_traits metafunction
+        the struct \p foo_set_traits is not required.
+
+        Now, the set of type \p foo_set is ready to use in your program.
+
+        Note that in this example we show only mandatory type_traits parts, optional ones is the default and they are inherited
+        from cds::container::split_list::type_traits.
+        The <b>cds</b> library contains many other options for deep tuning of behavior of the split-list and
+        ordered-list containers.
+    */
+    template <
+        class GC,
+        class T,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = split_list::type_traits
+#else
+        class Traits
+#endif
+    >
+    class SplitListSet:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::SplitListSet<GC, typename Traits::ordered_list, Traits>
+#else
+        protected details::make_split_list_set< GC, T, typename Traits::ordered_list, split_list::details::wrap_set_traits<T, Traits> >::type
+#endif
+    {
+    protected:
+        //@cond
+        typedef details::make_split_list_set< GC, T, typename Traits::ordered_list, split_list::details::wrap_set_traits<T, Traits> > maker;
+        typedef typename maker::type  base_class;
+        //@endcond
+
+    public:
+        typedef Traits                            options         ; ///< \p Traits template argument
+        typedef typename maker::gc                gc              ; ///< Garbage collector
+        typedef typename maker::value_type        value_type      ; ///< type of value stored in the list
+        typedef typename maker::ordered_list      ordered_list    ; ///< Underlying ordered list class
+        typedef typename base_class::key_comparator key_comparator; ///< key compare functor
+
+        /// Hash functor for \p %value_type and all its derivatives that you use
+        typedef typename base_class::hash           hash;
+        typedef typename base_class::item_counter   item_counter  ;   ///< Item counter type
+
+    protected:
+        //@cond
+        typedef typename maker::cxx_node_allocator    cxx_node_allocator;
+        typedef typename maker::node_type             node_type;
+        //@endcond
+
+    public:
+        /// Guarded pointer
+        typedef cds::gc::guarded_ptr< gc, node_type, value_type, details::guarded_ptr_cast_set<node_type, value_type> > guarded_ptr;
+
+    protected:
+        //@cond
+        template <typename Q>
+        static node_type * alloc_node(Q const& v )
+        {
+            return cxx_node_allocator().New( v );
+        }
+
+        template <typename Q, typename Func>
+        bool find_( Q& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f]( node_type& item, Q& val ) { cds::unref(f)(item.m_Value, val) ; } );
+#       else
+            find_functor_wrapper<Func> fw(f);
+            return base_class::find( val, cds::ref(fw) );
+#       endif
+        }
+
+        template <typename Q, typename Less, typename Func>
+        bool find_with_( Q& val, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Less>::type(),
+                [&f]( node_type& item, Q& val ) { cds::unref(f)(item.m_Value, val) ; } );
+#       else
+            find_functor_wrapper<Func> fw(f);
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Less>::type(), cds::ref(fw) );
+#       endif
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_node_allocator().MoveNew( std::forward<Args>(args)...);
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_node_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        bool insert_node( node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p(pNode);
+
+            if ( base_class::insert( *pNode ) ) {
+                p.release();
+                return true;
+            }
+
+            return false;
+        }
+
+        //@endcond
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        class insert_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_functor_wrapper( Func f ): base_class(f) {}
+
+            void operator()(node_type& node)
+            {
+                base_class::get()( node.m_Value );
+            }
+        };
+
+        template <typename Func, typename Q>
+        class ensure_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+            Q const&    m_val;
+        public:
+            ensure_functor_wrapper( Func f, Q const& v ): base_class(f), m_val(v) {}
+
+            void operator()( bool bNew, node_type& item, node_type const& /*val*/ )
+            {
+                base_class::get()( bNew, item.m_Value, m_val );
+            }
+        };
+
+        template <typename Func>
+        class find_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_functor_wrapper( Func f ): base_class(f) {}
+
+            template <typename Q>
+            void operator()( node_type& item, Q& val )
+            {
+                base_class::get()( item.m_Value, val );
+            }
+        };
+
+        template <typename Func>
+        class erase_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            erase_functor_wrapper( Func f ): base_class( f ) {}
+
+            void operator()(node_type& node)
+            {
+                base_class::get()( node.m_Value );
+            }
+        };
+#   endif // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    protected:
+        /// Forward iterator
+        /**
+            \p IsConst - constness boolean flag
+
+            The forward iterator for a split-list has the following features:
+            - it has no post-increment operator
+            - it depends on underlying ordered list iterator
+            - The iterator object cannot be moved across thread boundary since it contains GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the split-list.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use it for debug purpose only.
+        */
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            //@cond
+            typedef typename base_class::template iterator_type<IsConst> iterator_base_class;
+            friend class SplitListSet;
+            //@endcond
+        public:
+            /// Value pointer type (const for const iterator)
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            /// Value reference type (const for const iterator)
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+        public:
+            /// Default ctor
+            iterator_type()
+            {}
+
+            /// Copy ctor
+            iterator_type( iterator_type const& src )
+                : iterator_base_class( src )
+            {}
+
+        protected:
+            //@cond
+            explicit iterator_type( iterator_base_class const& src )
+                : iterator_base_class( src )
+            {}
+            //@endcond
+
+        public:
+            /// Dereference operator
+            value_ptr operator ->() const
+            {
+                return &(iterator_base_class::operator->()->m_Value);
+            }
+
+            /// Dereference operator
+            value_ref operator *() const
+            {
+                return iterator_base_class::operator*().m_Value;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base_class::operator++();
+                return *this;
+            }
+
+            /// Assignment operator
+            iterator_type& operator = (iterator_type const& src)
+            {
+                iterator_base_class::operator=(src);
+                return *this;
+            }
+
+            /// Equality operator
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base_class::operator==(i);
+            }
+
+            /// Equality operator
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base_class::operator!=(i);
+            }
+        };
+
+    public:
+        /// Initializes split-ordered list of default capacity
+        /**
+            The default capacity is defined in bucket table constructor.
+            See intrusive::split_list::expandable_bucket_table, intrusive::split_list::static_bucket_table
+            which selects by intrusive::split_list::dynamic_bucket_table option.
+        */
+        SplitListSet()
+            : base_class()
+        {}
+
+        /// Initializes split-ordered list
+        SplitListSet(
+            size_t nItemCount           ///< estimate average of item count
+            , size_t nLoadFactor = 1    ///< load factor - average item count per bucket. Small integer up to 8, default is 1.
+            )
+            : base_class( nItemCount, nLoadFactor )
+        {}
+
+    public:
+        /// Forward iterator
+        typedef iterator_type<false>  iterator;
+
+        /// Const forward iterator
+        typedef iterator_type<true>    const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( base_class::begin() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a set
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( base_class::end() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        const_iterator begin() const
+        {
+            return const_iterator( base_class::begin() );
+        }
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a set
+        const_iterator end() const
+        {
+            return const_iterator( base_class::end() );
+        }
+
+    public:
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the set.
+
+            The type \p Q should contain as minimum the complete key for the node.
+            The object of \ref value_type should be constructible from a value of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            return insert_node( alloc_node( val ) );
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success. It may be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& val, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( val ));
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *pNode, [&f](node_type& node) { cds::unref(f)( node.m_Value ) ; } ))
+#       else
+            insert_functor_wrapper<Func> fw(f);
+            if ( base_class::insert( *pNode, cds::ref(fw) ) )
+#       endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \p %value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            return insert_node( alloc_node( std::forward<Args>(args)...));
+        }
+#   endif
+
+        /// Ensures that the \p item exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p val key not found in the set, then the new item created from \p val
+            is inserted into the set. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( Q const& val, Func func )
+        {
+            scoped_node_ptr pNode( alloc_node( val ));
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> bRet = base_class::ensure( *pNode,
+                [&func, &val]( bool bNew, node_type& item,  node_type const& /*val*/ ) {
+                    cds::unref(func)( bNew, item.m_Value, val );
+                } );
+#       else
+            ensure_functor_wrapper<Func, Q> fw( func, val );
+            std::pair<bool, bool> bRet = base_class::ensure( *pNode, cds::ref(fw) );
+#       endif
+
+            if ( bRet.first && bRet.second )
+                pNode.release();
+            return bRet;
+        }
+
+        /// Deletes \p key from the set
+        /** \anchor cds_nonintrusive_SplitListSet_erase_val
+
+            The item comparator should be able to compare the values of type \p value_type
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+            return base_class::erase( key );
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+            return base_class::erase_with( key, typename maker::template predicate_wrapper<Less>::type() );
+        }
+
+        /// Deletes \p key from the set
+        /** \anchor cds_nonintrusive_SplitListSet_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type const& val);
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Since the key of SplitListSet's \p value_type is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the values of the type \p value_type
+            and the type \p Q.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase( key, [&f](node_type& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor_wrapper<Func> fw( f );
+            return base_class::erase( key, cds::ref(fw) );
+#       endif
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_with( key, typename maker::template predicate_wrapper<Less>::type(),
+                [&f](node_type& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor_wrapper<Func> fw( f );
+            return base_class::erase_with( key, typename maker::template predicate_wrapper<Less>::type(), cds::ref(fw) );
+#       endif
+        }
+
+        /// Extracts the item with specified \p key
+        /** \anchor cds_nonintrusive_SplitListSet_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the set, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The extracted item is freed automatically when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::SplitListSet< your_template_args > splitlist_set;
+            splitlist_set theSet;
+            // ...
+            {
+                splitlist_set::guarded_ptr gp;
+                theSet.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& dest, Q const& key )
+        {
+            return extract_( dest.guard(), key );
+        }
+
+        /// Extracts the item using compare functor \p pred
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_hp_extract "extract(guarded_ptr&, Q const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& dest, Q const& key, Less pred )
+        {
+            return extract_with_( dest.guard(), key, pred );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_nonintrusive_SplitListSet_find_func
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_with_( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_nonintrusive_SplitListSet_find_cfunc
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_with_( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_nonintrusive_SplitListSet_find_val
+
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \ref value_type.
+        */
+        template <typename Q>
+        bool find( Q const& val )
+        {
+            return base_class::find( val );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p key and return the item found
+        /** \anchor cds_nonintrusive_SplitListSet_hp_get
+            The function searches the item with key equal to \p key
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p key is found, and \p false otherwise.
+            If \p key is not found the \p ptr parameter is not changed.
+
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::container::SplitListSet< your_template_params >  splitlist_set;
+            splitlist_set theSet;
+            // ...
+            {
+                splitlist_set::guarded_ptr gp;
+                if ( theSet.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for split-list set
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& ptr, Q const& key )
+        {
+            return get_( ptr.guard(), key );
+        }
+
+        /// Finds \p key and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_hp_get "get( guarded_ptr&, Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& ptr, Q const& key, Less pred )
+        {
+            return get_with_( ptr.guard(), key, pred );
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function unlink all items from the set.
+            The function is not atomic and not lock-free and should be used for debugging only.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then assume that the set is empty.
+            Thus, the correct item counting feature is an important part of split-list set implementation.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+    protected:
+        //@cond
+        using base_class::extract_;
+        using base_class::get_;
+
+        template <typename Q, typename Less>
+        bool extract_with_( typename gc::Guard& guard, Q const& key, Less pred )
+        {
+            return base_class::extract_with_( guard, key, typename maker::template predicate_wrapper<Less>::type() );
+        }
+
+        template <typename Q, typename Less>
+        bool get_with_( typename gc::Guard& guard, Q const& key, Less pred )
+        {
+            return base_class::get_with_( guard, key, typename maker::template predicate_wrapper<Less>::type() );
+        }
+
+        //@endcond
+
+    };
+
+
+}}  // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_SPLIT_LIST_SET_H
diff --git a/cds/container/split_list_set_nogc.h b/cds/container/split_list_set_nogc.h
new file mode 100644 (file)
index 0000000..2dfaa74
--- /dev/null
@@ -0,0 +1,360 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SPLIT_LIST_SET_NOGC_H
+#define __CDS_CONTAINER_SPLIT_LIST_SET_NOGC_H
+
+#include <cds/intrusive/split_list_nogc.h>
+#include <cds/container/split_list_base.h>
+#include <cds/gc/nogc.h>
+#include <cds/container/details/make_split_list_set.h>
+
+namespace cds { namespace container {
+
+    /// Split-ordered list set (template specialization for gc::nogc)
+    /** @ingroup cds_nonintrusive_set
+        \anchor cds_nonintrusive_SplitListSet_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+
+        See \ref cds_nonintrusive_SplitListSet_hp "SplitListSet" for description of template parameters.
+
+        The interface of the specialization is a slightly different.
+    */
+    template <
+        class T,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = split_list::type_traits
+#else
+        class Traits
+#endif
+    >
+    class SplitListSet< cds::gc::nogc, T, Traits>
+#ifdef CDS_DOXYGEN_INVOKED
+        :protected intrusive::SplitListSet<cds::gc::nogc, typename Traits::ordered_list, Traits>
+#else
+        :protected details::make_split_list_set< cds::gc::nogc, T, typename Traits::ordered_list, split_list::details::wrap_set_traits<T, Traits> >::type
+#endif
+    {
+    protected:
+        //@cond
+        typedef details::make_split_list_set< cds::gc::nogc, T, typename Traits::ordered_list, split_list::details::wrap_set_traits<T, Traits> > options;
+        typedef typename options::type  base_class;
+        //@endcond
+
+    public:
+        typedef typename options::gc                gc              ;   ///< Garbage collector
+        typedef typename options::value_type        value_type      ;   ///< type of value stored in the list
+        typedef typename options::ordered_list      ordered_list    ;   ///< Underlying ordered list class
+        typedef typename base_class::key_comparator key_comparator  ;   ///< key comparison functor
+
+        /// Hash functor for \ref value_type and all its derivatives that you use
+        typedef typename base_class::hash           hash;
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counter type
+
+    protected:
+        //@cond
+        typedef typename options::cxx_node_allocator    cxx_node_allocator;
+        typedef typename options::node_type             node_type;
+
+        template <typename Q>
+        static node_type * alloc_node(Q const& v )
+        {
+            return cxx_node_allocator().New( v );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_node_allocator().MoveNew( std::forward<Args>(args)...);
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_node_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        //@endcond
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_ensure_functor
+        {
+            void operator()( bool /*bNew*/, node_type& /*item*/, node_type& /*val*/ )
+            {}
+        };
+#   endif
+        //@endcond
+
+
+    public:
+        /// Initialize split-ordered list of default capacity
+        /**
+            The default capacity is defined in bucket table constructor.
+            See intrusive::split_list::expandable_bucket_table, intrusive::split_list::static_ducket_table
+            which selects by intrusive::split_list::dynamic_bucket_table option.
+        */
+        SplitListSet()
+            : base_class()
+        {}
+
+        /// Initialize split-ordered list
+        SplitListSet(
+            size_t nItemCount           ///< estimate average of item count
+            , size_t nLoadFactor = 1    ///< load factor - average item count per bucket. Small integer up to 10, default is 1.
+            )
+            : base_class( nItemCount, nLoadFactor )
+        {}
+
+    protected:
+        /// Forward iterator
+        /**
+            \p IsConst - constness boolean flag
+
+            The forward iterator has the following features:
+            - it has no post-increment operator
+            - it depends on underlying ordered list iterator
+        */
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            //@cond
+            typedef typename base_class::template iterator_type<IsConst> iterator_base_class;
+            friend class SplitListSet;
+            //@endcond
+        public:
+            /// Value pointer type (const for const iterator)
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            /// Value reference type (const for const iterator)
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+        public:
+            /// Default ctor
+            iterator_type()
+            {}
+
+            /// Copy ctor
+            iterator_type( iterator_type const& src )
+                : iterator_base_class( src )
+            {}
+
+        protected:
+            //@cond
+            explicit iterator_type( iterator_base_class const& src )
+                : iterator_base_class( src )
+            {}
+            //@endcond
+
+        public:
+            /// Dereference operator
+            value_ptr operator ->() const
+            {
+                return &(iterator_base_class::operator->()->m_Value);
+            }
+
+            /// Dereference operator
+            value_ref operator *() const
+            {
+                return iterator_base_class::operator*().m_Value;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base_class::operator++();
+                return *this;
+            }
+
+            /// Assignment operator
+            iterator_type& operator = (iterator_type const& src)
+            {
+                iterator_base_class::operator=(src);
+                return *this;
+            }
+
+            /// Equality operator
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base_class::operator==(i);
+            }
+
+            /// Equality operator
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base_class::operator!=(i);
+            }
+        };
+
+    public:
+        /// Forward iterator
+        typedef iterator_type<false>  iterator;
+
+        /// Const forward iterator
+        typedef iterator_type<true>    const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( base_class::begin() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a set
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( base_class::end() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        const_iterator begin() const
+        {
+            return const_iterator( base_class::begin() );
+        }
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a set
+        const_iterator end() const
+        {
+            return const_iterator( base_class::end() );
+        }
+
+    protected:
+        //@cond
+        iterator insert_node( node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p(pNode);
+
+            iterator it( base_class::insert_( *pNode ));
+            if ( it != end() ) {
+                p.release();
+                return it;
+            }
+
+            return end();
+        }
+        //@endcond
+
+    public:
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+            The \ref value_type should be constructible from a value of type \p Q.
+
+            Return an iterator pointing to inserted item if success \ref end() otherwise
+        */
+        template <typename Q>
+        iterator insert( const Q& val )
+        {
+            return insert_node( alloc_node( val ) );
+        }
+
+#ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Return an iterator pointing to inserted item if success \ref end() otherwise
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        iterator emplace( Args&&... args )
+        {
+            return insert_node( alloc_node( std::forward<Args>(args)... ) );
+        }
+#endif
+
+        /// Ensures that the item \p val exists in the set
+        /**
+            The operation inserts new item created from \p val if the key \p val is not found in the set.
+            Otherwise, the function returns an iterator that points to item found.
+            The \p value_type should be constructible from a value of type \p Q.
+
+            Returns <tt> std::pair<iterator, bool>  </tt> where \p first is an iterator pointing to
+            item found or inserted, \p second is true if new item has been added or \p false if the item
+            already is in the set.
+        */
+        template <typename Q>
+        std::pair<iterator, bool> ensure( const Q& val )
+        {
+            scoped_node_ptr pNode( alloc_node( val ));
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<typename base_class::iterator, bool> ret = base_class::ensure_( *pNode, [](bool /*bNew*/, node_type& /*item*/, node_type& /*val*/){} );
+#       else
+            std::pair<typename base_class::iterator, bool> ret = base_class::ensure_( *pNode, empty_ensure_functor() );
+#       endif
+            if ( ret.first != base_class::end() && ret.second ) {
+                pNode.release();
+                return std::make_pair( iterator(ret.first), ret.second );
+            }
+
+            return std::make_pair( iterator(ret.first), ret.second );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_SplitListSet_nogc_find
+
+            The function searches the item with key equal to \p key
+            and returns an iterator pointed to item found if the key is found,
+            and \ref end() otherwise
+        */
+        template <typename Q>
+        iterator find( Q const& key )
+        {
+            return iterator( base_class::find_( key ));
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_nogc_find "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        iterator find_with( Q const& key, Less pred )
+        {
+            return iterator( base_class::find_with_( key, typename options::template predicate_wrapper<Less>::type() ));
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+            Thus, the correct item counting feature is an important part of split-list set implementation.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return base_class::size();
+        }
+    };
+
+}}  // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_SPLIT_LIST_SET_NOGC_H
diff --git a/cds/container/split_list_set_rcu.h b/cds/container/split_list_set_rcu.h
new file mode 100644 (file)
index 0000000..1080adc
--- /dev/null
@@ -0,0 +1,966 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_SPLIT_LIST_SET_RCU_H
+#define __CDS_CONTAINER_SPLIT_LIST_SET_RCU_H
+
+#include <cds/intrusive/split_list_rcu.h>
+#include <cds/container/details/make_split_list_set.h>
+#include <cds/details/functor_wrapper.h>
+
+namespace cds { namespace container {
+
+    /// Split-ordered list set (template specialization for \ref cds_urcu_desc "RCU")
+    /** @ingroup cds_nonintrusive_set
+        \anchor cds_nonintrusive_SplitListSet_rcu
+
+        Hash table implementation based on split-ordered list algorithm discovered by Ori Shalev and Nir Shavit, see
+        - [2003] Ori Shalev, Nir Shavit "Split-Ordered Lists - Lock-free Resizable Hash Tables"
+        - [2008] Nir Shavit "The Art of Multiprocessor Programming"
+
+        See intrusive::SplitListSet for a brief description of the split-list algorithm.
+
+        Template parameters:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p T - type stored in the split-list. The type must be default- and copy-constructible.
+        - \p Traits - type traits, default is split_list::type_traits. Instead of declaring split_list::type_traits -based
+            struct you may apply option-based notation with split_list::make_traits metafunction.
+
+        <b>Iterators</b>
+
+        The class supports a forward iterator (\ref iterator and \ref const_iterator).
+        The iteration is ordered.
+
+        You may iterate over split-list set items only under RCU lock.
+        Only in this case the iterator is thread-safe since
+        while RCU is locked any set's item cannot be reclaimed.
+
+        The requirement of RCU lock during iterating means that deletion of the elements (i.e. \ref erase)
+        is not possible.
+
+        @warning The iterator object cannot be passed between threads
+
+        \warning Due to concurrent nature of skip-list set it is not guarantee that you can iterate
+        all elements in the set: any concurrent deletion can exclude the element
+        pointed by the iterator from the set, and your iteration can be terminated
+        before end of the set. Therefore, such iteration is more suitable for debugging purposes
+
+        The iterator class supports the following minimalistic interface:
+        \code
+        struct iterator {
+            // Default ctor
+            iterator();
+
+            // Copy ctor
+            iterator( iterator const& s);
+
+            value_type * operator ->() const;
+            value_type& operator *() const;
+
+            // Pre-increment
+            iterator& operator ++();
+
+            // Copy assignment
+            iterator& operator = (const iterator& src);
+
+            bool operator ==(iterator const& i ) const;
+            bool operator !=(iterator const& i ) const;
+        };
+        \endcode
+        Note, the iterator object returned by \ref end, \p cend member functions points to \p NULL and should not be dereferenced.
+
+        \par Usage
+
+        You should decide what garbage collector you want, and what ordered list you want to use. Split-ordered list
+        is an original data structure based on an ordered list. Suppose, you want construct split-list set based on cds::urcu::general_buffered<> GC
+        and LazyList as ordered list implementation. So, you beginning your program with following include:
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/container/lazy_list_rcu.h>
+        #include <cds/container/split_list_set_rcu.h>
+
+        namespace cc = cds::container;
+
+        // The data belonged to split-ordered list
+        sturuct foo {
+            int     nKey;   // key field
+            std::string strValue    ;   // value field
+        };
+        \endcode
+        The inclusion order is important:
+        - first, include one of \ref cds_urcu_gc "RCU implementation" (<tt>cds/urcu/general_buffered.h</tt> in our case)
+        - second, include file for ordered-list implementation (for this example, <tt>cds/container/lazy_list_rcu.h</tt>),
+        - then, the header for RCU-based split-list set <tt>cds/container/split_list_set_rcu.h</tt>.
+
+        Now, you should declare traits for split-list set. The main parts of traits are a hash functor for the set and a comparing functor for ordered list.
+        Note that we define several function in <tt>foo_hash</tt> and <tt>foo_less</tt> functors for different argument types since we want call our \p %SplitListSet
+        object by the key of type <tt>int</tt> and by the value of type <tt>foo</tt>.
+
+        The second attention: instead of using LazyList in SplitListSet traits we use a tag <tt>cds::contaner::lazy_list_tag</tt> for the lazy list.
+        The split-list requires significant support from underlying ordered list class and it is not good idea to dive you
+        into deep implementation details of split-list and ordered list interrelations. The tag paradigm simplifies split-list interface.
+
+        \code
+        // foo hash functor
+        struct foo_hash {
+            size_t operator()( int key ) const { return std::hash( key ) ; }
+            size_t operator()( foo const& item ) const { return std::hash( item.nKey ) ; }
+        };
+
+        // foo comparator
+        struct foo_less {
+            bool operator()(int i, foo const& f ) const { return i < f.nKey ; }
+            bool operator()(foo const& f, int i ) const { return f.nKey < i ; }
+            bool operator()(foo const& f1, foo const& f2) const { return f1.nKey < f2.nKey; }
+        };
+
+        // SplitListSet traits
+        struct foo_set_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag   ordered_list    ;   // what type of ordered list we want to use
+            typedef foo_hash            hash            ;   // hash functor for our data stored in split-list set
+
+            // Type traits for our LazyList class
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef foo_less less   ;   // use our foo_less as comparator to order list nodes
+            };
+        };
+        \endcode
+
+        Now you are ready to declare our set class based on \p %SplitListSet:
+        \code
+        typedef cc::SplitListSet< cds::urcu::gc<cds::urcu::general_buffered<> >, foo, foo_set_traits > foo_set;
+        \endcode
+
+        You may use the modern option-based declaration instead of classic type-traits-based one:
+        \code
+        typedef cc:SplitListSet<
+            cds::urcu::gc<cds::urcu::general_buffered<> >   // RCU type used
+            ,foo                                            // type of data stored
+            ,cc::split_list::make_traits<      // metafunction to build split-list traits
+                cc::split_list::ordered_list<cc::lazy_list_tag>     // tag for underlying ordered list implementation
+                ,cc::opt::hash< foo_hash >              // hash functor
+                ,cc::split_list::ordered_list_traits<   // ordered list traits desired
+                    cc::lazy_list::make_traits<         // metafunction to build lazy list traits
+                        cc::opt::less< foo_less >           // less-based compare functor
+                    >::type
+                >
+            >::type
+        >  foo_set;
+        \endcode
+        In case of option-based declaration using split_list::make_traits metafunction
+        the struct \p foo_set_traits is not required.
+
+        Now, the set of type \p foo_set is ready to use in your program.
+
+        Note that in this example we show only mandatory type_traits parts, optional ones is the default and they are inherited
+        from cds::container::split_list::type_traits.
+        The <b>cds</b> library contains many other options for deep tuning of behavior of the split-list and
+        ordered-list containers.
+    */
+    template <
+        class RCU,
+        class T,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = split_list::type_traits
+#else
+        class Traits
+#endif
+    >
+    class SplitListSet< cds::urcu::gc< RCU >, T, Traits >:
+#ifdef CDS_DOXYGEN_INVOKED
+        protected intrusive::SplitListSet< cds::urcu::gc< RCU >, typename Traits::ordered_list, Traits >
+#else
+        protected details::make_split_list_set< cds::urcu::gc< RCU >, T, typename Traits::ordered_list, split_list::details::wrap_set_traits<T, Traits> >::type
+#endif
+    {
+    protected:
+        //@cond
+        typedef details::make_split_list_set< cds::urcu::gc< RCU >, T, typename Traits::ordered_list, split_list::details::wrap_set_traits<T, Traits> > maker;
+        typedef typename maker::type  base_class;
+        //@endcond
+
+    public:
+        typedef Traits                            options         ; ///< \p Traits template argument
+        typedef typename maker::gc                gc              ; ///< Garbage collector
+        typedef typename maker::value_type        value_type      ; ///< type of value stored in the list
+        typedef typename maker::ordered_list      ordered_list    ; ///< Underlying ordered list class
+        typedef typename base_class::key_comparator key_comparator; ///< key compare functor
+
+        /// Hash functor for \ref value_type and all its derivatives that you use
+        typedef typename base_class::hash           hash;
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counter type
+
+        typedef typename base_class::rcu_lock      rcu_lock   ; ///< RCU scoped lock
+        /// Group of \p extract_xxx functions require external locking if underlying ordered list requires that
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = base_class::c_bExtractLockExternal;
+
+    protected:
+        //@cond
+        typedef typename maker::cxx_node_allocator    cxx_node_allocator;
+        typedef typename maker::node_type             node_type;
+        //@endcond
+
+    public:
+        /// pointer to extracted node
+        typedef cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::ordered_list_traits::disposer > exempt_ptr;
+
+    protected:
+        //@cond
+
+        template <typename Q>
+        static node_type * alloc_node(Q const& v )
+        {
+            return cxx_node_allocator().New( v );
+        }
+
+        template <typename Q, typename Func>
+        bool find_( Q& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( val, [&f]( node_type& item, Q& val ) { cds::unref(f)(item.m_Value, val) ; } );
+#       else
+            find_functor_wrapper<Func> fw(f);
+            return base_class::find( val, cds::ref(fw) );
+#       endif
+        }
+
+        template <typename Q, typename Less, typename Func>
+        bool find_with_( Q& val, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Less>::type(),
+                [&f]( node_type& item, Q& val ) { cds::unref(f)(item.m_Value, val) ; } );
+#       else
+            find_functor_wrapper<Func> fw(f);
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Less>::type(), cds::ref(fw) );
+#       endif
+        }
+
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node( Args&&... args )
+        {
+            return cxx_node_allocator().MoveNew( std::forward<Args>(args)...);
+        }
+#   endif
+
+        static void free_node( node_type * pNode )
+        {
+            cxx_node_allocator().Delete( pNode );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+
+        bool insert_node( node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            scoped_node_ptr p(pNode);
+
+            if ( base_class::insert( *pNode ) ) {
+                p.release();
+                return true;
+            }
+
+            return false;
+        }
+
+        //@endcond
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        template <typename Func>
+        class insert_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            insert_functor_wrapper( Func f ): base_class(f) {}
+
+            void operator()(node_type& node)
+            {
+                base_class::get()( node.m_Value );
+            }
+        };
+
+        template <typename Func, typename Q>
+        class ensure_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+            Q const&    m_val;
+        public:
+            ensure_functor_wrapper( Func f, Q const& v ): base_class(f), m_val(v) {}
+
+            void operator()( bool bNew, node_type& item, node_type const& /*val*/ )
+            {
+                base_class::get()( bNew, item.m_Value, m_val );
+            }
+        };
+
+        template <typename Func>
+        class find_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_functor_wrapper( Func f ): base_class(f) {}
+
+            template <typename Q>
+            void operator()( node_type& item, Q& val )
+            {
+                base_class::get()( item.m_Value, val );
+            }
+        };
+
+        struct empty_find_functor
+        {
+            template <typename Q>
+            void operator()( node_type&, Q& )
+            {}
+        };
+
+        template <typename Func>
+        class erase_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            erase_functor_wrapper( Func f ): base_class( f ) {}
+
+            void operator()(node_type& node)
+            {
+                base_class::get()( node.m_Value );
+            }
+        };
+#   endif // ifndef CDS_CXX11_LAMBDA_SUPPORT
+        //@endcond
+
+    protected:
+        /// Forward iterator
+        /**
+            \p IsConst - constness boolean flag
+
+            The forward iterator for a split-list has the following features:
+            - it has no post-increment operator
+            - it depends on underlying ordered list iterator
+            - it is safe to iterate only inside RCU critical section
+            - deleting an item pointed by the iterator can cause to deadlock
+
+            Therefore, the use of iterators in concurrent environment is not good idea.
+            Use it for debug purpose only.
+        */
+        template <bool IsConst>
+        class iterator_type: protected base_class::template iterator_type<IsConst>
+        {
+            //@cond
+            typedef typename base_class::template iterator_type<IsConst> iterator_base_class;
+            friend class SplitListSet;
+            //@endcond
+        public:
+            /// Value pointer type (const for const iterator)
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            /// Value reference type (const for const iterator)
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+        public:
+            /// Default ctor
+            iterator_type()
+            {}
+
+            /// Copy ctor
+            iterator_type( iterator_type const& src )
+                : iterator_base_class( src )
+            {}
+
+        protected:
+            //@cond
+            explicit iterator_type( iterator_base_class const& src )
+                : iterator_base_class( src )
+            {}
+            //@endcond
+
+        public:
+            /// Dereference operator
+            value_ptr operator ->() const
+            {
+                return &(iterator_base_class::operator->()->m_Value);
+            }
+
+            /// Dereference operator
+            value_ref operator *() const
+            {
+                return iterator_base_class::operator*().m_Value;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                iterator_base_class::operator++();
+                return *this;
+            }
+
+            /// Assignment operator
+            iterator_type& operator = (iterator_type const& src)
+            {
+                iterator_base_class::operator=(src);
+                return *this;
+            }
+
+            /// Equality operator
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return iterator_base_class::operator==(i);
+            }
+
+            /// Equality operator
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return iterator_base_class::operator!=(i);
+            }
+        };
+
+    public:
+        /// Initializes split-ordered list of default capacity
+        /**
+            The default capacity is defined in bucket table constructor.
+            See intrusive::split_list::expandable_bucket_table, intrusive::split_list::static_bucket_table
+            which selects by intrusive::split_list::dynamic_bucket_table option.
+        */
+        SplitListSet()
+            : base_class()
+        {}
+
+        /// Initializes split-ordered list
+        SplitListSet(
+            size_t nItemCount           ///< estimate average of item count
+            , size_t nLoadFactor = 1    ///< load factor - average item count per bucket. Small integer up to 8, default is 1.
+            )
+            : base_class( nItemCount, nLoadFactor )
+        {}
+
+    public:
+        typedef iterator_type<false>  iterator        ; ///< Forward iterator
+        typedef iterator_type<true>   const_iterator  ; ///< Forward const iterator
+
+        /// Returns a forward iterator addressing the first element in a set
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( base_class::begin() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a set
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( base_class::end() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        const_iterator begin() const
+        {
+            return const_iterator( base_class::begin() );
+        }
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a set
+        const_iterator end() const
+        {
+            return const_iterator( base_class::end() );
+        }
+
+    public:
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the set.
+
+            The type \p Q should contain as minimum the complete key for the node.
+            The object of \p value_type should be constructible from a value of type \p Q.
+            In trivial case, \p Q is equal to \p value_type.
+
+            The function applies RCU lock internally.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+            return insert_node( alloc_node( val ) );
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success. It may be passed by reference
+            using <tt>boost::ref</tt>
+
+            The function applies RCU lock internally.
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& val, Func f )
+        {
+            scoped_node_ptr pNode( alloc_node( val ));
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            if ( base_class::insert( *pNode, [&f](node_type& node) { cds::unref(f)( node.m_Value ) ; } ))
+#       else
+            insert_functor_wrapper<Func> fw(f);
+            if ( base_class::insert( *pNode, cds::ref(fw) ) )
+#       endif
+            {
+                pNode.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \p value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            The function applies RCU lock internally.
+
+            @note This function is available only for compiler that supports
+            variadic template and move semantics.
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            return insert_node( alloc_node( std::forward<Args>(args)...));
+        }
+#   endif
+
+        /// Ensures that the \p item exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p val key not found in the set, then the new item created from \p val
+            is inserted into the set. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            The function applies RCU lock internally.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( Q const& val, Func func )
+        {
+            scoped_node_ptr pNode( alloc_node( val ));
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            std::pair<bool, bool> bRet = base_class::ensure( *pNode,
+                [&func, &val]( bool bNew, node_type& item,  node_type const& /*val*/ ) {
+                    cds::unref(func)( bNew, item.m_Value, val );
+                } );
+#       else
+            ensure_functor_wrapper<Func, Q> fw( func, val );
+            std::pair<bool, bool> bRet = base_class::ensure( *pNode, cds::ref(fw) );
+#       endif
+
+            if ( bRet.first && bRet.second )
+                pNode.release();
+            return bRet;
+        }
+
+        /// Deletes \p key from the set
+        /** \anchor cds_nonintrusive_SplitListSet_rcu_erase_val
+
+            Since the key of SplitListSet's item type \p value_type is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The set item comparator should be able to compare the values of type \p value_type
+            and the type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+            return base_class::erase( key );
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_rcu_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& key, Less pred )
+        {
+             return base_class::erase_with( key, typename maker::template predicate_wrapper<Less>::type() );
+        }
+
+        /// Deletes \p key from the set
+        /** \anchor cds_nonintrusive_SplitListSet_rcu_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type const& val);
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Since the key of SplitListSet's \p value_type is not explicitly specified,
+            template parameter \p Q defines the key type searching in the list.
+            The list item comparator should be able to compare the values of the type \p value_type
+            and the type \p Q.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase( key, [&f](node_type& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor_wrapper<Func> fw( f );
+            return base_class::erase( key, cds::ref(fw) );
+#       endif
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_rcu_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::erase_with( key, typename maker::template predicate_wrapper<Less>::type(),
+                [&f](node_type& node) { cds::unref(f)( node.m_Value ); } );
+#       else
+            erase_functor_wrapper<Func> fw( f );
+            return base_class::erase_with( key, typename maker::template predicate_wrapper<Less>::type(), cds::ref(fw) );
+#       endif
+        }
+
+        /// Extracts an item from the set
+        /** \anchor cds_nonintrusive_SplitListSet_rcu_extract
+            The function searches an item with key equal to \p val in the set,
+            unlinks it from the set, places item pointer into \p dest argument, and returns \p true.
+            If the item with the key equal to \p val is not found the function return \p false.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the set
+            and returns a pointer to item found.
+            You should lock RCU before calling of the function, and you should synchronize RCU
+            outside the RCU lock to free extracted item
+
+            \code
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::container::SplitListSet< rcu, Foo > splitlist_set;
+
+            splitlist_set theSet;
+            // ...
+
+            splitlist_set::exempt_ptr p;
+            {
+                // first, we should lock RCU
+                splitlist_set::rcu_lock lock;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theSet.extract( p, 10 )) {
+                    // do something with p
+                    ...
+                }
+            }
+
+            // We may safely release p here
+            // release() passes the pointer to RCU reclamation cycle
+            p.release();
+            \endcode
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& dest, Q const& val )
+        {
+            node_type * pNode = base_class::extract_( val, key_comparator() );
+            if ( pNode ) {
+                dest = pNode;
+                return true;
+            }
+            return false;
+        }
+
+        /// Extracts an item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_rcu_extract "extract(exempt_ptr&, Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& dest, Q const& val, Less pred )
+        {
+            node_type * pNode = base_class::extract_with_( val, typename maker::template predicate_wrapper<Less>::type());
+            if ( pNode ) {
+                dest = pNode;
+                return true;
+            }
+            return false;
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_nonintrusive_SplitListSet_rcu_find_func
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function makes RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_rcu_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_with_( val, pred, f );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_SplitListSet_rcu_find_cfunc
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set's \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function makes RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_rcu_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_with_( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_nonintrusive_SplitListSet_rcu_find_val
+
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function makes RCU lock internally.
+        */
+        template <typename Q>
+        bool find( Q const& val )
+        {
+            return base_class::find( val );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_rcu_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p Less must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+            return base_class::find_with( val, typename maker::template predicate_wrapper<Less>::type() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_nonintrusive_SplitListSet_rcu_get
+            The function searches the item with key equal to \p val and returns the pointer to item found.
+            If \p val is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::container::SplitListSet< rcu, Foo > splitlist_set;
+            splitlist_set theSet;
+            // ...
+            {
+                // Lock RCU
+                splitlist_set::rcu_lock lock;
+
+                foo * pVal = theSet.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be retired by disposer at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename Q>
+        value_type * get( Q const& val )
+        {
+            node_type * pNode = base_class::get( val );
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_nonintrusive_SplitListSet_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& val, Less pred )
+        {
+            node_type * pNode = base_class::get_with( val, typename maker::template predicate_wrapper<Less>::type());
+            return pNode ? &pNode->m_Value : null_ptr<value_type *>();
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function unlink all items from the set.
+            The function is not atomic and not lock-free and should be used for debugging only.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then assume that the set is empty.
+            Thus, the correct item counting feature is an important part of split-list set implementation.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return base_class::size();
+        }
+    };
+
+
+}}  // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_SPLIT_LIST_SET_RCU_H
diff --git a/cds/container/striped_map.h b/cds/container/striped_map.h
new file mode 100644 (file)
index 0000000..d02e481
--- /dev/null
@@ -0,0 +1,1000 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_H
+#define __CDS_CONTAINER_STRIPED_MAP_H
+
+#include <cds/container/striped_set.h>
+#include <cds/container/striped_set/adapter.h>
+#include <cds/details/std/type_traits.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+#ifndef CDS_CXX11_LAMBDA_SUPPORT
+#   include <cds/details/functor_wrapper.h>
+#endif
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+        template <class Container, CDS_DECL_OPTIONS9>
+        class make_striped_map
+        {
+            typedef StripedSet< Container, CDS_OPTIONS9>    billet;
+            typedef typename billet::options                billet_options;
+            typedef typename billet_options::hash           billet_hash;
+
+            typedef typename Container::value_type          pair_type;
+            typedef typename pair_type::first_type          key_type;
+
+            struct options: public billet_options {
+                struct hash: public billet_hash {
+                    size_t operator()( pair_type const& v ) const
+                    {
+                        return billet_hash::operator()( v.first );
+                    }
+
+                    template <typename Q>
+                    size_t operator()( Q const& v ) const
+                    {
+                        return billet_hash::operator()( v );
+                    }
+                };
+            };
+
+        public:
+            typedef StripedSet< Container, cds::opt::type_traits< options > >   type ;  ///< metafunction result
+        };
+    }
+    //@endcond
+
+    /// Striped hash map
+    /** @ingroup cds_nonintrusive_map
+
+        Source
+            - [2008] Maurice Herlihy, Nir Shavit "The Art of Multiprocessor Programming"
+
+        Lock striping is very simple technique.
+        The map consists of the bucket table and the array of locks.
+        Initially, the capacity of lock array and bucket table is the same.
+        When the map is resized, bucket table capacity will be doubled but lock array will not.
+        The lock \p i protects each bucket \p j, where <tt> j = i mod L </tt>,
+        where \p L - the size of lock array.
+
+        Template arguments:
+            - \p Container - the container class that is used as bucket entry. The \p Container class should support
+                an uniform interface described below.
+            - \p Options - options
+
+        The \p %StripedMap class does not exactly specify the type of container that should be used as a \p Container bucket.
+        Instead, the class supports different container type for the bucket, for exampe, \p std::list, \p std::map and others.
+
+        Remember that \p %StripedMap class algorithm ensures sequential blocking access to its bucket through the mutex type you specify
+        among \p Options template arguments.
+
+        The \p Options are:
+            - opt::mutex_policy - concurrent access policy.
+                Available policies: intrusive::striped_set::striping, intrusive::striped_set::refinable.
+                Default is %striped_set::striping.
+            - opt::hash - hash functor. Default option value see opt::v::hash_selector<opt::none> which selects default hash functor for
+                your compiler.
+            - opt::compare - key comparison functor. No default functor is provided.
+                If the option is not specified, the opt::less is used.
+            - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+            - opt::item_counter - item counter type. Default is \p atomicity::item_counter since some operation on the counter is performed
+                without locks. Note that item counting is an essential part of the map algorithm, so dummy type like atomicity::empty_item_counter
+                is not suitable.
+            - opt::allocator - the allocator type using for memory allocation of bucket table and lock array. Default is CDS_DEFAULT_ALLOCATOR.
+            - opt::resizing_policy - the resizing policy that is a functor that decides when to resize the hash map.
+                Default option value depends on bucket container type:
+                    for sequential containers like \p std::list, \p std::vector the resizing policy is hash_set::load_factor_resizing<4>;
+                    for other type of containers like \p std::map, \p std::unordered_map the resizing policy is hash_set::no_resizing.
+                See \ref intrusive::striped_set namespace for list of all possible types of the option.
+                Note that the choose of resizing policy depends of \p Container type:
+                for sequential containers like \p std::list, \p std::vector and so on, right choosing of the policy can
+                significantly improve performance.
+                For other, non-sequential types of \p Container (like a \p std::map)
+                the resizing policy is not so important.
+            - opt::copy_policy - the copy policy which is used to copy items from the old map to the new one when resizing.
+                The policy can be optionally used in adapted bucket container for performance reasons of resizing.
+                The detail of copy algorithm depends on type of bucket container and explains below.
+
+            \p opt::compare or \p opt::less options are used only in some \p Container class for searching an item.
+            \p %opt::compare option has the highest priority: if \p %opt::compare is specified, \p %opt::less is not used.
+
+        You can pass other option that would be passed to <tt>adapt</tt> metafunction, see below.
+
+        <b>Internal details</b>
+
+            The \p %StripedMap class cannot utilize the \p Container container specified directly, but only its adapted variant which
+            supports an unified interface. Internally, the adaptation is made via hash_set::adapt metafunction that wraps bucket container
+            and provides the unified bucket interface suitable for \p %StripedMap. Such adaptation is completely transparent for you -
+            you don't need to call \p adapt metafunction directly, \p %StripedMap class's internal machinery itself invokes appropriate
+            \p adapt metafunction to adjust your \p Container container class to \p %StripedMap bucket's internal interface.
+            All you need is to include a right header before <tt>striped_hash_map.h</tt>.
+
+            By default, <tt>intrusive::striped_set::adapt<AnyContainer, Options...> </tt> metafunction does not make any wrapping to \p AnyContainer,
+            so, the result <tt>%intrusive::striped_set::adapt<AnyContainer, Options...>::type </tt> is the same as \p AnyContainer.
+            However, there are a lot of specializations of \p adapt for well-known containers, see table below.
+            Any of this specialization wraps corresponding container making it suitable for the map's bucket.
+            Remember, you should include the proper header file for \p adapt <b>before</b> <tt>striped_map.h</tt>.
+            <table>
+                <tr>
+                    <th>Container</th>
+                    <th>.h-file for \p adapt</th>
+                    <th>Example</th>
+                    <th>Notes</th>
+                </tr>
+                <tr>
+                    <td> \p std::list</td>
+                    <td><tt><cds/container/striped_map/std_list.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_map/std_list.h>
+                        #include <cds/container/striped_hash_map.h>
+                        typedef cds::container::StripedMap<
+                            std::list< std::pair< const Key, V > >,
+                            cds::opt::less< std::less<Key> >
+                        > striped_map;
+                    \endcode
+                    </td>
+                    <td>
+                        The type of values stored in the \p std::list must be <tt> std::pair< const Key, V > </tt>, where \p Key - key type,  and \p V - value type
+                        The list is ordered by key \p Key.
+                        Template argument pack \p Options <b>must</b> contain cds::opt::less or cds::opt::compare for type \p Key stored in the list.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p std::map</td>
+                    <td><tt><cds/container/striped_map/std_map.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_map/std_map.h>
+                        #include <cds/container/striped_hash_map.h>
+                        typedef cds::container::StripedMap<
+                            std::map< Key, T, std::less<Key> >
+                        > striped_map;
+                    \endcode
+                    </td>
+                    <td>
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p std::unordered_map</td>
+                    <td><tt><cds/container/striped_map/std_hash_map.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_map/std_hash_map.h>
+                        #include <cds/container/striped_hash_map.h>
+                        typedef cds::container::StripedMap<
+                            std::unordered_map<
+                                Key, T,
+                                std::hash<Key>,
+                                std::equal_to<Key>
+                            >
+                        > striped_map;
+                    \endcode
+                    </td>
+                    <td>
+                        You should provide two different hash function \p h1 and \p h2 - one for std::unordered_map and other for \p %StripedMap.
+                        For the best result, \p h1 and \p h2 must be orthogonal i.e. <tt> h1(X) != h2(X) </tt> for any value \p X of type \p Key.
+                    </td>
+                </tr>
+                <tr>
+                    <td>\p stdext::hash_map (only for MS VC++ 2008)</td>
+                    <td><tt><cds/container/striped_map/std_hash_map.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_map/std_hash_map.h>
+                        #include <cds/container/striped_hash_map.h>
+                        typedef cds::container::StripedMap<
+                            stdext::hash_map< Key, T,
+                                stdext::hash_compare<
+                                    Key,
+                                    std::less<Key>
+                                >
+                            >
+                        > striped_map;
+                    \endcode
+                    </td>
+                    <td>
+                        You should provide two different hash function \p h1 and \p h2 - one for stdext::hash_map and other for \p %StripedMap.
+                        For the best result, \p h1 and \p h2 must be orthogonal i.e. <tt> h1(X) != h2(X) </tt> for any value \p X of type \p Key.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::slist</td>
+                    <td><tt><cds/container/striped_map/boost_slist.h></tt></td>
+                    <td>\code
+                        #include <cds/container/hash_smap/boost_slist.h>
+                        #include <cds/container/striped_hash_map.h>
+                        typedef cds::container::StripedMap<
+                            boost::container::slist< std::pair< const Key, T > >
+                        > striped_map;
+                    \endcode
+                    </td>
+                    <td>
+                        The type of values stored in the \p boost::container::slist must be <tt> std::pair< const Key, T > </tt>,
+                        where \p Key - key type,  and \p T - value type. The list is ordered.
+                        \p Options <b>must</b> contain cds::opt::less or cds::opt::compare.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::list</td>
+                    <td><tt><cds/container/striped_map/boost_list.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_map/boost_list.h>
+                        #include <cds/container/striped_hash_map.h>
+                        typedef cds::container::StripedMap<
+                            boost::container::list< std::pair< const Key, T > >
+                        > striped_map;
+                    \endcode
+                    </td>
+                    <td>
+                        The type of values stored in the \p boost::container::list must be <tt> std::pair< const Key, T > </tt>,
+                        where \p Key - key type,  and \p T - value type. The list is ordered.
+                        \p Options <b>must</b> contain cds::opt::less or cds::opt::compare.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::map</td>
+                    <td><tt><cds/container/striped_map/boost_map.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_map/boost_map.h>
+                        #include <cds/container/striped_hash_map.h>
+                        typedef cds::container::StripedMap<
+                            boost::container::map< Key, T, std::pair< const Key, T> >
+                        > striped_map;
+                    \endcode
+                    </td>
+                    <td>
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::flat_map</td>
+                    <td><tt><cds/container/striped_map/boost_flat_map.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_map/boost_flat_map.h>
+                        #include <cds/container/striped_hash_map.h>
+                        typedef cds::container::StripedMap<
+                            boost::container::flat_map< Key, T,
+                                std::less< std::pair< const Key, T> >
+                            >
+                        > striped_map;
+                    \endcode
+                    </td>
+                    <td>
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::unordered_map</td>
+                    <td><tt><cds/container/striped_map/boost_unordered_map.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_map/boost_unordered_map.h>
+                        #include <cds/container/refinable_hash_map.h>
+                        typedef cds::container::StripedMap<
+                            boost::unordered_map< Key, T, boost::hash<Key>, std::equal_to<Key> >
+                        > refinable_map;
+                    \endcode
+                    </td>
+                    <td>
+                    </td>
+                </tr>
+            </table>
+
+
+            You can use another container type as map's bucket.
+            Suppose, you have a container class \p MyBestContainer and you want to integrate it with \p %StripedMap as bucket type.
+            There are two possibility:
+            - either your \p MyBestContainer class has native support of bucket's interface;
+                in this case, you can use default <tt>hash_set::adapt</tt> metafunction;
+            - or your \p MyBestContainer class does not support bucket's interface, which means, that you should develop a specialization
+                <tt>cds::container::hash_set::adapt<MyBestContainer> </tt> metafunction providing necessary interface.
+
+            The <tt>hash_set::adapt< Container, Options... ></tt> metafunction has two template argument:
+            - \p Container is the class that should be used as the bucket, for example, <tt>std::list< std::pair< Key, T > ></tt>.
+            - \p Options pack is the options from \p %StripedMap declaration. The \p adapt metafunction can use
+                any option from \p Options for its internal use. For example, a \p compare option can be passed to \p adapt
+                metafunction via \p Options argument of \p %StripedMap declaration.
+
+            See hash_set::adapt metafunction for the description of interface that the bucket container must provide
+            to be \p %StripedMap compatible.
+
+        <b>Copy policy</b>
+            There are three predefined copy policy:
+            - \p cds::container::hash_set::copy_item - copy item from old bucket to new one when resizing using copy ctor. It is default policy for
+                any compiler that do not support move semantics
+            - \p cds::container::hash_set::move_item - move item from old bucket to new one when resizing using move semantics. It is default policy for
+                any compiler that support move semantics. If compiler does not support move semantics, the move policy is the same as \p copy_item
+            - \p cds::container::hash_set::swap_item - copy item from old bucket to new one when resizing using \p std::swap. Not all containers support
+                this copy policy, see details in table below.
+
+            You can define your own copy policy specifically for your case.
+            Note, right copy policy can significantly improve the performance of resizing.
+
+            <table>
+                <tr>
+                    <th>Container</th>
+                    <th>Policies</th>
+                </tr>
+                <tr>
+                    <td>
+                        - \p std::list
+                        - \p boost::list
+                    </td>
+                    <td>\code
+                        struct copy_item {
+                            void operator()(
+                                std::list< std::pair<const Key, T> >& list,
+                                std::list<std::pair<const Key, T> >::iterator itInsert,
+                                std::list<std::pair<const Key, T> >::iterator itWhat )
+                            {
+                                list.insert( itInsert, *itWhat );
+                            }
+                        } \endcode
+
+                        \code
+                        // The type T stored in the list must be swappable
+                        struct swap_item {
+                            void operator()(
+                                std::list< std::pair<const Key, T> >& list,
+                                std::list<std::pair<const Key, T> >::iterator itInsert,
+                                std::list<std::pair<const Key, T> >::iterator itWhat )
+                            {
+                                std::pair<Key, T> newVal( itWhat->first, T() );
+                                std::swap( list.insert( itInsert, newVal )->second, itWhat->second );
+                            }
+                        } \endcode
+
+                        \code
+                        struct move_item {
+                            void operator()(
+                                std::list< std::pair<const Key, T> >& list,
+                                std::list<std::pair<const Key, T> >::iterator itInsert,
+                                std::list<std::pair<const Key, T> >::iterator itWhat )
+                            {
+                                list.insert( itInsert, std::move( *itWhat ) );
+                            }
+                        } \endcode
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        - \p std::map
+                        - \p std::unordered_map
+                        - \p stdext::hash_map (only for MS VC++ 2008)
+                        - \p boost::container::map
+                        - \p boost::container::flat_map
+                        - \p boost::unordered_map
+                    </td>
+                    <td>\code
+                        struct copy_item {
+                            void operator()( std::map< Key, T>& map, std::map<Key, T>::iterator itWhat )
+                            {
+                                map.insert( *itWhat );
+                            }
+                        } \endcode
+
+                    \code
+                        struct swap_item {
+                            void operator()( std::map< Key, T>& map, std::map<Key, T>::iterator itWhat )
+                            {
+                                std::swap(
+                                    map.insert(
+                                        std::map::value_type( itWhat->first, T() ) ).first->second
+                                        , itWhat->second
+                                ));
+                            }
+                        } \endcode
+                        \p T type must be swappable.
+
+                    \code
+                        struct move_item {
+                            void operator()( std::map< Key, T>& map, std::map<Key, T>::iterator itWhat )
+                            {
+                                map.insert( std::move( *itWhat ));
+                            }
+                        } \endcode
+                </tr>
+                <tr>
+                    <td> \p boost::container::slist</td>
+                    <td>\code
+                        struct copy_item {
+                            void operator()(
+                                bc::slist< std::pair<const Key, T> >& list,
+                                bc::slist<std::pair<const Key, T> >::iterator itInsert,
+                                bc::slist<std::pair<const Key, T> >::iterator itWhat )
+                            {
+                                list.insert_after( itInsert, *itWhat );
+                            }
+                        } \endcode
+
+                        \code
+                        // The type T stored in the list must be swappable
+                        struct swap_item {
+                            void operator()(
+                                bc::slist< std::pair<const Key, T> >& list,
+                                bc::slist<std::pair<const Key, T> >::iterator itInsert,
+                                bc::slist<std::pair<const Key, T> >::iterator itWhat )
+                            {
+                                std::pair<Key, T> newVal( itWhat->first, T() );
+                                std::swap( list.insert( itInsert, newVal )->second, itWhat->second );
+                            }
+                        } \endcode
+
+                        \code
+                        struct move_item {
+                            void operator()(
+                                bc::slist< std::pair<const Key, T> >& list,
+                                bc::slist<std::pair<const Key, T> >::iterator itInsert,
+                                bc::slist<std::pair<const Key, T> >::iterator itWhat )
+                            {
+                                list.insert_after( itInsert, std::move( *itWhat ) );
+                            }
+                        } \endcode
+                    </td>
+                </tr>
+            </table>
+
+        <b>Advanced functions</b>
+
+        <b>libcds</b> provides some advanced functions like \p erase_with, \p find_with,
+        that cannot be supported by all underlying containers.
+        The table below shows whether underlying container supports those functions
+        (the sign "+" means "container supports the function"):
+
+        <table>
+            <tr>
+                <th>Container</th>
+                <th>\p find_with</th>
+                <th>\p erse_with</th>
+            </tr>
+            <tr>
+                <td> \p std::list</td>
+                <td>+</td>
+                <td>+</td>
+            </tr>
+            <tr>
+                <td> \p std::map</td>
+                <td>-</td>
+                <td>-</td>
+            </tr>
+            <tr>
+                <td> \p std::unordered_map</td>
+                <td>-</td>
+                <td>-</td>
+            </tr>
+            <tr>
+                <td>\p stdext::hash_map (only for MS VC++ 2008)</td>
+                <td>-</td>
+                <td>-</td>
+            </tr>
+            <tr>
+                <td> \p boost::container::slist</td>
+                <td>+</td>
+                <td>+</td>
+            </tr>
+            <tr>
+                <td> \p boost::container::list</td>
+                <td>+</td>
+                <td>+</td>
+            </tr>
+            <tr>
+                <td> \p boost::container::map</td>
+                <td>-</td>
+                <td>-</td>
+            </tr>
+            <tr>
+                <td> \p boost::container::flat_map</td>
+                <td>-</td>
+                <td>-</td>
+            </tr>
+            <tr>
+                <td> \p boost::unordered_map</td>
+                <td>-</td>
+                <td>-</td>
+            </tr>
+        </table>
+
+    **/
+    template <class Container, CDS_DECL_OPTIONS9>
+    class StripedMap
+#ifdef CDS_DOXYGEN_INVOKED
+        : protected StripedSet<Container, CDS_OPTIONS9>
+#else
+        : protected details::make_striped_map< Container, CDS_OPTIONS9>::type
+#endif
+    {
+        //@cond
+        typedef typename details::make_striped_map< Container, CDS_OPTIONS9>::type base_class;
+        //@endcond
+
+    public:
+        //@cond
+        typedef typename base_class::default_options    default_options;
+        typedef typename base_class::options            options;
+        //@endcond
+
+        typedef Container                           underlying_container_type   ;   ///< original intrusive container type for the bucket
+        typedef typename base_class::bucket_type    bucket_type ;   ///< container type adapted for hash set
+        typedef typename bucket_type::value_type    value_type  ;   ///< pair type (<tt> std::pair<key_type const, mapped_type> </tt>)
+        typedef typename value_type::first_type     key_type    ;   ///< key type
+        typedef typename value_type::second_type    mapped_type ;   ///< mapped type
+
+        typedef typename base_class::hash               hash            ; ///< Hash functor
+        typedef typename base_class::item_counter       item_counter    ; ///< Item counter
+        typedef typename base_class::resizing_policy    resizing_policy ; ///< Resizing policy
+        typedef typename base_class::allocator_type     allocator_type  ; ///< allocator type specified in options.
+        typedef typename base_class::mutex_policy       mutex_policy    ; ///< Mutex policy
+
+    protected:
+        //@cond
+        typedef typename base_class::scoped_cell_lock   scoped_cell_lock;
+        typedef typename base_class::scoped_full_lock   scoped_full_lock;
+        typedef typename base_class::scoped_resize_lock scoped_resize_lock;
+        //@endcond
+
+    private:
+        //@cond
+        struct key_accessor {
+            key_type const& operator()( value_type const& p ) const
+            {
+                return p.first;
+            }
+        };
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+
+        template <typename Func>
+        class find_functor_wrapper: protected cds::details::functor_wrapper<Func>
+        {
+            typedef cds::details::functor_wrapper<Func> base_class;
+        public:
+            find_functor_wrapper() {}
+            find_functor_wrapper( Func f ): base_class(f) {}
+
+            template <typename Q>
+            void operator()( value_type& pair, Q const& /*val*/ )
+            {
+                base_class::get()( pair );
+            }
+        };
+
+        template <typename Q>
+        class insert_value_functor
+        {
+            Q const&    m_val;
+        public:
+            insert_value_functor( Q const & v)
+                : m_val(v)
+            {}
+
+            void operator()( value_type& item )
+            {
+                item.second = m_val;
+            }
+        };
+
+        struct dummy_insert_functor
+        {
+            void operator()( value_type& item )
+            {}
+        };
+#   endif  // #ifndef CDS_CXX11_LAMBDA_SUPPORT
+
+        //@endcond
+
+    public:
+        /// Default ctor. The initial capacity is 16.
+        StripedMap()
+        : base_class()
+        {}
+
+        /// Ctor with initial capacity specified
+        StripedMap(
+            size_t nCapacity    ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
+        ) : base_class( nCapacity )
+        {}
+
+        /// Ctor with resizing policy (copy semantics)
+        /**
+            This constructor initializes m_ResizingPolicy member with copy of \p resizingPolicy parameter
+        */
+        StripedMap(
+            size_t nCapacity    ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
+            ,resizing_policy const& resizingPolicy  ///< Resizing policy
+        ) : base_class( nCapacity, resizingPolicy )
+        {}
+
+#ifdef CDS_RVALUE_SUPPORT
+        /// Ctor with resizing policy (move semantics)
+        /**
+            This constructor initializes m_ResizingPolicy member moving \p resizingPolicy parameter
+            Move semantics is used. Available only for the compilers that supports C++11 rvalue reference.
+        */
+        StripedMap(
+            size_t nCapacity    ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
+            ,resizing_policy&& resizingPolicy  ///< Resizing policy
+            ) : base_class( nCapacity, std::forward<resizing_policy>(resizingPolicy) )
+        {}
+#endif
+
+        /// Destructor destroys internal data
+        ~StripedMap()
+        {}
+
+    public:
+        /// Inserts new node with key and default value
+        /**
+            The function creates a node with \p key and default value, and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from a value of type \p K.
+                In trivial case, \p K is equal to \ref key_type.
+            - The \ref mapped_type should be default-constructible.
+
+            Returns \p true if inserting successful, \p false otherwise.
+        */
+        template <typename K>
+        bool insert( K const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert_key( key, [](value_type&){} );
+#       else
+            return insert_key( key, dummy_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the map.
+
+            Preconditions:
+            - The \ref key_type should be constructible from \p key of type \p K.
+            - The \ref mapped_type should be constructible from \p val of type \p V.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename K, typename V>
+        bool insert( K const& key, V const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert_key( key, [&val](value_type& item) { item.second = val ; } );
+#       else
+            insert_value_functor<V> f(val);
+            return insert_key( key, cds::ref(f) );
+#       endif
+        }
+
+        /// Inserts new node and initialize it by a functor
+        /**
+            This function inserts new node with key \p key and if inserting is successful then it calls
+            \p func functor with signature
+            \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+            \endcode
+
+            The argument \p item of user-defined functor \p func is the reference
+            to the map's item inserted:
+                - <tt>item.first</tt> is a const reference to item's key that cannot be changed.
+                - <tt>item.second</tt> is a reference to item's value that may be changed.
+
+            The user-defined functor can be passed by reference using <tt>boost::ref</tt>
+            and it is called only if inserting is successful.
+
+            The key_type should be constructible from value of type \p K.
+
+            The function allows to split creating of new item into two part:
+            - create item from \p key;
+            - insert new item into the map;
+            - if inserting is successful, initialize the value of item by calling \p func functor
+
+            This can be useful if complete initialization of object of \p mapped_type is heavyweight and
+            it is preferable that the initialization should be completed only if inserting is successful.
+        */
+        template <typename K, typename Func>
+        bool insert_key( const K& key, Func func )
+        {
+            return base_class::insert( key, func );
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// For key \p key inserts data of type \ref mapped_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename K, typename... Args>
+        bool emplace( K&& key, Args&&... args )
+        {
+            bool bOk;
+            bool bResize;
+            size_t nHash = base_class::hashing( std::forward<K>(key));
+            bucket_type * pBucket;
+            {
+                scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
+                pBucket = base_class::bucket( nHash );
+
+                bOk = pBucket->emplace( std::forward<K>(key), std::forward<Args>(args)...);
+                bResize = bOk && base_class::m_ResizingPolicy( ++base_class::m_ItemCounter, *this, *pBucket );
+            }
+
+            if ( bResize )
+                base_class::resize();
+
+            return bOk;
+        }
+#   endif
+
+        /// Ensures that the \p key exists in the map
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the \p key not found in the map, then the new item created from \p key
+            is inserted into the map (note that in this case the \ref key_type should be
+            constructible from type \p K).
+            Otherwise, the functor \p func is called with item found.
+            The functor \p Func may be a function with signature:
+            \code
+                void func( bool bNew, value_type& item );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+
+            The functor may change any fields of the \p item.second that is \ref mapped_type.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename K, typename Func>
+        std::pair<bool, bool> ensure( K const& key, Func func )
+        {
+            std::pair<bool, bool> result;
+            bool bResize;
+            size_t nHash = base_class::hashing( key );
+            bucket_type * pBucket;
+            {
+                scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
+                pBucket = base_class::bucket( nHash );
+
+                result = pBucket->ensure( key, func );
+                bResize = result.first && result.second && base_class::m_ResizingPolicy( ++base_class::m_ItemCounter, *this, *pBucket );
+            }
+
+            if ( bResize )
+                base_class::resize();
+            return result;
+        }
+
+        /// Delete \p key from the map
+        /** \anchor cds_nonintrusive_StripedMap_erase
+
+            Return \p true if \p key is found and deleted, \p false otherwise
+        */
+        template <typename K>
+        bool erase( K const& key )
+        {
+            return base_class::erase( key );
+        }
+
+#ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_StripedMap_erase "erase(K const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the map.
+
+            @note This function is enabled if the compiler supports C++11
+            default template arguments for function template <b>and</b> the underlying container
+            supports \p %erase_with feature.
+        */
+        template < typename K, typename Less
+            ,typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_erase_with >::type >
+        bool erase_with( K const& key, Less pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_with( key, pred, [](value_type const&) {} );
+#       else
+            return erase_with( key, pred, typename base_class::empty_erase_functor() );
+#       endif
+        }
+#endif
+
+        /// Delete \p key from the map
+        /** \anchor cds_nonintrusive_StripedMap_erase_func
+
+            The function searches an item with key \p key, calls \p f functor
+            and deletes the item. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface:
+            \code
+            struct extractor {
+                void operator()(value_type& item) { ... }
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            Return \p true if key is found and deleted, \p false otherwise
+
+            See also: \ref erase
+        */
+        template <typename K, typename Func>
+        bool erase( K const& key, Func f )
+        {
+            return base_class::erase( key, f );
+        }
+
+#ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+        /// Deletes the item from the map using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_StripedMap_erase_func "erase(K const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the map.
+
+            @note This function is enabled if the compiler supports C++11
+            default template arguments for function template <b>and</b> the underlying container
+            supports \p %erase_with feature.
+        */
+        template <typename K, typename Less, typename Func
+            ,typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_erase_with >::type >
+        bool erase_with( K const& key, Less pred, Func f )
+        {
+            return base_class::erase_with( key, cds::details::predicate_wrapper< value_type, Less, key_accessor >(), f );
+        }
+#endif
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_StripedMap_find_func
+
+            The function searches the item with key equal to \p key and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item );
+            };
+            \endcode
+            where \p item is the item found.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change \p item.second.
+
+            The function returns \p true if \p key is found, \p false otherwise.
+        */
+        template <typename K, typename Func>
+        bool find( K const& key, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find( key, [&f]( value_type& pair, K const& ) mutable { cds::unref(f)(pair); } );
+#       else
+            find_functor_wrapper<Func> fw(f);
+            return base_class::find( key, cds::ref(fw) );
+#       endif
+        }
+
+#ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+        /// Find the key \p val using \p pred predicate
+        /**
+            The function is an analog of \ref cds_nonintrusive_StripedMap_find_func "find(K const&, Func)"
+            but \p pred is used for key comparing
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+
+            @note This function is enabled if the compiler supports C++11
+            default template arguments for function template <b>and</b> the underlying container
+            supports \p %find_with feature.
+        */
+        template <typename K, typename Less, typename Func
+            ,typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_find_with >::type >
+        bool find_with( K const& key, Less pred, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return base_class::find_with( key, cds::details::predicate_wrapper< value_type, Less, key_accessor >(),
+                [&f]( value_type& pair, K const& ) mutable { cds::unref(f)(pair); } );
+#       else
+            find_functor_wrapper<Func> fw(f);
+            return base_class::find_with( key, cds::details::predicate_wrapper< value_type, Less, key_accessor >(), cds::ref(fw) );
+#       endif
+        }
+#endif
+
+        /// Find the key \p key
+        /** \anchor cds_nonintrusive_StripedMap_find_val
+
+            The function searches the item with key equal to \p key
+            and returns \p true if it is found, and \p false otherwise.
+        */
+        template <typename K>
+        bool find( K const& key )
+        {
+            return base_class::find( key );
+        }
+
+#ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+        /// Find the key \p val using \p pred predicate
+        /**
+            The function is an analog of \ref cds_nonintrusive_StripedMap_find_val "find(K const&)"
+            but \p pred is used for key comparing
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+
+            @note This function is enabled if the compiler supports C++11
+            default template arguments for function template <b>and</b> the underlying container
+            supports \p %find_with feature.
+        */
+        template <typename K, typename Less
+            ,typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_find_with >::type >
+        bool find_with( K const& key, Less pred )
+        {
+            return base_class::find_with( key, cds::details::predicate_wrapper< value_type, Less, key_accessor >() );
+        }
+#endif
+
+        /// Clears the map
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Checks if the map is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the map is empty.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the map
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns the size of hash table
+        /**
+            The hash table size is non-constant and can be increased via resizing.
+        */
+        size_t bucket_count() const
+        {
+            return base_class::bucket_count();
+        }
+
+        /// Returns lock array size
+        /**
+            The lock array size is constant.
+        */
+        size_t lock_count() const
+        {
+            return base_class::lock_count();
+        }
+
+        /// Returns resizing policy object
+        resizing_policy& get_resizing_policy()
+        {
+            return base_class::get_resizing_policy();
+        }
+
+        /// Returns resizing policy (const version)
+        resizing_policy const& get_resizing_policy() const
+        {
+            return base_class::get_resizing_policy();
+        }
+    };
+
+}}  // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_MAP_H
diff --git a/cds/container/striped_map/boost_flat_map.h b/cds/container/striped_map/boost_flat_map.h
new file mode 100644 (file)
index 0000000..d16d89f
--- /dev/null
@@ -0,0 +1,58 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_BOOST_FLAT_MAP_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_MAP_BOOST_FLAT_MAP_ADAPTER_H
+
+#include <boost/version.hpp>
+#if BOOST_VERSION < 104800
+#   error "For boost::container::flat_map you must use boost 1.48 or above"
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <boost/container/flat_map.hpp>
+
+//#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION >= 1700
+//#   error "boost::container::flat_map is not compatible with MS VC++ 11"
+//#endif
+
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct copy_item_policy< boost::container::flat_map< Key, T, Traits, Alloc > >
+            : public details::boost_map_copy_policies<boost::container::flat_map< Key, T, Traits, Alloc > >::copy_item_policy
+        {};
+
+        // Swap item policy
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct swap_item_policy< boost::container::flat_map< Key, T, Traits, Alloc > >
+            : public details::boost_map_copy_policies<boost::container::flat_map< Key, T, Traits, Alloc > >::swap_item_policy
+        {};
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct move_item_policy< boost::container::flat_map< Key, T, Traits, Alloc > >
+            : public details::boost_map_copy_policies<boost::container::flat_map< Key, T, Traits, Alloc > >::move_item_policy
+        {};
+#endif
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    template <typename Key, typename T, class Traits, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::container::flat_map< Key, T, Traits, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::container::flat_map< Key, T, Traits, Alloc>     container_type          ;   ///< underlying container type
+        typedef cds::container::striped_set::details::boost_map_adapter< container_type, CDS_OPTIONS >    type;
+    };
+}}} // namespace cds::intrusive::striped_set
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_MAP_BOOST_FLAT_MAP_ADAPTER_H
diff --git a/cds/container/striped_map/boost_list.h b/cds/container/striped_map/boost_list.h
new file mode 100644 (file)
index 0000000..df4c4d0
--- /dev/null
@@ -0,0 +1,273 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_BOOST_LIST_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_MAP_BOOST_LIST_ADAPTER_H
+
+#include <boost/version.hpp>
+#if BOOST_VERSION < 104800
+#   error "For boost::container::list you must use boost 1.48 or above"
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <cds/ref.h>
+#include <boost/container/list.hpp>
+#include <algorithm>    // std::lower_bound
+#include <utility>      // std::pair
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for map
+        template <typename K, typename T, typename Alloc>
+        struct copy_item_policy< boost::container::list< std::pair< K const, T >, Alloc > >
+        {
+            typedef std::pair< K const, T>  pair_type;
+            typedef boost::container::list< pair_type, Alloc > list_type;
+            typedef typename list_type::iterator    iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, *itWhat );
+            }
+        };
+
+        // Swap policy for map
+        template <typename K, typename T, typename Alloc>
+        struct swap_item_policy< boost::container::list< std::pair< K const, T >, Alloc > >
+        {
+            typedef std::pair< K const, T>  pair_type;
+            typedef boost::container::list< pair_type, Alloc > list_type;
+            typedef typename list_type::iterator    iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                pair_type newVal( itWhat->first, typename pair_type::second_type() );
+                itInsert = list.insert( itInsert, newVal );
+                std::swap( itInsert->second, itWhat->second );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for map
+        template <typename K, typename T, typename Alloc>
+        struct move_item_policy< boost::container::list< std::pair< K const, T >, Alloc > >
+        {
+            typedef std::pair< K const, T>          pair_type;
+            typedef boost::container::list< pair_type, Alloc >   list_type;
+            typedef typename list_type::iterator    iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::move( *itWhat ) );
+            }
+        };
+#endif
+    } // namespace striped_set
+}} // namespace cds:container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// boost::container::list adapter for hash map bucket
+    template <typename Key, typename T, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::container::list< std::pair<Key const, T>, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::container::list< std::pair<Key const, T>, Alloc>     container_type          ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_sequential_container
+        {
+        public:
+            typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+            typedef typename value_type::first_type     key_type;
+            typedef typename value_type::second_type    mapped_type;
+            typedef typename container_type::iterator   iterator    ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = true;
+            static bool const has_erase_with = true;
+
+        private:
+            //@cond
+            typedef typename cds::opt::details::make_comparator_from_option_list< value_type, CDS_OPTIONS >::type key_comparator;
+
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+
+            struct find_predicate
+            {
+                bool operator()( value_type const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1.first, i2.first ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( Q const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2.first ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( value_type const& i1, Q const& i2) const
+                {
+                    return key_comparator()( i1.first, i2 ) < 0;
+                }
+            };
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_List;
+            //@endcond
+
+        public:
+            adapted_container()
+            {}
+
+            template <typename Q, typename Func>
+            bool insert( const Q& key, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( key, it->first ) != 0 ) {
+                    //value_type newItem( key );
+                    it = m_List.insert( it, value_type( key, mapped_type()) );
+                    cds::unref( f )( *it );
+
+                    return true;
+                }
+
+                // key already exists
+                return false;
+            }
+
+#           ifdef CDS_EMPLACE_SUPPORT
+            template <typename K, typename... Args>
+            bool emplace( K&& key, Args&&... args )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( key, it->first ) != 0 ) {
+                    m_List.emplace( it, std::forward<K>(key), std::move( mapped_type( std::forward<Args>(args)... )) );
+                    return true;
+                }
+                return false;
+            }
+#           endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& key, Func func )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( key, it->first ) != 0 ) {
+                    // insert new
+                    value_type newItem( key, mapped_type() );
+                    it = m_List.insert( it, newItem );
+                    cds::unref( func )( true, *it );
+
+                    return std::make_pair( true, true );
+                }
+                else {
+                    // already exists
+                    cds::unref( func )( false, *it );
+                    return std::make_pair( true, false );
+                }
+            }
+
+            template <typename Q, typename Func>
+            bool erase( Q const& key, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( key, it->first ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_List.erase( it );
+
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool erase( Q const& key, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, pred );
+                if ( it == m_List.end() || pred( key, it->first ) || pred(it->first, key) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_List.erase( it );
+
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, it->first ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& val, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, pred );
+                if ( it == m_List.end() || pred( val, it->first ) || pred( it->first, val ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            /// Clears the container
+            void clear()
+            {
+                m_List.clear();
+            }
+
+            iterator begin()                { return m_List.begin(); }
+            const_iterator begin() const    { return m_List.begin(); }
+            iterator end()                  { return m_List.end(); }
+            const_iterator end() const      { return m_List.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), *itWhat, find_predicate() );
+                assert( it == m_List.end() || key_comparator()( itWhat->first, it->first ) != 0 );
+
+                copy_item()( m_List, it, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_List.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+
+}}} // namespace cds::intrusive::striped_set
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_MAP_BOOST_LIST_ADAPTER_H
diff --git a/cds/container/striped_map/boost_map.h b/cds/container/striped_map/boost_map.h
new file mode 100644 (file)
index 0000000..371cf9c
--- /dev/null
@@ -0,0 +1,54 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_BOOST_MAP_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_MAP_BOOST_MAP_ADAPTER_H
+
+#include <boost/version.hpp>
+#if BOOST_VERSION < 104800
+#   error "For boost::container::map you must use boost 1.48 or above"
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <boost/container/map.hpp>
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct copy_item_policy< boost::container::map< Key, T, Traits, Alloc > >
+            : public details::boost_map_copy_policies<boost::container::map< Key, T, Traits, Alloc > >::copy_item_policy
+        {};
+
+        // Swap item policy
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct swap_item_policy< boost::container::map< Key, T, Traits, Alloc > >
+            : public details::boost_map_copy_policies<boost::container::map< Key, T, Traits, Alloc > >::swap_item_policy
+        {};
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct move_item_policy< boost::container::map< Key, T, Traits, Alloc > >
+            : public details::boost_map_copy_policies<boost::container::map< Key, T, Traits, Alloc > >::move_item_policy
+        {};
+#endif
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// std::set adapter for hash set bucket
+    template <typename Key, typename T, class Traits, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::container::map< Key, T, Traits, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::container::map< Key, T, Traits, Alloc>     container_type          ;   ///< underlying container type
+        typedef cds::container::striped_set::details::boost_map_adapter< container_type, CDS_OPTIONS >    type;
+    };
+}}} // namespace cds::intrusive::striped_set
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_MAP_BOOST_MAP_ADAPTER_H
diff --git a/cds/container/striped_map/boost_slist.h b/cds/container/striped_map/boost_slist.h
new file mode 100644 (file)
index 0000000..5244597
--- /dev/null
@@ -0,0 +1,285 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_BOOST_SLIST_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_MAP_BOOST_SLIST_ADAPTER_H
+
+#include <boost/version.hpp>
+#if BOOST_VERSION < 104800
+#   error "For boost::container::slist you must use boost 1.48 or above"
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <cds/ref.h>
+#include <boost/container/slist.hpp>
+#include <utility>      // std::pair
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for map
+        template <typename K, typename T, typename Alloc>
+        struct copy_item_policy< boost::container::slist< std::pair< K const, T >, Alloc > >
+        {
+            typedef std::pair< K const, T>  pair_type;
+            typedef boost::container::slist< pair_type, Alloc > list_type;
+            typedef typename list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                itInsert = list.insert_after( itInsert, *itWhat );
+            }
+        };
+
+        // Swap policy for map
+        template <typename K, typename T, typename Alloc>
+        struct swap_item_policy< boost::container::slist< std::pair< K const, T >, Alloc > >
+        {
+            typedef std::pair< K const, T>  pair_type;
+            typedef boost::container::slist< pair_type, Alloc > list_type;
+            typedef typename list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                pair_type newVal( itWhat->first, typename pair_type::mapped_type() );
+                itInsert = list.insert_after( itInsert, newVal );
+                std::swap( itInsert->second, itWhat->second );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for map
+        template <typename K, typename T, typename Alloc>
+        struct move_item_policy< boost::container::slist< std::pair< K const, T >, Alloc > >
+        {
+            typedef std::pair< K const, T>  pair_type;
+            typedef boost::container::slist< pair_type, Alloc > list_type;
+            typedef typename list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert_after( itInsert, std::move( *itWhat ) );
+            }
+        };
+#endif
+    } // namespace striped_set
+}} // namespace cds:container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// boost::container::slist adapter for hash map bucket
+    template <typename Key, typename T, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::container::slist< std::pair<Key const, T>, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::container::slist< std::pair<Key const, T>, Alloc>     container_type          ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_sequential_container
+        {
+        public:
+            typedef typename container_type::value_type     value_type  ;   ///< value type stored in the container
+            typedef typename value_type::first_type         key_type;
+            typedef typename value_type::second_type        mapped_type;
+            typedef typename container_type::iterator       iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = true;
+            static bool const has_erase_with = true;
+
+        private:
+            //@cond
+            typedef typename cds::opt::details::make_comparator_from_option_list< value_type, CDS_OPTIONS >::type key_comparator;
+
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+
+            template <typename Q>
+            std::pair< iterator, bool > find_prev_item( Q const& key )
+            {
+                iterator itPrev = m_List.before_begin();
+                iterator itEnd = m_List.end();
+                for ( iterator it = m_List.begin(); it != itEnd; ++it ) {
+                    int nCmp = key_comparator()( key, it->first );
+                    if ( nCmp < 0 )
+                        itPrev = it;
+                    else if ( nCmp > 0 )
+                        break;
+                    else
+                        return std::make_pair( itPrev, true );
+                }
+                return std::make_pair( itPrev, false );
+            }
+
+            template <typename Q, typename Less>
+            std::pair< iterator, bool > find_prev_item( Q const& key, Less pred )
+            {
+                iterator itPrev = m_List.before_begin();
+                iterator itEnd = m_List.end();
+                for ( iterator it = m_List.begin(); it != itEnd; ++it ) {
+                    if ( pred( key, it->first ))
+                        itPrev = it;
+                    else if ( pred(it->first, key))
+                        break;
+                    else
+                        return std::make_pair( itPrev, true );
+                }
+                return std::make_pair( itPrev, false );
+            }
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_List;
+            //@endcond
+
+        public:
+            adapted_container()
+            {}
+
+            template <typename Q, typename Func>
+            bool insert( const Q& key, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( key );
+                if ( !pos.second ) {
+                    value_type newItem( key, mapped_type() );
+                    pos.first = m_List.insert_after( pos.first, newItem );
+                    cds::unref( f )( *pos.first );
+                    return true;
+                }
+
+                // key already exists
+                return false;
+            }
+
+#           ifdef CDS_EMPLACE_SUPPORT
+            template <typename K, typename... Args>
+            bool emplace( K&& key, Args&&... args )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( key );
+                if ( !pos.second ) {
+                    m_List.emplace_after( pos.first, std::forward<K>(key), std::move( mapped_type( std::forward<Args>(args)... )));
+                    return true;
+                }
+                return false;
+            }
+#           endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& key, Func func )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( key );
+                if ( !pos.second ) {
+                    // insert new
+                    value_type newItem( key, mapped_type() );
+                    pos.first = m_List.insert_after( pos.first, newItem );
+                    cds::unref( func )( true, *pos.first );
+                    return std::make_pair( true, true );
+                }
+                else {
+                    // already exists
+                    cds::unref( func )( false, *(++pos.first) );
+                    return std::make_pair( true, false );
+                }
+            }
+
+            template <typename Q, typename Func>
+            bool erase( Q const& key, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( key );
+                if ( !pos.second )
+                    return false;
+
+                // key exists
+                iterator it = pos.first;
+                cds::unref( f )( *(++it) );
+                m_List.erase_after( pos.first );
+
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool erase( Q const& key, Less pred, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( key, pred );
+                if ( !pos.second )
+                    return false;
+
+                // key exists
+                iterator it = pos.first;
+                cds::unref( f )( *(++it) );
+                m_List.erase_after( pos.first );
+
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( val );
+                if ( !pos.second )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *(++pos.first), val );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& val, Less pred, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( val, pred );
+                if ( !pos.second )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *(++pos.first), val );
+                return true;
+            }
+
+            void clear()
+            {
+                m_List.clear();
+            }
+
+            iterator begin()                { return m_List.begin(); }
+            const_iterator begin() const    { return m_List.begin(); }
+            iterator end()                  { return m_List.end(); }
+            const_iterator end() const      { return m_List.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( itWhat->first );
+                assert( !pos.second );
+
+                copy_item()( m_List, pos.first, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_List.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_MAP_BOOST_SLIST_ADAPTER_H
diff --git a/cds/container/striped_map/boost_unordered_map.h b/cds/container/striped_map/boost_unordered_map.h
new file mode 100644 (file)
index 0000000..05076e3
--- /dev/null
@@ -0,0 +1,50 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_BOOST_UNORDERED_MAP_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_MAP_BOOST_UNORDERED_MAP_ADAPTER_H
+
+#include <cds/container/striped_set/adapter.h>
+#include <boost/unordered_map.hpp>
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct copy_item_policy< boost::unordered_map< Key, T, Traits, Alloc > >
+            : public details::boost_map_copy_policies<boost::unordered_map< Key, T, Traits, Alloc > >::copy_item_policy
+        {};
+
+        // Swap policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct swap_item_policy< boost::unordered_map< Key, T, Traits, Alloc > >
+            : public details::boost_map_copy_policies<boost::unordered_map< Key, T, Traits, Alloc > >::swap_item_policy
+        {};
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct move_item_policy< boost::unordered_map< Key, T, Traits, Alloc > >
+            : public details::boost_map_copy_policies<boost::unordered_map< Key, T, Traits, Alloc > >::move_item_policy
+        {};
+#endif
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// boost::unordered_map  adapter for hash map bucket
+    template <typename Key, typename T, class Hash, class Pred, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::unordered_map< Key, T, Hash, Pred, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::unordered_map< Key, T, Hash, Pred, Alloc>  container_type  ;   ///< underlying container type
+        typedef cds::container::striped_set::details::boost_map_adapter< container_type, CDS_OPTIONS >    type;
+    };
+}}} // namespace cds::intrusive::striped_set
+
+
+//@endcond
+
+#endif  // #ifndef __CDS_CONTAINER_STRIPED_MAP_BOOST_UNORDERED_MAP_ADAPTER_H
diff --git a/cds/container/striped_map/std_hash_map.h b/cds/container/striped_map/std_hash_map.h
new file mode 100644 (file)
index 0000000..7b1fa6b
--- /dev/null
@@ -0,0 +1,13 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_STD_HASH_MAP_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_MAP_STD_HASH_MAP_ADAPTER_H
+
+#include <cds/container/striped_set/adapter.h>
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600    // MS VC 2008
+#   include <cds/container/striped_map/std_hash_map_vc.h>
+#else
+#   include <cds/container/striped_map/std_hash_map_std.h>
+#endif
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_MAP_STD_HASH_MAP_ADAPTER_H
diff --git a/cds/container/striped_map/std_hash_map_std.h b/cds/container/striped_map/std_hash_map_std.h
new file mode 100644 (file)
index 0000000..404d1d9
--- /dev/null
@@ -0,0 +1,195 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_STD_HASH_MAP_STD_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_MAP_STD_HASH_MAP_STD_ADAPTER_H
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_STD_HASH_MAP_ADAPTER_H
+#   error <cds/container/striped_map/std_hash_map.h> must be included instead of <cds/container/striped_map/std_hash_map_std.h> header
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <unordered_map>
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for map
+        template <typename Key, typename T, typename Hash, typename Pred, typename Alloc>
+        struct copy_item_policy< std::unordered_map< Key, T, Hash, Pred, Alloc > >
+        {
+            typedef std::unordered_map< Key, T, Hash, Pred, Alloc > map_type;
+            typedef typename map_type::value_type   pair_type;
+            typedef typename map_type::iterator     iterator;
+
+            void operator()( map_type& map, iterator itWhat )
+            {
+                map.insert( *itWhat );
+            }
+        };
+
+        // Swap policy for map
+        template <typename Key, typename T, typename Hash, typename Pred, typename Alloc>
+        struct swap_item_policy< std::unordered_map< Key, T, Hash, Pred, Alloc > >
+        {
+            typedef std::unordered_map< Key, T, Hash, Pred, Alloc > map_type;
+            typedef typename map_type::value_type   pair_type;
+            typedef typename map_type::iterator     iterator;
+
+            void operator()( map_type& map, iterator itWhat )
+            {
+                pair_type pair( itWhat->first, typename pair_type::second_type() );
+                std::pair<iterator, bool> res = map.insert( pair );
+                assert( res.second );
+                std::swap( res.first->second, itWhat->second );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for map
+        template <typename Key, typename T, typename Hash, typename Pred, typename Alloc>
+        struct move_item_policy< std::unordered_map< Key, T, Hash, Pred, Alloc > >
+        {
+            typedef std::unordered_map< Key, T, Hash, Pred, Alloc > map_type;
+            typedef typename map_type::value_type pair_type;
+            typedef typename map_type::iterator     iterator;
+
+            void operator()( map_type& map, iterator itWhat )
+            {
+                map.insert( std::move( *itWhat ) );
+            }
+        };
+#endif
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// std::unordered_map  adapter for hash map bucket
+    template <typename Key, typename T, class Hash, class Pred, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< std::unordered_map< Key, T, Hash, Pred, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef std::unordered_map< Key, T, Hash, Pred, Alloc>  container_type  ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_container
+        {
+        public:
+            typedef typename container_type::value_type     value_type  ;   ///< value type stored in the container
+            typedef typename container_type::key_type       key_type;
+            typedef typename container_type::mapped_type    mapped_type;
+            typedef typename container_type::iterator       iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = false;
+            static bool const has_erase_with = false;
+
+        private:
+            //@cond
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_Map;
+            //@endcond
+
+        public:
+            template <typename Q, typename Func>
+            bool insert( const Q& key, Func f )
+            {
+                std::pair<iterator, bool> res = m_Map.insert( value_type( key, mapped_type() ));
+                if ( res.second )
+                    ::cds::unref(f)( const_cast<value_type&>(*res.first) );
+                return res.second;
+            }
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            template <typename Q, typename... Args>
+            bool emplace( Q&& key, Args&&... args )
+            {
+#           if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION < 40800 || CDS_COMPILER == CDS_COMPILER_CLANG && !defined(__LIBCPP_VERSION)
+                // GCC < 4.8: std::map has no "emplace" member function. Emulate it
+                std::pair<iterator, bool> res = m_Map.insert( value_type( std::forward<Q>(key), mapped_type( std::forward<Args>(args)...)));
+#           else
+                std::pair<iterator, bool> res = m_Map.emplace( std::forward<Q>(key), std::move( mapped_type(std::forward<Args>(args)...)) );
+#           endif
+                return res.second;
+            }
+#       endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& key, Func func )
+            {
+                std::pair<iterator, bool> res = m_Map.insert( value_type( key, mapped_type() ) );
+                cds::unref(func)( res.second, const_cast<value_type&>(*res.first));
+                return std::make_pair( true, res.second );
+            }
+
+            template <typename Q, typename Func>
+            bool erase( const Q& key, Func f )
+            {
+                iterator it = m_Map.find( key_type(key) );
+                if ( it == m_Map.end() )
+                    return false;
+                ::cds::unref(f)( const_cast<value_type&>(*it) );
+                m_Map.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = m_Map.find( key_type(val) );
+                if ( it == m_Map.end() )
+                    return false;
+                ::cds::unref(f)( const_cast<value_type&>(*it), val );
+                return true;
+            }
+
+            void clear()
+            {
+                m_Map.clear();
+            }
+
+            iterator begin()                { return m_Map.begin(); }
+            const_iterator begin() const    { return m_Map.begin(); }
+            iterator end()                  { return m_Map.end(); }
+            const_iterator end() const      { return m_Map.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                assert( m_Map.find( itWhat->first ) == m_Map.end() );
+                copy_item()( m_Map, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_Map.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+
+
+//@endcond
+
+#endif  // #ifndef __CDS_CONTAINER_STRIPED_MAP_STD_HASH_MAP_STD_ADAPTER_H
diff --git a/cds/container/striped_map/std_hash_map_vc.h b/cds/container/striped_map/std_hash_map_vc.h
new file mode 100644 (file)
index 0000000..34ede22
--- /dev/null
@@ -0,0 +1,182 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_STD_HASH_MAP_MSVC_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_MAP_STD_HASH_MAP_MSVC_ADAPTER_H
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_STD_HASH_MAP_ADAPTER_H
+#   error <cds/container/striped_map/std_hash_map.h> must be included instead of <cds/container/striped_map/std_hash_map_vc.h> header
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <hash_map>
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct copy_item_policy< stdext::hash_map< Key, T, Traits, Alloc > >
+        {
+            typedef stdext::hash_map< Key, T, Traits, Alloc > map_type;
+            typedef typename map_type::value_type pair_type;
+            typedef typename map_type::iterator iterator;
+
+            void operator()( map_type& map, iterator itWhat )
+            {
+                std::pair< typename map_type::iterator, bool> res = map.insert( *itWhat );
+                assert( res.second )    ; // succesful insert
+            }
+        };
+
+        // Swap policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct swap_item_policy< stdext::hash_map< Key, T, Traits, Alloc > >
+        {
+            typedef stdext::hash_map< Key, T, Traits, Alloc > map_type;
+            typedef typename map_type::value_type pair_type;
+            typedef typename map_type::iterator iterator;
+
+            void operator()( map_type& map, iterator itWhat )
+            {
+                pair_type newVal( itWhat->first, typename pair_type::second_type() );
+                std::pair< typename map_type::iterator, bool> res = map.insert( newVal );
+                assert( res.second )    ; // succesful insert
+                std::swap( res.first->second, itWhat->second );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct move_item_policy< stdext::hash_map< Key, T, Traits, Alloc > >
+        {
+            typedef stdext::hash_map< Key, T, Traits, Alloc > map_type;
+            typedef typename map_type::value_type pair_type;
+            typedef typename map_type::iterator iterator;
+
+            void operator()( map_type& map, iterator itWhat )
+            {
+                map.insert( std::move( *itWhat ) );
+            }
+        };
+#endif
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// stdext::hash_map adapter for hash map bucket
+    template <typename Key, typename T, class Traits, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< stdext::hash_map< Key, T, Traits, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef stdext::hash_map< Key, T, Traits, Alloc>  container_type  ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_container
+        {
+        public:
+            typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+            typedef typename container_type::key_type   key_type;
+            typedef typename container_type::mapped_type    mapped_type;
+            typedef typename container_type::iterator      iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = false;
+            static bool const has_erase_with = false;
+
+        private:
+            //@cond
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_Map;
+            //@endcond
+
+        public:
+            template <typename Q, typename Func>
+            bool insert( const Q& key, Func f )
+            {
+                std::pair<iterator, bool> res = m_Map.insert( value_type( key, mapped_type() ) );
+                if ( res.second )
+                    ::cds::unref(f)( *res.first );
+                return res.second;
+            }
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& val, Func func )
+            {
+                std::pair<iterator, bool> res = m_Map.insert( value_type( val, mapped_type() ));
+                ::cds::unref(func)( res.second, *res.first );
+                return std::make_pair( true, res.second );
+            }
+
+            template <typename Q, typename Func>
+            bool erase( const Q& key, Func f )
+            {
+                iterator it = m_Map.find( key_type(key) );
+                if ( it == m_Map.end() )
+                    return false;
+                ::cds::unref(f)( *it );
+                m_Map.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = m_Map.find( key_type(val) );
+                if ( it == m_Map.end() )
+                    return false;
+                ::cds::unref(f)( *it, val );
+                return true;
+            }
+
+            void clear()
+            {
+                m_Map.clear();
+            }
+
+            iterator begin()                { return m_Map.begin(); }
+            const_iterator begin() const    { return m_Map.begin(); }
+            iterator end()                  { return m_Map.end(); }
+            const_iterator end() const      { return m_Map.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                assert( m_Map.find( itWhat->first ) == m_Map.end() );
+                copy_item()( m_Map, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_Map.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+
+
+//@endcond
+
+#endif  // #ifndef __CDS_CONTAINER_STRIPED_MAP_STD_HASH_MAP_MSVC_ADAPTER_H
diff --git a/cds/container/striped_map/std_list.h b/cds/container/striped_map/std_list.h
new file mode 100644 (file)
index 0000000..8df61dc
--- /dev/null
@@ -0,0 +1,301 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_STD_LIST_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_MAP_STD_LIST_ADAPTER_H
+
+#include <cds/container/striped_set/adapter.h>
+#include <cds/ref.h>
+#include <list>
+#include <algorithm>    // std::lower_bound
+#include <utility>      // std::pair
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for map
+        template <typename K, typename T, typename Alloc>
+        struct copy_item_policy< std::list< std::pair< K const, T >, Alloc > >
+        {
+            typedef std::pair< K const, T>  pair_type;
+            typedef std::list< pair_type, Alloc > list_type;
+            typedef typename list_type::iterator    iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, *itWhat );
+            }
+        };
+
+        // Swap policy for map
+        template <typename K, typename T, typename Alloc>
+        struct swap_item_policy< std::list< std::pair< K const, T >, Alloc > >
+        {
+            typedef std::pair< K const, T>  pair_type;
+            typedef std::list< pair_type, Alloc > list_type;
+            typedef typename list_type::iterator    iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                pair_type newVal( itWhat->first, typename pair_type::second_type() );
+                itInsert = list.insert( itInsert, newVal );
+                std::swap( itInsert->second, itWhat->second );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for map
+        template <typename K, typename T, typename Alloc>
+        struct move_item_policy< std::list< std::pair< K const, T >, Alloc > >
+        {
+            typedef std::pair< K const, T>          pair_type;
+            typedef std::list< pair_type, Alloc >   list_type;
+            typedef typename list_type::iterator    iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::move( *itWhat ) );
+            }
+        };
+#endif
+    } // namespace striped_set
+}} // namespace cds:container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// std::list adapter for hash map bucket
+    template <typename Key, typename T, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< std::list< std::pair<Key const, T>, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef std::list< std::pair<Key const, T>, Alloc>     container_type          ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_sequential_container
+        {
+        public:
+            typedef typename container_type::value_type     value_type  ;   ///< value type stored in the container
+            typedef typename value_type::first_type         key_type;
+            typedef typename value_type::second_type        mapped_type;
+            typedef typename container_type::iterator       iterator    ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = true;
+            static bool const has_erase_with = true;
+
+        private:
+            //@cond
+            typedef typename cds::opt::details::make_comparator_from_option_list< value_type, CDS_OPTIONS >::type key_comparator;
+
+
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+
+            struct find_predicate
+            {
+                bool operator()( value_type const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1.first, i2.first ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( Q const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2.first ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( value_type const& i1, Q const& i2) const
+                {
+                    return key_comparator()( i1.first, i2 ) < 0;
+                }
+            };
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_List;
+#       ifdef __GLIBCXX__
+            // GCC C++ lib bug:
+            // In GCC (at least up to 4.7.x), the complexity of std::list::size() is O(N)
+            // (see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49561)
+            size_t          m_nSize ;   // list size
+#       endif
+            //@endcond
+
+        public:
+            adapted_container()
+#       ifdef __GLIBCXX__
+                : m_nSize(0)
+#       endif
+            {}
+
+            template <typename Q, typename Func>
+            bool insert( const Q& key, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( key, it->first ) != 0 ) {
+                    //value_type newItem( key );
+                    it = m_List.insert( it, value_type( key, mapped_type()) );
+                    cds::unref( f )( *it );
+
+#           ifdef __GLIBCXX__
+                    ++m_nSize;
+#           endif
+                    return true;
+                }
+
+                // key already exists
+                return false;
+            }
+
+#           ifdef CDS_EMPLACE_SUPPORT
+            template <typename K, typename... Args>
+            bool emplace( K&& key, Args&&... args )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( key, it->first ) != 0 ) {
+                    //value_type newItem( key );
+                    it = m_List.emplace( it, value_type( std::forward<K>(key), std::move( mapped_type( std::forward<Args>(args)...) )) );
+
+#           ifdef __GLIBCXX__
+                    ++m_nSize;
+#           endif
+                    return true;
+                }
+                return false;
+            }
+#           endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& key, Func func )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( key, it->first ) != 0 ) {
+                    // insert new
+                    value_type newItem( key, mapped_type() );
+                    it = m_List.insert( it, newItem );
+                    cds::unref( func )( true, *it );
+#           ifdef __GLIBCXX__
+                    ++m_nSize;
+#           endif
+                    return std::make_pair( true, true );
+                }
+                else {
+                    // already exists
+                    cds::unref( func )( false, *it );
+                    return std::make_pair( true, false );
+                }
+            }
+
+            template <typename Q, typename Func>
+            bool erase( Q const& key, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( key, it->first ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_List.erase( it );
+#           ifdef __GLIBCXX__
+                --m_nSize;
+#           endif
+
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool erase( Q const& key, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, pred );
+                if ( it == m_List.end() || pred( key, it->first ) || pred( it->first, key ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_List.erase( it );
+#           ifdef __GLIBCXX__
+                --m_nSize;
+#           endif
+
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, it->first ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& val, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, pred );
+                if ( it == m_List.end() || pred( val, it->first ) || pred( it->first, val ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            void clear()
+            {
+                m_List.clear();
+            }
+
+            iterator begin()                { return m_List.begin(); }
+            const_iterator begin() const    { return m_List.begin(); }
+            iterator end()                  { return m_List.end(); }
+            const_iterator end() const      { return m_List.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), *itWhat, find_predicate() );
+                assert( it == m_List.end() || key_comparator()( itWhat->first, it->first ) != 0 );
+
+                copy_item()( m_List, it, itWhat );
+#           ifdef __GLIBCXX__
+                ++m_nSize;
+#           endif
+            }
+
+            size_t size() const
+            {
+#           ifdef __GLIBCXX__
+                return m_nSize;
+#           else
+                return m_List.size();
+#           endif
+
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_MAP_STD_LIST_ADAPTER_H
diff --git a/cds/container/striped_map/std_map.h b/cds/container/striped_map/std_map.h
new file mode 100644 (file)
index 0000000..728ebf0
--- /dev/null
@@ -0,0 +1,190 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_MAP_STD_MAP_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_MAP_STD_MAP_ADAPTER_H
+
+#include <cds/container/striped_set/adapter.h>
+#include <map>
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct copy_item_policy< std::map< Key, T, Traits, Alloc > >
+        {
+            typedef std::map< Key, T, Traits, Alloc > map_type;
+            typedef typename map_type::value_type pair_type;
+            typedef typename map_type::iterator    iterator;
+
+            void operator()( map_type& map, iterator itWhat )
+            {
+                map.insert( *itWhat );
+            }
+        };
+
+        // Swap item policy
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct swap_item_policy< std::map< Key, T, Traits, Alloc > >
+        {
+            typedef std::map< Key, T, Traits, Alloc > map_type;
+            typedef typename map_type::value_type pair_type;
+            typedef typename map_type::iterator    iterator;
+
+            void operator()( map_type& map, iterator itWhat )
+            {
+                std::pair< typename map_type::iterator, bool > ret = map.insert( pair_type( itWhat->first, typename pair_type::second_type() ));
+                assert( ret.second )    ;   // successful insertion
+                std::swap( ret.first->second, itWhat->second );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for map
+        template <typename Key, typename T, typename Traits, typename Alloc>
+        struct move_item_policy< std::map< Key, T, Traits, Alloc > >
+        {
+            typedef std::map< Key, T, Traits, Alloc > map_type;
+            typedef typename map_type::value_type pair_type;
+            typedef typename map_type::iterator    iterator;
+
+            void operator()( map_type& map, iterator itWhat  )
+            {
+                map.insert( std::move( *itWhat ) );
+            }
+        };
+#endif
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// std::set adapter for hash set bucket
+    template <typename Key, typename T, class Traits, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< std::map< Key, T, Traits, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef std::map< Key, T, Traits, Alloc>     container_type          ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_container
+        {
+        public:
+            typedef typename container_type::value_type     value_type  ;   ///< value type stored in the container
+            typedef typename container_type::key_type       key_type;
+            typedef typename container_type::mapped_type    mapped_type;
+            typedef typename container_type::iterator       iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = false;
+            static bool const has_erase_with = false;
+
+        private:
+            //@cond
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_Map;
+            //@endcond
+
+        public:
+
+            template <typename Q, typename Func>
+            bool insert( const Q& key, Func f )
+            {
+                std::pair<iterator, bool> res = m_Map.insert( value_type( key, mapped_type() ) );
+                if ( res.second )
+                    ::cds::unref(f)( *res.first );
+                return res.second;
+            }
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            template <typename Q, typename... Args>
+            bool emplace( Q&& key, Args&&... args )
+            {
+#           if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION < 40800 || CDS_COMPILER == CDS_COMPILER_CLANG && !defined(__LIBCPP_VERSION)
+                // GCC < 4.8: std::map has no "emplace" member function. Emulate it
+                std::pair<iterator, bool> res = m_Map.insert( value_type( std::forward<Q>(key), mapped_type( std::forward<Args>(args)...)));
+#           else
+                std::pair<iterator, bool> res = m_Map.emplace( std::forward<Q>(key), std::move(mapped_type( std::forward<Args>(args)...)));
+#           endif
+                return res.second;
+            }
+#       endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& key, Func func )
+            {
+                std::pair<iterator, bool> res = m_Map.insert( value_type( key, mapped_type() ));
+                cds::unref(func)( res.second, *res.first );
+                return std::make_pair( true, res.second );
+            }
+
+            template <typename Q, typename Func>
+            bool erase( const Q& key, Func f )
+            {
+                iterator it = m_Map.find( key_type(key) );
+                if ( it == m_Map.end() )
+                    return false;
+                cds::unref(f)( *it );
+                m_Map.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = m_Map.find( key_type(val) );
+                if ( it == m_Map.end() )
+                    return false;
+                cds::unref(f)( *it, val );
+                return true;
+            }
+
+            /// Clears the container
+            void clear()
+            {
+                m_Map.clear();
+            }
+
+            iterator begin()                { return m_Map.begin(); }
+            const_iterator begin() const    { return m_Map.begin(); }
+            iterator end()                  { return m_Map.end(); }
+            const_iterator end() const      { return m_Map.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                assert( m_Map.find( itWhat->first ) == m_Map.end() );
+                copy_item()( m_Map, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_Map.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+    };
+}}} // namespace cds::intrusive::striped_set
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_MAP_STD_MAP_ADAPTER_H
diff --git a/cds/container/striped_set.h b/cds/container/striped_set.h
new file mode 100644 (file)
index 0000000..83c9575
--- /dev/null
@@ -0,0 +1,1009 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_H
+#define __CDS_CONTAINER_STRIPED_SET_H
+
+#include <cds/intrusive/striped_set.h>
+#include <cds/container/striped_set/adapter.h>
+
+namespace cds { namespace container {
+
+    /// Striped hash set
+    /** @ingroup cds_nonintrusive_set
+
+        Source
+            - [2008] Maurice Herlihy, Nir Shavit "The Art of Multiprocessor Programming"
+
+        Lock striping is very simple technique.
+        The set consists of the bucket table and the array of locks.
+        Initially, the capacity of lock array and bucket table is the same.
+        When set is resized, bucket table capacity will be doubled but lock array will not.
+        The lock \p i protects each bucket \p j, where <tt> j = i mod L </tt>,
+        where \p L - the size of lock array.
+
+        Template arguments:
+            - \p Container - the container class that is used as bucket table entry. The \p Container class should support
+                an uniform interface described below.
+            - \p Options - options
+
+        The \p %StripedSet class does not exactly dictate the type of container that should be used as a \p Container bucket.
+        Instead, the class supports different container type for the bucket, for exampe, \p std::list, \p std::set and others.
+
+        Remember that \p %StripedSet class algorithm ensures sequential blocking access to its bucket through the mutex type you specify
+        among \p Options template arguments.
+
+        The \p Options are:
+            - opt::mutex_policy - concurrent access policy.
+                Available policies: intrusive::striped_set::striping, intrusive::striped_set::refinable.
+                Default is %striped_set::striping.
+            - opt::hash - hash functor. Default option value see opt::v::hash_selector<opt::none> which selects default hash functor for
+                your compiler.
+            - opt::compare - key comparison functor. No default functor is provided.
+                If the option is not specified, the opt::less is used.
+            - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+            - opt::item_counter - item counter type. Default is \p atomicity::item_counter since some operation on the counter is performed
+                without locks. Note that item counting is an essential part of the set algorithm, so dummy type like atomicity::empty_item_counter
+                is not suitable.
+            - opt::allocator - the allocator type using for memory allocation of bucket table and lock array. Default is CDS_DEFAULT_ALLOCATOR.
+            - opt::resizing_policy - the resizing policy that is a functor that decides when to resize the hash set.
+                Default option value depends on bucket container type:
+                    for sequential containers like \p std::list, \p std::vector the resizing policy is striped_set::load_factor_resizing<4>;
+                    for other type of containers like \p std::set, \p std::unordered_set the resizing policy is striped_set::no_resizing.
+                See \ref striped_set namespace for list of all possible types of the option.
+                Note that the choose of resizing policy depends of \p Container type:
+                for sequential containers like \p std::list, \p std::vector and so on, right choosing of the policy can
+                significantly improve performance.
+                For other, non-sequential types of \p Container (like a \p std::set)
+                the resizing policy is not so important.
+            - opt::copy_policy - the copy policy which is used to copy items from the old set to the new one when resizing.
+                The policy can be optionally used in adapted bucket container for performance reasons of resizing.
+                The detail of copy algorithm depends on type of bucket container and explains below.
+
+            opt::compare or opt::less options are used in some \p Container class for searching an item.
+            opt::compare option has the highest priority: if opt::compare is specified, opt::less is not used.
+
+        You can pass other option that would be passed to <tt>adapt</tt> metafunction, see below.
+
+        <b>Internal details</b>
+
+            The \p %StripedSet class cannot utilize the \p Container container specified directly, but only its adapted variant which
+            supports an unified interface. Internally, the adaptation is made via striped_set::adapt metafunction that wraps bucket container
+            and provides the unified bucket interface suitable for \p %StripedSet. Such adaptation is completely transparent for you -
+            you don't need to call \p adapt metafunction directly, \p %StripedSet class's internal machinery itself invokes appropriate
+            \p adapt metafunction to adjust your \p Container container class to \p %StripedSet bucket's internal interface.
+            All you need is to include a right header before <tt>striped_hash_set.h</tt>.
+
+            By default, <tt>striped_set::adapt<AnyContainer, Options...> </tt> metafunction does not make any wrapping to \p AnyContainer,
+            so, the result <tt>%striped_set::adapt<AnyContainer, Options...>::type </tt> is the same as \p AnyContainer.
+            However, there are a lot of specializations of <tt>striped_set::adapt</tt> for well-known containers, see table below.
+            Any of this specialization wraps corresponding container making it suitable for the set's bucket.
+            Remember, you should include the proper header file for \p adapt <b>before</b> including <tt>striped_hash_set.h</tt>.
+            <table>
+                <tr>
+                    <th>Container</th>
+                    <th>.h-file for \p adapt</th>
+                    <th>Example</th>
+                    <th>Notes</th>
+                </tr>
+                <tr>
+                    <td> \p std::list</td>
+                    <td><tt><cds/container/striped_set/std_list.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/std_list.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            std::list<T>,
+                            cds::opt::less< std::less<T> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        The list is ordered.
+                        Template argument pack \p Options <b>must</b> contain cds::opt::less or cds::opt::compare for type \p T stored in the list
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p std::vector</td>
+                    <td><tt><cds/container/striped_set/std_vector.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/std_vector.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            std::vector<T>,
+                            cds::opt::less< std::less<T> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        The vector is ordered.
+                        Template argument pack \p Options <b>must</b> contain cds::opt::less or cds::opt::compare for type \p T stored in the list
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p std::set</td>
+                    <td><tt><cds/container/striped_set/std_set.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/std_set.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            std::set< T, std::less<T> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p std::unordered_set</td>
+                    <td><tt><cds/container/striped_set/std_hash_set.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/std_hash_set.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            std::unordered_set<
+                                T,
+                                hash<T>,
+                                equal<T>
+                            >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        You should provide two different hash function \p h1 and \p h2 - one for std::unordered_set and other for \p %StripedSet.
+                        For the best result, \p h1 and \p h2 must be orthogonal i.e. <tt> h1(X) != h2(X) </tt> for any value \p X.
+                    </td>
+                </tr>
+                <tr>
+                    <td>\p stdext::hash_set (only for MS VC++ 2008)</td>
+                    <td><tt><cds/container/striped_set/std_hash_set.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/std_hash_set.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            stdext::hash_set< T,
+                                stdext::hash_compare<
+                                    T,
+                                    std::less<T>
+                                >
+                            >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        You should provide two different hash function \p h1 and \p h2 - one for stdext::hash_set and other for \p %StripedSet.
+                        For the best result, \p h1 and \p h2 must be orthogonal i.e. <tt> h1(X) != h2(X) </tt> for any value \p X.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::slist</td>
+                    <td><tt><cds/container/striped_set/boost_slist.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/boost_slist.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            boost::container::slist<T>
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        The list is ordered.
+                        \p Options <b>must</b> contain cds::opt::less or cds::opt::compare.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::list</td>
+                    <td><tt><cds/container/striped_set/boost_list.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/boost_list.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            boost::container::list<T>
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        The list is ordered.
+                        \p Options <b>must</b> contain cds::opt::less or cds::opt::compare.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::vector</td>
+                    <td><tt><cds/container/striped_set/boost_vector.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/boost_vector.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            boost::container::vector<T>,
+                            cds::opt::less< std::less<T> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        The vector is ordered.
+                        Template argument pack \p Options <b>must</b> contain cds::opt::less or cds::opt::compare for type \p T stored in the list
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::stable_vector</td>
+                    <td><tt><cds/container/striped_set/boost_stable_vector.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/boost_stable_vector.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            boost::container::stable_vector<T>,
+                            cds::opt::less< std::less<T> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        The vector is ordered.
+                        Template argument pack \p Options <b>must</b> contain cds::opt::less or cds::opt::compare for type \p T stored in the list
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::set</td>
+                    <td><tt><cds/container/striped_set/boost_set.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/boost_set.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            boost::container::set< T, std::less<T> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::flat_set</td>
+                    <td><tt><cds/container/striped_set/boost_flat_set.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/boost_flat_set.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            boost::container::flat_set< T, std::less<T> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::unordered_set</td>
+                    <td><tt><cds/container/striped_set/boost_unordered_set.h></tt></td>
+                    <td>\code
+                        #include <cds/container/striped_set/boost_unordered_set.h>
+                        #include <cds/container/striped_hash_set.h>
+                        typedef cds::container::StripedSet<
+                            boost::unordered_set<
+                                T,
+                                hash<T>,
+                                equal<T>
+                            >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        You should provide two different hash function \p h1 and \p h2 - one for boost::unordered_set and other for \p %StripedSet.
+                        For the best result, \p h1 and \p h2 must be orthogonal i.e. <tt> h1(X) != h2(X) </tt> for any value \p X.
+                    </td>
+                </tr>
+            </table>
+
+            You can use another container type as set's bucket.
+            Suppose, you have a container class \p MyBestContainer and you want to integrate it with \p %StripedSet as bucket type.
+            There are two possibility:
+            - either your \p MyBestContainer class has native support of bucket's interface;
+                in this case, you can use default <tt>striped_set::adapt</tt> metafunction;
+            - or your \p MyBestContainer class does not support bucket's interface, which means, that you should develop a specialization
+                <tt>cds::container::striped_set::adapt<MyBestContainer> </tt> metafunction providing necessary interface.
+
+            The <tt>striped_set::adapt< Container, Options... ></tt> metafunction has two template argument:
+            - \p Container is the class that should be used as the bucket, for example, <tt>std::list< T ></tt>.
+            - \p Options pack is the options from \p %StripedSet declaration. The \p adapt metafunction can use
+                any option from \p Options for its internal use. For example, a \p compare option can be passed to \p adapt
+                metafunction via \p Options argument of \p %StripedSet declaration.
+
+            See striped_set::adapt metafunction for the description of interface that the bucket container must provide
+            to be %StripedSet compatible.
+
+        <b>Copy policy</b>
+            There are three predefined copy policy:
+            - \p cds::container::striped_set::copy_item - copy item from old bucket to new one when resizing using copy ctor. It is default policy for
+                any compiler that do not support move semantics
+            - \p cds::container::striped_set::move_item - move item from old bucket to new one when resizing using move semantics. It is default policy for
+                any compiler that support move semantics. If compiler does not support move semantics, the move policy is the same as \p copy_item
+            - \p cds::container::striped_set::swap_item - copy item from old bucket to new one when resizing using \p std::swap. Not all containers support
+                this copy policy, see details in table below.
+
+            You can define your own copy policy specifically for your case.
+            Note, right copy policy can significantly improve the performance of resizing.
+
+            <table>
+                <tr>
+                    <th>Container</th>
+                    <th>Policies</th>
+                </tr>
+                <tr>
+                    <td>
+                        - \p std::list
+                        - \p std::vector
+                        - \p boost::list
+                        - \p boost::vector
+                        - \p boost::stable_vector
+                    </td>
+                    <td>\code
+                        struct copy_item {
+                            void operator()( std::list<T>& list, std::list<T>::iterator itInsert, std::list<T>::iterator itWhat )
+                            {
+                                list.insert( itInsert, *itWhat );
+                            }
+                        } \endcode
+
+                        \code
+                        // The type T stored in the list must be swappable
+                        struct swap_item {
+                            void operator()( std::list<T>& list, std::list<T>::iterator itInsert, std::list<T>::iterator itWhat )
+                            {
+                                std::swap( *list.insert( itInsert, T() ), *itWhat );
+                            }
+                        } \endcode
+
+                        \code
+                        struct move_item {
+                            void operator()( std::list<T>& list, std::list<T>::iterator itInsert, std::list<T>::iterator itWhat )
+                            {
+                                list.insert( itInsert, std::move( *itWhat ) );
+                            }
+                        } \endcode
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        - \p std::set
+                        - \p std::unordered_set
+                        - \p stdext::hash_set (only for MS VC++ 2008)
+                    </td>
+                    <td>\code
+                        struct copy_item {
+                            void operator()( std::set<T>& set, std::set<T>::iterator itWhat )
+                            {
+                                set.insert( *itWhat );
+                            }
+                        } \endcode
+                    \p swap_item is not applicable (same as \p copy_item)
+
+                    \code
+                        struct move_item {
+                            void operator()( std::set<T>& set, std::set<T>::iterator itWhat )
+                            {
+                                set.insert( std::move( *itWhat ));
+                            }
+                        } \endcode
+                </tr>
+                <tr>
+                    <td>
+                        - \p boost::container::slist
+                    </td>
+                    <td>\code
+                        struct copy_item {
+                            void operator()( bc::slist<T>& list, bc::slist<T>::iterator itInsert, bc::slist<T>::iterator itWhat )
+                            {
+                                list.insert_after( itInsert, *itWhat );
+                            }
+                        } \endcode
+
+                        \code
+                        // The type T stored in the list must be swappable
+                        struct swap_item {
+                            void operator()( bc::slist<T>& list, bc::slist<T>::iterator itInsert, bc::slist<T>::iterator itWhat )
+                            {
+                                std::swap( *list.insert_after( itInsert, T() ), *itWhat );
+                            }
+                        } \endcode
+
+                        \code
+                        struct move_item {
+                            void operator()( bc::slist<T>& list, bc::slist<T>::iterator itInsert, bc::slist<T>::iterator itWhat )
+                            {
+                                list.insert_after( itInsert, std::move( *itWhat ) );
+                            }
+                        } \endcode
+                    </td>
+                </tr>
+            </table>
+
+        <b>Advanced functions</b>
+
+            <b>libcds</b> provides some advanced functions like \p erase_with, \p find_with,
+            that cannot be supported by all underlying containers.
+            The table below shows whether underlying container supports those functions
+            (the sign "+" means "container supports the function"):
+
+            <table>
+                <tr>
+                    <th>Container</th>
+                    <th>\p find_with</th>
+                    <th>\p erse_with</th>
+                </tr>
+                <tr>
+                    <td> \p std::list</td>
+                    <td>+</td>
+                    <td>+</td>
+                </tr>
+                <tr>
+                    <td> \p std::vector</td>
+                    <td>+</td>
+                    <td>+</td>
+                </tr>
+                <tr>
+                    <td> \p std::set</td>
+                    <td>-</td>
+                    <td>-</td>
+                </tr>
+                <tr>
+                    <td> \p std::unordered_set</td>
+                    <td>-</td>
+                    <td>-</td>
+                </tr>
+                <tr>
+                    <td>\p stdext::hash_set (only for MS VC++ 2008)</td>
+                    <td>-</td>
+                    <td>-</td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::slist</td>
+                    <td>+</td>
+                    <td>+</td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::list</td>
+                    <td>+</td>
+                    <td>+</td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::vector</td>
+                    <td>+</td>
+                    <td>+</td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::stable_vector</td>
+                    <td>+</td>
+                    <td>+</td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::set</td>
+                    <td>-</td>
+                    <td>-</td>
+                </tr>
+                <tr>
+                    <td> \p boost::container::flat_set</td>
+                    <td>-</td>
+                    <td>-</td>
+                </tr>
+                <tr>
+                    <td> \p boost::unordered_set</td>
+                    <td>-</td>
+                    <td>-</td>
+                </tr>
+            </table>
+    */
+    template <class Container, CDS_DECL_OPTIONS9>
+    class StripedSet: protected intrusive::StripedSet<Container, CDS_OPTIONS9>
+    {
+        //@cond
+        typedef intrusive::StripedSet<Container, CDS_OPTIONS9>  base_class;
+        //@endcond
+    public:
+        //@cond
+        typedef typename base_class::default_options    default_options;
+        typedef typename base_class::options            options;
+        //@endcond
+
+        typedef Container                           underlying_container_type   ;   ///< original intrusive container type for the bucket
+        typedef typename base_class::bucket_type    bucket_type ;   ///< container type adapted for hash set
+        typedef typename bucket_type::value_type    value_type  ;   ///< value type stored in the set
+
+        typedef typename base_class::hash               hash            ; ///< Hash functor
+        typedef typename base_class::item_counter       item_counter    ; ///< Item counter
+        typedef typename base_class::resizing_policy    resizing_policy ; ///< Resizing policy
+        typedef typename base_class::allocator_type     allocator_type  ; ///< allocator type specified in options.
+        typedef typename base_class::mutex_policy       mutex_policy    ; ///< Mutex policy
+
+    protected:
+        //@cond
+        typedef typename base_class::scoped_cell_lock   scoped_cell_lock;
+        typedef typename base_class::scoped_full_lock   scoped_full_lock;
+        typedef typename base_class::scoped_resize_lock scoped_resize_lock;
+        //@endcond
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor {
+            void operator()( value_type& )
+            {}
+        };
+
+        struct empty_erase_functor  {
+            void operator()( value_type const& )
+            {}
+        };
+
+        struct empty_find_functor {
+            template <typename Q>
+            void operator()( value_type& item, Q& val )
+            {}
+        };
+#   endif
+        //@endcond
+
+    public:
+        /// Default ctor. The initial capacity is 16.
+        StripedSet()
+        : base_class()
+        {}
+
+        /// Ctor with initial capacity specified
+        StripedSet(
+            size_t nCapacity    ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
+        ) : base_class( nCapacity )
+        {}
+
+        /// Ctor with resizing policy (copy semantics)
+        /**
+            This constructor initializes m_ResizingPolicy member with copy of \p resizingPolicy parameter
+        */
+        StripedSet(
+            size_t nCapacity    ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
+            ,resizing_policy const& resizingPolicy  ///< Resizing policy
+        ) : base_class( nCapacity, resizingPolicy )
+        {}
+
+#ifdef CDS_RVALUE_SUPPORT
+        /// Ctor with resizing policy (move semantics)
+        /**
+            This constructor initializes m_ResizingPolicy member moving \p resizingPolicy parameter
+            Move semantics is used. Available only for the compilers that supports C++11 rvalue reference.
+        */
+        StripedSet(
+            size_t nCapacity    ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
+            ,resizing_policy&& resizingPolicy  ///< Resizing policy
+            ) : base_class( nCapacity, std::forward<resizing_policy>(resizingPolicy) )
+        {}
+#endif
+
+        /// Destructor destroys internal data
+        ~StripedSet()
+        {}
+
+    public:
+        /// Inserts new node
+        /**
+            The function creates a node with copy of \p val value
+            and then inserts the node created into the set.
+
+            The type \p Q should contain as minimum the complete key for the node.
+            The object of \ref value_type should be constructible from a value of type \p Q.
+            In trivial case, \p Q is equal to \ref value_type.
+
+            Returns \p true if \p val is inserted into the set, \p false otherwise.
+        */
+        template <typename Q>
+        bool insert( Q const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert( val, []( value_type& ) {} );
+#       else
+            return insert( val, empty_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls \p f functor to initialize value-field of new item .
+
+            The functor signature is:
+            \code
+                void func( value_type& item );
+            \endcode
+            where \p item is the item inserted.
+
+            The type \p Q can differ from \ref value_type of items storing in the set.
+            Therefore, the \p value_type should be constructible from type \p Q.
+
+            The user-defined functor is called only if the inserting is success. It can be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Q, typename Func>
+        bool insert( Q const& val, Func f )
+        {
+            bool bOk;
+            bool bResize;
+            size_t nHash = base_class::hashing( val );
+            bucket_type * pBucket;
+            {
+                scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
+                pBucket = base_class::bucket( nHash );
+                bOk = pBucket->insert( val, f );
+                bResize = bOk && base_class::m_ResizingPolicy( ++base_class::m_ItemCounter, *this, *pBucket );
+            }
+
+            if ( bResize )
+                base_class::resize();
+            return bOk;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Inserts data of type \p %value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            Returns \p true if inserting successful, \p false otherwise.
+
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            bool bOk;
+            bool bResize;
+            size_t nHash = base_class::hashing( value_type( std::forward<Args>(args)...));
+            bucket_type * pBucket;
+            {
+                scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
+                pBucket = base_class::bucket( nHash );
+
+                bOk = pBucket->emplace( std::forward<Args>(args)...);
+                bResize = bOk && base_class::m_ResizingPolicy( ++base_class::m_ItemCounter, *this, *pBucket );
+            }
+
+            if ( bResize )
+                base_class::resize();
+            return bOk;
+        }
+#   endif
+
+        /// Ensures that the \p val exists in the set
+        /**
+            The operation performs inserting or changing data.
+
+            If the \p val key not found in the set, then the new item created from \p val
+            is inserted into the set. Otherwise, the functor \p func is called with the item found.
+            The functor \p Func should be a function with signature:
+            \code
+                void func( bool bNew, value_type& item, const Q& val );
+            \endcode
+            or a functor:
+            \code
+                struct my_functor {
+                    void operator()( bool bNew, value_type& item, const Q& val );
+                };
+            \endcode
+
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+            - \p val - argument \p val passed into the \p ensure function
+
+            The functor can change non-key fields of the \p item.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt>.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p val key
+            already exists.
+        */
+        template <typename Q, typename Func>
+        std::pair<bool, bool> ensure( Q const& val, Func func )
+        {
+            std::pair<bool, bool> result;
+            bool bResize;
+            size_t nHash = base_class::hashing( val );
+            bucket_type * pBucket;
+            {
+                scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
+                pBucket = base_class::bucket( nHash );
+
+                result = pBucket->ensure( val, func );
+                bResize = result.first && result.second && base_class::m_ResizingPolicy( ++base_class::m_ItemCounter, *this, *pBucket );
+            }
+
+            if ( bResize )
+                base_class::resize();
+            return result;
+        }
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_StripedSet_erase
+
+            The set item comparator should be able to compare the type \p value_type and the type \p Q.
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q>
+        bool erase( Q const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase( key, [](value_type const&) {} );
+#       else
+            return erase( key, empty_erase_functor() );
+#       endif
+        }
+
+#ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_StripedSet_erase "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+
+            @note This function is enabled if the compiler supports C++11
+            default template arguments for function template <b>and</b> the underlying container
+            supports \p %erase_with feature.
+        */
+        template < typename Q, typename Less
+            ,typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_erase_with >::type >
+        bool erase_with( Q const& key, Less pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_with( key, pred, [](value_type const&) {} );
+#       else
+            return erase_with( key, pred, empty_erase_functor() );
+#       endif
+        }
+#endif
+
+        /// Delete \p key from the set
+        /** \anchor cds_nonintrusive_StripedSet_erase_func
+
+            The function searches an item with key \p key, calls \p f functor with item found
+            and deletes it. If \p key is not found, the functor is not called.
+
+            The functor \p Func interface is:
+            \code
+            struct functor {
+                void operator()(value_type const& val);
+            };
+            \endcode
+            The functor can be passed by value or by reference using <tt>boost:ref</tt>
+
+            Return \p true if key is found and deleted, \p false otherwise
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& key, Func f )
+        {
+            bool bOk;
+            size_t nHash = base_class::hashing( key );
+            {
+                scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
+                bucket_type * pBucket = base_class::bucket( nHash );
+
+                bOk = pBucket->erase( key, f );
+            }
+
+            if ( bOk )
+                --base_class::m_ItemCounter;
+            return bOk;
+        }
+
+#ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_nonintrusive_StripedSet_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+
+            @note This function is enabled if the compiler supports C++11
+            default template arguments for function template <b>and</b> the underlying container
+            supports \p %erase_with feature.
+        */
+        template < typename Q, typename Less, typename Func
+            , typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_erase_with >::type >
+        bool erase_with( Q const& key, Less pred, Func f )
+        {
+            bool bOk;
+            size_t nHash = base_class::hashing( key );
+            {
+                scoped_cell_lock sl( base_class::m_MutexPolicy, nHash );
+                bucket_type * pBucket = base_class::bucket( nHash );
+
+                bOk = pBucket->erase( key, pred, f );
+            }
+
+            if ( bOk )
+                --base_class::m_ItemCounter;
+            return bOk;
+        }
+#endif
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_StripedSet_find_func
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            The type \p Q can differ from \ref value_type of items storing in the container.
+            Therefore, the \p value_type should be comparable with type \p Q.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return base_class::find( val, f );
+        }
+
+#ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+        /// Find the key \p val using \p pred predicate
+        /**
+            The function is an analog of \ref cds_nonintrusive_StripedSet_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+
+            @note This function is enabled if the compiler supports C++11
+            default template arguments for function template <b>and</b> the underlying container
+            supports \p %find_with feature.
+        */
+        template <typename Q, typename Less, typename Func
+            , typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_find_with >::type >
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return base_class::find_with( val, pred, f );
+        }
+#endif
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_StripedSet_find_cfunc
+
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+
+            The type \p Q can differ from \ref value_type of items storing in the container.
+            Therefore, the \p value_type should be comparable with type \p Q.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return base_class::find( val, f );
+        }
+
+#ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+        /// Find the key \p val using \p pred predicate
+        /**
+            The function is an analog of \ref cds_nonintrusive_StripedSet_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+
+            @note This function is enabled if the compiler supports C++11
+            default template arguments for function template <b>and</b> the underlying container
+            supports \p %find_with feature.
+        */
+        template <typename Q, typename Less, typename Func
+            , typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_find_with >::type >
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return base_class::find_with( val, pred, f );
+        }
+#endif
+
+        /// Find the key \p val
+        /** \anchor cds_nonintrusive_StripedSet_find_val
+
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \ref value_type.
+        */
+        template <typename Q>
+        bool find( Q const& val )
+        {
+            return base_class::find( val );
+        }
+
+#ifdef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+        /// Find the key \p val using \p pred predicate
+        /**
+            The function is an analog of \ref cds_nonintrusive_StripedSet_find_val "find(Q const&)"
+            but \p pred is used for key comparing
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+
+            @note This function is enabled if the compiler supports C++11
+            default template arguments for function template <b>and</b> the underlying container
+            supports \p %find_with feature.
+        */
+        template <typename Q, typename Less
+            , typename Bucket = bucket_type, typename = typename std::enable_if< Bucket::has_find_with >::type >
+        bool find_with( Q const& val, Less pred )
+        {
+            return base_class::find_with( val, pred );
+        }
+#endif
+
+        /// Clears the set
+        /**
+            The function erases all items from the set.
+        */
+        void clear()
+        {
+            return base_class::clear();
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+        */
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns the size of hash table
+        /**
+            The hash table size is non-constant and can be increased via resizing.
+        */
+        size_t bucket_count() const
+        {
+            return base_class::bucket_count();
+        }
+
+        /// Returns lock array size
+        size_t lock_count() const
+        {
+            return base_class::lock_count();
+        }
+
+        /// Returns resizing policy object
+        resizing_policy& get_resizing_policy()
+        {
+            return base_class::get_resizing_policy();
+        }
+
+        /// Returns resizing policy (const version)
+        resizing_policy const& get_resizing_policy() const
+        {
+            return base_class::get_resizing_policy();
+        }
+    };
+
+}} // namespace cds::container
+
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_H
diff --git a/cds/container/striped_set/adapter.h b/cds/container/striped_set/adapter.h
new file mode 100644 (file)
index 0000000..267305b
--- /dev/null
@@ -0,0 +1,491 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_ADAPTER_H
+
+#include <cds/intrusive/striped_set/adapter.h>
+#include <cds/intrusive/striped_set/striping_policy.h>
+
+namespace cds { namespace container {
+    /// Striped hash set related definitions
+    namespace striped_set {
+
+        //@cond
+        struct copy_item    ;   // copy_item_policy tag
+        template <typename Container>
+        struct copy_item_policy;
+
+        struct swap_item    ;   // swap_item_policy tag
+        template <typename Container>
+        struct swap_item_policy;
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        struct move_item    ;   // move_item_policy tag
+        template <typename Container>
+        struct move_item_policy;
+#else
+        typedef copy_item move_item ;   // if move semantics is not supported, move_item is synonym for copy_item
+#endif
+        //@endcond
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Default adapter for hash set
+        /**
+            By default, the metafunction does not make any transformation for container type \p Container.
+            \p Container should provide interface suitable for the hash set.
+
+            The \p Options template argument contains a list of options
+            that has been passed to cds::container::StripedSet.
+
+        <b>Bucket interface</b>
+
+            The result of metafunction is a container (a bucket) that should support the following interface:
+
+            Public typedefs that the bucket should provide:
+                - \p value_type - the type of the item in the bucket
+                - \p iterator - bucket's item iterator
+                - \p const_iterator - bucket's item constant iterator
+                - \p default_resizing_policy - defalt resizing policy preferable for the container.
+                    By default, the library defines striped_set::load_factor_resizing<4> for sequential containers like
+                    std::list, std::vector, and striped_set::no_resizing for ordered container like std::set,
+                    std::unordered_set.
+
+            <b>Insert value \p val of type \p Q</b>
+            \code template <typename Q, typename Func> bool insert( const Q& val, Func f ) ; \endcode
+                The function allows to split creating of new item into two part:
+                - create item with key only from \p val
+                - try to insert new item into the container
+                - if inserting is success, calls \p f functor to initialize value-field of the new item.
+
+                The functor signature is:
+                \code
+                    void func( value_type& item );
+                \endcode
+                where \p item is the item inserted.
+
+                The type \p Q can differ from \ref value_type of items storing in the container.
+                Therefore, the \p value_type should be comparable with type \p Q and constructible from type \p Q,
+
+                The user-defined functor is called only if the inserting is success. It can be passed by reference
+                using <tt>boost::ref</tt>
+                <hr>
+
+            <b>Inserts data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt></b>
+            \code template <typename... Args> bool emplace( Args&&... args ) ; \endcode
+                Returns \p true if inserting successful, \p false otherwise.
+
+                This function should be available only for compiler that supports
+                variadic template and move semantics
+            <hr>
+
+            <b>Ensures that the \p item exists in the container</b>
+            \code template <typename Q, typename Func> std::pair<bool, bool> ensure( const Q& val, Func func ) \endcode
+                The operation performs inserting or changing data.
+
+                If the \p val key not found in the container, then the new item created from \p val
+                is inserted. Otherwise, the functor \p func is called with the item found.
+                The \p Func functor has interface:
+                \code
+                    void func( bool bNew, value_type& item, const Q& val );
+                \endcode
+                or like a functor:
+                \code
+                    struct my_functor {
+                        void operator()( bool bNew, value_type& item, const Q& val );
+                    };
+                \endcode
+
+                where arguments are:
+                - \p bNew - \p true if the item has been inserted, \p false otherwise
+                - \p item - container's item
+                - \p val - argument \p val passed into the \p ensure function
+
+                The functor can change non-key fields of the \p item.
+
+                The type \p Q can differ from \ref value_type of items storing in the container.
+                Therefore, the \p value_type should be comparable with type \p Q and constructible from type \p Q,
+
+                You can pass \p func argument by reference using <tt>boost::ref</tt>.
+
+                Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+                \p second is true if new item has been added or \p false if the item with \p val key
+                already exists.
+                <hr>
+
+
+            <b>Delete \p key</b>
+            \code template <typename Q, typename Func> bool erase( const Q& key, Func f ) \endcode
+                The function searches an item with key \p key, calls \p f functor
+                and deletes the item. If \p key is not found, the functor is not called.
+
+                The functor \p Func interface is:
+                \code
+                struct extractor {
+                    void operator()(value_type const& val);
+                };
+                \endcode
+                The functor can be passed by reference using <tt>boost:ref</tt>
+
+                The type \p Q can differ from \ref value_type of items storing in the container.
+                Therefore, the \p value_type should be comparable with type \p Q.
+
+                Return \p true if key is found and deleted, \p false otherwise
+                <hr>
+
+
+            <b>Find the key \p val </b>
+            \code template <typename Q, typename Func> bool find( Q& val, Func f ) \endcode
+                The function searches the item with key equal to \p val and calls the functor \p f for item found.
+                The interface of \p Func functor is:
+                \code
+                struct functor {
+                    void operator()( value_type& item, Q& val );
+                };
+                \endcode
+                where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+                You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+                The functor can change non-key fields of \p item.
+                The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+                can modify both arguments.
+
+                The type \p Q can differ from \ref value_type of items storing in the container.
+                Therefore, the \p value_type should be comparable with type \p Q.
+
+                The function returns \p true if \p val is found, \p false otherwise.
+                <hr>
+
+            <b>Clears the container</b>
+            \code void clear() \endcode
+            <hr>
+
+            <b>Get size of bucket</b>
+            \code size_t size() const \endcode
+            This function can be required by some resizing policy
+            <hr>
+
+            <b>Move item when resizing</b>
+            \code void move_item( adapted_container& from, iterator it ) \endcode
+            This helper function is invented for the set resizing when the item
+            pointed by \p it iterator is copied from an old bucket \p from to a new bucket
+            pointed by \p this.
+            <hr>
+
+        */
+        template < typename Container, CDS_DECL_OPTIONS >
+        class adapt
+        {
+        public:
+            typedef Container   type            ;   ///< adapted container type
+            typedef typename type::value_type value_type  ;   ///< value type stored in the container
+        };
+#else   // CDS_DOXYGEN_INVOKED
+        using cds::intrusive::striped_set::adapt;
+#endif
+
+        //@cond
+        using cds::intrusive::striped_set::adapted_sequential_container;
+        using cds::intrusive::striped_set::adapted_container;
+
+        using cds::intrusive::striped_set::load_factor_resizing;
+        using cds::intrusive::striped_set::single_bucket_size_threshold;
+        using cds::intrusive::striped_set::no_resizing;
+
+        using cds::intrusive::striped_set::striping;
+        using cds::intrusive::striped_set::refinable;
+        //@endcond
+
+        //@cond
+        namespace details {
+
+            template <class Set>
+            struct boost_set_copy_policies
+            {
+                struct copy_item_policy
+                {
+                    typedef Set set_type;
+                    typedef typename set_type::iterator iterator;
+
+                    void operator()( set_type& set, iterator itWhat )
+                    {
+                        set.insert( *itWhat );
+                    }
+                };
+
+                typedef copy_item_policy swap_item_policy;
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+              struct move_item_policy
+                {
+                    typedef Set set_type;
+                    typedef typename set_type::iterator iterator;
+
+                    void operator()( set_type& set, iterator itWhat )
+                    {
+                        set.insert( std::move( *itWhat ) );
+                    }
+                };
+#endif
+            };
+
+            template <class Set, CDS_SPEC_OPTIONS>
+            class boost_set_adapter: public striped_set::adapted_container
+            {
+            public:
+                typedef Set container_type;
+
+                typedef typename container_type::value_type     value_type      ;   ///< value type stored in the container
+                typedef typename container_type::iterator       iterator        ;   ///< container iterator
+                typedef typename container_type::const_iterator const_iterator  ;   ///< container const iterator
+
+                static bool const has_find_with = false;
+                static bool const has_erase_with = false;
+
+            private:
+                typedef typename cds::opt::select<
+                    typename cds::opt::value<
+                        typename cds::opt::find_option<
+                            cds::opt::copy_policy< cds::container::striped_set::move_item >
+                            , CDS_OPTIONS
+                        >::type
+                    >::copy_policy
+                    , cds::container::striped_set::copy_item, copy_item_policy<container_type>
+                    , cds::container::striped_set::swap_item, swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                    , cds::container::striped_set::move_item, move_item_policy<container_type>
+#endif
+                >::type copy_item;
+
+            private:
+                container_type  m_Set;
+
+            public:
+                boost_set_adapter()
+                {}
+
+                container_type& base_container()
+                {
+                    return m_Set;
+                }
+
+                template <typename Q, typename Func>
+                bool insert( const Q& val, Func f )
+                {
+                    std::pair<iterator, bool> res = m_Set.insert( value_type(val) );
+                    if ( res.second )
+                        cds::unref(f)( const_cast<value_type&>(*res.first) );
+                    return res.second;
+                }
+
+#           ifdef CDS_EMPLACE_SUPPORT
+                template <typename... Args>
+                bool emplace( Args&&... args )
+                {
+                    std::pair<iterator, bool> res = m_Set.emplace( std::forward<Args>(args)... );
+                    return res.second;
+                }
+#           endif
+
+                template <typename Q, typename Func>
+                std::pair<bool, bool> ensure( const Q& val, Func func )
+                {
+                    std::pair<iterator, bool> res = m_Set.insert( value_type(val) );
+                    cds::unref(func)( res.second, const_cast<value_type&>(*res.first), val );
+                    return std::make_pair( true, res.second );
+                }
+
+                template <typename Q, typename Func>
+                bool erase( const Q& key, Func f )
+                {
+                    const_iterator it = m_Set.find( value_type(key) );
+                    if ( it == m_Set.end() )
+                        return false;
+                    cds::unref(f)( const_cast<value_type&>(*it) );
+                    m_Set.erase( it );
+                    return true;
+                }
+
+                template <typename Q, typename Func>
+                bool find( Q& val, Func f )
+                {
+                    iterator it = m_Set.find( value_type(val) );
+                    if ( it == m_Set.end() )
+                        return false;
+                    cds::unref(f)( const_cast<value_type&>(*it), val );
+                    return true;
+                }
+
+                void clear()
+                {
+                    m_Set.clear();
+                }
+
+                iterator begin()                { return m_Set.begin(); }
+                const_iterator begin() const    { return m_Set.begin(); }
+                iterator end()                  { return m_Set.end(); }
+                const_iterator end() const      { return m_Set.end(); }
+
+                void move_item( adapted_container& /*from*/, iterator itWhat )
+                {
+                    assert( m_Set.find( *itWhat ) == m_Set.end() );
+                    copy_item()( m_Set, itWhat );
+                }
+
+                size_t size() const
+                {
+                    return m_Set.size();
+                }
+            };
+
+            template <class Map>
+            struct boost_map_copy_policies {
+                struct copy_item_policy {
+                    typedef Map map_type;
+                    typedef typename map_type::value_type pair_type;
+                    typedef typename map_type::iterator    iterator;
+
+                    void operator()( map_type& map, iterator itWhat )
+                    {
+                        map.insert( *itWhat );
+                    }
+                };
+
+                struct swap_item_policy {
+                    typedef Map map_type;
+                    typedef typename map_type::value_type pair_type;
+                    typedef typename map_type::iterator    iterator;
+
+                    void operator()( map_type& map, iterator itWhat )
+                    {
+                        std::pair< iterator, bool > ret = map.insert( pair_type( itWhat->first, typename pair_type::second_type() ));
+                        assert( ret.second )    ;   // successful insertion
+                        std::swap( ret.first->second, itWhat->second );
+                    }
+                };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                struct move_item_policy {
+                    typedef Map map_type;
+                    typedef typename map_type::value_type pair_type;
+                    typedef typename map_type::iterator    iterator;
+
+                    void operator()( map_type& map, iterator itWhat  )
+                    {
+                        map.insert( std::move( *itWhat ) );
+                    }
+                };
+#endif
+            };
+
+            template <class Map, CDS_SPEC_OPTIONS>
+            class boost_map_adapter: public striped_set::adapted_container
+            {
+            public:
+                typedef Map container_type;
+
+                typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+                typedef typename container_type::key_type   key_type;
+                typedef typename container_type::mapped_type    mapped_type;
+                typedef typename container_type::iterator       iterator        ;   ///< container iterator
+                typedef typename container_type::const_iterator const_iterator  ;   ///< container const iterator
+
+                static bool const has_find_with = false;
+                static bool const has_erase_with = false;
+
+            private:
+                typedef typename cds::opt::select<
+                    typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                    >::copy_policy
+                    , cds::container::striped_set::copy_item, copy_item_policy<container_type>
+                    , cds::container::striped_set::swap_item, swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                    , cds::container::striped_set::move_item, move_item_policy<container_type>
+#endif
+                >::type copy_item;
+
+            private:
+                container_type  m_Map;
+
+            public:
+                template <typename Q, typename Func>
+                bool insert( const Q& key, Func f )
+                {
+                    std::pair<iterator, bool> res = m_Map.insert( value_type( key, mapped_type() ) );
+                    if ( res.second )
+                        cds::unref(f)( *res.first );
+                    return res.second;
+                }
+
+#           ifdef CDS_EMPLACE_SUPPORT
+                template <typename Q, typename... Args>
+                bool emplace( Q&& key, Args&&... args )
+                {
+                    std::pair<iterator, bool> res = m_Map.emplace( std::forward<Q>(key), std::move( mapped_type( std::forward<Args>(args)...)));
+                    return res.second;
+                }
+#           endif
+
+                template <typename Q, typename Func>
+                std::pair<bool, bool> ensure( const Q& val, Func func )
+                {
+                    std::pair<iterator, bool> res = m_Map.insert( value_type( val, mapped_type() ));
+                    cds::unref(func)( res.second, *res.first );
+                    return std::make_pair( true, res.second );
+                }
+
+                template <typename Q, typename Func>
+                bool erase( const Q& key, Func f )
+                {
+                    iterator it = m_Map.find( key_type(key) );
+                    if ( it == m_Map.end() )
+                        return false;
+                    cds::unref(f)( *it );
+                    m_Map.erase( it );
+                    return true;
+                }
+
+                template <typename Q, typename Func>
+                bool find( Q& val, Func f )
+                {
+                    iterator it = m_Map.find( key_type(val) );
+                    if ( it == m_Map.end() )
+                        return false;
+                    cds::unref(f)( *it, val );
+                    return true;
+                }
+
+                void clear()
+                {
+                    m_Map.clear();
+                }
+
+                iterator begin()                { return m_Map.begin(); }
+                const_iterator begin() const    { return m_Map.begin(); }
+                iterator end()                  { return m_Map.end(); }
+                const_iterator end() const      { return m_Map.end(); }
+
+                void move_item( adapted_container& /*from*/, iterator itWhat )
+                {
+                    assert( m_Map.find( itWhat->first ) == m_Map.end() );
+                    copy_item()( m_Map, itWhat );
+                }
+
+                size_t size() const
+                {
+                    return m_Map.size();
+                }
+            };
+
+        } // namespace details
+        //@endcond
+
+    }   // namespace striped_set
+}} // namespace cds::container
+
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_ADAPTER_H
diff --git a/cds/container/striped_set/boost_flat_set.h b/cds/container/striped_set/boost_flat_set.h
new file mode 100644 (file)
index 0000000..d1d8840
--- /dev/null
@@ -0,0 +1,57 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_FLAT_SET_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_BOOST_FLAT_SET_ADAPTER_H
+
+#include <boost/version.hpp>
+#if BOOST_VERSION < 104800
+#   error "For boost::container::flat_set you must use boost 1.48 or above"
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <boost/container/flat_set.hpp>
+
+//#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION >= 1700
+//#   error "boost::container::flat_set is not compatible with MS VC++ 11"
+//#endif
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for boost::container::flat_set
+        template <typename T, typename Traits, typename Alloc>
+        struct copy_item_policy< boost::container::flat_set< T, Traits, Alloc > >
+            : public details::boost_set_copy_policies< boost::container::flat_set< T, Traits, Alloc > >::copy_item_policy
+        {};
+
+        // Swap policy is not defined for boost::container::flat_set
+        template <typename T, typename Traits, typename Alloc>
+        struct swap_item_policy< boost::container::flat_set< T, Traits, Alloc > >
+            : public details::boost_set_copy_policies< boost::container::flat_set< T, Traits, Alloc > >::swap_item_policy
+        {};
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for boost::container::flat_set
+        template <typename T, typename Traits, typename Alloc>
+        struct move_item_policy< boost::container::flat_set< T, Traits, Alloc > >
+            : public details::boost_set_copy_policies< boost::container::flat_set< T, Traits, Alloc > >::move_item_policy
+        {};
+#endif
+
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+    template <typename T, class Traits, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::container::flat_set<T, Traits, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::container::flat_set<T, Traits, Alloc>    container_type ;   ///< underlying container type
+        typedef cds::container::striped_set::details::boost_set_adapter< container_type, CDS_OPTIONS >    type;
+    };
+}}}
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_FLAT_SET_ADAPTER_H
diff --git a/cds/container/striped_set/boost_list.h b/cds/container/striped_set/boost_list.h
new file mode 100644 (file)
index 0000000..ffc661a
--- /dev/null
@@ -0,0 +1,266 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_LIST_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_BOOST_LIST_ADAPTER_H
+
+#include <boost/version.hpp>
+#if BOOST_VERSION < 104800
+#   error "For boost::container::list you must use boost 1.48 or above"
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <cds/ref.h>
+#include <boost/container/list.hpp>
+#include <algorithm>    // std::lower_bound
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for boost::container::list
+        template <typename T, typename Alloc>
+        struct copy_item_policy< boost::container::list< T, Alloc > >
+        {
+            typedef boost::container::list< T, Alloc > list_type;
+            typedef typename list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                itInsert = list.insert( itInsert, *itWhat );
+            }
+        };
+
+        // Swap policy for boost::container::list
+        template <typename T, typename Alloc>
+        struct swap_item_policy< boost::container::list< T, Alloc > >
+        {
+            typedef boost::container::list< T, Alloc > list_type;
+            typedef typename list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                typename list_type::value_type newVal;
+                itInsert = list.insert( itInsert, newVal );
+                std::swap( *itWhat, *itInsert );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for boost::container::list
+        template <typename T, typename Alloc>
+        struct move_item_policy< boost::container::list< T, Alloc > >
+        {
+            typedef boost::container::list< T, Alloc > list_type;
+            typedef typename list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::move( *itWhat ) );
+            }
+        };
+#endif
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// boost::container::list adapter for hash set bucket
+    template <typename T, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::container::list<T, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::container::list<T, Alloc>     container_type          ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_sequential_container
+        {
+        public:
+            typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+            typedef typename container_type::iterator      iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = true;
+            static bool const has_erase_with = true;
+
+        private:
+            //@cond
+            typedef typename cds::opt::details::make_comparator_from_option_list< value_type, CDS_OPTIONS >::type key_comparator;
+
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+
+            struct find_predicate
+            {
+                bool operator()( value_type const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( Q const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( value_type const& i1, Q const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+            };
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_List;
+            //@endcond
+
+        public:
+            adapted_container()
+            {}
+
+            template <typename Q, typename Func>
+            bool insert( Q const& val, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, *it ) != 0 ) {
+                    value_type newItem( val );
+                    it = m_List.insert( it, newItem );
+                    cds::unref( f )( *it );
+
+                    return true;
+                }
+
+                // key already exists
+                return false;
+            }
+
+#           ifdef CDS_EMPLACE_SUPPORT
+            template <typename... Args>
+            bool emplace( Args&&... args )
+            {
+                value_type val( std::forward<Args>(args)... );
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, *it ) != 0 ) {
+                    m_List.emplace( it, std::move( val ) );
+                    return true;
+                }
+                return false;
+            }
+#           endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( Q const& val, Func func )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, *it ) != 0 ) {
+                    // insert new
+                    value_type newItem( val );
+                    it = m_List.insert( it, newItem );
+                    cds::unref( func )( true, *it, val );
+                    return std::make_pair( true, true );
+                }
+                else {
+                    // already exists
+                    cds::unref( func )( false, *it, val );
+                    return std::make_pair( true, false );
+                }
+            }
+
+            template <typename Q, typename Func>
+            bool erase( Q const& key, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( key, *it ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_List.erase( it );
+
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool erase( Q const& key, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, pred );
+                if ( it == m_List.end() || pred( key, *it ) || pred( *it, key ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_List.erase( it );
+
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, *it ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& val, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, pred );
+                if ( it == m_List.end() || pred( val, *it ) || pred( *it, val ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            /// Clears the container
+            void clear()
+            {
+                m_List.clear();
+            }
+
+            iterator begin()                { return m_List.begin(); }
+            const_iterator begin() const    { return m_List.begin(); }
+            iterator end()                  { return m_List.end(); }
+            const_iterator end() const      { return m_List.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), *itWhat, find_predicate() );
+                assert( it == m_List.end() || key_comparator()( *itWhat, *it ) != 0 );
+
+                copy_item()( m_List, it, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_List.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}} // namespace cds::intrsive::striped_set
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_LIST_ADAPTER_H
diff --git a/cds/container/striped_set/boost_set.h b/cds/container/striped_set/boost_set.h
new file mode 100644 (file)
index 0000000..e26bf31
--- /dev/null
@@ -0,0 +1,56 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_SET_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_BOOST_SET_ADAPTER_H
+
+#include <boost/version.hpp>
+#if BOOST_VERSION < 104800
+#   error "For boost::container::set you must use boost 1.48 or above"
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <boost/container/set.hpp>
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for boost::container::set
+        template <typename T, typename Traits, typename Alloc>
+        struct copy_item_policy< boost::container::set< T, Traits, Alloc > >
+            : public details::boost_set_copy_policies< boost::container::set< T, Traits, Alloc > >::copy_item_policy
+        {};
+        // Copy policy for boost::container::set
+        template <typename T, typename Traits, typename Alloc>
+        struct swap_item_policy< boost::container::set< T, Traits, Alloc > >
+            : public details::boost_set_copy_policies< boost::container::set< T, Traits, Alloc > >::swap_item_policy
+        {};
+
+        // Swap policy is not defined for boost::container::set
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for boost::container::set
+        template <typename T, typename Traits, typename Alloc>
+        struct move_item_policy< boost::container::set< T, Traits, Alloc > >
+            : public details::boost_set_copy_policies< boost::container::set< T, Traits, Alloc > >::move_item_policy
+        {};
+#endif
+
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+    /// boost::container::flat_set adapter for hash set bucket
+    template <typename T, class Traits, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::container::set<T, Traits, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::container::set<T, Traits, Alloc>     container_type ;   ///< underlying container type
+        typedef cds::container::striped_set::details::boost_set_adapter< container_type, CDS_OPTIONS >    type;
+    };
+}}} // namespace cds::intrusive::striped_set
+
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_SET_ADAPTER_H
diff --git a/cds/container/striped_set/boost_slist.h b/cds/container/striped_set/boost_slist.h
new file mode 100644 (file)
index 0000000..fb8d65f
--- /dev/null
@@ -0,0 +1,277 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_SLIST_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_BOOST_SLIST_ADAPTER_H
+
+#include <cds/container/striped_set/adapter.h>
+#include <cds/ref.h>
+#include <boost/container/slist.hpp>
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for boost::container::slist
+        template <typename T, typename Alloc>
+        struct copy_item_policy< boost::container::slist< T, Alloc > >
+        {
+            typedef boost::container::slist< T, Alloc > list_type;
+            typedef typename list_type::iterator    iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert_after( itInsert, *itWhat );
+            }
+        };
+
+        // Swap policy for boost::container::slist
+        template <typename T, typename Alloc>
+        struct swap_item_policy< boost::container::slist< T, Alloc > >
+        {
+            typedef boost::container::slist< T, Alloc > list_type;
+            typedef typename list_type::iterator    iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                T newVal;
+                itInsert = list.insert_after( itInsert, newVal );
+                std::swap( *itInsert, *itWhat );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for boost::container::slist
+        template <typename T, typename Alloc>
+        struct move_item_policy< boost::container::slist< T, Alloc > >
+        {
+            typedef boost::container::slist< T, Alloc > list_type;
+            typedef typename list_type::iterator    iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert_after( itInsert, std::move( *itWhat ) );
+            }
+        };
+#endif
+
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// boost::container::slist adapter for hash set bucket
+    template <typename T, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::container::slist<T, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::container::slist<T, Alloc>     container_type          ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_sequential_container
+        {
+        public:
+            typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+            typedef typename container_type::iterator      iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = true;
+            static bool const has_erase_with = true;
+
+        private:
+            //@cond
+            typedef typename cds::opt::details::make_comparator_from_option_list< value_type, CDS_OPTIONS >::type key_comparator;
+
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+
+            template <typename Q>
+            std::pair< iterator, bool > find_prev_item( Q const& key )
+            {
+                iterator itPrev = m_List.before_begin();
+                iterator itEnd = m_List.end();
+                for ( iterator it = m_List.begin(); it != itEnd; ++it ) {
+                    int nCmp = key_comparator()( key, *it );
+                    if ( nCmp < 0 )
+                        itPrev = it;
+                    else if ( nCmp > 0 )
+                        break;
+                    else
+                        return std::make_pair( itPrev, true );
+                }
+                return std::make_pair( itPrev, false );
+            }
+
+            template <typename Q, typename Less>
+            std::pair< iterator, bool > find_prev_item( Q const& key, Less pred )
+            {
+                iterator itPrev = m_List.before_begin();
+                iterator itEnd = m_List.end();
+                for ( iterator it = m_List.begin(); it != itEnd; ++it ) {
+                    if ( pred( key, *it ))
+                        itPrev = it;
+                    else if ( pred( *it, key ) )
+                        break;
+                    else
+                        return std::make_pair( itPrev, true );
+                }
+                return std::make_pair( itPrev, false );
+            }
+
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_List;
+            //@endcond
+
+        public:
+            adapted_container()
+            {}
+
+            template <typename Q, typename Func>
+            bool insert( const Q& val, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( val );
+                if ( !pos.second ) {
+                    value_type newItem( val );
+                    pos.first = m_List.insert_after( pos.first, newItem );
+                    cds::unref( f )( *pos.first );
+                    return true;
+                }
+
+                // key already exists
+                return false;
+            }
+
+#           ifdef CDS_EMPLACE_SUPPORT
+            template <typename... Args>
+            bool emplace( Args&&... args )
+            {
+                value_type val( std::forward<Args>(args)... );
+                std::pair< iterator, bool > pos = find_prev_item( val );
+                if ( !pos.second ) {
+                    m_List.emplace_after( pos.first, std::move( val ) );
+                    return true;
+                }
+                return false;
+            }
+#           endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& val, Func func )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( val );
+                if ( !pos.second ) {
+                    // insert new
+                    value_type newItem( val );
+                    pos.first = m_List.insert_after( pos.first, newItem );
+                    cds::unref( func )( true, *pos.first, val );
+                    return std::make_pair( true, true );
+                }
+                else {
+                    // already exists
+                    cds::unref( func )( false, *(++pos.first), val );
+                    return std::make_pair( true, false );
+                }
+            }
+
+            template <typename Q, typename Func>
+            bool erase( Q const& key, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( key );
+                if ( !pos.second )
+                    return false;
+
+                // key exists
+                iterator it = pos.first;
+                cds::unref( f )( *(++it) );
+                m_List.erase_after( pos.first );
+
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool erase( Q const& key, Less pred, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( key, pred );
+                if ( !pos.second )
+                    return false;
+
+                // key exists
+                iterator it = pos.first;
+                cds::unref( f )( *(++it) );
+                m_List.erase_after( pos.first );
+
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( val );
+                if ( !pos.second )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *(++pos.first), val );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& val, Less pred, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( val, pred );
+                if ( !pos.second )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *(++pos.first), val );
+                return true;
+            }
+
+            void clear()
+            {
+                m_List.clear();
+            }
+
+            iterator begin()                { return m_List.begin(); }
+            const_iterator begin() const    { return m_List.begin(); }
+            iterator end()                  { return m_List.end(); }
+            const_iterator end() const      { return m_List.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( *itWhat );
+                assert( !pos.second );
+
+                copy_item()( m_List, pos.first, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_List.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_SLIST_ADAPTER_H
diff --git a/cds/container/striped_set/boost_stable_vector.h b/cds/container/striped_set/boost_stable_vector.h
new file mode 100644 (file)
index 0000000..d83a55a
--- /dev/null
@@ -0,0 +1,354 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_STABLE_VECTOR_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_BOOST_STABLE_VECTOR_ADAPTER_H
+
+#include <boost/version.hpp>
+#if BOOST_VERSION < 104800
+#   error "For boost::container::stable_vector you must use boost 1.48 or above"
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <cds/ref.h>
+#include <boost/container/stable_vector.hpp>
+#include <algorithm>    // std::lower_bound
+#include <utility>      // std::pair
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for boost::container::stable_vector
+        template <typename T, typename Alloc>
+        struct copy_item_policy< boost::container::stable_vector< T, Alloc > >
+        {
+            typedef boost::container::stable_vector< T, Alloc > vector_type;
+            typedef typename vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, *itWhat );
+            }
+        };
+
+        // Swap policy for boost::container::stable_vector
+        template <typename T, typename Alloc>
+        struct swap_item_policy< boost::container::stable_vector< T, Alloc > >
+        {
+            typedef boost::container::stable_vector< T, Alloc > vector_type;
+            typedef typename vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                typename vector_type::value_type newVal;
+                itInsert = vec.insert( itInsert, newVal );
+                std::swap( *itInsert, *itWhat );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for boost::container::stable_vector
+        template <typename T, typename Alloc>
+        struct move_item_policy< boost::container::stable_vector< T, Alloc > >
+        {
+            typedef boost::container::stable_vector< T, Alloc > vector_type;
+            typedef typename vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, std::move( *itWhat ));
+            }
+        };
+#endif
+
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+    /// boost::container::stable_vector adapter for hash set bucket
+    template <typename T, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::container::stable_vector<T, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::container::stable_vector<T, Alloc>     container_type          ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_sequential_container
+        {
+        public:
+            typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+            typedef typename container_type::iterator      iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = true;
+            static bool const has_erase_with = true;
+
+        private:
+            //@cond
+            typedef typename cds::opt::details::make_comparator_from_option_list< value_type, CDS_OPTIONS >::type key_comparator;
+
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+
+            struct find_predicate
+            {
+                bool operator()( value_type const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( Q const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( value_type const& i1, Q const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+            };
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_Vector;
+            //@endcond
+
+        public:
+
+            /// Insert value \p val of type \p Q into the container
+            /**
+                The function allows to split creating of new item into two part:
+                - create item with key only from \p val
+                - try to insert new item into the container
+                - if inserting is success, calls \p f functor to initialize value-field of the new item.
+
+                The functor signature is:
+                \code
+                    void func( value_type& item );
+                \endcode
+                where \p item is the item inserted.
+
+                The type \p Q may differ from \ref value_type of items storing in the container.
+                Therefore, the \p value_type should be comparable with type \p Q and constructible from type \p Q,
+
+                The user-defined functor is called only if the inserting is success. It may be passed by reference
+                using <tt>boost::ref</tt>
+            */
+            template <typename Q, typename Func>
+            bool insert( const Q& val, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 ) {
+                    value_type newItem( val );
+                    it = m_Vector.insert( it, newItem );
+                    cds::unref( f )( *it );
+                    return true;
+                }
+                return false;
+            }
+
+#           ifdef CDS_EMPLACE_SUPPORT
+            template <typename... Args>
+            bool emplace( Args&&... args )
+            {
+                value_type val( std::forward<Args>(args)... );
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 ) {
+                    it = m_Vector.emplace( it, std::move( val ) );
+                    return true;
+                }
+                return false;
+            }
+#           endif
+
+            /// Ensures that the \p item exists in the container
+            /**
+                The operation performs inserting or changing data.
+
+                If the \p val key not found in the container, then the new item created from \p val
+                is inserted. Otherwise, the functor \p func is called with the item found.
+                The \p Func functor has interface:
+                \code
+                    void func( bool bNew, value_type& item, const Q& val );
+                \endcode
+                or like a functor:
+                \code
+                    struct my_functor {
+                        void operator()( bool bNew, value_type& item, const Q& val );
+                    };
+                \endcode
+
+                where arguments are:
+                - \p bNew - \p true if the item has been inserted, \p false otherwise
+                - \p item - container's item
+                - \p val - argument \p val passed into the \p ensure function
+
+                The functor may change non-key fields of the \p item.
+
+                The type \p Q may differ from \ref value_type of items storing in the container.
+                Therefore, the \p value_type should be comparable with type \p Q and constructible from type \p Q,
+
+                You may pass \p func argument by reference using <tt>boost::ref</tt>.
+
+                Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+                \p second is true if new item has been added or \p false if the item with \p val key
+                already exists.
+            */
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& val, Func func )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 ) {
+                    // insert new
+                    value_type newItem( val );
+                    it = m_Vector.insert( it, newItem );
+                    cds::unref( func )( true, *it, val );
+                    return std::make_pair( true, true );
+                }
+                else {
+                    // already exists
+                    cds::unref( func )( false, *it, val );
+                    return std::make_pair( true, false );
+                }
+            }
+
+            /// Delete \p key
+            /**
+                The function searches an item with key \p key, calls \p f functor
+                and deletes the item. If \p key is not found, the functor is not called.
+
+                The functor \p Func interface is:
+                \code
+                struct extractor {
+                    void operator()(value_type const& val);
+                };
+                \endcode
+                The functor may be passed by reference using <tt>boost:ref</tt>
+
+                The type \p Q may differ from \ref value_type of items storing in the container.
+                Therefore, the \p value_type should be comparable with type \p Q.
+
+                Return \p true if key is found and deleted, \p false otherwise
+            */
+            template <typename Q, typename Func>
+            bool erase( const Q& key, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), key, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( key, *it ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_Vector.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool erase( const Q& key, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), key, pred );
+                if ( it == m_Vector.end() || pred( key, *it ) || pred( *it, key ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_Vector.erase( it );
+                return true;
+            }
+
+            /// Find the key \p val
+            /**
+                The function searches the item with key equal to \p val and calls the functor \p f for item found.
+                The interface of \p Func functor is:
+                \code
+                struct functor {
+                    void operator()( value_type& item, Q& val );
+                };
+                \endcode
+                where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+                You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+                The functor may change non-key fields of \p item.
+                The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+                may modify both arguments.
+
+                The type \p Q may differ from \ref value_type of items storing in the container.
+                Therefore, the \p value_type should be comparable with type \p Q.
+
+                The function returns \p true if \p val is found, \p false otherwise.
+            */
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& val, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, pred );
+                if ( it == m_Vector.end() || pred( val, *it ) || pred( *it, val ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            /// Clears the container
+            void clear()
+            {
+                m_Vector.clear();
+            }
+
+            iterator begin()                { return m_Vector.begin(); }
+            const_iterator begin() const    { return m_Vector.begin(); }
+            iterator end()                  { return m_Vector.end(); }
+            const_iterator end() const      { return m_Vector.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), *itWhat, find_predicate() );
+                assert( it == m_Vector.end() || key_comparator()( *itWhat, *it ) != 0 );
+
+                copy_item()( m_Vector, it, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_Vector.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_STABLE_VECTOR_ADAPTER_H
diff --git a/cds/container/striped_set/boost_unordered_set.h b/cds/container/striped_set/boost_unordered_set.h
new file mode 100644 (file)
index 0000000..5c9b98b
--- /dev/null
@@ -0,0 +1,47 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_UNORDERED_SET_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_BOOST_UNORDERED_SET_ADAPTER_H
+
+#include <cds/container/striped_set/adapter.h>
+#include <boost/unordered_set.hpp>
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for boost::unordered_set
+        template <typename T, typename Traits, typename Alloc>
+        struct copy_item_policy< boost::unordered_set< T, Traits, Alloc > >
+            : public details::boost_set_copy_policies< boost::unordered_set< T, Traits, Alloc > >::copy_item_policy
+        {};
+
+        template <typename T, typename Traits, typename Alloc>
+        struct swap_item_policy< boost::unordered_set< T, Traits, Alloc > >
+            : public details::boost_set_copy_policies< boost::unordered_set< T, Traits, Alloc > >::swap_item_policy
+        {};
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for boost::unordered_set
+        template <typename T, typename Traits, typename Alloc>
+        struct move_item_policy< boost::unordered_set< T, Traits, Alloc > >
+            : public details::boost_set_copy_policies< boost::unordered_set< T, Traits, Alloc > >::move_item_policy
+        {};
+#endif
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+    /// boost::unordered_set adapter for hash set bucket
+    template <typename T, class Traits, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::unordered_set<T, Traits, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::unordered_set<T, Traits, Alloc>    container_type ;   ///< underlying container type
+        typedef cds::container::striped_set::details::boost_set_adapter< container_type, CDS_OPTIONS >    type;
+    };
+}}} // namespace cds::intrusive::striped_set
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_UNORDERED_SET_ADAPTER_H
diff --git a/cds/container/striped_set/boost_vector.h b/cds/container/striped_set/boost_vector.h
new file mode 100644 (file)
index 0000000..076bfd8
--- /dev/null
@@ -0,0 +1,261 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_VECTOR_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_BOOST_VECTOR_ADAPTER_H
+
+#include <boost/version.hpp>
+#if BOOST_VERSION < 104800
+#   error "For boost::container::vector you must use boost 1.48 or above"
+#endif
+
+#include <cds/container/striped_set/adapter.h>     // lower_bound
+#include <cds/ref.h>
+#include <boost/container/vector.hpp>
+#include <algorithm>    // std::lower_bound
+#include <utility>      // std::pair
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for boost::container::vector
+        template <typename T, typename Alloc>
+        struct copy_item_policy< boost::container::vector< T, Alloc > >
+        {
+            typedef boost::container::vector< T, Alloc > vector_type;
+            typedef typename vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, *itWhat );
+            }
+        };
+
+        // Swap policy for boost::container::vector
+        template <typename T, typename Alloc>
+        struct swap_item_policy< boost::container::vector< T, Alloc > >
+        {
+            typedef boost::container::vector< T, Alloc > vector_type;
+            typedef typename vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                typename vector_type::value_type newVal;
+                itInsert = vec.insert( itInsert, newVal );
+                std::swap( *itInsert, *itWhat );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for boost::container::vector
+        template <typename T, typename Alloc>
+        struct move_item_policy< boost::container::vector< T, Alloc > >
+        {
+            typedef boost::container::vector< T, Alloc > vector_type;
+            typedef typename vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, std::move( *itWhat ));
+            }
+        };
+#endif
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// boost::container::vector adapter for hash set bucket
+    template <typename T, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< boost::container::vector<T, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::container::vector<T, Alloc>     container_type          ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_sequential_container
+        {
+        public:
+            typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+            typedef typename container_type::iterator      iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = true;
+            static bool const has_erase_with = true;
+
+        private:
+            //@cond
+            typedef typename cds::opt::details::make_comparator_from_option_list< value_type, CDS_OPTIONS >::type key_comparator;
+
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+
+            struct find_predicate
+            {
+                bool operator()( value_type const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( Q const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( value_type const& i1, Q const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+            };
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_Vector;
+            //@endcond
+
+        public:
+            template <typename Q, typename Func>
+            bool insert( const Q& val, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 ) {
+                    value_type newItem( val );
+                    it = m_Vector.insert( it, newItem );
+                    cds::unref( f )( *it );
+                    return true;
+                }
+                return false;
+            }
+
+#           ifdef CDS_EMPLACE_SUPPORT
+            template <typename... Args>
+            bool emplace( Args&&... args )
+            {
+                value_type val( std::forward<Args>(args)... );
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 ) {
+                    it = m_Vector.emplace( it, std::move( val ) );
+                    return true;
+                }
+                return false;
+            }
+#           endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& val, Func func )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 ) {
+                    // insert new
+                    value_type newItem( val );
+                    it = m_Vector.insert( it, newItem );
+                    cds::unref( func )( true, *it, val );
+                    return std::make_pair( true, true );
+                }
+                else {
+                    // already exists
+                    cds::unref( func )( false, *it, val );
+                    return std::make_pair( true, false );
+                }
+            }
+
+            template <typename Q, typename Func>
+            bool erase( const Q& key, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), key, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( key, *it ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_Vector.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool erase( Q const& key, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), key, pred );
+                if ( it == m_Vector.end() || pred( key, *it ) || pred( *it, key ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_Vector.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& val, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, pred );
+                if ( it == m_Vector.end() || pred( val, *it ) || pred( *it, val ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            /// Clears the container
+            void clear()
+            {
+                m_Vector.clear();
+            }
+
+            iterator begin()                { return m_Vector.begin(); }
+            const_iterator begin() const    { return m_Vector.begin(); }
+            iterator end()                  { return m_Vector.end(); }
+            const_iterator end() const      { return m_Vector.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), *itWhat, find_predicate() );
+                assert( it == m_Vector.end() || key_comparator()( *itWhat, *it ) != 0 );
+
+                copy_item()( m_Vector, it, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_Vector.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_BOOST_VECTOR_ADAPTER_H
diff --git a/cds/container/striped_set/std_hash_set.h b/cds/container/striped_set/std_hash_set.h
new file mode 100644 (file)
index 0000000..fcfb5e9
--- /dev/null
@@ -0,0 +1,13 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_STD_HASH_SET_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_STD_HASH_SET_ADAPTER_H
+
+#include <cds/container/striped_set/adapter.h>
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600    // MS VC 2008
+#   include <cds/container/striped_set/std_hash_set_vc.h>
+#else
+#   include <cds/container/striped_set/std_hash_set_std.h>
+#endif
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_STD_HASH_SET_ADAPTER_H
diff --git a/cds/container/striped_set/std_hash_set_std.h b/cds/container/striped_set/std_hash_set_std.h
new file mode 100644 (file)
index 0000000..c02d6dd
--- /dev/null
@@ -0,0 +1,178 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_STD_HASH_SET_STD_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_STD_HASH_SET_STD_ADAPTER_H
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_STD_HASH_SET_ADAPTER_H
+#   error <cds/container/striped_set/std_hash_set.h> must be included instead of <cds/container/striped_set/std_hash_set_std.h> header
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <unordered_set>
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for std::unordered_set
+        template <typename T, typename Hash, typename Pred, typename Alloc>
+        struct copy_item_policy< std::unordered_set< T, Hash, Pred, Alloc > >
+        {
+            typedef std::unordered_set< T, Hash, Pred, Alloc > set_type;
+            typedef typename set_type::iterator iterator;
+
+            void operator()( set_type& set, iterator itWhat )
+            {
+                set.insert( *itWhat );
+            }
+        };
+
+        template <typename T, typename Hash, typename Pred, typename Alloc>
+        struct swap_item_policy< std::unordered_set< T, Hash, Pred, Alloc > >: public copy_item_policy< std::unordered_set< T, Hash, Pred, Alloc > >
+        {};
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for std::unordered_set
+        template <typename T, typename Hash, typename Pred, typename Alloc>
+        struct move_item_policy< std::unordered_set< T, Hash, Pred, Alloc > >
+        {
+            typedef std::unordered_set< T, Hash, Pred, Alloc > set_type;
+            typedef typename set_type::iterator iterator;
+
+            void operator()( set_type& set, iterator itWhat )
+            {
+                set.insert( std::move( *itWhat ) );
+            }
+        };
+#endif
+
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+    /// std::unordered_set  adapter for hash set bucket
+    template <typename T, class Hash, class Pred, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< std::unordered_set<T, Hash, Pred, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef std::unordered_set<T, Hash, Pred, Alloc>  container_type  ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_container
+        {
+        public:
+            typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+            typedef typename container_type::iterator      iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = false;
+            static bool const has_erase_with = false;
+
+        private:
+            //@cond
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type> // not defined
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_Set;
+            //@endcond
+
+        public:
+            template <typename Q, typename Func>
+            bool insert( const Q& val, Func f )
+            {
+                std::pair<iterator, bool> res = m_Set.insert( value_type(val) );
+                if ( res.second )
+                    ::cds::unref(f)( const_cast<value_type&>(*res.first) );
+                return res.second;
+            }
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            template <typename... Args>
+            bool emplace( Args&&... args )
+            {
+#           if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION < 40800 || CDS_COMPILER == CDS_COMPILER_CLANG && !defined(__LIBCPP_VERSION)
+                // GCC < 4.8:  std::set has no "emplace" member function. Emulate it
+                std::pair<iterator, bool> res = m_Set.insert( value_type( std::forward<Args>(args)...));
+#           else
+                std::pair<iterator, bool> res = m_Set.emplace( std::forward<Args>(args)... );
+#           endif
+                return res.second;
+            }
+#       endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& val, Func func )
+            {
+                std::pair<iterator, bool> res = m_Set.insert( value_type(val) );
+                cds::unref(func)( res.second, const_cast<value_type&>(*res.first), val );
+                return std::make_pair( true, res.second );
+            }
+
+            template <typename Q, typename Func>
+            bool erase( const Q& key, Func f )
+            {
+                const_iterator it = m_Set.find( value_type(key) );
+                if ( it == m_Set.end() )
+                    return false;
+                cds::unref(f)( const_cast<value_type&>(*it) );
+                m_Set.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = m_Set.find( value_type(val) );
+                if ( it == m_Set.end() )
+                    return false;
+                cds::unref(f)( const_cast<value_type&>(*it), val );
+                return true;
+            }
+
+            /// Clears the container
+            void clear()
+            {
+                m_Set.clear();
+            }
+
+            iterator begin()                { return m_Set.begin(); }
+            const_iterator begin() const    { return m_Set.begin(); }
+            iterator end()                  { return m_Set.end(); }
+            const_iterator end() const      { return m_Set.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                assert( m_Set.find( *itWhat ) == m_Set.end() );
+                copy_item()( m_Set, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_Set.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+    };
+}}} // namespace cds::intrusive::striped_set
+
+
+//@endcond
+
+#endif  // #ifndef __CDS_CONTAINER_STRIPED_SET_STD_HASH_SET_STD_ADAPTER_H
diff --git a/cds/container/striped_set/std_hash_set_vc.h b/cds/container/striped_set/std_hash_set_vc.h
new file mode 100644 (file)
index 0000000..51f7d0b
--- /dev/null
@@ -0,0 +1,166 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_STD_HASH_SET_MSVC_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_STD_HASH_SET_MSVC_ADAPTER_H
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_STD_HASH_SET_ADAPTER_H
+#   error <cds/container/striped_set/std_hash_set.h> must be included instead of <cds/container/striped_set/std_hash_set_vc.h> header
+#endif
+
+#include <cds/container/striped_set/adapter.h>
+#include <hash_set>
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for stdext::hash_set
+        template <typename T, typename Traits, typename Alloc>
+        struct copy_item_policy< stdext::hash_set< T, Traits, Alloc > >
+        {
+            typedef stdext::hash_set< T, Traits, Alloc > set_type;
+            typedef typename set_type::iterator iterator;
+
+            void operator()( set_type& set, iterator itWhat )
+            {
+                set.insert( *itWhat );
+            }
+        };
+
+        template <typename T, typename Traits, typename Alloc>
+        struct swap_item_policy< stdext::hash_set< T, Traits, Alloc > >: public copy_item_policy< stdext::hash_set< T, Traits, Alloc > >
+        {};
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for stdext::hash_set
+        template <typename T, typename Hash, typename Pred, typename Alloc>
+        struct move_item_policy< stdext::hash_set< T, Traits, Alloc > >
+        {
+            typedef stdext::hash_set< T, Traits, Alloc > set_type;
+            typedef typename set_type::iterator iterator;
+
+            void operator()( set_type& set, iterator itWhat )
+            {
+                set.insert( std::move( *itWhat ) );
+            }
+        };
+#endif
+
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// std::unordered_set  adapter for hash set bucket
+    template <typename T, class Traits, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< stdext::hash_set<T, Traits, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef stdext::hash_set<T, Traits, Alloc>  container_type  ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_container
+        {
+        public:
+            typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+            typedef typename container_type::iterator      iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = false;
+            static bool const has_erase_with = false;
+
+        private:
+            //@cond
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type> // not defined
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_Set;
+            //@endcond
+
+        public:
+
+            template <typename Q, typename Func>
+            bool insert( const Q& val, Func f )
+            {
+                std::pair<iterator, bool> res = m_Set.insert( value_type(val) );
+                if ( res.second )
+                    ::cds::unref(f)( *res.first );
+                return res.second;
+            }
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& val, Func func )
+            {
+                std::pair<iterator, bool> res = m_Set.insert( value_type(val) );
+                ::cds::unref(func)( res.second, *res.first, val );
+                return std::make_pair( true, res.second );
+            }
+
+            template <typename Q, typename Func>
+            bool erase( const Q& key, Func f )
+            {
+                iterator it = m_Set.find( value_type(key) );
+                if ( it == m_Set.end() )
+                    return false;
+                ::cds::unref(f)( *it );
+                m_Set.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = m_Set.find( value_type(val) );
+                if ( it == m_Set.end() )
+                    return false;
+                ::cds::unref(f)( *it, val );
+                return true;
+            }
+
+            /// Clears the container
+            void clear()
+            {
+                m_Set.clear();
+            }
+
+            iterator begin()                { return m_Set.begin(); }
+            const_iterator begin() const    { return m_Set.begin(); }
+            iterator end()                  { return m_Set.end(); }
+            const_iterator end() const      { return m_Set.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                assert( m_Set.find( *itWhat ) == m_Set.end() );
+                copy_item()( m_Set, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_Set.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+
+//@endcond
+
+#endif  // #ifndef __CDS_CONTAINER_STRIPED_SET_STD_HASH_SET_MSVC_ADAPTER_H
diff --git a/cds/container/striped_set/std_list.h b/cds/container/striped_set/std_list.h
new file mode 100644 (file)
index 0000000..aa53fec
--- /dev/null
@@ -0,0 +1,302 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_STD_LIST_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_STD_LIST_ADAPTER_H
+
+#include <cds/container/striped_set/adapter.h>
+#include <cds/ref.h>
+#include <list>
+#include <algorithm>    // std::lower_bound
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for std::list
+        template <typename T, typename Alloc>
+        struct copy_item_policy< std::list< T, Alloc > >
+        {
+            typedef std::list< T, Alloc > list_type;
+            typedef typename list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                itInsert = list.insert( itInsert, *itWhat );
+            }
+        };
+
+        // Swap policy for std::list
+        template <typename T, typename Alloc>
+        struct swap_item_policy< std::list< T, Alloc > >
+        {
+            typedef std::list< T, Alloc > list_type;
+            typedef typename list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                typename list_type::value_type newVal;
+                itInsert = list.insert( itInsert, newVal );
+                std::swap( *itWhat, *itInsert );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for std::list
+        template <typename T, typename Alloc>
+        struct move_item_policy< std::list< T, Alloc > >
+        {
+            typedef std::list< T, Alloc > list_type;
+            typedef typename list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::move( *itWhat ) );
+            }
+        };
+#endif
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// std::list adapter for hash set bucket
+    template <typename T, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< std::list<T, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef std::list<T, Alloc>     container_type          ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_sequential_container
+        {
+        public:
+            typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+            typedef typename container_type::iterator      iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = true;
+            static bool const has_erase_with = true;
+
+        private:
+            //@cond
+            typedef typename cds::opt::details::make_comparator_from_option_list< value_type, CDS_OPTIONS >::type key_comparator;
+
+
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+
+            struct find_predicate
+            {
+                bool operator()( value_type const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( Q const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( value_type const& i1, Q const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+            };
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_List;
+#       ifdef __GLIBCXX__
+            // GCC C++ lib bug:
+            // In GCC (at least up to 4.7.x), the complexity of std::list::size() is O(N)
+            // (see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49561)
+            size_t          m_nSize ;   // list size
+#       endif
+            //@endcond
+
+        public:
+            adapted_container()
+#       ifdef __GLIBCXX__
+                : m_nSize(0)
+#       endif
+            {}
+
+            template <typename Q, typename Func>
+            bool insert( const Q& val, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, *it ) != 0 ) {
+                    value_type newItem( val );
+                    it = m_List.insert( it, newItem );
+                    cds::unref( f )( *it );
+
+#           ifdef __GLIBCXX__
+                    ++m_nSize;
+#           endif
+                    return true;
+                }
+
+                // key already exists
+                return false;
+            }
+
+#           ifdef CDS_EMPLACE_SUPPORT
+            template <typename... Args>
+            bool emplace( Args&&... args )
+            {
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12
+                // MS VC++ 2013: internal compiler error
+                // Use assignment workaround, see http://connect.microsoft.com/VisualStudio/feedback/details/804941/visual-studio-2013-rc-c-internal-compiler-error-with-std-forward
+                value_type val = value_type( std::forward<Args>(args)... );
+#else
+                value_type val(std::forward<Args>(args)...);
+#endif
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, *it ) != 0 ) {
+                    it = m_List.emplace( it, std::move( val ) );
+#           ifdef __GLIBCXX__
+                    ++m_nSize;
+#           endif
+                    return true;
+                }
+                return false;
+            }
+#           endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& val, Func func )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, *it ) != 0 ) {
+                    // insert new
+                    value_type newItem( val );
+                    it = m_List.insert( it, newItem );
+                    cds::unref( func )( true, *it, val );
+#           ifdef __GLIBCXX__
+                    ++m_nSize;
+#           endif
+                    return std::make_pair( true, true );
+                }
+                else {
+                    // already exists
+                    cds::unref( func )( false, *it, val );
+                    return std::make_pair( true, false );
+                }
+            }
+
+            template <typename Q, typename Func>
+            bool erase( const Q& key, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( key, *it ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_List.erase( it );
+#           ifdef __GLIBCXX__
+                --m_nSize;
+#           endif
+
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool erase( Q const& key, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), key, pred );
+                if ( it == m_List.end() || pred( key, *it ) || pred( *it, key ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_List.erase( it );
+#           ifdef __GLIBCXX__
+                --m_nSize;
+#           endif
+
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, *it ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& val, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), val, pred );
+                if ( it == m_List.end() || pred( val, *it ) || pred( *it, val ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            /// Clears the container
+            void clear()
+            {
+                m_List.clear();
+            }
+
+            iterator begin()                { return m_List.begin(); }
+            const_iterator begin() const    { return m_List.begin(); }
+            iterator end()                  { return m_List.end(); }
+            const_iterator end() const      { return m_List.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                iterator it = std::lower_bound( m_List.begin(), m_List.end(), *itWhat, find_predicate() );
+                assert( it == m_List.end() || key_comparator()( *itWhat, *it ) != 0 );
+
+                copy_item()( m_List, it, itWhat );
+#           ifdef __GLIBCXX__
+                ++m_nSize;
+#           endif
+            }
+
+            size_t size() const
+            {
+#           ifdef __GLIBCXX__
+                return m_nSize;
+#           else
+                return m_List.size();
+#           endif
+
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}}
+
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_STD_LIST_ADAPTER_H
diff --git a/cds/container/striped_set/std_set.h b/cds/container/striped_set/std_set.h
new file mode 100644 (file)
index 0000000..96be878
--- /dev/null
@@ -0,0 +1,175 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_STD_SET_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_STD_SET_ADAPTER_H
+
+#include <cds/container/striped_set/adapter.h>
+#include <set>
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for std::set
+        template <typename T, typename Traits, typename Alloc>
+        struct copy_item_policy< std::set< T, Traits, Alloc > >
+        {
+            typedef std::set< T, Traits, Alloc > set_type;
+            typedef typename set_type::iterator iterator;
+
+            void operator()( set_type& set, iterator itWhat )
+            {
+                set.insert( *itWhat );
+            }
+        };
+
+        template <typename T, typename Traits, typename Alloc>
+        struct swap_item_policy< std::set< T, Traits, Alloc > >: public copy_item_policy< std::set< T, Traits, Alloc > >
+        {};
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for std::set
+        template <typename T, typename Traits, typename Alloc>
+        struct move_item_policy< std::set< T, Traits, Alloc > >
+        {
+            typedef std::set< T, Traits, Alloc > set_type;
+            typedef typename set_type::iterator iterator;
+
+            void operator()( set_type& set, iterator itWhat )
+            {
+                set.insert( std::move( *itWhat ) );
+            }
+        };
+#endif
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// std::set adapter for hash set bucket
+    template <typename T, class Traits, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< std::set<T, Traits, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef std::set<T, Traits, Alloc>     container_type          ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_container
+        {
+        public:
+            typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+            typedef typename container_type::iterator      iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = false;
+            static bool const has_erase_with = false;
+
+        private:
+            //@cond
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_Set;
+            //@endcond
+
+        public:
+
+            template <typename Q, typename Func>
+            bool insert( const Q& val, Func f )
+            {
+                std::pair<iterator, bool> res = m_Set.insert( value_type(val) );
+                if ( res.second )
+                    ::cds::unref(f)( const_cast<value_type&>(*res.first) );
+                return res.second;
+            }
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            template <typename... Args>
+            bool emplace( Args&&... args )
+            {
+#           if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION < 40800 || CDS_COMPILER == CDS_COMPILER_CLANG && !defined(__LIBCPP_VERSION)
+                // GCC < 4.8: std::set has no "emplace" member function. Emulate it
+                std::pair<iterator, bool> res = m_Set.insert( value_type( std::forward<Args>(args)...));
+#           else
+                std::pair<iterator, bool> res = m_Set.emplace( std::forward<Args>(args)... );
+#           endif
+                return res.second;
+            }
+#       endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& val, Func func )
+            {
+                std::pair<iterator, bool> res = m_Set.insert( value_type(val) );
+                ::cds::unref(func)( res.second, const_cast<value_type&>(*res.first), val );
+                return std::make_pair( true, res.second );
+            }
+
+            template <typename Q, typename Func>
+            bool erase( const Q& key, Func f )
+            {
+                iterator it = m_Set.find( value_type(key) );
+                if ( it == m_Set.end() )
+                    return false;
+                ::cds::unref(f)( const_cast<value_type&>(*it) );
+                m_Set.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = m_Set.find( value_type(val) );
+                if ( it == m_Set.end() )
+                    return false;
+                ::cds::unref(f)( const_cast<value_type&>(*it), val );
+                return true;
+            }
+
+            void clear()
+            {
+                m_Set.clear();
+            }
+
+            iterator begin()                { return m_Set.begin(); }
+            const_iterator begin() const    { return m_Set.begin(); }
+            iterator end()                  { return m_Set.end(); }
+            const_iterator end() const      { return m_Set.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                assert( m_Set.find( *itWhat ) == m_Set.end() );
+                copy_item()( m_Set, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_Set.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_STD_SET_ADAPTER_H
diff --git a/cds/container/striped_set/std_vector.h b/cds/container/striped_set/std_vector.h
new file mode 100644 (file)
index 0000000..37010e6
--- /dev/null
@@ -0,0 +1,263 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_STRIPED_SET_STD_VECTOR_ADAPTER_H
+#define __CDS_CONTAINER_STRIPED_SET_STD_VECTOR_ADAPTER_H
+
+#include <cds/container/striped_set/adapter.h>     // lower_bound
+#include <cds/ref.h>
+#include <vector>
+#include <algorithm>    // std::lower_bound
+#include <utility>      // std::pair
+
+//@cond
+namespace cds { namespace container {
+    namespace striped_set {
+
+        // Copy policy for std::vector
+        template <typename T, typename Alloc>
+        struct copy_item_policy< std::vector< T, Alloc > >
+        {
+            typedef std::vector< T, Alloc > vector_type;
+            typedef typename vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, *itWhat );
+            }
+        };
+
+        // Swap policy for std::vector
+        template <typename T, typename Alloc>
+        struct swap_item_policy< std::vector< T, Alloc > >
+        {
+            typedef std::vector< T, Alloc > vector_type;
+            typedef typename vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                typename vector_type::value_type newVal;
+                itInsert = vec.insert( itInsert, newVal );
+                std::swap( *itInsert, *itWhat );
+            }
+        };
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        // Move policy for std::vector
+        template <typename T, typename Alloc>
+        struct move_item_policy< std::vector< T, Alloc > >
+        {
+            typedef std::vector< T, Alloc > vector_type;
+            typedef typename vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, std::move( *itWhat ));
+            }
+        };
+#endif
+
+    }   // namespace striped_set
+}} // namespace cds::container
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// std::vector adapter for hash set bucket
+    template <typename T, class Alloc, CDS_SPEC_OPTIONS>
+    class adapt< std::vector<T, Alloc>, CDS_OPTIONS >
+    {
+    public:
+        typedef std::vector<T, Alloc>     container_type          ;   ///< underlying container type
+
+    private:
+        /// Adapted container type
+        class adapted_container: public cds::container::striped_set::adapted_sequential_container
+        {
+        public:
+            typedef typename container_type::value_type value_type  ;   ///< value type stored in the container
+            typedef typename container_type::iterator      iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            static bool const has_find_with = true;
+            static bool const has_erase_with = true;
+
+        private:
+            //@cond
+            typedef typename cds::opt::details::make_comparator_from_option_list< value_type, CDS_OPTIONS >::type key_comparator;
+
+            typedef typename cds::opt::select<
+                typename cds::opt::value<
+                    typename cds::opt::find_option<
+                        cds::opt::copy_policy< cds::container::striped_set::move_item >
+                        , CDS_OPTIONS
+                    >::type
+                >::copy_policy
+                , cds::container::striped_set::copy_item, cds::container::striped_set::copy_item_policy<container_type>
+                , cds::container::striped_set::swap_item, cds::container::striped_set::swap_item_policy<container_type>
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+                , cds::container::striped_set::move_item, cds::container::striped_set::move_item_policy<container_type>
+#endif
+            >::type copy_item;
+
+            struct find_predicate
+            {
+                bool operator()( value_type const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( Q const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( value_type const& i1, Q const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+            };
+            //@endcond
+
+        private:
+            //@cond
+            container_type  m_Vector;
+            //@endcond
+
+        public:
+
+            template <typename Q, typename Func>
+            bool insert( const Q& val, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 ) {
+                    value_type newItem( val );
+                    it = m_Vector.insert( it, newItem );
+                    cds::unref( f )( *it );
+                    return true;
+                }
+                return false;
+            }
+
+#           ifdef CDS_EMPLACE_SUPPORT
+            template <typename... Args>
+            bool emplace( Args&&... args )
+            {
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12
+                // MS VC++ 2013 internal compiler error
+                // Use assignment workaround, see http://connect.microsoft.com/VisualStudio/feedback/details/804941/visual-studio-2013-rc-c-internal-compiler-error-with-std-forward
+                value_type val = value_type(std::forward<Args>(args)...);
+#else
+                value_type val( std::forward<Args>(args)... );
+#endif
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 ) {
+                    it = m_Vector.emplace( it, std::move( val ) );
+                    return true;
+                }
+                return false;
+            }
+#           endif
+
+            template <typename Q, typename Func>
+            std::pair<bool, bool> ensure( const Q& val, Func func )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 ) {
+                    // insert new
+                    value_type newItem( val );
+                    it = m_Vector.insert( it, newItem );
+                    cds::unref( func )( true, *it, val );
+                    return std::make_pair( true, true );
+                }
+                else {
+                    // already exists
+                    cds::unref( func )( false, *it, val );
+                    return std::make_pair( true, false );
+                }
+            }
+
+            template <typename Q, typename Func>
+            bool erase( const Q& key, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), key, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( key, *it ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_Vector.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool erase( const Q& key, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), key, pred );
+                if ( it == m_Vector.end() || pred( key, *it ) || pred( *it, key ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it );
+                m_Vector.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& val, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, find_predicate() );
+                if ( it == m_Vector.end() || key_comparator()( val, *it ) != 0 )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& val, Less pred, Func f )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), val, pred );
+                if ( it == m_Vector.end() || pred( val, *it ) || pred( *it, val ) )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, val );
+                return true;
+            }
+
+
+            void clear()
+            {
+                m_Vector.clear();
+            }
+
+            iterator begin()                { return m_Vector.begin(); }
+            const_iterator begin() const    { return m_Vector.begin(); }
+            iterator end()                  { return m_Vector.end(); }
+            const_iterator end() const      { return m_Vector.end(); }
+
+            void move_item( adapted_container& /*from*/, iterator itWhat )
+            {
+                iterator it = std::lower_bound( m_Vector.begin(), m_Vector.end(), *itWhat, find_predicate() );
+                assert( it == m_Vector.end() || key_comparator()( *itWhat, *it ) != 0 );
+
+                copy_item()( m_Vector, it, itWhat );
+            }
+
+            size_t size() const
+            {
+                return m_Vector.size();
+            }
+        };
+
+    public:
+        typedef adapted_container type ; ///< Result of \p adapt metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+
+//@endcond
+
+#endif // #ifndef __CDS_CONTAINER_STRIPED_SET_STD_VECTOR_ADAPTER_H
diff --git a/cds/container/treiber_stack.h b/cds/container/treiber_stack.h
new file mode 100644 (file)
index 0000000..63d0e86
--- /dev/null
@@ -0,0 +1,297 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_TREIBER_STACK_H
+#define __CDS_CONTAINER_TREIBER_STACK_H
+
+#include <cds/intrusive/treiber_stack.h>
+#include <cds/container/base.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace treiber_stack {
+        using cds::intrusive::treiber_stack::stat;
+        using cds::intrusive::treiber_stack::empty_stat;
+
+        template <typename GC, typename T, CDS_DECL_OPTIONS11>
+        struct make_treiber_stack
+        {
+            typedef T value_type;
+
+            struct default_options {
+                typedef cds::backoff::Default               back_off;
+                typedef CDS_DEFAULT_ALLOCATOR               allocator;
+                typedef cds::opt::v::relaxed_ordering       memory_model;
+                typedef cds::atomicity::empty_item_counter  item_counter;
+                typedef empty_stat                          stat;
+
+                // Elimination back-off options
+                static CDS_CONSTEXPR_CONST bool enable_elimination = false;
+                typedef cds::backoff::delay<>          elimination_backoff;
+                typedef opt::v::static_buffer< int, 4 > buffer;
+                typedef opt::v::c_rand                  random_engine;
+                typedef cds::lock::Spin                 lock_type;
+            };
+
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< default_options, CDS_OPTIONS11 >::type
+                ,CDS_OPTIONS11
+            >::type   options;
+
+            typedef GC gc;
+            typedef typename options::memory_model memory_model;
+
+            struct node_type: public cds::intrusive::single_link::node< gc >
+            {
+                value_type  m_value;
+
+                node_type( const value_type& val )
+                    : m_value( val )
+                {}
+#           ifdef CDS_EMPLACE_SUPPORT
+                template <typename... Args>
+                node_type( Args&&... args )
+                    : m_value( std::forward<Args>(args)...)
+                {}
+#           else
+                node_type()
+                {}
+#           endif
+            };
+
+            typedef typename options::allocator::template rebind<node_type>::other allocator_type;
+            typedef cds::details::Allocator< node_type, allocator_type >           cxx_allocator;
+
+            struct node_deallocator
+            {
+                void operator ()( node_type * pNode )
+                {
+                    cxx_allocator().Delete( pNode );
+                }
+            };
+
+            typedef intrusive::TreiberStack<
+                gc
+                ,node_type
+                ,intrusive::opt::hook<
+                    intrusive::single_link::base_hook< cds::opt::gc<gc> >
+                >
+                ,cds::opt::back_off< typename options::back_off >
+                ,cds::intrusive::opt::disposer< node_deallocator >
+                ,cds::opt::memory_model< memory_model >
+                ,cds::opt::item_counter< typename options::item_counter >
+                ,cds::opt::stat< typename options::stat >
+                ,cds::opt::enable_elimination< options::enable_elimination >
+                ,cds::opt::buffer< typename options::buffer >
+                ,cds::opt::random_engine< typename options::random_engine >
+                ,cds::opt::elimination_backoff< typename options::elimination_backoff >
+                ,cds::opt::lock_type< typename options::lock_type >
+            >   type;
+        };
+    } // namespace treiber_stack
+    //@endcond
+
+    /// Treiber's stack algorithm
+    /** @ingroup cds_nonintrusive_stack
+        It is non-intrusive version of Treiber's stack algorithm based on intrusive implementation
+        intrusive::TreiberStack.
+
+        Template arguments:
+        - \p GC - garbage collector type: gc::HP, gc::HRC, gc::PTB
+        - \p T - type stored in the stack. It should be default-constructible, copy-constructible, assignable type.
+        - \p Options - options
+
+        Available \p Options:
+        - opt::allocator - allocator (like \p std::allocator). Default is \ref CDS_DEFAULT_ALLOCATOR
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::stat - the type to gather internal statistics.
+            Possible option value are: \ref cds::intrusive::treiber_stack::stat "treiber_stack::stat",
+            \ref cds::intrusive::treiber_stack::empty_stat "treiber_stack::empty_stat" (the default),
+            user-provided class that supports treiber_stack::stat interface.
+        - opt::enable_elimination - enable elimination back-off for the stack. Default value is \p valse.
+
+        If elimination back-off is enabled (\p %cds::opt::enable_elimination< true >) additional options can be specified:
+        - opt::buffer - a buffer type for elimination array, see \p opt::v::static_buffer, \p opt::v::dynamic_buffer.
+            The buffer can be any size: \p Exp2 template parameter of those classes can be \p false.
+            The size should be selected empirically for your application and hardware, there are no common rules for that.
+            Default is <tt> %opt::v::static_buffer< any_type, 4 > </tt>.
+        - opt::random_engine - a random engine to generate a random position in elimination array.
+            Default is opt::v::c_rand.
+        - opt::elimination_backoff - back-off strategy to wait for elimination, default is cds::backoff::delay<>
+        - opt::lock_type - a lock type used in elimination back-off, default is cds::lock::Spin.
+    */
+    template < typename GC, typename T, CDS_DECL_OPTIONS11 >
+    class TreiberStack
+        : public
+#ifdef CDS_DOXYGEN_INVOKED
+        intrusive::TreiberStack< GC, cds::intrusive::single_link::node< T >, Options... >
+#else
+        treiber_stack::make_treiber_stack< GC, T, CDS_OPTIONS11 >::type
+#endif
+    {
+        //@cond
+        typedef treiber_stack::make_treiber_stack< GC, T, CDS_OPTIONS11 > options;
+        typedef typename options::type base_class;
+        //@endcond
+
+    public:
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS11>
+        struct rebind {
+            typedef TreiberStack< GC2, T2, CDS_OTHER_OPTIONS11> other   ;   ///< Rebinding result
+        };
+
+    public:
+        typedef T value_type ; ///< Value type stored in the stack
+        typedef typename base_class::gc gc                      ;   ///< Garbage collector used
+        typedef typename base_class::back_off  back_off         ;   ///< Back-off strategy used
+        typedef typename options::allocator_type allocator_type ;   ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename options::memory_model  memory_model    ;   ///< Memory ordering. See cds::opt::memory_order option
+        typedef typename base_class::stat       stat            ;   ///< Internal statistics policy used
+
+    protected:
+        typedef typename options::node_type  node_type   ;   ///< stack node type (derived from intrusive::single_link::node)
+
+        //@cond
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;   // deallocate node
+        //@endcond
+
+    protected:
+        ///@cond
+        static node_type * alloc_node( const value_type& val )
+        {
+            return cxx_allocator().New( val );
+        }
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static node_type * alloc_node_move( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>( args )... );
+        }
+#   endif
+
+        static void free_node( node_type * p )
+        {
+            node_deallocator()( p );
+        }
+        static void retire_node( node_type * p )
+        {
+            gc::template retire<typename base_class::disposer>( p );
+        }
+
+        struct node_disposer {
+            void operator()( node_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< node_type, node_disposer >     scoped_node_ptr;
+        //@endcond
+
+    public:
+        /// Constructs empty stack
+        TreiberStack()
+        {}
+
+        /// Constructs empty stack and initializes elimination back-off data
+        /**
+            This form should be used if you use elimination back-off with dynamically allocated collision array, i.e
+            \p Options... contains cds::opt::buffer< cds::opt::v::dynamic_buffer >.
+            \p nCollisionCapacity parameter specifies the capacity of collision array.
+        */
+        TreiberStack( size_t nCollisionCapacity )
+            : base_class( nCollisionCapacity )
+        {}
+
+        /// Clears the stack on destruction
+        ~TreiberStack()
+        {}
+
+        /// Push the item \p val on the stack
+        bool push( const value_type& val )
+        {
+            scoped_node_ptr p( alloc_node(val));
+            if ( base_class::push( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Pushes data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr p( alloc_node_move( std::forward<Args>(args)...));
+            if ( base_class::push( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Pop an item from the stack
+        /**
+            The value of popped item is stored in \p val.
+            On success functions returns \p true, \p val contains value popped from the stack.
+            If stack is empty the function returns \p false, \p val is unchanged.
+        */
+        bool pop( value_type& val )
+        {
+            node_type * p = base_class::pop();
+            if ( !p )
+                return false;
+
+            val = p->m_value;
+            retire_node( p );
+
+            return true;
+        }
+
+        /// Check if stack is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Clear the stack
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        /// Returns stack's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the stack
+            is empty. To check emptyness use \ref empty() method.
+        */
+        size_t    size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns reference to internal statistics
+        stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+    };
+
+}}  // namespace cds::container
+
+
+#endif // #ifndef __CDS_CONTAINER_TREIBER_STACK_H
diff --git a/cds/container/tsigas_cycle_queue.h b/cds/container/tsigas_cycle_queue.h
new file mode 100644 (file)
index 0000000..7ea351a
--- /dev/null
@@ -0,0 +1,341 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_TSIGAS_CYCLE_QUEUE_H
+#define __CDS_CONTAINER_TSIGAS_CYCLE_QUEUE_H
+
+#include <cds/intrusive/tsigas_cycle_queue.h>
+#include <cds/container/base.h>
+#include <cds/details/trivial_assign.h>
+#include <cds/details/std/memory.h>
+
+namespace cds { namespace container {
+
+    //@cond
+    namespace details {
+        template <typename T, CDS_DECL_OPTIONS7>
+        struct make_tsigas_cycle_queue
+        {
+            typedef T value_type;
+
+            struct default_options {
+                typedef cds::backoff::empty     back_off;
+                typedef CDS_DEFAULT_ALLOCATOR   allocator;
+                typedef atomicity::empty_item_counter item_counter;
+                typedef opt::v::relaxed_ordering    memory_model;
+                enum { alignment = opt::cache_line_alignment };
+            };
+
+            typedef typename opt::make_options<
+                typename cds::opt::find_type_traits< default_options, CDS_OPTIONS7 >::type
+                ,CDS_OPTIONS7
+            >::type   options;
+
+            typedef typename options::allocator::template rebind<value_type>::other allocator_type;
+            typedef cds::details::Allocator< value_type, allocator_type >           cxx_allocator;
+
+            struct node_deallocator
+            {
+                void operator ()( value_type * pNode )
+                {
+                    cxx_allocator().Delete( pNode );
+                }
+            };
+            typedef node_deallocator node_disposer;
+
+            typedef intrusive::TsigasCycleQueue<
+                value_type
+                ,opt::buffer< typename options::buffer >
+                ,opt::back_off< typename options::back_off >
+                ,intrusive::opt::disposer< node_disposer >
+                ,opt::item_counter< typename options::item_counter >
+                ,opt::alignment< options::alignment >
+                ,opt::memory_model< typename options::memory_model >
+            >   type;
+        };
+
+    }
+    //@endcond
+
+    /// Non-blocking cyclic queue discovered by Philippas Tsigas and Yi Zhang
+    /** @ingroup cds_nonintrusive_queue
+        It is non-intrusive implementation of Tsigas & Zhang cyclic queue based on intrusive::TsigasCycleQueue.
+
+        Source:
+        \li [2000] Philippas Tsigas, Yi Zhang "A Simple, Fast and Scalable Non-Blocking Concurrent FIFO Queue
+            for Shared Memory Multiprocessor Systems"
+
+        \p T is a type stored in the queue. It should be default-constructible, copy-constructible, assignable type.
+
+        Available \p Options:
+        - opt::buffer - buffer to store items. Mandatory option, see option description for full list of possible types.
+        - opt::allocator - allocator (like \p std::allocator). Default is \ref CDS_DEFAULT_ALLOCATOR
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::alignment - the alignment for internal queue data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        \par Examples:
+        \code
+        #include <cds/container/tsigas_cycle_queue.h>
+
+        struct Foo {
+            ...
+        };
+
+        // Queue of Foo, capacity is 1024, statically allocated buffer:
+        typedef cds::intrusive::TsigasCycleQueue<
+            Foo
+            ,cds::opt::buffer< cds::opt::v::static_buffer< Foo, 1024 > >
+        > static_queue;
+        static_queue    stQueue;
+
+        // Queue of Foo, capacity is 1024, dynamically allocated buffer:
+        typedef cds::intrusive::TsigasCycleQueue<
+            Foo
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< Foo > >
+        > dynamic_queue;
+        dynamic_queue    dynQueue( 1024 );
+        \endcode
+    */
+    template <typename T, CDS_DECL_OPTIONS7>
+    class TsigasCycleQueue:
+#ifdef CDS_DOXYGEN_INVOKED
+        intrusive::TsigasCycleQueue< T, Options... >
+#else
+        details::make_tsigas_cycle_queue< T, CDS_OPTIONS7 >::type
+#endif
+    {
+        //@cond
+        typedef details::make_tsigas_cycle_queue< T, CDS_OPTIONS7 > options;
+        typedef typename options::type base_class;
+        //@endcond
+    public:
+        typedef T value_type ; ///< Value type stored in the stack
+
+        typedef typename base_class::back_off           back_off        ; ///< Back-off strategy used
+        typedef typename options::allocator_type        allocator_type  ; ///< Allocator type used for allocate/deallocate the nodes
+        typedef typename options::options::item_counter item_counter    ; ///< Item counting policy used
+        typedef typename base_class::memory_model       memory_model    ; ///< Memory ordering. See cds::opt::memory_model option
+
+        /// Rebind template arguments
+        template <typename T2, CDS_DECL_OTHER_OPTIONS7>
+        struct rebind {
+            typedef TsigasCycleQueue< T2, CDS_OTHER_OPTIONS7> other   ;   ///< Rebinding result
+        };
+
+    protected:
+        //@cond
+        typedef typename options::cxx_allocator     cxx_allocator;
+        typedef typename options::node_deallocator  node_deallocator;   // deallocate node
+        typedef typename options::node_disposer     node_disposer;
+        //@endcond
+
+    protected:
+        ///@cond
+        static value_type * alloc_node()
+        {
+            return cxx_allocator().New();
+        }
+        static value_type * alloc_node( const value_type& val )
+        {
+            return cxx_allocator().New( val );
+        }
+#   ifdef CDS_EMPLACE_SUPPORT
+        template <typename... Args>
+        static value_type * alloc_node_move( Args&&... args )
+        {
+            return cxx_allocator().MoveNew( std::forward<Args>( args )... );
+        }
+#   endif
+        static void free_node( value_type * p )
+        {
+            node_deallocator()( p );
+        }
+
+        struct node_disposer2 {
+            void operator()( value_type * pNode )
+            {
+                free_node( pNode );
+            }
+        };
+        typedef std::unique_ptr< value_type, node_disposer2 >     scoped_node_ptr;
+        //@endcond
+
+    public:
+        /// Initialize empty queue of capacity \p nCapacity
+        /**
+            For cds::opt::v::static_buffer the \p nCapacity parameter is ignored.
+
+            Note that the real capacity of queue is \p nCapacity - 2.
+        */
+        TsigasCycleQueue( size_t nCapacity = 0 )
+            : base_class( nCapacity )
+        {}
+
+        /// Returns queue's item count (see \ref intrusive::TsigasCycleQueue::size for explanation)
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns capacity of cyclic buffer
+        /**
+            Warning: real capacity of queue is two less than returned value of this function.
+        */
+        size_t capacity() const
+        {
+            return base_class::capacity();
+        }
+
+        /// Enqueues \p val value into the queue.
+        /**
+            The function makes queue node in dynamic memory calling copy constructor for \p val
+            and then it calls intrusive::TsigasCycleQueue::enqueue.
+            Returns \p true if success, \p false otherwise.
+        */
+        bool enqueue( value_type const& val )
+        {
+            scoped_node_ptr p( alloc_node(val));
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+        /// Enqueues \p data to queue using copy functor
+        /**
+            \p Func is a functor called to copy value \p data of type \p Type
+            which may be differ from type \p T stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(T& dest, SOURCE const& data)
+                {
+                    // // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool enqueue( const Type& data, Func f  )
+        {
+            scoped_node_ptr p( alloc_node());
+            unref(f)( *p, data );
+            if ( base_class::enqueue( *p )) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Enqueues data of type \ref value_type constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            scoped_node_ptr p ( alloc_node_move( std::forward<Args>(args)...));
+            if ( base_class::enqueue( *p)) {
+                p.release();
+                return true;
+            }
+            return false;
+        }
+#   endif
+
+        /// Dequeues a value using copy functor
+        /**
+            \p Func is a functor called to copy dequeued value to \p dest of type \p Type
+            which may be differ from type \p T stored in the queue.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+                void operator()(Type& dest, T const& data)
+                {
+                    // // Code to copy \p data to \p dest
+                    dest = data;
+                }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Type, typename Func>
+        bool dequeue( Type& dest, Func f )
+        {
+            value_type * p = base_class::dequeue();
+            if ( p ) {
+                unref(f)( dest, *p );
+                node_disposer()( p );
+                return true;
+            }
+            return false;
+        }
+
+        /// Dequeues a value from the queue
+        /**
+            If queue is not empty, the function returns \p true, \p dest contains copy of
+            dequeued value. The assignment operator for type \ref value_type is invoked.
+            If queue is empty, the function returns \p false, \p dest is unchanged.
+        */
+        bool dequeue( value_type& dest )
+        {
+            typedef cds::details::trivial_assign<value_type, value_type> functor;
+            return dequeue( dest, functor() );
+        }
+
+        /// Synonym for \ref enqueue function
+        bool push( const value_type& val )
+        {
+            return enqueue( val );
+        }
+
+        /// Synonym for template version of \ref enqueue function
+        template <typename Type, typename Func>
+        bool push( const Type& data, Func f  )
+        {
+            return enqueue( data, f );
+        }
+
+        /// Synonym for \ref dequeue function
+        bool pop( value_type& dest )
+        {
+            return dequeue( dest );
+        }
+
+        /// Synonym for template version of \ref dequeue function
+        template <typename Type, typename Func>
+        bool pop( Type& dest, Func f )
+        {
+            return dequeue( dest, f );
+        }
+
+        /// Checks if the queue is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        /// Clear the queue
+        /**
+            The function repeatedly calls \ref dequeue until it returns NULL.
+        */
+        void clear()
+        {
+            base_class::clear();
+        }
+    };
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_CONTAINER_TSIGAS_CYCLE_QUEUE_H
diff --git a/cds/container/vyukov_mpmc_cycle_queue.h b/cds/container/vyukov_mpmc_cycle_queue.h
new file mode 100644 (file)
index 0000000..0b871d1
--- /dev/null
@@ -0,0 +1,392 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_VYUKOV_MPMC_CYCLE_QUEUE_H
+#define __CDS_CONTAINER_VYUKOV_MPMC_CYCLE_QUEUE_H
+
+#include <cds/container/base.h>
+#include <cds/opt/buffer.h>
+#include <cds/opt/value_cleaner.h>
+#include <cds/cxx11_atomic.h>
+#include <cds/ref.h>
+#include <cds/details/trivial_assign.h>
+#include <cds/details/bounded_container.h>
+
+namespace cds { namespace container {
+
+    /// Vyukov's MPMC bounded queue
+    /** @ingroup cds_nonintrusive_queue
+        This algorithm is developed by Dmitry Vyukov (see http://www.1024cores.net)
+        It's multi-producer multi-consumer (MPMC), array-based, fails on overflow, does not require GC, w/o priorities, causal FIFO,
+        blocking producers and consumers queue. The algorithm is pretty simple and fast. It's not lock-free in the official meaning,
+        just implemented by means of atomic RMW operations w/o mutexes.
+
+        The cost of enqueue/dequeue is 1 CAS per operation.
+        No dynamic memory allocation/management during operation. Producers and consumers are separated from each other (as in the two-lock queue),
+        i.e. do not touch the same data while queue is not empty.
+
+        \par Source:
+            http://www.1024cores.net/home/lock-free-algorithms/queues/bounded-mpmc-queue
+
+        \par Template parameters
+            \li \p T - type stored in queue.
+            \li \p Options - queue's options
+
+        Options \p Options are:
+        - opt::buffer - buffer to store items. Mandatory option, see option description for full list of possible types.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::value_cleaner - a functor to clean item dequeued. Default value is \ref opt::v::destruct_cleaner
+            that calls the destructor of type \p T.
+            After an item is dequeued, \p value_cleaner cleans the cell that the item has been occupied. If \p T
+            is a complex type, \p value_cleaner may be the useful feature.
+        - opt::alignment - the alignment for internal queue data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        \par License
+            Simplified BSD license by Dmitry Vyukov (http://www.1024cores.net/site/1024cores/home/code-license)
+
+        \par Example
+        \code
+        #include <cds/container/vyukov_mpmc_cycle_queue.h>
+
+        // // Queue with 1024 item static buffer
+        cds::container::vyukov_mpmc_bounded<
+            int
+            ,cds::opt::buffer< cds::opt::v::static_buffer<int, 1024> >
+        > myQueue;
+        \endcode
+    */
+    template <typename T, CDS_DECL_OPTIONS6>
+    class VyukovMPMCCycleQueue
+        : public cds::bounded_container
+    {
+    protected:
+        //@cond
+        struct default_options
+        {
+            typedef cds::opt::v::destruct_cleaner  value_cleaner;
+            typedef atomicity::empty_item_counter item_counter;
+            typedef opt::v::empty_disposer      disposer    ;   // for intrusive version only
+            typedef opt::v::relaxed_ordering    memory_model;
+            enum { alignment = opt::cache_line_alignment };
+        };
+        //@endcond
+
+    public:
+        //@cond
+        typedef typename opt::make_options<
+            typename cds::opt::find_type_traits< default_options, CDS_OPTIONS6 >::type
+            ,CDS_OPTIONS6
+        >::type   options;
+        //@endcond
+
+    protected:
+        //@cond
+        typedef typename options::value_cleaner  value_cleaner;
+        //@endcond
+
+    public:
+        typedef T value_type    ;   ///< @anchor cds_container_VyukovMPMCCycleQueue_value_type type of value stored in the queue
+        typedef typename options::item_counter  item_counter ;  ///< Item counter type
+        typedef typename options::memory_model  memory_model ;  ///< Memory ordering. See cds::opt::memory_model option
+
+        /// Rebind template arguments
+        template <typename T2, CDS_DECL_OTHER_OPTIONS6>
+        struct rebind {
+            typedef VyukovMPMCCycleQueue< T2, CDS_OTHER_OPTIONS6> other   ;   ///< Rebinding result
+        };
+
+    protected:
+        //@cond
+        typedef CDS_ATOMIC::atomic<size_t> sequence_type;
+        struct cell_type
+        {
+            sequence_type   sequence;
+            value_type      data;
+
+            cell_type()
+            {}
+        };
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct copy_construct {
+            void operator()( value_type& dest, value_type const& src )
+            {
+                new ( &dest ) value_type( src );
+            }
+        };
+#   endif
+
+        typedef cds::details::trivial_assign< value_type, value_type > copy_assign;
+
+        typedef typename options::buffer::template rebind<cell_type>::other buffer;
+        typedef typename opt::details::alignment_setter< sequence_type, options::alignment >::type aligned_sequence_type;
+        typedef typename opt::details::alignment_setter< buffer, options::alignment >::type aligned_buffer;
+        //@endcond
+
+    protected:
+        //@cond
+        aligned_buffer  m_buffer;
+        size_t const    m_nBufferMask;
+        aligned_sequence_type m_posEnqueue;
+        aligned_sequence_type m_posDequeue;
+        item_counter    m_ItemCounter;
+        //@endcond
+
+    public:
+        /// Constructs the queue of capacity \p nCapacity
+        /**
+            For cds::opt::v::static_buffer the \p nCapacity parameter is ignored.
+        */
+        VyukovMPMCCycleQueue(
+            size_t nCapacity = 0
+            )
+            : m_buffer( nCapacity )
+            , m_nBufferMask( m_buffer.capacity() - 1 )
+        {
+            nCapacity = m_buffer.capacity();
+
+            // Buffer capacity must be power of 2
+            assert( nCapacity >= 2 && (nCapacity & (nCapacity - 1)) == 0 );
+
+            for (size_t i = 0; i != nCapacity; i += 1)
+                m_buffer[i].sequence.store(i, memory_model::memory_order_relaxed);
+
+            m_posEnqueue.store(0, memory_model::memory_order_relaxed);
+            m_posDequeue.store(0, memory_model::memory_order_relaxed);
+        }
+
+        ~VyukovMPMCCycleQueue()
+        {
+            clear();
+        }
+
+        /// Enqueues \p data to queue using copy functor
+        /** @anchor cds_container_VyukovMPMCCycleQueue_enqueue_func
+            \p Func is a functor called to copy value \p data of type \p Source
+            which may be differ from type \p T stored in the queue.
+            The functor's interface is:
+            \code
+                struct myFunctor {
+                    void operator()(T& dest, Source const& data)
+                    {
+                        // // Code to copy \p data to \p dest
+                        dest = data;
+                    }
+                };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p f by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Source, typename Func>
+        bool enqueue(Source const& data, Func func)
+        {
+            cell_type* cell;
+            size_t pos = m_posEnqueue.load(memory_model::memory_order_relaxed);
+
+            for (;;)
+            {
+                cell = &m_buffer[pos & m_nBufferMask];
+                size_t seq = cell->sequence.load(memory_model::memory_order_acquire);
+
+                intptr_t dif = (intptr_t)seq - (intptr_t)pos;
+
+                if (dif == 0)
+                {
+                    if ( m_posEnqueue.compare_exchange_weak(pos, pos + 1, memory_model::memory_order_relaxed) )
+                        break;
+                }
+                else if (dif < 0)
+                    return false;
+                else
+                    pos = m_posEnqueue.load(memory_model::memory_order_relaxed);
+            }
+
+            unref(func)( cell->data, data );
+
+            cell->sequence.store(pos + 1, memory_model::memory_order_release);
+            ++m_ItemCounter;
+
+            return true;
+        }
+
+        /// @anchor cds_container_VyukovMPMCCycleQueue_enqueue Enqueues \p data to queue
+        bool enqueue(value_type const& data )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return enqueue( data, [](value_type& dest, value_type const& src){ new ( &dest ) value_type( src ); });
+#       else
+            return enqueue( data, copy_construct() );
+#       endif
+        }
+
+#   ifdef CDS_EMPLACE_SUPPORT
+        /// Enqueues data of type \ref cds_container_VyukovMPMCCycleQueue_value_type "value_type" constructed with <tt>std::forward<Args>(args)...</tt>
+        /**
+            This function is available only for compiler that supports
+            variadic template and move semantics
+        */
+        template <typename... Args>
+        bool emplace( Args&&... args )
+        {
+            cell_type* cell;
+            size_t pos = m_posEnqueue.load(memory_model::memory_order_relaxed);
+
+            for (;;)
+            {
+                cell = &m_buffer[pos & m_nBufferMask];
+                size_t seq = cell->sequence.load(memory_model::memory_order_acquire);
+
+                intptr_t dif = (intptr_t)seq - (intptr_t)pos;
+
+                if (dif == 0)
+                {
+                    if ( m_posEnqueue.compare_exchange_weak(pos, pos + 1, memory_model::memory_order_relaxed) )
+                        break;
+                }
+                else if (dif < 0)
+                    return false;
+                else
+                    pos = m_posEnqueue.load(memory_model::memory_order_relaxed);
+            }
+
+            new ( &cell->data ) value_type( std::forward<Args>(args)... );
+
+            cell->sequence.store(pos + 1, memory_model::memory_order_release);
+            ++m_ItemCounter;
+
+            return true;
+
+        }
+#   endif
+
+        /// Dequeues an item from queue
+        /** @anchor cds_container_VyukovMPMCCycleQueue_dequeue_func
+            \p Func is a functor called to copy dequeued value of type \p T to \p dest of type \p Dest.
+            The functor's interface is:
+            \code
+            struct myFunctor {
+            void operator()(Dest& dest, T const& data)
+            {
+                // // Code to copy \p data to \p dest
+                dest = data;
+            }
+            };
+            \endcode
+            You may use \p boost:ref construction to pass functor \p func by reference.
+
+            <b>Requirements</b> The functor \p Func should not throw any exception.
+        */
+        template <typename Dest, typename Func>
+        bool dequeue( Dest& data, Func func )
+        {
+            cell_type * cell;
+            size_t pos = m_posDequeue.load(memory_model::memory_order_relaxed);
+
+            for (;;)
+            {
+                cell = &m_buffer[pos & m_nBufferMask];
+                size_t seq = cell->sequence.load(memory_model::memory_order_acquire);
+                intptr_t dif = (intptr_t)seq - (intptr_t)(pos + 1);
+
+                if (dif == 0) {
+                    if ( m_posDequeue.compare_exchange_weak(pos, pos + 1, memory_model::memory_order_relaxed))
+                        break;
+                }
+                else if (dif < 0)
+                    return false;
+                else
+                    pos = m_posDequeue.load(memory_model::memory_order_relaxed);
+            }
+
+            unref(func)( data, cell->data );
+            value_cleaner()( cell->data );
+            --m_ItemCounter;
+            cell->sequence.store( pos + m_nBufferMask + 1, memory_model::memory_order_release );
+
+            return true;
+        }
+
+        /// Dequeues an item from queue to \p data
+        /** @anchor cds_container_VyukovMPMCCycleQueue_dequeue
+            If queue is empty, returns \p false, \p data is unchanged.
+        */
+        bool dequeue(value_type & data )
+        {
+            return dequeue( data, copy_assign() );
+        }
+
+        /// Synonym of \ref cds_container_VyukovMPMCCycleQueue_enqueue "enqueue"
+        bool push(value_type const& data)
+        {
+            return enqueue(data);
+        }
+
+        /// Synonym for template version of \ref cds_container_VyukovMPMCCycleQueue_enqueue_func "enqueue" function
+        template <typename Source, typename Func>
+        bool push( const Source& data, Func f  )
+        {
+            return enqueue( data, f );
+        }
+
+        /// Synonym of \ref cds_container_VyukovMPMCCycleQueue_dequeue "dequeue"
+        bool pop(value_type& data)
+        {
+            return dequeue(data);
+        }
+
+        /// Synonym for template version of \ref cds_container_VyukovMPMCCycleQueue_dequeue_func "dequeue" function
+        template <typename Type, typename Func>
+        bool pop( Type& dest, Func f )
+        {
+            return dequeue( dest, f );
+        }
+
+        /// Checks if the queue is empty
+        bool empty() const
+        {
+            const cell_type * cell;
+            size_t pos = m_posDequeue.load(memory_model::memory_order_relaxed);
+
+            for (;;)
+            {
+                cell = &m_buffer[pos & m_nBufferMask];
+                size_t seq = cell->sequence.load(memory_model::memory_order_acquire);
+                intptr_t dif = (intptr_t)seq - (intptr_t)(pos + 1);
+
+                if (dif == 0)
+                    return false;
+                else if (dif < 0)
+                    return true;
+                else
+                    pos = m_posDequeue.load(memory_model::memory_order_relaxed);
+            }
+        }
+
+        /// Clears the queue
+        void clear()
+        {
+            value_type v;
+            while ( pop(v) );
+        }
+
+        /// Returns queue's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+        /// Returns capacity of cyclic buffer
+        size_t capacity() const
+        {
+            return m_buffer.capacity();
+        }
+    };
+}}  // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_VYUKOV_MPMC_CYCLE_QUEUE_H
diff --git a/cds/cxx11_atomic.h b/cds/cxx11_atomic.h
new file mode 100644 (file)
index 0000000..d61a49a
--- /dev/null
@@ -0,0 +1,378 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CXX11_ATOMIC_H
+#define __CDS_CXX11_ATOMIC_H
+
+#include <cds/details/defs.h>
+
+namespace cds {
+
+/// C++11 Atomic library support
+/** @ingroup cds_cxx11_stdlib_wrapper
+    <b>libcds</b> has an implementation of C++11 atomic library (header <tt><cds/cxx11_atomic.h></tt>)
+    specified in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf">N3242, p.29</a>.
+
+    This implementation has full support
+    - <tt>atomic<T></tt> class and its specializations for integral types and pointers
+    - <tt>atomic_flag</tt> class
+    - free <tt>atomic_xxx</tt> functions
+
+    Exclusions: the following features specified in C++11 standard are not implemented:
+    - Atomic emulation. The library implements only genuine atomic operations for supported processors
+    - Static initialization macros (like \p ATOMIC_FLAG_INIT and others)
+    - \p atomic_init functions
+
+    Internal atomic implementation is used when the standard library provided by compiler
+    has no C++11 <tt>\<atomic\></tt> header or it is not standard compliant,
+    or when \p CDS_USE_LIBCDS_ATOMIC preprocessor macro is explicitly defined in compiler command line.
+    The library defines \p CDS_ATOMIC macro that specifies atomic library namespace:
+    - \p std for compiler-provided <tt>\<atomic\></tt> library
+    - \p boost if you use <tt>boost.atomic</tt> library (see note below)
+    - \p cds::cxx11_atomic if internal \p libcds atomic implementation used
+
+    The library has internal atomic implementation for the following processor architectures:
+    - Intel and AMD x86 (32bit) and amd64 (64bit)
+    - Intel Itanium IA64 (64bit)
+    - UltraSparc (64bit)
+
+    Using \p CDS_ATOMIC macro you may call <tt>\<atomic\></tt> library functions and classes,
+    for example:
+    \code
+    CDS_ATOMIC::atomic<int> atomInt;
+    CDS_ATOMIC::atomic_store_explicit( &atomInt, 0, CDS_ATOMIC::memory_order_release );
+    \endcode
+
+    \par Microsoft Visual C++
+
+    MS Visual C++ has native <tt>\<atomic\></tt> header beginning from Visual C++ 2012.
+    However, MSVC++ 2012 has a quite inefficient implementation on atomic load/store
+    based on \p compare_exchange, so \p libcds does not use MSVC++ 2012 atomics.
+    The \p libcds library defines \p CDS_ATOMIC as
+    - \p cds::cxx11_atomic (internal implementation) for MS VC++ 2008, 2010, and 2012
+    - \p std for MS VC++ 2013 and above.
+
+    \par GCC
+
+    For GCC compiler the macro \p CDS_ATOMIC is defined as:
+    - \p cds::cxx11_atomic by default
+    - \p std if the compiler version is 4.6 and \p CDS_CXX11_ATOMIC_GCC is defined (see below)
+    - \p std for GCC 4.7 and above
+
+    GCC team implements full support for C++11 memory model in version 4.7
+    (see <a href="http://gcc.gnu.org/wiki/Atomic/GCCMM">http://gcc.gnu.org/wiki/Atomic/GCCMM</a>).
+    \p libcds uses its own implementation of C++11 <tt>\<atomic\></tt> library located in
+    file <tt><cds/cxx11_atomic.h></tt> for GCC version up to 4.6. This implementation almost conforms to C++11 standard draft
+    <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf">N3242</a> (see exclusions above)
+    that is closest to final version.
+    However, GCC 4.6 has the implementation of <tt>\<atomic\></tt> header in its <tt>libstdc++</tt>
+    that is built on <tt>__sync_xxx</tt> (or <tt>__atomic_xxx</tt>) built-in functions. You can use <b>libcds</b> with GCC 4.6
+    <tt>\<atomic\></tt> specifying \p CDS_CXX11_ATOMIC_GCC macro in g++ command line:
+    \code g++ -DCDS_CXX11_ATOMIC_GCC ... \endcode
+    GCC 4.6 atomic implementation does not support <tt>atomic<T></tt> for <b>any</b> type \p T. The linker
+    generates "undefined symbol" error for <tt>atomic<T></tt> if \p T is not an integral type or a pointer. It is
+    not essential for intrusive and non-intrusive containers represented in \p libcds.
+    However, cds::memory::michael memory allocator cannot be linked with GCC 4.6 <tt>\<atomic\></tt> header.
+    This error has been fixed in GCC 4.7.
+
+    \par Clang
+
+    The macro \p CDS_ATOMIC is defined as \p cds::cxx11_atomic.
+    \p libcds does not yet use native clang atomics.
+
+    \par boost::atomic
+
+    Beginning from version 1.54, <a href="http://boost.org">boost</a> library contains an implementation of atomic
+    sufficient for \p libcds.
+    You can compile \p libcds and your projects with <tt>boost.atomic</tt> specifying \p -DCDS_USE_BOOST_ATOMIC
+    in compiler's command line.
+*/
+namespace cxx11_atomics {
+}} // namespace cds::cxx11_atomics
+
+//@cond
+#if defined(CDS_USE_BOOST_ATOMIC)
+#   include <boost/version.hpp>
+#   if BOOST_VERSION >= 105400
+#       include <boost/atomic.hpp>
+#       define CDS_ATOMIC boost
+#       define CDS_CXX11_ATOMIC_BEGIN_NAMESPACE namespace boost {
+#       define CDS_CXX11_ATOMIC_END_NAMESPACE }
+#   else
+#       error "Boost version 1.54 or above is needed for boost.atomic"
+#   endif
+#elif CDS_CXX11_ATOMIC_SUPPORT == 1 && !defined(CDS_USE_LIBCDS_ATOMIC)
+    // Compiler supports C++11 atomic (conditionally defined in cds/details/defs.h)
+#   include <cds/compiler/cxx11_atomic_prepatches.h>
+#   include <atomic>
+#   define CDS_ATOMIC std
+#   define CDS_CXX11_ATOMIC_BEGIN_NAMESPACE namespace std {
+#   define CDS_CXX11_ATOMIC_END_NAMESPACE }
+#   include <cds/compiler/cxx11_atomic_patches.h>
+#else
+#   include <cds/compiler/cxx11_atomic.h>
+#   define CDS_ATOMIC cds::cxx11_atomics
+#   define CDS_CXX11_ATOMIC_BEGIN_NAMESPACE namespace cds { namespace cxx11_atomics {
+#   define CDS_CXX11_ATOMIC_END_NAMESPACE }}
+#endif
+//@endcond
+
+namespace cds {
+
+    /// Atomic primitives
+    /**
+        This namespace contains useful primitives derived from <tt>std::atomic</tt>.
+    */
+    namespace atomicity {
+
+        /// Atomic event counter.
+        /**
+            This class is based on <tt>std::atomic_size_t</tt>.
+            It uses relaxed memory ordering \p memory_order_relaxed and may be used as a statistic counter.
+        */
+        class event_counter
+        {
+            //@cond
+            CDS_ATOMIC::atomic_size_t   m_counter;
+            //@endcond
+
+        public:
+            typedef size_t      value_type  ;       ///< Type of counter
+
+        public:
+            // Initializes event counter with zero
+            event_counter() CDS_NOEXCEPT
+                : m_counter(size_t(0))
+            {}
+
+            /// Assign operator
+            /**
+                Returns \p n.
+            */
+            value_type operator =(
+                value_type n    //< new value of the counter
+            ) CDS_NOEXCEPT
+            {
+                m_counter.exchange( n, CDS_ATOMIC::memory_order_relaxed );
+                return n;
+            }
+
+            /// Addition
+            /**
+                Returns new value of the atomic counter.
+            */
+            size_t operator +=(
+                size_t n    ///< addendum
+            ) CDS_NOEXCEPT
+            {
+                return m_counter.fetch_add( n, CDS_ATOMIC::memory_order_relaxed ) + n;
+            }
+
+            /// Substraction
+            /**
+                Returns new value of the atomic counter.
+            */
+            size_t operator -=(
+                size_t n    ///< subtrahend
+            ) CDS_NOEXCEPT
+            {
+                return m_counter.fetch_sub( n, CDS_ATOMIC::memory_order_relaxed ) - n;
+            }
+
+            /// Get current value of the counter
+            operator size_t () const CDS_NOEXCEPT
+            {
+                return m_counter.load( CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Preincrement
+            size_t operator ++() CDS_NOEXCEPT
+            {
+                return m_counter.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed ) + 1;
+            }
+            /// Postincrement
+            size_t operator ++(int) CDS_NOEXCEPT
+            {
+                return m_counter.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Predecrement
+            size_t operator --() CDS_NOEXCEPT
+            {
+                return m_counter.fetch_sub( 1, CDS_ATOMIC::memory_order_relaxed ) - 1;
+            }
+            /// Postdecrement
+            size_t operator --(int) CDS_NOEXCEPT
+            {
+                return m_counter.fetch_sub( 1, CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Get current value of the counter
+            size_t get() const CDS_NOEXCEPT
+            {
+                return m_counter.load( CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Resets the counter to 0
+            void reset() CDS_NOEXCEPT
+            {
+                m_counter.store( 0, CDS_ATOMIC::memory_order_release );
+            }
+
+        };
+
+        /// Atomic item counter
+        /**
+            This class is simplified interface around <tt>std::atomic_size_t</tt>.
+            The class supports getting of current value of the counter and increment/decrement its value.
+        */
+        class item_counter
+        {
+        public:
+            typedef CDS_ATOMIC::atomic_size_t   atomic_type ;   ///< atomic type used
+            typedef size_t counter_type    ;   ///< Integral item counter type (size_t)
+
+        private:
+            //@cond
+            atomic_type                         m_Counter   ;   ///< Atomic item counter
+            //@endcond
+
+        public:
+            /// Default ctor initializes the counter to zero.
+            item_counter()
+                : m_Counter(counter_type(0))
+            {}
+
+            /// Returns current value of the counter
+            counter_type    value(CDS_ATOMIC::memory_order order = CDS_ATOMIC::memory_order_relaxed) const
+            {
+                return m_Counter.load( order );
+            }
+
+            /// Same as \ref value() with relaxed memory ordering
+            operator counter_type() const
+            {
+                return value();
+            }
+
+            /// Returns underlying atomic interface
+            atomic_type&  getAtomic()
+            {
+                return m_Counter;
+            }
+
+            /// Returns underlying atomic interface (const)
+            const atomic_type&  getAtomic() const
+            {
+                return m_Counter;
+            }
+
+            /// Increments the counter. Semantics: postincrement
+            counter_type inc(CDS_ATOMIC::memory_order order = CDS_ATOMIC::memory_order_relaxed )
+            {
+                return m_Counter.fetch_add( 1, order );
+            }
+
+            /// Decrements the counter. Semantics: postdecrement
+            counter_type dec(CDS_ATOMIC::memory_order order = CDS_ATOMIC::memory_order_relaxed)
+            {
+                return m_Counter.fetch_sub( 1, order );
+            }
+
+            /// Preincrement
+            counter_type operator ++()
+            {
+                return inc() + 1;
+            }
+            /// Postincrement
+            counter_type operator ++(int)
+            {
+                return inc();
+            }
+
+            /// Predecrement
+            counter_type operator --()
+            {
+                return dec() - 1;
+            }
+            /// Postdecrement
+            counter_type operator --(int)
+            {
+                return dec();
+            }
+
+            /// Resets count to 0
+            void reset(CDS_ATOMIC::memory_order order = CDS_ATOMIC::memory_order_relaxed)
+            {
+                m_Counter.store( 0, order );
+            }
+        };
+
+        /// Empty item counter
+        /**
+            This class may be used instead of \ref item_counter when you do not need full \ref item_counter interface.
+            All methods of the class is empty and returns 0.
+
+            The object of this class should not be used in data structure that behavior significantly depends on item counting
+            (for example, in many hash map implementation).
+        */
+        class empty_item_counter {
+        public:
+            typedef size_t counter_type    ;  ///< Counter type
+        public:
+            /// Returns 0
+            counter_type    value(CDS_ATOMIC::memory_order /*order*/ = CDS_ATOMIC::memory_order_relaxed) const
+            {
+                return 0;
+            }
+
+            /// Same as \ref value(), always returns 0.
+            operator counter_type() const
+            {
+                return value();
+            }
+
+            /// Dummy increment. Always returns 0
+            size_t inc(CDS_ATOMIC::memory_order /*order*/ = CDS_ATOMIC::memory_order_relaxed)
+            {
+                return 0;
+            }
+
+            /// Dummy increment. Always returns 0
+            size_t dec(CDS_ATOMIC::memory_order /*order*/ = CDS_ATOMIC::memory_order_relaxed)
+            {
+                return 0;
+            }
+
+            /// Dummy pre-increment. Always returns 0
+            size_t operator ++()
+            {
+                return 0;
+            }
+            /// Dummy post-increment. Always returns 0
+            size_t operator ++(int)
+            {
+                return 0;
+            }
+
+            /// Dummy pre-decrement. Always returns 0
+            size_t operator --()
+            {
+                return 0;
+            }
+            /// Dummy post-decrement. Always returns 0
+            size_t operator --(int)
+            {
+                return 0;
+            }
+
+            /// Dummy function
+            void reset(CDS_ATOMIC::memory_order /*order*/ = CDS_ATOMIC::memory_order_relaxed)
+            {}
+        };
+
+
+    }   // namespace atomicity
+
+}   // namespace cds
+
+#endif // #ifndef __CDS_CXX11_ATOMIC_H
diff --git a/cds/details/aligned_allocator.h b/cds/details/aligned_allocator.h
new file mode 100644 (file)
index 0000000..85ff72a
--- /dev/null
@@ -0,0 +1,158 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_ALIGNED_ALLOCATOR_H
+#define __CDS_DETAILS_ALIGNED_ALLOCATOR_H
+
+#include <cds/details/defs.h>
+#include <cds/user_setup/allocator.h>
+
+namespace cds { namespace details {
+
+    /// Allocator for aligned data
+    /**
+        The class is the wrapper around user-defined aligned allocator.
+        Template parameters:
+        \li \p T is a type to allocate
+        \li \p ALIGNED_ALLOCATOR is an aligned allocator implementation. Default implementation is defined by macro
+        CDS_DEFAULT_ALIGNED_ALLOCATOR from cds/user_setup/allocator.h header file.
+
+        The \p nAlign parameter of member function specifyes desired aligment of data allocated.
+
+        \par Note
+        When an array allocation is performed the allocator guarantees the alignment for first element of array only.
+        To guarantee the alignment for each element of the array the size of type \p T must be multiple of \p nAlign:
+        \code
+        sizeof(T) % nAlign == 0
+        \endcode
+    */
+    template <
+        typename T
+        , typename ALIGNED_ALLOCATOR = CDS_DEFAULT_ALIGNED_ALLOCATOR
+    >
+    class AlignedAllocator: public ALIGNED_ALLOCATOR::template rebind<T>::other
+    {
+    public:
+        /// Underlying aligned allocator type
+        typedef typename ALIGNED_ALLOCATOR::template rebind<T>::other   allocator_type;
+
+#   ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+        /// Analogue of operator new T(\p src... )
+        template <typename... S>
+        T *  New( size_t nAlign, const S&... src )
+        {
+            return Construct( allocator_type::allocate( nAlign, 1), src... );
+        }
+#   else
+        //@cond
+        /// Analogue of operator new T
+        T *  New( size_t nAlign )
+        {
+            return Construct( allocator_type::allocate(nAlign, 1) );
+        }
+
+        /// Analogue of operator new T(\p src )
+        template <typename S>
+        T *  New( size_t nAlign, const S& src )
+        {
+            return Construct( allocator_type::allocate( nAlign, 1), src );
+        }
+
+        /// Analogue of operator new T( \p s1, \p s2 )
+        template <typename S1, typename S2>
+        T *  New( size_t nAlign, const S1& s1, const S2& s2 )
+        {
+            return Construct( allocator_type::allocate( nAlign, 1 ), s1, s2 );
+        }
+
+        /// Analogue of operator new T( \p s1, \p s2, \p s3 )
+        template <typename S1, typename S2, typename S3>
+        T *  New( size_t nAlign, const S1& s1, const S2& s2, const S3& s3 )
+        {
+            return Construct( allocator_type::allocate(nAlign, 1), s1, s2, s3 );
+        }
+        //@endcond
+#   endif
+
+        /// Analogue of operator new T[\p nCount ]
+        T * NewArray( size_t nAlign, size_t nCount )
+        {
+            T * p = allocator_type::allocate( nAlign, nCount );
+            for ( size_t i = 0; i < nCount; ++i )
+                Construct( p + i );
+            return p;
+        }
+
+        /// Analogue of operator new T[\p nCount ].
+        /**
+            Each item of array of type T is initialized by parameter \p src.
+        */
+        template <typename S>
+        T * NewArray( size_t nAlign, size_t nCount, const S& src )
+        {
+            T * p = allocator_type::allocate( nAlign, nCount );
+            for ( size_t i = 0; i < nCount; ++i )
+                Construct( p + i, src );
+            return p;
+        }
+
+        /// Analogue of operator delete
+        void Delete( T * p )
+        {
+            allocator_type::destroy( p );
+            allocator_type::deallocate( p, 1 );
+        }
+
+        /// Analogue of operator delete []
+        void Delete( T * p, size_t nCount )
+        {
+            for ( size_t i = 0; i < nCount; ++i )
+                allocator_type::destroy( p + i );
+            allocator_type::deallocate( p, nCount );
+        }
+
+#   ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+        /// Analogue of placement operator new( \p p ) T( \p src... )
+        template <typename... S>
+        T * Construct( void * p, const S&... src )
+        {
+            return new( p ) T( src... );
+        }
+#   else
+        /// Analogue of placement operator new( \p p ) T
+        T * Construct( void * p )
+        {
+            return new( p ) T;
+        }
+
+        /// Analogue of placement operator new( \p p ) T( \p src )
+        template <typename S>
+        T * Construct( void * p, const S& src )
+        {
+            return new( p ) T( src );
+        }
+
+        /// Analogue of placement operator new( \p p ) T( \p s1, \p s2 )
+        template <typename S1, typename S2>
+        T *  Construct( void * p, const S1& s1, const S2& s2 )
+        {
+            return new( p ) T( s1, s2 );
+        }
+
+        /// Analogue of placement operator new( \p p ) T( \p s1, \p s2, \p s3 )
+        template <typename S1, typename S2, typename S3>
+        T *  Construct( void * p, const S1& s1, const S2& s2, const S3& s3 )
+        {
+            return new( p ) T( s1, s2, s3 );
+        }
+#   endif
+
+        /// Rebinds allocator to other type \p Q instead of \p T
+        template <typename Q>
+        struct rebind {
+            typedef AlignedAllocator< Q, typename ALIGNED_ALLOCATOR::template rebind<Q>::other >    other ; ///< Rebinding result
+        };
+    };
+
+}} // namespace cds::details
+
+#endif // #ifndef __CDS_DETAILS_ALIGNED_ALLOCATOR_H
diff --git a/cds/details/aligned_type.h b/cds/details/aligned_type.h
new file mode 100644 (file)
index 0000000..0600827
--- /dev/null
@@ -0,0 +1,80 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_ALIGNED_TYPE_H
+#define __CDS_DETAILS_ALIGNED_TYPE_H
+
+#include <cds/details/defs.h>
+
+namespace cds { namespace details {
+
+    /// Aligned type
+    /**
+        This meta-algorithm solves compiler problem when you need to declare a type \p T with alignment
+        equal to another type alignment. For example, the following declaration produces an error in Microsoft Visual Studio 2008 compiler:
+        \code
+            typedef double  my_double;
+            typedef __declspec(align( __alignof(my_double) )) int   aligned_int;
+        \endcode
+        In MS VS, the __declspec(align(N)) construction requires that N must be a integer constant (1, 2, 4 and so on)
+        but not an integer constant expression.
+
+        The result of this meta-algo is a type \p aligned_type<T,Alignment>::type that is \p T aligned by \p Alignment.
+        For example, with \p aligned_type the prevoius example will not generate an error:
+        \code
+            typedef double  my_double;
+            typedef typename cds::details::aligned_type<int, __alignof(my_double)>::type   aligned_int;
+        \endcode
+        and result of this declaration is equivalent to
+        \code
+            typedef __declspec(align(8)) int   aligned_int;
+        \endcode
+
+        The \p Alignment template parameter must be a constant expression and its result must be power of two.
+        The maximum of its value is 1024.
+
+        See also \ref align_as
+    */
+    template <typename T, size_t Alignment>
+    struct aligned_type
+#ifdef CDS_DOXYGEN_INVOKED
+        {}
+#endif
+;
+
+    //@cond none
+#   define CDS_ALIGNED_TYPE_impl(nAlign) template <typename T> struct aligned_type<T,nAlign> { typedef CDS_TYPE_ALIGNMENT(nAlign) T type; }
+    CDS_ALIGNED_TYPE_impl(1);
+    CDS_ALIGNED_TYPE_impl(2);
+    CDS_ALIGNED_TYPE_impl(4);
+    CDS_ALIGNED_TYPE_impl(8);
+    CDS_ALIGNED_TYPE_impl(16);
+    CDS_ALIGNED_TYPE_impl(32);
+    CDS_ALIGNED_TYPE_impl(64);
+    CDS_ALIGNED_TYPE_impl(128);
+    CDS_ALIGNED_TYPE_impl(256);
+    CDS_ALIGNED_TYPE_impl(512);
+    CDS_ALIGNED_TYPE_impl(1024);
+#   undef CDS_ALIGNED_TYPE_impl
+    //@endcond
+
+    /** Alignment by example
+
+        This meta-algo is similar to \ref aligned_type <T, alignof(AlignAs)>.
+
+        For example, the following code
+        \code
+        typedef typename cds::details::align_as<int, double>::type   aligned_int;
+        \endcode
+        declares type \p aligned_int which is \p int aligned like \p double.
+
+        See also: \ref aligned_type
+    */
+    template <typename T, typename AlignAs>
+    struct align_as {
+        /// Result of meta-algo: type \p T aligned like type \p AlignAs
+        typedef typename aligned_type<T, alignof(AlignAs)>::type type;
+    };
+
+}}  // namespace cds::details
+
+#endif // #ifndef __CDS_DETAILS_ALIGNED_TYPE_H
diff --git a/cds/details/allocator.h b/cds/details/allocator.h
new file mode 100644 (file)
index 0000000..7070c1f
--- /dev/null
@@ -0,0 +1,307 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_ALLOCATOR_H
+#define __CDS_DETAILS_ALLOCATOR_H
+
+/*
+    Allocator class for the library. Supports allocating and constructing of objects
+
+    Editions:
+        2008.03.08    Maxim.Khiszinsky    Created
+*/
+
+#include <cds/details/defs.h>
+#include <cds/user_setup/allocator.h>
+#include <cds/details/std/type_traits.h>
+#include <memory>
+#include <boost/type_traits/has_trivial_destructor.hpp>
+
+namespace cds {
+    namespace details {
+
+        /// Extends \p std::allocator interface to provide semantics like operator \p new and \p delete
+        /**
+            The class is the wrapper around underlying \p Alloc class.
+            \p Alloc provides the \p std::allocator interface.
+        */
+        template <typename T, class Alloc = CDS_DEFAULT_ALLOCATOR >
+        class Allocator
+            : public std::conditional<
+                        std::is_same< T, typename Alloc::value_type>::value
+                        , Alloc
+                        , typename Alloc::template rebind<T>::other
+                     >::type
+        {
+        public:
+            /// Underlying allocator type
+            typedef typename std::conditional<
+                std::is_same< T, typename Alloc::value_type>::value
+                , Alloc
+                , typename Alloc::template rebind<T>::other
+            >::type allocator_type;
+
+            /// Element type
+            typedef T   value_type;
+
+#       ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+            /// Analogue of operator new T(\p src... )
+            template <typename... S>
+            value_type *  New( S const&... src )
+            {
+                return Construct( allocator_type::allocate(1), src... );
+            }
+#       else
+            //@cond
+            /// Analogue of operator new T
+            value_type *  New()
+            {
+                return Construct( allocator_type::allocate(1) );
+            }
+
+            /// Analogue of operator new T(\p src )
+            template <typename S>
+            value_type *  New( S const& src )
+            {
+                return Construct( allocator_type::allocate(1), src );
+            }
+
+            /// Analogue of operator new T( \p s1, \p s2 )
+            template <typename S1, typename S2>
+            value_type *  New( S1 const& s1, S2 const& s2 )
+            {
+                return Construct( allocator_type::allocate(1), s1, s2 );
+            }
+
+            /// Analogue of operator new T( \p s1, \p s2, \p s3 )
+            template <typename S1, typename S2, typename S3>
+            value_type *  New( S1 const& s1, S2 const& s2, S3 const& s3 )
+            {
+                return Construct( allocator_type::allocate(1), s1, s2, s3 );
+            }
+            //@endcond
+#       endif
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            /// Analogue of <tt>operator new T( std::forward<Args>(args)... )</tt> (move semantics)
+            /**
+                This function is available only for compiler that supports
+                variadic template and move semantics
+            */
+            template <typename... Args>
+            value_type * MoveNew( Args&&... args )
+            {
+                return MoveConstruct( allocator_type::allocate(1), std::forward<Args>(args)... );
+            }
+#       endif
+
+
+            /// Analogue of operator new T[\p nCount ]
+            value_type * NewArray( size_t nCount )
+            {
+                value_type * p = allocator_type::allocate( nCount );
+                for ( size_t i = 0; i < nCount; ++i )
+                    Construct( p + i );
+                return p;
+            }
+
+            /// Analogue of operator new T[\p nCount ].
+            /**
+                Each item of array of type T is initialized by parameter \p src: T( src )
+            */
+            template <typename S>
+            value_type * NewArray( size_t nCount, S const& src )
+            {
+                value_type * p = allocator_type::allocate( nCount );
+                for ( size_t i = 0; i < nCount; ++i )
+                    Construct( p + i, src );
+                return p;
+            }
+
+#       ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+#       if CDS_COMPILER == CDS_COMPILER_INTEL
+            //@cond
+            value_type * NewBlock( size_t nSize )
+            {
+                return Construct( heap_alloc( nSize ));
+            }
+            //@endcond
+#       endif
+            /// Allocates block of memory of size at least \p nSize bytes.
+            /**
+                Internally, the block is allocated as an array of \p void* pointers,
+                then \p Construct() method is called to initialize \p T.
+
+                Precondition: <tt> nSize >= sizeof(T) </tt>
+            */
+            template <typename... S>
+            value_type *  NewBlock( size_t nSize, S const&... src )
+            {
+                return Construct( heap_alloc( nSize ), src... );
+            }
+#       else
+            //@cond
+            value_type * NewBlock( size_t nSize )
+            {
+                return Construct( heap_alloc( nSize ));
+            }
+            template <typename S>
+            value_type * NewBlock( size_t nSize, S const& arg )
+            {
+                return Construct( heap_alloc( nSize ), arg );
+            }
+            template <typename S1, typename S2>
+            value_type * NewBlock( size_t nSize, S1 const& arg1, S2 const& arg2 )
+            {
+                return Construct( heap_alloc( nSize ), arg1, arg2 );
+            }
+            template <typename S1, typename S2, typename S3>
+            value_type * NewBlock( size_t nSize, S1 const& arg1, S2 const& arg2, S3 const& arg3 )
+            {
+                return Construct( heap_alloc( nSize ), arg1, arg2, arg3 );
+            }
+            //@endcond
+#       endif
+
+            /// Analogue of operator delete
+            void Delete( value_type * p )
+            {
+                allocator_type::destroy( p );
+                allocator_type::deallocate( p, 1 );
+            }
+
+            /// Analogue of operator delete []
+            void Delete( value_type * p, size_t nCount )
+            {
+                 for ( size_t i = 0; i < nCount; ++i )
+                     allocator_type::destroy( p + i );
+                allocator_type::deallocate( p, nCount );
+            }
+
+#       ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+#       if CDS_COMPILER == CDS_COMPILER_INTEL
+            //@cond
+            value_type * Construct( void * p )
+            {
+                return new( p ) value_type;
+            }
+            //@endcond
+#       endif
+            /// Analogue of placement operator new( \p p ) T( src... )
+            template <typename... S>
+            value_type * Construct( void * p, S const&... src )
+            {
+                return new( p ) value_type( src... );
+            }
+#       else
+            //@cond
+            /// Analogue of placement operator new( \p p ) T
+            value_type * Construct( void * p )
+            {
+                return new( p ) value_type;
+            }
+
+
+            /// Analogue of placement operator new( \p p ) T( \p src )
+            template <typename S>
+            value_type * Construct( void * p, S const& src )
+            {
+                return new( p ) value_type( src );
+            }
+
+            /// Analogue of placement operator new( \p p ) T( \p s1, \p s2 )
+            template <typename S1, typename S2>
+            value_type *  Construct( void * p, S1 const& s1, S2 const& s2 )
+            {
+                return new( p ) value_type( s1, s2 );
+            }
+
+            /// Analogue of placement operator new( \p p ) T( \p s1, \p s2, \p s3 )
+            template <typename S1, typename S2, typename S3>
+            value_type *  Construct( void * p, S1 const& s1, S2 const& s2, S3 const& s3 )
+            {
+                return new( p ) value_type( s1, s2, s3 );
+            }
+            //@endcond
+#       endif
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            /// Analogue of placement <tt>operator new( p ) T( std::forward<Args>(args)... )</tt>
+            /**
+                This function is available only for compiler that supports
+                variadic template and move semantics
+            */
+            template <typename... Args>
+            value_type * MoveConstruct( void * p, Args&&... args )
+            {
+                return new( p ) value_type( std::forward<Args>(args)... );
+            }
+#       endif
+
+            /// Rebinds allocator to other type \p Q instead of \p T
+            template <typename Q>
+            struct rebind {
+                typedef Allocator< Q, typename Alloc::template rebind<Q>::other >    other ; ///< Rebinding result
+            };
+
+        private:
+            //@cond
+            void * heap_alloc( size_t nByteSize )
+            {
+                assert( nByteSize >= sizeof(value_type));
+
+                size_t const nPtrSize = ( nByteSize + sizeof(void *) - 1 ) / sizeof(void *);
+                typedef typename allocator_type::template rebind< void * >::other void_allocator;
+                return void_allocator().allocate( nPtrSize );
+            }
+            //@endcond
+        };
+
+        //@cond
+        namespace {
+            template <class T>
+            static inline void impl_call_dtor(T* p, boost::false_type const&)
+            {
+                p->T::~T();
+            }
+
+            template <class T>
+            static inline void impl_call_dtor(T* p, boost::true_type const&)
+            {}
+        }
+        //@endcond
+
+        /// Helper function to call destructor of type T
+        /**
+            This function is empty for the type T that has trivial destructor.
+        */
+        template <class T>
+        static inline void call_dtor( T* p )
+        {
+            impl_call_dtor( p, ::boost::has_trivial_destructor<T>() );
+        }
+
+
+        /// Deferral removing of the object of type \p T. Helper class
+        template <typename T, typename Alloc = CDS_DEFAULT_ALLOCATOR>
+        struct deferral_deleter {
+            typedef T           type            ; ///< Type
+            typedef Alloc       allocator_type  ; ///< Allocator for removing
+
+            /// Frees the object \p p
+            /**
+                Caveats: this function uses temporary object of type \ref cds::details::Allocator to free the node \p p.
+                So, the node allocator should be stateless. It is standard requirement for \p std::allocator class objects.
+
+                Do not use this function directly.
+            */
+            static void free( T * p )
+            {
+                Allocator<T, Alloc> a;
+                a.Delete( p );
+            }
+        };
+
+    }    // namespace details
+}    // namespace cds
+
+#endif    // #ifndef __CDS_DETAILS_ALLOCATOR_H
diff --git a/cds/details/binary_functor_wrapper.h b/cds/details/binary_functor_wrapper.h
new file mode 100644 (file)
index 0000000..1acbb2a
--- /dev/null
@@ -0,0 +1,62 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_BINARY_FUNCTOR_WRAPPER_H
+#define __CDS_DETAILS_BINARY_FUNCTOR_WRAPPER_H
+
+#include <cds/details/defs.h>
+
+//@cond
+namespace cds { namespace details {
+
+    template <typename ReturnType, typename Functor, typename ArgType, typename Accessor>
+    struct binary_functor_wrapper {
+        typedef ReturnType  return_type;
+        typedef Functor     functor_type;
+        typedef ArgType     argument_type;
+        typedef Accessor    accessor;
+
+        return_type operator()( argument_type const& a1, argument_type const& a2 ) const
+        {
+            return functor_type()( accessor()( a1 ), accessor()( a2 ));
+        }
+
+        template <typename Q>
+        return_type operator()( argument_type const& a, Q const& q ) const
+        {
+            return functor_type()( accessor()(a), q );
+        }
+
+        template <typename Q>
+        return_type operator()( Q const& q, argument_type const& a ) const
+        {
+            return functor_type()( q, accessor()(a));
+        }
+
+        template <typename Q1, typename Q2>
+        return_type operator()( Q1 const& q1, Q2 const& q2 ) const
+        {
+            return functor_type()( q1, q2 );
+        }
+    };
+
+#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
+    template <typename ArgType, typename Predicate, typename Accessor>
+    using predicate_wrapper = binary_functor_wrapper< bool, Predicate, ArgType, Accessor>;
+
+    template <typename ArgType, typename Compare, typename Accessor>
+    using compare_wrapper = binary_functor_wrapper< int, Compare, ArgType, Accessor>;
+#else
+    template <typename ArgType, typename Predicate, typename Accessor>
+    struct predicate_wrapper: public binary_functor_wrapper< bool, Predicate, ArgType, Accessor>
+    {};
+
+    template <typename ArgType, typename Compare, typename Accessor>
+    struct compare_wrapper: public binary_functor_wrapper< int, Compare, ArgType, Accessor >
+    {};
+#endif
+
+}} // namespace cds::details
+
+//@endcond
+
+#endif // #ifndef __CDS_DETAILS_BINARY_FUNCTOR_WRAPPER_H
diff --git a/cds/details/bit_reverse_counter.h b/cds/details/bit_reverse_counter.h
new file mode 100644 (file)
index 0000000..5f0df6e
--- /dev/null
@@ -0,0 +1,73 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_BIT_REVERSE_COUNTER_H
+#define __CDS_DETAILS_BIT_REVERSE_COUNTER_H
+
+#include <cds/bitop.h>
+
+//@cond
+namespace cds { namespace bitop {
+
+    template <typename Counter = size_t>
+    class bit_reverse_counter
+    {
+    public:
+        typedef Counter     counter_type;
+
+    private:
+        counter_type        m_nCounter;
+        counter_type        m_nReversed;
+        int                 m_nHighBit;
+
+    public:
+        bit_reverse_counter()
+            : m_nCounter(0)
+            , m_nReversed(0)
+            , m_nHighBit(-1)
+        {}
+
+        counter_type inc()
+        {
+            ++m_nCounter;
+            int nBit;
+            for ( nBit = m_nHighBit - 1; nBit >= 0; --nBit ) {
+                if ( !cds::bitop::complement( m_nReversed, nBit ))
+                    break;
+            }
+            if ( nBit < 0 ) {
+                m_nReversed = m_nCounter;
+                ++m_nHighBit;
+            }
+            return m_nReversed;
+        }
+
+        counter_type dec()
+        {
+            --m_nCounter;
+            int nBit;
+            for ( nBit = m_nHighBit - 1; nBit >= 0; --nBit ) {
+                if ( cds::bitop::complement( m_nReversed, nBit ) )
+                    break;
+            }
+            if ( nBit < 0 ) {
+                m_nReversed = m_nCounter;
+                --m_nHighBit;
+            }
+            return m_nReversed;
+        }
+
+        counter_type    value() const
+        {
+            return m_nCounter;
+        }
+
+        counter_type    reversed_value() const
+        {
+            return m_nReversed;
+        }
+    };
+
+}}   // namespace cds::bitop
+//@endcond
+
+#endif // #ifndef __CDS_DETAILS_BIT_REVERSE_COUNTER_H
diff --git a/cds/details/bitop_generic.h b/cds/details/bitop_generic.h
new file mode 100644 (file)
index 0000000..8fed30b
--- /dev/null
@@ -0,0 +1,271 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_BITOP_GENERIC_H
+#define __CDS_DETAILS_BITOP_GENERIC_H
+
+#include <stdlib.h>     // rand()
+namespace cds {
+    namespace bitop { namespace platform {
+        // Return true if x = 2 ** k, k >= 0
+#ifndef cds_bitop_isPow2_32_DEFINED
+        static inline bool isPow2_32( atomic32u_t x )
+        {
+            return (x & ( x - 1 )) == 0    && x;
+        }
+#endif
+
+#ifndef cds_bitop_isPow2_64_DEFINED
+        static inline bool isPow2_64( atomic64_unaligned x )
+        {
+            return (x & ( x - 1 )) == 0 && x;
+        }
+#endif
+
+        //***************************************************
+        // Most significant bit number (1..N)
+        // Return 0 if x == 0
+        //
+#ifndef cds_bitop_msb32_DEFINED
+        // Return number (1..32) of most significant bit
+        // Return 0 if x == 0
+        // Source: Linux kernel
+        static inline int msb32( atomic32u_t x )
+        {
+            int r = 32;
+
+            if (!x)
+                return 0;
+            if (!(x & 0xffff0000u)) {
+                x <<= 16;
+                r -= 16;
+            }
+            if (!(x & 0xff000000u)) {
+                x <<= 8;
+                r -= 8;
+            }
+            if (!(x & 0xf0000000u)) {
+                x <<= 4;
+                r -= 4;
+            }
+            if (!(x & 0xc0000000u)) {
+                x <<= 2;
+                r -= 2;
+            }
+            if (!(x & 0x80000000u)) {
+                x <<= 1;
+                r -= 1;
+            }
+            return r;
+        }
+#endif
+
+#ifndef cds_bitop_msb32nz_DEFINED
+        static inline int msb32nz( atomic32u_t x )
+        {
+            return msb32( x ) - 1;
+        }
+#endif
+
+#ifndef cds_bitop_msb64_DEFINED
+        static inline int msb64( atomic64u_unaligned x )
+        {
+            atomic32u_t h = (atomic32u_t) (x >> 32);
+            if ( h )
+                return msb32( h ) + 32;
+            return msb32( (atomic32u_t) x );
+        }
+#endif
+
+#ifndef cds_bitop_msb64nz_DEFINED
+        static inline int msb64nz( atomic64u_unaligned x )
+        {
+            return msb64( x ) - 1;
+        }
+#endif
+
+        //***************************************************
+        // Least significant bit number (1..N)
+        // Return 0 if x == 0
+        //
+#ifndef cds_bitop_lsb32_DEFINED
+        // Return number (1..32) of least significant bit
+        // Return 0 if x == 0
+        // Source: Linux kernel
+        static inline int lsb32( atomic32u_t x )
+        {
+            int r = 1;
+
+            if (!x)
+                return 0;
+            if (!(x & 0xffff)) {
+                x >>= 16;
+                r += 16;
+            }
+            if (!(x & 0xff)) {
+                x >>= 8;
+                r += 8;
+            }
+            if (!(x & 0xf)) {
+                x >>= 4;
+                r += 4;
+            }
+            if (!(x & 3)) {
+                x >>= 2;
+                r += 2;
+            }
+            if (!(x & 1)) {
+                x >>= 1;
+                r += 1;
+            }
+            return r;
+        }
+#endif
+
+#ifndef cds_bitop_lsb32nz_DEFINED
+        static inline int lsb32nz( atomic32u_t x )
+        {
+            return lsb32( x ) - 1;
+        }
+#endif
+
+#ifndef cds_bitop_lsb64_DEFINED
+        static inline int lsb64( atomic64u_unaligned x )
+        {
+            if ( !x )
+                return 0;
+            if ( x & 0xffffffffu )
+                return lsb32( (atomic32u_t) x );
+            return lsb32( (atomic32u_t) (x >> 32) ) + 32;
+        }
+#endif
+
+#ifndef cds_bitop_lsb64nz_DEFINED
+        static inline int lsb64nz( atomic64u_unaligned x )
+        {
+            return lsb64( x ) - 1;
+        }
+#endif
+
+        //******************************************************
+        // Reverse bit order
+        //******************************************************
+#ifndef cds_bitop_rbo32_DEFINED
+        static inline atomic32u_t rbo32( atomic32u_t x )
+        {
+            // swap odd and even bits
+            x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1);
+            // swap consecutive pairs
+            x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2);
+            // swap nibbles ...
+            x = ((x >> 4) & 0x0F0F0F0F) | ((x & 0x0F0F0F0F) << 4);
+            // swap bytes
+            x = ((x >> 8) & 0x00FF00FF) | ((x & 0x00FF00FF) << 8);
+            // swap 2-byte long pairs
+            return ( x >> 16 ) | ( x << 16 );
+        }
+#endif
+
+#ifndef cds_bitop_rbo64_DEFINED
+        static inline atomic64u_t rbo64( atomic64u_unaligned x )
+        {
+            //                      Low 32bit                                          Hight 32bit
+            return ( ((atomic64u_t) rbo32( (atomic32u_t) x )) << 32 ) | ((atomic64u_t) rbo32( (atomic32u_t) (x >> 32) ));
+        }
+#endif
+
+        //******************************************************
+        // Set bit count. Return count of non-zero bits in word
+        //******************************************************
+#ifndef cds_bitop_sbc32_DEFINED
+        static inline int sbc32( atomic32u_t x )
+        {
+#        ifdef cds_beans_zbc32_DEFINED
+            return 32 - zbc32( x );
+#        else
+            // Algorithm from Sean Eron Anderson's great collection
+            x = x - ((x >> 1) & 0x55555555);
+            x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
+            return (((x + (x >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24;
+#        endif
+        }
+#endif
+
+#ifndef cds_bitop_sbc64_DEFINED
+        static inline int sbc64( atomic64u_unaligned x )
+        {
+#        ifdef cds_beans_zbc64_DEFINED
+            return 64 - zbc64( x );
+#        else
+            return sbc32( (atomic32u_t) (x >> 32) ) + sbc32( (atomic32u_t) x );
+#        endif
+        }
+#endif
+
+        //******************************************************
+        // Zero bit count. Return count of zero bits in word
+        //******************************************************
+#ifndef cds_bitop_zbc32_DEFINED
+        static inline int zbc32( atomic32u_t x )
+        {
+            return 32 - sbc32( x );
+        }
+#endif
+
+#ifndef cds_bitop_zbc64_DEFINED
+        static inline int zbc64( atomic64u_unaligned x )
+        {
+            return 64 - sbc64( x );
+        }
+#endif
+
+        // Bit complement
+#ifndef cds_bitop_complement32_DEFINED
+        static inline bool complement32( atomic32u_t * pArg, unsigned int nBit )
+        {
+            assert( pArg != NULL );
+            atomic32u_t nVal = *pArg & (1 << nBit);
+            *pArg ^= 1 << nBit;
+            return nVal != 0;
+        }
+#endif
+
+#ifndef cds_bitop_complement64_DEFINED
+        static inline bool complement64( atomic64u_t * pArg, unsigned int nBit )
+        {
+            assert( pArg != NULL );
+            atomic64u_t nVal = *pArg & (atomic64u_t(1) << nBit);
+            *pArg ^= atomic64u_t(1) << nBit;
+            return nVal != 0;
+        }
+#endif
+
+        /*
+            Simple random number generator
+            Source:
+                [2003] George Marsaglia "Xorshift RNGs"
+        */
+        static inline uint32_t RandXorShift32(uint32_t x)
+        {
+            //static atomic32u_t xRandom = 2463534242UL    ;    //rand() | 0x0100    ;    // must be nonzero
+            //atomic32u_t x = xRandom;
+            if ( !x )
+                x = ((rand() + 1) << 16) + rand() + 1;
+            x ^= x << 13;
+            x ^= x >> 15;
+            return x ^= x << 5;
+        }
+
+        static inline uint64_t RandXorShift64(uint64_t x)
+        {
+            //static atomic64u_t xRandom = 88172645463325252LL;
+            //atomic64u_t x = xRandom;
+            if ( !x )
+                x = 88172645463325252LL;
+            x ^= x << 13;
+            x ^= x >> 7;
+            return x ^= x << 17;
+        }
+    }}    // namespace bitop::platform
+} // namespace cds
+
+#endif    // __CDS_DETAILS_BITOP_GENERIC_H
diff --git a/cds/details/bounded_array.h b/cds/details/bounded_array.h
new file mode 100644 (file)
index 0000000..97a783a
--- /dev/null
@@ -0,0 +1,231 @@
+//$$CDS-header$$
+
+#ifndef __CDS_IMPL_BOUNDED_ARRAY_H
+#define __CDS_IMPL_BOUNDED_ARRAY_H
+
+/*
+    Dynamic non-growing array
+
+    Editions:
+        2008.03.08    Maxim.Khiszinsky    Created
+*/
+
+#include <cds/details/allocator.h>
+#include <vector>
+#include <assert.h>
+
+//@cond
+namespace cds {
+    namespace details {
+
+        /// Upper bounded dynamic array
+        /**
+            BoundedArray is dynamic allocated C-array of item of type T with the interface like STL.
+            The max size (capacity) of array is defined at ctor time and cannot be changed during object's lifetime
+
+            \par Template parameters
+                - \p T type of elements
+                - \p Allocator dynamic memory allocator class (<tt>std::allocator</tt> semantics)
+
+            This class is deprecated: it is based on std::vector and does not support non-copyable type \p T.
+            See \ref bounded_array.
+        */
+        template <typename T, class Allocator = CDS_DEFAULT_ALLOCATOR >
+        class BoundedArray: private std::vector< T, typename Allocator::template rebind<T>::other >
+        {
+        public:
+            typedef T value_type ;    ///< value type stored in the array
+            typedef Allocator allocator_type ;  ///< allocator type
+            typedef std::vector<T, typename Allocator::template rebind<T>::other>   vector_type ; ///< underlying vector type
+
+            typedef typename vector_type::iterator          iterator        ;    ///< item iterator
+            typedef typename vector_type::const_iterator    const_iterator    ;    ///< item const iterator
+
+        public:
+            /// Default ctor
+            explicit BoundedArray(
+                size_t nCapacity            ///< capacity
+            )
+            {
+                vector_type::resize( nCapacity );
+                assert( size() == capacity() );
+            }
+
+            /// Ctor with item's initialization
+            BoundedArray(
+                size_t nCapacity,            ///< capacity of array
+                const value_type& init,                ///< initial value of any item
+                size_t nInitCount = 0        ///< how many items will be initialized; 0 - all items
+            )
+            {
+                assert( nInitCount <= nCapacity );
+                vector_type::resize( nCapacity );
+                assign( nInitCount ? nInitCount : vector_type::capacity(), init );
+                assert( size() == capacity() );
+            }
+
+            const value_type& operator []( size_t nItem ) const
+            {
+                return vector_type::operator[](nItem);
+            }
+
+            value_type& operator []( size_t nItem )
+            {
+                return vector_type::operator[](nItem);
+            }
+
+            size_t   size() const
+            {
+                return vector_type::size();
+            }
+
+            size_t   capacity() const
+            {
+                return vector_type::capacity();
+            }
+
+            /// Returns sizeof(T)
+            static size_t itemSize()
+            {
+                return sizeof(T);
+            }
+
+            /// Returns pointer to the first item in the array
+            value_type * top()
+            {
+                return & vector_type::front();
+            }
+
+            friend value_type * operator +( BoundedArray<value_type, allocator_type>& arr, size_t i )
+            {
+                return &( arr[i] );
+            }
+
+            /// Get begin iterator
+            const_iterator  begin() const
+            {
+                return vector_type::begin();
+            }
+            iterator        begin()
+            {
+                return vector_type::begin();
+            }
+
+            /// Get end iterator
+            const_iterator  end() const
+            {
+                return vector_type::end();
+            }
+            iterator        end()
+            {
+                return vector_type::end();
+            }
+
+            /// Get end iterator for \p nMax-th item
+            const_iterator    end( size_t nMax )    const
+            {
+                assert( nMax <= vector_type::capacity());
+                return vector_type::begin() + nMax;
+            }
+            iterator        end( size_t nMax )
+            {
+                assert( nMax <= vector_type::capacity());
+                return vector_type::begin() + nMax;
+            }
+        };
+
+        /// Bounded dynamic array
+        /**
+            The class template is intended for storing fixed-size sequences of objects.
+            Array capacity is constant and cannot be changed after creation of object of the class.
+            It is suitable for managing objects of non-copyable type \p T.
+
+            \par Template parameters
+                - \p T type of elements
+                - \p Allocator dynamic memory allocator class (<tt>std::allocator</tt> semantics)
+
+        */
+        template <typename T, class Allocator = CDS_DEFAULT_ALLOCATOR >
+        class bounded_array
+        {
+        public:
+            typedef T value_type ;    ///< value type stored in the array
+            typedef Allocator allocator_type ;  ///< allocator type
+
+            typedef value_type *          iterator          ; ///< item iterator
+            typedef value_type const *    const_iterator    ; ///< item const iterator
+
+        private:
+            typedef cds::details::Allocator< T, allocator_type> allocator_impl;
+
+            value_type *    m_arr;
+            const size_t    m_nCapacity;
+
+        public:
+            /// Default ctor
+            explicit bounded_array(
+                size_t nCapacity            ///< capacity
+            )
+            : m_arr( allocator_impl().NewArray( nCapacity ) )
+            , m_nCapacity( nCapacity )
+            {}
+
+            ~bounded_array()
+            {
+                allocator_impl().Delete( m_arr, capacity() );
+            }
+
+            const value_type& operator []( size_t nItem ) const
+            {
+                assert( nItem < capacity() );
+                return m_arr[nItem];
+            }
+
+            value_type& operator []( size_t nItem )
+            {
+                assert( nItem < capacity() );
+                return m_arr[nItem];
+            }
+
+            size_t   size() const CDS_NOEXCEPT
+            {
+                return capacity();
+            }
+
+            size_t   capacity() const CDS_NOEXCEPT
+            {
+                return m_nCapacity;
+            }
+
+            /// Returns pointer to the first item in the array
+            value_type * top()
+            {
+                return m_arr;
+            }
+
+            /// Get begin iterator
+            const_iterator  begin() const CDS_NOEXCEPT
+            {
+                return m_arr;
+            }
+            iterator        begin() CDS_NOEXCEPT
+            {
+                return m_arr;
+            }
+
+            /// Get end iterator
+            const_iterator  end() const CDS_NOEXCEPT
+            {
+                return begin() + capacity();
+            }
+            iterator        end() CDS_NOEXCEPT
+            {
+                return begin() + capacity();
+            }
+        };
+
+    }    // namespace details
+}    // namespace cds
+//@endcond
+
+#endif    // #ifndef __CDS_IMPL_BOUNDED_ARRAY_H
diff --git a/cds/details/bounded_container.h b/cds/details/bounded_container.h
new file mode 100644 (file)
index 0000000..24fac0a
--- /dev/null
@@ -0,0 +1,15 @@
+//$$CDS-header$$
+
+#ifndef __CDS_BOUNDED_CONTAINER_H
+#define __CDS_BOUNDED_CONTAINER_H
+
+namespace cds {
+    /// Bounded container
+    /**
+        If a container has upper limit of item then it should be based on bounded_container class.
+        Example of those containers: cyclic queue (cds::container::TsigasCycleQueue)
+    */
+    struct bounded_container {};
+}    // namespace cds
+
+#endif    // __CDS_BOUNDED_CONTAINER_H
diff --git a/cds/details/comparator.h b/cds/details/comparator.h
new file mode 100644 (file)
index 0000000..3728f58
--- /dev/null
@@ -0,0 +1,61 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_COMPARATOR_H
+#define __CDS_DETAILS_COMPARATOR_H
+
+#include <functional>
+#include <string>
+
+namespace cds {
+    /// Helper classes and functions
+    namespace details {
+        /// Comparator
+        /**
+            Comparator is a functor (a class with binary @a operator() ) that compares two values.
+            The comparator is based on \p std::less<T> functor and returns the result
+            of comparing of two values:
+            \li -1 if a < b
+            \li 0 if a == b
+            \li 1 if a > b
+        */
+        template <typename T>
+        class Comparator {
+            //@cond
+            std::less< T > m_cmp;
+            //@endcond
+        public:
+            typedef T        value_type    ;    ///< Type of values to compare
+
+            /// Compare method
+            /**
+                @return -1 if @p p1 < @p p2 \n
+                0 if @p p1 == @p p2 \n
+                1 if @p p1 > @p p2 \n
+            */
+            int operator()( const T& p1, const T& p2 ) const
+            {
+                if ( m_cmp( p1, p2 ) )
+                    return -1;
+                if ( m_cmp( p2, p1 ))
+                    return 1;
+                return 0;
+            }
+        };
+
+        /// String specialization. It uses @a string::compare method
+        template <>
+        class Comparator< std::string > {
+        public:
+            //@cond
+            typedef std::string        value_type    ;    ///< Type of values to compare
+
+            int operator()( const std::string& str1, const std::string& str2 ) const
+            {
+                return str1.compare( str2 );
+            }
+            //@endcond
+        };
+    }    // namespace details
+}    // namespace cds
+
+#endif // #ifndef __CDS_DETAILS_COMPARATOR_H
diff --git a/cds/details/cxx11_features.h b/cds/details/cxx11_features.h
new file mode 100644 (file)
index 0000000..cbafeb9
--- /dev/null
@@ -0,0 +1,26 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_CXX11_FEATURES_H
+#define __CDS_DETAILS_CXX11_FEATURES_H
+//@cond
+
+#ifndef __CDS_DEFS_H
+#   error "<cds/details/cxx11_features.h> cannot be included directly, use <cds/details/defs.h> instead"
+#endif
+
+// =delete function specifier
+#ifdef CDS_CXX11_DELETE_DEFINITION_SUPPORT
+#   define CDS_DELETE_SPECIFIER     =delete
+#else
+#   define CDS_DELETE_SPECIFIER
+#endif
+
+// =default function specifier
+#ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+#   define CDS_DEFAULT_SPECIFIER    =default
+#else
+#   define CDS_DEFAULT_SPECIFIER
+#endif
+
+//@endcond
+#endif // #ifndef __CDS_DETAILS_CXX11_FEATURES_H
diff --git a/cds/details/defs.h b/cds/details/defs.h
new file mode 100644 (file)
index 0000000..f8a7e5f
--- /dev/null
@@ -0,0 +1,539 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DEFS_H
+#define __CDS_DEFS_H
+
+#include <assert.h>
+#include <exception>
+#include <string>
+#include <memory>
+
+#include <cds/version.h>
+
+/** \mainpage CDS: Concurrent Data Structures library
+
+   This library is a collection of lock-free and lock-based fine-grained algorithms of data structures
+   like maps, queues, list etc. The library contains implementation of well-known data structures
+   and memory reclamation schemas for modern processor architectures.
+
+   Supported processor architectures and operating systems (OS) are:
+      - x86 [32bit] Linux, Windows, FreeBSD, MinGW
+      - amd64 (x86-64) [64bit] Linux, Windows, FreeBSD, MinGW
+      - ia64 (itanium) [64bit] Linux, HP-UX 11.23, HP-UX 11.31
+      - sparc [64bit] Sun Solaris
+      - Mac OS X amd64
+
+   Supported compilers:
+      - GCC 4.3+ - for the UNIX-like OSes
+      - Clang 3.0+ - for Linux
+      - MS Visual C++ 2008 and above - for MS Windows
+
+   For each lock-free data structure the \p CDS library presents several implementation based on published papers. For
+   example, there are several implementations of queue, each of them is divided by memory reclamation
+   schema used. However, any implementation supports common interface for the type of data structure.
+
+   To implement any lock-free data structure, two things are needed:
+   - atomic operation library conforming with C++11 memory model. The <b>libcds</b> has such feature, see cds::cxx11_atomics namespace for
+     details and compiler-specific information.
+   - safe memory reclamation (SMR) or garbage collecting (GC) algorithm. The <b>libcds</b> has an implementation of several
+     well-known SMR algos, see below.
+
+   The main part of lock-free data structs is garbage collecting. The garbage collector (GC) solves the problem of safe
+   memory reclamation that is one of the main problems for lock-free programming.
+   The library contains the implementations of several light-weight \ref cds_garbage_collector "memory reclamation schemes":
+   - M.Michael's Hazard Pointer - see cds::gc::HP for more explanation
+   - Gidenstam's memory reclamation schema based on Hazard Pointer and reference counting - see cds::gc::HRC
+   - M.Herlihy and M.Moir's Pass The Buck algorithm - see cds::gc::PTB
+   - User-space Read-Copy Update (RCU) - see cds::urcu namespace
+   - there is cds::gc::nogc "GC" for containers that do not support item reclamation.
+
+   Many GC requires a support from the thread. The library does not define the threading model you must use,
+   it is developed to support various ones; about incorporating <b>cds</b> library to your threading model see cds::threading.
+
+   The main namespace for the library is \ref cds.
+   To see the full list of container's class go to <a href="modules.html">modules</a> tab.
+
+   \par How to build
+
+   The <b>cds</b> is mostly header-only library. Only small part of library related to GC core functionality
+   must be compiled. The test projects depends on the following static library from \p boost:
+   - <tt>boost_thread</tt>
+   - <tt>boost_date_time</tt>
+
+   \par Windows build
+
+   Prerequisites: for building <b>cds</b> library and test suite you need:
+    - <a href="http://www.activestate.com/activeperl/downloads">perl</a> installed; \p PATH environment variable
+        should contain full path to Perl binary. Perl is used to generate large dictionary for testing purpose;
+    - <a href="http://www.boost.org/">boost library</a> 1.51 and above. You should create environment variable
+        \p BOOST_PATH containing full path to \p boost root directory (for example, <tt>C:\\libs\\boost_1_47_0</tt>).
+
+   Open solution file <tt>cds\projects\vcX\cds.sln</tt> where vcX - version of
+   Microsoft Visual C++ you use: vc9 for MS VC 2008, vc10 for MS VC 2010 and so on. The solution
+   contains <tt>cds</tt> project and several test projects. Just build the library using solution.
+
+   <b>Warning</b>: the solution depends on \p BOOST_PATH environment variable that specifies full path
+   to \p boost library root directory. The test projects search \p boost libraries in:
+   - for 32bit: \$(BOOST_PATH)/stage/lib, \$(BOOST_PATH)/stage32/lib, and \$(BOOST_PATH)/bin.
+   - for 64bit: \$(BOOST_PATH)/stage64/lib and \$(BOOST_PATH)/bin.
+
+   \par *NIX build
+
+   For Unix-like systems GCC and Clang compilers are supported.
+   Use GCC 4.3 (or above) compiler or Clang 3.0 or above to build <b>cds</b> library. The distributive contains
+   makefile and <tt>build.sh</tt> script in <tt>build</tt> directory.
+   The <tt>build/sample</tt> directory contains sample scripts for different operating systems and
+   processor architectures.
+   The <tt>build.sh</tt> script supports the following options:
+   - <tt>-c toolset</tt> - Toolset name, possible values: <tt>gcc</tt> (default), <tt>clang</tt>
+   - <tt>-x compiler</tt> - C++ compiler name (e.g. g++, g++-4.5 and so on)
+   - <tt>-p arch</tt> - processor architecture; possible values for arch are: x86, amd64 (x86_64), sparc, ia64
+   - <tt>-o OStype</tt> - OS family; possible values for OStype are: linux, sunos (solaris), hpux
+   - <tt>-D define</tt> additional defines
+   - <tt>-b bits</tt> - bits to build, accepts '64', '32'
+   - <tt>-l "options"</tt> - extra linker options (in quotes)
+   - <tt>-z "options"</tt> - extra compiler options (in quotes)
+   - <tt>--with-boost path</tt> - path to boost include
+   - <tt>--debug-cxx-options "options"</tt> - extra compiler options for debug target
+   - <tt>--debug-ld-options "options"</tt> - extra linker options for debug target
+   - <tt>--release-cxx-options "options"</tt> - extra compiler options for release target
+   - <tt>--release-ld-options "optons"</tt> - extra linker options for release target
+   - <tt>--clean</tt> - clean all before building
+   - <tt>--debug-test</tt> - make unit test in debug mode; by defalt release unit test generated
+   - <tt>--amd64-use-128bit</tt> - compile with supporting 128bit (16byte) CAS on amd64 (for am64 only)
+
+    <b>Important for GCC compiler</b>: all your projects that use <b>libcds</b> must be compiled with <b>-fno-strict-aliasing</b>
+    compiler flag. Also, the compiler option <tt>-std=c++0x</tt> is very useful.
+
+   \anchor cds_how_to_use
+   \par How to use
+
+   To use \p cds lock-free containers based on garbage collectors (GC) provided by library
+   your application must be linked with \p libcds.
+
+   The main part of lock-free programming is garbage collecting for safe memory reclamation.
+   The library provides several types of GC schemes. One of widely used and well-tested one is Hazard Pointer
+   memory reclamation schema discovered by M. Micheal and implemented in the library as cds::gc::HP class.
+   Usually, the application is based on only one type of GC.
+
+   In the next example we mean that your application uses Hazard Pointer (cds::gc::HP) - based containers.
+   Other GCs (cds::gc::HRC, cds::gc::PTB) are applied analogously.
+
+    First, in your code you should initialize \p cds library and a garbage collector in \p main function:
+    \code
+    #include <cds/init.h>       // for cds::Initialize and cds::Terminate
+    #include <cds/gc/hp.h>      // for cds::HP (Hazard Pointer) garbage collector
+
+    int main(int argc, char** argv)
+    {
+        // Initialize libcds
+        cds::Initialize();
+
+        {
+            // Initialize Hazard Pointer singleton
+            cds::gc::HP hpGC;
+
+            // If main thread uses lock-free containers
+            // the main thread should be attached to libcds infrastructure
+            cds::threading::Manager::attachThread();
+
+            // Now you can use HP-based containers in the main thread
+            //...
+        }
+
+        // Terminate libcds
+        cds::Terminate();
+    }
+    \endcode
+
+    Second, any of your thread should be attached to \p cds infrastructure.
+    \code
+    #include <cds/gc/hp.h>
+
+    int myThreadEntryPoint(void *)
+    {
+        // Attach the thread to libcds infrastructure
+        cds::threading::Manager::attachThread();
+
+        // Now you can use HP-based containers in the thread
+        //...
+
+        // Detach thread when terminating
+        cds::threading::Manager::detachThread();
+    }
+    \endcode
+
+    After that, you can use \p cds lock-free containers safely without any external synchronization.
+
+    In some cases, you should work in an external thread. For example, your application
+    is a plug-in for a server that calls your code in a thread that has been created by the server.
+    In this case, you should use persistent mode of garbage collecting. In this mode, the thread attaches
+    to the GC singleton only if it is not attached yet and never call detaching:
+    \code
+    #include <cds/gc/hp.h>
+
+    int plugin_entry_point()
+    {
+        // Attach the thread if it is not attached yet
+        if ( !cds::threading::Manager::isThreadAttached() )
+            cds::threading::Manager::attachThread();
+
+        // Do some work with HP-related containers
+        ...
+    }
+    \endcode
+
+*/
+
+
+/// The main library namespace
+namespace cds {}
+
+/*
+    \brief Basic typedefs and defines
+
+    You do not need include this header directly. All library header files depends on defs.h and include it.
+
+    Defines macros:
+
+    CDS_COMPILER        Compiler:
+                    - CDS_COMPILER_MSVC     Microsoft Visual C++
+                    - CDS_COMPILER_GCC      GNU C++
+                    - CDS_COMPILER_CLANG    clang
+                    - CDS_COMPILER_UNKNOWN  unknown compiler
+
+    CDS_COMPILER__NAME    Character compiler name
+
+    CDS_COMPILER_VERSION    Compliler version (number)
+
+    CDS_BUILD_BITS    Resulting binary code:
+                    - 32        32bit
+                    - 64        64bit
+                    - -1        undefined
+
+    CDS_POW2_BITS    CDS_BUILD_BITS == 2**CDS_POW2_BITS
+
+    CDS_PROCESSOR_ARCH    The processor architecture:
+                    - CDS_PROCESSOR_X86     Intel x86 (32bit)
+                    - CDS_PROCESSOR_AMD64   Amd64, Intel x86-64 (64bit)
+                    - CDS_PROCESSOR_IA64    Intel IA64 (Itanium)
+                    - CDS_PROCESSOR_SPARC   Sparc
+                    - CDS_PROCESSOR_PPC64   PowerPC64
+                    - CDS_PROCESSOR_ARM7    ARM v7
+                    - CDS_PROCESSOR_UNKNOWN undefined processor architecture
+
+    CDS_PROCESSOR__NAME    The name (string) of processor architecture
+
+    CDS_OS_TYPE        Operating system type:
+                    - CDS_OS_UNKNOWN        unknown OS
+                    - CDS_OS_PTHREAD        unknown OS with pthread
+                    - CDS_OS_WIN32          Windows 32bit
+                    - CDS_OS_WIN64          Windows 64bit
+                    - CDS_OS_LINUX          Linux
+                    - CDS_OS_SUN_SOLARIS    Sun Solaris
+                    - CDS_OS_HPUX           HP-UX
+                    - CDS_OS_AIX            IBM AIX
+                    - CDS_OS_BSD            FreeBSD, OpenBSD, NetBSD - common flag
+                    - CDS_OS_FREE_BSD       FreeBSD
+                    - CDS_OS_OPEN_BSD       OpenBSD
+                    - CSD_OS_NET_BSD        NetBSD
+                    - CDS_OS_MINGW          MinGW
+                    - CDS_OS_OSX            Apple OS X
+
+    CDS_OS__NAME        The name (string) of operating system type
+
+    CDS_OS_INTERFACE OS interface:
+                    - CDS_OSI_UNIX             Unix (POSIX)
+                    - CDS_OSI_WINDOWS          Windows
+
+
+    CDS_BUILD_TYPE    Build type: 'RELEASE' or 'DEBUG' string
+
+*/
+
+#if defined(_DEBUG) || !defined(NDEBUG)
+#    define    CDS_DEBUG
+#    define    CDS_BUILD_TYPE    "DEBUG"
+#else
+#    define    CDS_BUILD_TYPE    "RELEASE"
+#endif
+
+/// Unused function argument
+#define CDS_UNUSED(x)   (void)(x)
+
+// Supported compilers:
+#define CDS_COMPILER_MSVC        1
+#define CDS_COMPILER_GCC         2
+#define CDS_COMPILER_INTEL       3
+#define CDS_COMPILER_CLANG       4
+#define CDS_COMPILER_UNKNOWN    -1
+
+// Supported processor architectures:
+#define CDS_PROCESSOR_X86       1
+#define CDS_PROCESSOR_IA64      2
+#define CDS_PROCESSOR_SPARC     3
+#define CDS_PROCESSOR_AMD64     4
+#define CDS_PROCESSOR_PPC64     5   // PowerPC 64bit
+#define CDS_PROCESSOR_ARM7      7
+#define CDS_PROCESSOR_UNKNOWN   -1
+
+// Supported OS interfaces
+#define CDS_OSI_UNKNOWN          0
+#define CDS_OSI_UNIX             1
+#define CDS_OSI_WINDOWS          2
+
+// Supported operating systems (value of CDS_OS_TYPE):
+#define CDS_OS_UNKNOWN          -1
+#define CDS_OS_WIN32            1
+#define CDS_OS_WIN64            5
+#define CDS_OS_LINUX            10
+#define CDS_OS_SUN_SOLARIS      20
+#define CDS_OS_HPUX             30
+#define CDS_OS_AIX              50  // IBM AIX
+#define CDS_OS_FREE_BSD         61
+#define CDS_OS_OPEN_BSD         62
+#define CDS_OS_NET_BSD          63
+#define CDS_OS_MINGW            70
+#define CDS_OS_OSX              80
+#define CDS_OS_PTHREAD          100
+
+#if defined(_MSC_VER)
+#   if defined(__ICL) || defined(__INTEL_COMPILER)
+#       define CDS_COMPILER CDS_COMPILER_INTEL
+#   else
+#       define CDS_COMPILER CDS_COMPILER_MSVC
+#   endif
+#elif defined(__clang__)    // Clang checking must be before GCC since Clang defines __GCC__ too
+#   define CDS_COMPILER CDS_COMPILER_CLANG
+#elif defined( __GCC__ ) || defined(__GNUC__)
+#   if defined(__ICL) || defined(__INTEL_COMPILER)
+#       define CDS_COMPILER CDS_COMPILER_INTEL
+#   else
+#       define CDS_COMPILER CDS_COMPILER_GCC
+#   endif
+#else
+#    define CDS_COMPILER CDS_COMPILER_UNKNOWN
+#endif  // Compiler choice
+
+
+// CDS_VERIFY: Debug - assert(_expr); Release - _expr
+#ifdef CDS_DEBUG
+#   define CDS_VERIFY( _expr )    assert( _expr )
+#   define CDS_DEBUG_DO( _expr )        _expr
+#else
+#   define CDS_VERIFY( _expr )    _expr
+#   define CDS_DEBUG_DO( _expr )
+#endif
+
+#ifdef CDS_STRICT
+#   define CDS_STRICT_DO(_expr)         _expr
+#else
+#   define CDS_STRICT_DO( _expr )
+#endif
+
+
+// Compiler-specific defines
+#include <cds/compiler/defs.h>
+// New C++11 features
+#include <cds/details/cxx11_features.h>
+
+#define CDS_NOEXCEPT            CDS_NOEXCEPT_SUPPORT
+#define CDS_NOEXCEPT_( expr )   CDS_NOEXCEPT_SUPPORT_( expr )
+#ifndef CDS_NOEXCEPT_DEFAULTED
+    // Some compilers do not allow noexcept specification in defaulted function
+    // For example, GCC 4.6.x raise following error:
+    //  void foo() noexcept = default
+    //  error: function \91foo\92 defaulted on its first declaration must not have an exception-specification
+    // For such compiler empty CDS_NOEXCEPT_DEFAULTED must be defined
+#   define CDS_NOEXCEPT_DEFAULTED         CDS_NOEXCEPT
+#   define CDS_NOEXCEPT_DEFAULTED_(expr)  CDS_NOEXCEPT_( expr )
+#endif
+
+#if defined(CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT) && defined(CDS_MOVE_SEMANTICS_SUPPORT)
+#   define CDS_EMPLACE_SUPPORT
+#endif
+
+#ifdef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+#   define CDS_CXX11_INLINE_NAMESPACE   inline
+#else
+#   define CDS_CXX11_INLINE_NAMESPACE
+#endif
+
+//@cond
+// typedefs for back compatibility
+namespace cds {
+    /// Atomic pointer
+    typedef void *            pointer_t;
+
+    /// 64bit unaligned int
+    typedef int64_t     atomic64_unaligned;
+
+    /// 64bit unaligned unsigned int
+    typedef uint64_t  atomic64u_unaligned;
+
+    /// 64bit aligned int
+    typedef atomic64_unaligned CDS_TYPE_ALIGNMENT(8)    atomic64_aligned;
+
+    /// 64bit aligned unsigned int
+    typedef atomic64u_unaligned CDS_TYPE_ALIGNMENT(8)   atomic64u_aligned;
+
+    /// 64bit atomic int (aligned)
+    typedef atomic64_aligned    atomic64_t;
+
+    /// 64bit atomic unsigned int (aligned)
+    typedef atomic64u_aligned   atomic64u_t;
+
+    /// 32bit atomic int
+    typedef int32_t     atomic32_t;
+
+    /// 32bit atomic unsigned int
+    typedef uint32_t    atomic32u_t;
+
+    /// atomic int
+    typedef atomic32_t          atomic_t;
+
+    /// atomic unsigned int
+    typedef atomic32u_t         unsigned_atomic_t;
+
+    /// atomic int sized as pointer
+    typedef intptr_t ptr_atomic_t;
+
+    /// atomic unsigned int sized as pointer
+    typedef uintptr_t uptr_atomic_t;
+} // namespace cds
+//@endcond
+
+/*************************************************************************
+ Common things
+**************************************************************************/
+
+#include <cds/numtraits.h>
+
+namespace cds {
+
+    //@cond
+    /// Helper template: converts volatile pointer to non-volatile one
+    template <typename T>
+    static inline T * non_volatile( T volatile * p ) { return const_cast<T *>( p ); }
+
+    template <typename T>
+    static inline T * non_volatile( T * p ) { return p; }
+    //@endcond
+
+    /// Base of all exceptions in the library
+    class Exception: public std::exception
+    {
+    protected:
+        std::string    m_strMsg    ;    ///< Exception message
+    public:
+        /// Create empty exception
+        Exception()
+        {}
+        /// Create exception with message
+        explicit Exception( const char * pszMsg )
+            : m_strMsg( pszMsg )
+        {}
+        /// Create exception with message
+        explicit Exception( const std::string& strMsg )
+            :m_strMsg( strMsg )
+        {}
+
+        /// Destructor
+        virtual ~Exception() throw()
+        {}
+
+        /// Return exception message
+        virtual const char * what( ) const throw()
+        {
+            return m_strMsg.c_str();
+        }
+    };
+
+//@cond
+#   define CDS_PURE_VIRTUAL_FUNCTION_CALLED    { assert(false); throw Exception("Pure virtual function called"); }
+#   define CDS_PURE_VIRTUAL_FUNCTION_CALLED_(method_name)    { assert(false); throw Exception("Pure virtual function called " method_name ); }
+//@endcond
+
+    /// any_type is used as a placeholder for auto-calculated type (usually in \p rebind templates)
+    struct any_type {};
+
+    /** \def CDS_DECLARE_EXCEPTION( _class, _msg )
+        Simplifying declaration of specific exception (usual within classes)
+        - @p _class - the class name of exception
+        - @p _msg - exception message (const char *)
+    */
+#define CDS_DECLARE_EXCEPTION( _class, _msg )       \
+    struct _class: public std::exception {          \
+    public:                                         \
+    _class(): std::exception() {}                   \
+    virtual const char * what( ) const throw() { return _msg; } \
+    }
+
+
+    //@cond
+    // This template function should be replaced with nullptr keyword when all compilers will support it
+    template <typename T>
+    static inline CDS_CONSTEXPR T null_ptr() CDS_NOEXCEPT
+    {
+        return reinterpret_cast<T>( NULL );
+    }
+    //@endcond
+
+} // namespace cds
+
+
+/// @defgroup cds_cxx11_stdlib_wrapper New C++11 standard library support
+
+/// C++11 standard library wrapper namespace
+/** @ingroup cds_cxx11_stdlib_wrapper
+    libcds needs support from new features defined in C++11 standard library.
+    In case when an old compiler and corresponding \p std library has no required feature
+    the \p boost library is used if possible. The \p %cds_std namespace is a wrapper for new C++11 stdlib classes:
+    - if the compiler supports new feature, this feature places (with \p using directive) into \p %cds_std namespace "as is"
+    - otherwise the \p boost analog is used and it places into \p %cds_std namespace too
+
+    For example, for class \p std::mutex the \p libcds does the following:
+    - for old compiler: \code
+        #include <boost/thread/mutex.hpp>
+        namespace cds_std {
+            using boost::mutex;
+        }
+        \endcode
+    - for C++11-ready compiler: \code
+        #include <mutex>
+        namespace cds_std {
+            using std::mutex;
+        }
+        \endcode
+
+        Everywhere in \p libcds the class \p %cds_std::mutex is used instead of \p std::mutex.
+
+        Note, not all C++11 features are contained in \p %cds_std but only required by \p libcds.
+
+        In future when all compilers will be C++11-ready we can transform the \p libcds
+        to new C++11 standard library changing \p %cds_std namespace to native \p std.
+*/
+namespace cds_std {}
+
+//@cond
+#ifdef _DEBUG
+#   define cds_assert(X)    assert(X)
+#else
+#   include <stdio.h>   // snprintf
+    static inline void cds_assert_( bool bCond, char const * pszMsg, char const * pszFile, int nLine )
+    {
+        if ( !bCond ) {
+            char buf[4096];
+#   if CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL
+            _snprintf_s( buf, sizeof(buf)/sizeof(buf[0]), _TRUNCATE, pszMsg, pszFile, nLine );
+#   else
+            snprintf( buf, sizeof(buf)/sizeof(buf[0]), pszMsg, pszFile, nLine );
+#   endif
+            throw cds::Exception( buf );
+        }
+    }
+#   define cds_assert(X)    cds_assert_( X, "%s (%d): Assert failed: " #X, __FILE__, __LINE__ );
+#endif
+//@endcond
+
+#endif // #ifndef __CDS_DEFS_H
diff --git a/cds/details/functor_wrapper.h b/cds/details/functor_wrapper.h
new file mode 100644 (file)
index 0000000..d4882a4
--- /dev/null
@@ -0,0 +1,152 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_FUNCTOR_WRAPPER_H
+#define __CDS_DETAILS_FUNCTOR_WRAPPER_H
+
+#include <cds/ref.h>
+
+//@cond
+namespace cds { namespace details {
+
+    template <typename Functor>
+    struct functor_wrapper
+    {
+    public:
+        functor_wrapper()
+        {}
+
+        functor_wrapper( Functor /*f*/)
+        {}
+
+        Functor get()
+        {
+            return Functor();
+        }
+    };
+
+    template <typename Functor>
+    struct functor_wrapper<Functor&>
+    {
+        Functor&    m_func;
+    public:
+        functor_wrapper( Functor& f)
+        : m_func(f)
+        {}
+
+        Functor& get()
+        {
+            return m_func;
+        }
+    };
+
+    template <typename Functor>
+    struct functor_wrapper< boost::reference_wrapper<Functor> >
+    {
+        boost::reference_wrapper<Functor>    m_func;
+    public:
+        functor_wrapper( boost::reference_wrapper<Functor> f)
+        : m_func(f)
+        {}
+
+        Functor& get()
+        {
+            return m_func.get();
+        }
+    };
+
+#ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+    template <typename Result, typename... Args>
+    struct functor_wrapper<Result (*)(Args...)>
+    {
+        typedef Result (* func_ptr)(Args...);
+        typedef Result (& func_ref)(Args...);
+        func_ptr m_func;
+    public:
+        functor_wrapper( func_ptr f )
+            : m_func(f)
+        {}
+
+        func_ref get()
+        {
+            assert( m_func != NULL );
+            return *m_func;
+        }
+    };
+#else
+    template <typename Result>
+    struct functor_wrapper<Result (*)()>
+    {
+        typedef Result (* func_ptr)();
+        typedef Result (& func_ref)();
+        func_ptr m_func;
+    public:
+        functor_wrapper( func_ptr f )
+            : m_func(f)
+        {}
+
+        func_ref get()
+        {
+            assert( m_func != NULL );
+            return *m_func;
+        }
+    };
+
+    template <typename Result, typename Arg1>
+    struct functor_wrapper<Result (*)(Arg1)>
+    {
+        typedef Result (* func_ptr)(Arg1);
+        typedef Result (& func_ref)(Arg1);
+        func_ptr m_func;
+    public:
+        functor_wrapper( func_ptr f )
+            : m_func(f)
+        {}
+
+        func_ref get()
+        {
+            assert( m_func != NULL );
+            return *m_func;
+        }
+    };
+
+    template <typename Result, typename Arg1, typename Arg2>
+    struct functor_wrapper<Result (*)(Arg1, Arg2)>
+    {
+        typedef Result (* func_ptr)(Arg1, Arg2);
+        typedef Result (& func_ref)(Arg1, Arg2);
+        func_ptr m_func;
+    public:
+        functor_wrapper( func_ptr f )
+            : m_func(f)
+        {}
+
+        func_ref get()
+        {
+            assert( m_func != NULL );
+            return *m_func;
+        }
+    };
+
+    template <typename Result, typename Arg1, typename Arg2, typename Arg3>
+    struct functor_wrapper<Result (*)(Arg1, Arg2, Arg3)>
+    {
+        typedef Result (* func_ptr)(Arg1, Arg2, Arg3);
+        typedef Result (& func_ref)(Arg1, Arg2, Arg3);
+        func_ptr m_func;
+    public:
+        functor_wrapper( func_ptr f )
+            : m_func(f)
+        {}
+
+        func_ref get()
+        {
+            assert( m_func != NULL );
+            return *m_func;
+        }
+    };
+
+#endif
+}}  // namespace cds::details
+//@endcond
+
+#endif // #ifndef __CDS_DETAILS_FUNCTOR_WRAPPER_H
diff --git a/cds/details/hash_functor_selector.h b/cds/details/hash_functor_selector.h
new file mode 100644 (file)
index 0000000..c7a49d4
--- /dev/null
@@ -0,0 +1,51 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_HASH_FUNCTOR_SELECTOR_H
+#define __CDS_DETAILS_HASH_FUNCTOR_SELECTOR_H
+
+//@cond
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL
+#   include <functional>
+#elif CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG
+    // GCC 4.3+
+#   include <functional>
+#else
+    // Default, use boost implementation
+#   include <boost/tr1/functional.hpp>
+#endif
+
+namespace cds { namespace details {
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL
+#   if _MSC_VER >= 1600
+        // MSVC 2010 and above
+        using std::hash;
+#       define CDS_BEGIN_STD_HASH_NAMESPACE namespace std {
+#       define CDS_END_STD_HASH_NAMESPACE   }
+#       define CDS_STD_HASH_NAMESPACE std
+#   else
+        // MSVC 2008
+        using std::tr1::hash;
+#       define CDS_BEGIN_STD_HASH_NAMESPACE namespace std { namespace tr1 {
+#       define CDS_END_STD_HASH_NAMESPACE   }}
+#       define CDS_STD_HASH_NAMESPACE std::tr1
+#   endif
+#elif CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG
+    // GCC 4.3+
+    using std::hash;
+#   define CDS_BEGIN_STD_HASH_NAMESPACE namespace std {
+#   define CDS_END_STD_HASH_NAMESPACE   }
+#   define CDS_STD_HASH_NAMESPACE std
+#else
+    // Default, use boost implementation
+    using std::tr1::hash;
+#   define CDS_BEGIN_STD_HASH_NAMESPACE namespace std { namespace tr1 {
+#   define CDS_END_STD_HASH_NAMESPACE   }}
+#   define CDS_STD_HASH_NAMESPACE std::tr1
+#endif
+
+}} // namespace cds::details
+//@endcond
+
+#endif // __CDS_DETAILS_HASH_FUNCTOR_SELECTOR_H
diff --git a/cds/details/is_aligned.h b/cds/details/is_aligned.h
new file mode 100644 (file)
index 0000000..f50b899
--- /dev/null
@@ -0,0 +1,36 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_IS_ALIGNED_H
+#define __CDS_DETAILS_IS_ALIGNED_H
+
+#include <cds/details/defs.h>
+
+namespace cds { namespace details {
+
+    /// Checks if the pointer \p p has \p ALIGN byte alignment
+    /**
+        \p ALIGN must be power of 2.
+
+        The function is mostly intended for run-time assertion
+    */
+    template <int ALIGN, typename T>
+    static inline bool is_aligned(T const * p)
+    {
+        return (((uptr_atomic_t)p) & uptr_atomic_t(ALIGN - 1)) == 0;
+    }
+
+    /// Checks if the pointer \p p has \p nAlign byte alignment
+    /**
+        \p nAlign must be power of 2.
+
+        The function is mostly intended for run-time assertion
+    */
+    template <typename T>
+    static inline bool is_aligned(T const * p, size_t nAlign)
+    {
+        return (((uptr_atomic_t)p) & uptr_atomic_t(nAlign - 1)) == 0;
+    }
+
+}} // namespace cds::details
+
+#endif // #ifndef __CDS_DETAILS_IS_ALIGNED_H
diff --git a/cds/details/lib.h b/cds/details/lib.h
new file mode 100644 (file)
index 0000000..ecfb01b
--- /dev/null
@@ -0,0 +1,28 @@
+//$$CDS-header$$
+
+#ifndef __CDS_LIB_H
+#define __CDS_LIB_H
+//@cond
+
+#include <cds/details/defs.h>
+
+#ifndef CDS_BUILD_LIB
+
+#ifdef _DEBUG
+#   define  CDS_LIB_DEBUG_SUFFIX "_debug"
+#else
+#   define  CDS_LIB_DEBUG_SUFFIX ""
+#endif
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   pragma comment( lib, "libcds-" CDS_PROCESSOR__NICK "-" CDS_COMPILER__NICK CDS_LIB_DEBUG_SUFFIX )
+#elif CDS_COMPILER == CDS_COMPILER_INTEL
+#   pragma comment( lib, "libcds-" CDS_PROCESSOR__NICK "-" CDS_COMPILER__NICK CDS_LIB_DEBUG_SUFFIX )
+#endif
+
+#undef CDS_LIB_DEBUG_SUFFIX
+
+#endif // #ifndef CDS_BUILD_LIB
+
+//@endcond
+#endif // #ifndef __CDS_LIB_H
diff --git a/cds/details/make_const_type.h b/cds/details/make_const_type.h
new file mode 100644 (file)
index 0000000..4ece20e
--- /dev/null
@@ -0,0 +1,30 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_MAKE_CONST_TYPE_H
+#define __CDS_DETAILS_MAKE_CONST_TYPE_H
+
+#include <cds/details/defs.h>
+
+namespace cds { namespace details {
+
+    //@cond
+    template <typename T, bool B>
+    struct make_const_type
+    {
+        typedef T      type;
+        typedef T *    pointer;
+        typedef T &    reference;
+    };
+    template<typename T>
+    struct make_const_type<T, true>
+    {
+        typedef T const      type;
+        typedef T const *    pointer;
+        typedef T const &    reference;
+    };
+
+    //@endcond
+
+}}  // namespace cds::details
+
+#endif  // #ifndef __CDS_DETAILS_MAKE_CONST_TYPE_H
diff --git a/cds/details/marked_ptr.h b/cds/details/marked_ptr.h
new file mode 100644 (file)
index 0000000..3645e05
--- /dev/null
@@ -0,0 +1,374 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_MARKED_PTR_H
+#define __CDS_DETAILS_MARKED_PTR_H
+
+#include <cds/cxx11_atomic.h>
+
+namespace cds {
+    namespace details {
+
+        /// Marked pointer
+        /**
+            On the modern architectures, the default data alignment is 4 (for 32bit) or 8 byte for 64bit.
+            Therefore, the least 2 or 3 bits of the pointer is always zero and can
+            be used as a bitfield to store logical flags. This trick is widely used in
+            lock-free programming to operate with the pointer and its flags atomically.
+
+            Template parameters:
+            - T - type of pointer
+            - Bitmask - bitmask of least unused bits
+        */
+        template <typename T, int Bitmask>
+        class marked_ptr
+        {
+            T *     m_ptr   ;   ///< pointer and its mark bits
+
+        public:
+            typedef T       value_type      ;       ///< type of value the class points to
+            typedef T *     pointer_type    ;       ///< type of pointer
+            static CDS_CONSTEXPR_CONST uintptr_t bitmask = Bitmask  ;   ///< bitfield bitmask
+            static CDS_CONSTEXPR_CONST uintptr_t pointer_bitmask = ~bitmask ; ///< pointer bitmask
+
+        public:
+            /// Constructs null marked pointer. The flag is cleared.
+            CDS_CONSTEXPR marked_ptr() CDS_NOEXCEPT
+                : m_ptr( null_ptr<pointer_type>() )
+            {}
+
+            /// Constructs marked pointer with \p ptr value. The least bit(s) of \p ptr is the flag.
+            CDS_CONSTEXPR explicit marked_ptr( value_type * ptr ) CDS_NOEXCEPT
+                : m_ptr( ptr )
+            {}
+
+            /// Constructs marked pointer with \p ptr value and \p nMask flag.
+            /**
+                The \p nMask argument defines the OR-bits
+            */
+            marked_ptr( value_type * ptr, int nMask ) CDS_NOEXCEPT
+                : m_ptr( ptr )
+            {
+                assert( bits() == 0 );
+                *this |= nMask;
+            }
+
+#   ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            /// Copy constructor
+            marked_ptr( marked_ptr const& src ) CDS_NOEXCEPT_DEFAULTED = default;
+            /// Copy-assignment operator
+            marked_ptr& operator =( marked_ptr const& p ) CDS_NOEXCEPT_DEFAULTED = default;
+#       if defined(CDS_MOVE_SEMANTICS_SUPPORT) && !defined(CDS_DISABLE_DEFAULT_MOVE_CTOR)
+            //@cond
+            marked_ptr( marked_ptr&& src ) CDS_NOEXCEPT_DEFAULTED = default;
+            marked_ptr& operator =( marked_ptr&& p ) CDS_NOEXCEPT_DEFAULTED = default;
+            //@endcond
+#       endif
+#   else
+            /// Copy constructor
+            marked_ptr( marked_ptr const& src ) CDS_NOEXCEPT
+                : m_ptr( src.m_ptr )
+            {}
+
+            /// Copy-assignment operator
+            marked_ptr& operator =( marked_ptr const& p ) CDS_NOEXCEPT
+            {
+                m_ptr = p.m_ptr;
+                return *this;
+            }
+#   endif
+
+            //TODO: make move ctor
+
+        private:
+            //@cond
+            static uintptr_t   to_int( value_type * p ) CDS_NOEXCEPT
+            {
+                return reinterpret_cast<uintptr_t>( p );
+            }
+
+            static value_type * to_ptr( uintptr_t n ) CDS_NOEXCEPT
+            {
+                return reinterpret_cast< value_type *>( n );
+            }
+
+            uintptr_t   to_int() const CDS_NOEXCEPT
+            {
+                return to_int( m_ptr );
+            }
+            //@endcond
+
+        public:
+            /// Returns the pointer without mark bits (real pointer) const version
+            value_type *        ptr() const CDS_NOEXCEPT
+            {
+                return to_ptr( to_int() & ~bitmask );
+            }
+
+            /// Returns the pointer and bits together
+            value_type *        all() const CDS_NOEXCEPT
+            {
+                return m_ptr;
+            }
+
+            /// Returns the least bits of pointer according to \p Bitmask template argument of the class
+            uintptr_t bits() const CDS_NOEXCEPT
+            {
+                return to_int() & bitmask;
+            }
+
+            /// Analogue for \ref ptr
+            value_type * operator ->() const CDS_NOEXCEPT
+            {
+                return ptr();
+            }
+
+            /// Assignment operator sets markup bits to zero
+            marked_ptr operator =( T * p ) CDS_NOEXCEPT
+            {
+                m_ptr = p;
+                return *this;
+            }
+
+            /// Set LSB bits as <tt>bits() | nBits</tt>
+            marked_ptr& operator |=( int nBits ) CDS_NOEXCEPT
+            {
+                assert( (nBits & pointer_bitmask) == 0 );
+                m_ptr = to_ptr( to_int() | nBits );
+                return *this;
+            }
+
+            /// Set LSB bits as <tt>bits() & nBits</tt>
+            marked_ptr& operator &=( int nBits ) CDS_NOEXCEPT
+            {
+                assert( (nBits & pointer_bitmask) == 0 );
+                m_ptr = to_ptr( to_int() & (pointer_bitmask | nBits) );
+                return *this;
+            }
+
+            /// Set LSB bits as <tt>bits() ^ nBits</tt>
+            marked_ptr& operator ^=( int nBits ) CDS_NOEXCEPT
+            {
+                assert( (nBits & pointer_bitmask) == 0 );
+                m_ptr = to_ptr( to_int() ^ nBits );
+                return *this;
+            }
+
+            /// Returns <tt>p |= nBits</tt>
+            friend marked_ptr operator |( marked_ptr p, int nBits) CDS_NOEXCEPT
+            {
+                p |= nBits;
+                return p;
+            }
+
+            /// Returns <tt>p |= nBits</tt>
+            friend marked_ptr operator |( int nBits, marked_ptr p ) CDS_NOEXCEPT
+            {
+                p |= nBits;
+                return p;
+            }
+
+            /// Returns <tt>p &= nBits</tt>
+            friend marked_ptr operator &( marked_ptr p, int nBits) CDS_NOEXCEPT
+            {
+                p &= nBits;
+                return p;
+            }
+
+            /// Returns <tt>p &= nBits</tt>
+            friend marked_ptr operator &( int nBits, marked_ptr p ) CDS_NOEXCEPT
+            {
+                p &= nBits;
+                return p;
+            }
+
+            /// Returns <tt>p ^= nBits</tt>
+            friend marked_ptr operator ^( marked_ptr p, int nBits) CDS_NOEXCEPT
+            {
+                p ^= nBits;
+                return p;
+            }
+            /// Returns <tt>p ^= nBits</tt>
+            friend marked_ptr operator ^( int nBits, marked_ptr p ) CDS_NOEXCEPT
+            {
+                p ^= nBits;
+                return p;
+            }
+
+            /// Inverts LSBs of pointer \p p
+            friend marked_ptr operator ~( marked_ptr p ) CDS_NOEXCEPT
+            {
+                return p ^ marked_ptr::bitmask;
+            }
+
+
+            /// Comparing two marked pointer including its mark bits
+            friend bool operator ==( marked_ptr p1, marked_ptr p2 ) CDS_NOEXCEPT
+            {
+                return p1.all() == p2.all();
+            }
+
+            /// Comparing marked pointer and raw pointer, mark bits of \p p1 is ignored
+            friend bool operator ==( marked_ptr p1, value_type const * p2 ) CDS_NOEXCEPT
+            {
+                return p1.ptr() == p2;
+            }
+
+            /// Comparing marked pointer and raw pointer, mark bits of \p p2 is ignored
+            friend bool operator ==( value_type const * p1, marked_ptr p2 ) CDS_NOEXCEPT
+            {
+                return p1 == p2.ptr();
+            }
+
+            /// Comparing two marked pointer including its mark bits
+            friend bool operator !=( marked_ptr p1, marked_ptr p2 ) CDS_NOEXCEPT
+            {
+                return p1.all() != p2.all();
+            }
+
+            /// Comparing marked pointer and raw pointer, mark bits of \p p1 is ignored
+            friend bool operator !=( marked_ptr p1, value_type const * p2 ) CDS_NOEXCEPT
+            {
+                return p1.ptr() != p2;
+            }
+
+            /// Comparing marked pointer and raw pointer, mark bits of \p p2 is ignored
+            friend bool operator !=( value_type const * p1, marked_ptr p2 ) CDS_NOEXCEPT
+            {
+                return p1 != p2.ptr();
+            }
+
+            //@cond
+            /// atomic< marked_ptr< T, Bitmask > > support
+            T *& impl_ref() CDS_NOEXCEPT
+            {
+                return m_ptr;
+            }
+            //@endcond
+        };
+    }   // namespace details
+
+}   // namespace cds
+
+//@cond
+CDS_CXX11_ATOMIC_BEGIN_NAMESPACE
+
+    template <typename T, int Bitmask >
+    class atomic< cds::details::marked_ptr<T, Bitmask> >
+    {
+    private:
+        typedef cds::details::marked_ptr<T, Bitmask> marked_ptr;
+        typedef CDS_ATOMIC::atomic<T *>  atomic_impl;
+
+        atomic_impl m_atomic;
+    public:
+        bool is_lock_free() const volatile CDS_NOEXCEPT
+        {
+            return m_atomic.is_lock_free();
+        }
+        bool is_lock_free() const CDS_NOEXCEPT
+        {
+            return m_atomic.is_lock_free();
+        }
+
+        void store(marked_ptr val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            m_atomic.store( val.all(), order );
+        }
+        void store(marked_ptr val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            m_atomic.store( val.all(), order );
+        }
+
+        marked_ptr load(memory_order order = memory_order_seq_cst) const volatile CDS_NOEXCEPT
+        {
+            return marked_ptr( m_atomic.load( order ));
+        }
+        marked_ptr load(memory_order order = memory_order_seq_cst) const CDS_NOEXCEPT
+        {
+            return marked_ptr( m_atomic.load( order ));
+        }
+
+        operator marked_ptr() const volatile CDS_NOEXCEPT
+        {
+            return load();
+        }
+        operator marked_ptr() const CDS_NOEXCEPT
+        {
+            return load();
+        }
+
+        marked_ptr exchange(marked_ptr val, memory_order order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            return marked_ptr( m_atomic.exchange( val.all(), order ));
+        }
+        marked_ptr exchange(marked_ptr val, memory_order order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            return marked_ptr( m_atomic.exchange( val.all(), order ));
+        }
+
+        bool compare_exchange_weak(marked_ptr& expected, marked_ptr desired, memory_order success_order, memory_order failure_order) volatile CDS_NOEXCEPT
+        {
+            return m_atomic.compare_exchange_weak( expected.impl_ref(), desired.all(), success_order, failure_order );
+        }
+        bool compare_exchange_weak(marked_ptr& expected, marked_ptr desired, memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+        {
+            return m_atomic.compare_exchange_weak( expected.impl_ref(), desired.all(), success_order, failure_order );
+        }
+        bool compare_exchange_strong(marked_ptr& expected, marked_ptr desired, memory_order success_order, memory_order failure_order) volatile CDS_NOEXCEPT
+        {
+            return m_atomic.compare_exchange_strong( expected.impl_ref(), desired.all(), success_order, failure_order );
+        }
+        bool compare_exchange_strong(marked_ptr& expected, marked_ptr desired, memory_order success_order, memory_order failure_order) CDS_NOEXCEPT
+        {
+            return m_atomic.compare_exchange_strong( expected.impl_ref(), desired.all(), success_order, failure_order );
+        }
+        bool compare_exchange_weak(marked_ptr& expected, marked_ptr desired, memory_order success_order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            return m_atomic.compare_exchange_weak( expected.impl_ref(), desired.all(), success_order );
+        }
+        bool compare_exchange_weak(marked_ptr& expected, marked_ptr desired, memory_order success_order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            return m_atomic.compare_exchange_weak( expected.impl_ref(), desired.all(), success_order );
+        }
+        bool compare_exchange_strong(marked_ptr& expected, marked_ptr desired, memory_order success_order = memory_order_seq_cst) volatile CDS_NOEXCEPT
+        {
+            return m_atomic.compare_exchange_strong( expected.impl_ref(), desired.all(), success_order );
+        }
+        bool compare_exchange_strong(marked_ptr& expected, marked_ptr desired, memory_order success_order = memory_order_seq_cst) CDS_NOEXCEPT
+        {
+            return m_atomic.compare_exchange_strong( expected.impl_ref(), desired.all(), success_order );
+        }
+
+        CDS_CONSTEXPR atomic() CDS_NOEXCEPT
+            : m_atomic( cds::null_ptr<T *>() )
+        {}
+
+        CDS_CONSTEXPR explicit atomic(marked_ptr val) CDS_NOEXCEPT
+            : m_atomic( val.all() )
+        {}
+        CDS_CONSTEXPR explicit atomic(T * p) CDS_NOEXCEPT
+            : m_atomic( p )
+        {}
+
+#   ifdef CDS_CXX11_DELETE_DEFINITION_SUPPORT
+        atomic(const atomic&) = delete;
+        atomic& operator=(const atomic&) = delete;
+        atomic& operator=(const atomic&) volatile = delete;
+#   endif
+
+        marked_ptr operator=(marked_ptr val) volatile CDS_NOEXCEPT
+        {
+            store( val );
+            return val;
+        }
+        marked_ptr operator=(marked_ptr val) CDS_NOEXCEPT
+        {
+            store( val );
+            return val;
+        }
+    };
+
+CDS_CXX11_ATOMIC_END_NAMESPACE
+//@endcond
+
+#endif  // #ifndef __CDS_DETAILS_MARKED_PTR_H
diff --git a/cds/details/noncopyable.h b/cds/details/noncopyable.h
new file mode 100644 (file)
index 0000000..c2983a9
--- /dev/null
@@ -0,0 +1,15 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_NONCOPYABLE_H
+#define __CDS_DETAILS_NONCOPYABLE_H
+
+#include <boost/noncopyable.hpp>
+
+//@cond
+namespace cds { namespace details {
+    using boost::noncopyable;
+}}  // namespace cds::details
+//@endcond
+
+#endif // __CDS_DETAILS_NONCOPYABLE_H
+
diff --git a/cds/details/static_functor.h b/cds/details/static_functor.h
new file mode 100644 (file)
index 0000000..bba9f86
--- /dev/null
@@ -0,0 +1,21 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_STATIC_FUNCTOR_H
+#define __CDS_DETAILS_STATIC_FUNCTOR_H
+
+//@cond
+namespace cds { namespace details {
+
+    template <class Functor, typename T>
+    struct static_functor
+    {
+        static void call( T * p )
+        {
+            Functor()( p );
+        }
+    };
+
+}} // namespace cds::details
+//@endcond
+
+#endif // #ifndef __CDS_DETAILS_STATIC_FUNCTOR_H
diff --git a/cds/details/std/chrono.h b/cds/details/std/chrono.h
new file mode 100644 (file)
index 0000000..3c045aa
--- /dev/null
@@ -0,0 +1,24 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_STD_CHRONO_H
+#define __CDS_DETAILS_STD_CHRONO_H
+
+//@cond
+
+#include <cds/details/defs.h>
+
+#ifdef CDS_CXX11_STDLIB_CHRONO
+#   include <chrono>
+namespace cds_std {
+    namespace chrono = std::chrono;
+}
+#else
+#   include <boost/chrono.hpp>
+namespace cds_std {
+    namespace chrono = boost::chrono;
+}
+#endif
+
+//@endcond
+
+#endif // #ifndef __CDS_DETAILS_STD_CHRONO_H
diff --git a/cds/details/std/condition_variable.h b/cds/details/std/condition_variable.h
new file mode 100644 (file)
index 0000000..5db1e2f
--- /dev/null
@@ -0,0 +1,26 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_STD_CONDITION_VARIABLE_H
+#define __CDS_DETAILS_STD_CONDITION_VARIABLE_H
+
+//@cond
+
+#include <cds/details/defs.h>
+
+#ifdef CDS_CXX11_STDLIB_CONDITION_VARIABLE
+#   include <condition_variable>
+    namespace cds_std {
+        using std::condition_variable;
+        using std::condition_variable_any;
+    }
+#else
+#   include <boost/thread/condition_variable.hpp>
+    namespace cds_std {
+        using boost::condition_variable;
+        using boost::condition_variable_any;
+    }
+#endif
+
+//@endcond
+
+#endif // #ifndef __CDS_DETAILS_STD_CONDITION_VARIABLE_H
diff --git a/cds/details/std/memory.h b/cds/details/std/memory.h
new file mode 100644 (file)
index 0000000..8c0682e
--- /dev/null
@@ -0,0 +1,108 @@
+//$$CDS-header$$
+
+//@cond
+#ifndef __CDS_DETAILS_STD_MEMORY_H
+#define __CDS_DETAILS_STD_MEMORY_H
+
+#include <cds/details/defs.h>
+#include <memory>
+
+// -----------------------------------------------------------------
+// std::unique_ptr
+
+#if ((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1500) \
+    || (CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION < 40400 )
+// MS VC 2008, GCC 4.3
+
+namespace std {
+    template <class T> struct default_delete {
+        default_delete()
+        {}
+        void operator()(T* p) const
+        {
+            delete p;
+        }
+    };
+
+    template <typename T, typename Deleter = default_delete<T> >
+    class unique_ptr: private auto_ptr<T>
+    {
+        typedef auto_ptr<T> base_class;
+
+        // copy ctor is deleted
+        template <typename Q, typename D> unique_ptr( unique_ptr<Q, D> const& s );
+
+    public:
+        unique_ptr() throw()
+        {}
+
+        explicit unique_ptr( T * p ) throw()
+            : base_class( p )
+        {}
+
+        ~unique_ptr()
+        {
+            T * p = release();
+            if ( p )
+                Deleter()( p );
+        }
+
+        T * operator ->() const throw()
+        {
+            return base_class::operator->();
+        }
+
+        T& operator *() throw()
+        {
+            return base_class::operator*();
+        }
+
+        unique_ptr& operator=( T * p )
+        {
+            base_class::operator=(p);
+            return *this;
+        }
+
+        T * get() const throw()
+        {
+            return base_class::get();
+        }
+
+        T * release() throw()
+        {
+            return base_class::release();
+        }
+
+        void reset( T * p )
+        {
+            T * pOld = release();
+            assert( p != pOld );
+            if ( pOld )
+                Deleter()( pOld );
+            base_class::reset( p );
+        }
+    };
+}
+
+#endif
+// -----------------------------------------------------------------
+// std::shared_ptr
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1500
+// MS VC 2008
+
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/enable_shared_from_this.hpp>
+
+namespace std {
+    using boost::shared_ptr;
+    using boost::make_shared;
+    using boost::allocate_shared;
+    using boost::enable_shared_from_this;
+}   // namespace std
+#endif
+
+
+#endif // #ifndef __CDS_DETAILS_STD_MEMORY_H
+//@endcond
diff --git a/cds/details/std/mutex.h b/cds/details/std/mutex.h
new file mode 100644 (file)
index 0000000..7bd3533
--- /dev/null
@@ -0,0 +1,39 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_STD_MUTEX_H
+#define __CDS_DETAILS_STD_MUTEX_H
+
+//@cond
+
+#include <cds/details/defs.h>
+
+#ifdef CDS_CXX11_STDLIB_MUTEX
+#   include <mutex>
+    namespace cds_std {
+        using std::mutex;
+        using std::recursive_mutex;
+        using std::unique_lock;
+        using std::lock_guard;
+        using std::adopt_lock_t;
+    }
+#else
+#   include <boost/thread/mutex.hpp>
+#   include <boost/thread/recursive_mutex.hpp>
+#   if BOOST_VERSION >= 105300
+#       include <boost/thread/locks.hpp>
+#       include <boost/thread/lock_guard.hpp>
+#   else
+#       include <boost/thread.hpp>
+#   endif
+    namespace cds_std {
+        using boost::mutex;
+        using boost::recursive_mutex;
+        using boost::unique_lock;
+        using boost::lock_guard;
+        using boost::adopt_lock_t;
+    }
+#endif
+
+//@endcond
+
+#endif // #ifndef __CDS_DETAILS_STD_MUTEX_H
diff --git a/cds/details/std/thread.h b/cds/details/std/thread.h
new file mode 100644 (file)
index 0000000..ff7af37
--- /dev/null
@@ -0,0 +1,26 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_STD_THREAD_H
+#define __CDS_DETAILS_STD_THREAD_H
+
+//@cond
+
+#include <cds/details/defs.h>
+
+#ifdef CDS_CXX11_STDLIB_THREAD
+#   include <thread>
+    namespace cds_std {
+        using std::thread;
+        namespace this_thread = std::this_thread;
+    }
+#else
+#   include <boost/thread/thread.hpp>
+    namespace cds_std {
+        using boost::thread;
+        namespace this_thread = boost::this_thread;
+    }
+#endif
+
+//@endcond
+
+#endif // #ifndef __CDS_DETAILS_STD_THREAD_H
diff --git a/cds/details/std/tuple.h b/cds/details/std/tuple.h
new file mode 100644 (file)
index 0000000..97b935f
--- /dev/null
@@ -0,0 +1,30 @@
+//$$CDS-header$$
+
+//@cond
+#ifndef __CDS_DETAILS_STD_TUPLE_H
+#define __CDS_DETAILS_STD_TUPLE_H
+
+#include <cds/details/defs.h>
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600
+// MS VC 2008
+#include <boost/tuple/tuple.hpp>
+
+namespace std {
+    using boost::tuple;
+    using boost::get;
+    using boost::make_tuple;
+    using boost::tie;
+
+    template <class Tuple>
+    struct tuple_size {
+        static size_t const value = boost::tuples::length<Tuple>::value;
+    };
+
+}   // namespace std
+#else
+#   include <tuple>
+#endif
+
+#endif // #ifndef __CDS_DETAILS_STD_MEMORY_H
+//@endcond
diff --git a/cds/details/std/type_traits.h b/cds/details/std/type_traits.h
new file mode 100644 (file)
index 0000000..2fca3ab
--- /dev/null
@@ -0,0 +1,89 @@
+//$$CDS-header$$
+
+//@cond
+#ifndef __CDS_DETAILS_STD_TYPE_TRAITS_H
+#define __CDS_DETAILS_STD_TYPE_TRAITS_H
+
+#include <cds/details/defs.h>
+#include <type_traits>
+
+// -----------------------------------------------------------------
+// std::integral_constant, std::true_type, std::false_type
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1500
+
+namespace std {
+    using std::tr1::integral_constant;
+    using std::tr1::true_type;
+    using std::tr1::false_type;
+}   // namespace std
+#endif
+
+
+// -----------------------------------------------------------------
+// std::is_same, std::is_base_of
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1500
+
+namespace std {
+    using std::tr1::is_same;
+    using std::tr1::is_base_of;
+}   // namespace std
+#endif
+
+
+// -----------------------------------------------------------------
+// std::conditional
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1500
+
+#include <boost/type_traits/conditional.hpp>
+namespace std {
+    using boost::conditional;
+}   // namespace std
+#endif
+
+// -----------------------------------------------------------------
+// std::decay
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1500
+
+#include <boost/type_traits/decay.hpp>
+namespace std {
+    using boost::decay;
+}   // namespace std
+#endif
+
+// -----------------------------------------------------------------
+// std::enable_if
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1500
+
+namespace std {
+
+    template<bool Test, class Type = void>
+    struct enable_if
+    {};
+
+    template<class Type>
+    struct enable_if<true, Type>
+    {
+        typedef Type type;
+    };
+
+}   // namespace std
+#endif
+
+// -----------------------------------------------------------------
+// std::remove_const, std::remove_cv, std::remove_volatile
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1500
+namespace std {
+    using std::tr1::remove_const;
+    using std::tr1::remove_volatile;
+    using std::tr1::remove_cv;
+    using std::tr1::remove_reference;
+}
+#endif
+
+#endif  // #ifndef __CDS_DETAILS_STD_TYPE_TRAITS_H
+//@endcond
diff --git a/cds/details/trivial_assign.h b/cds/details/trivial_assign.h
new file mode 100644 (file)
index 0000000..6e5d4c2
--- /dev/null
@@ -0,0 +1,22 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_TRIVIAL_ASSIGN_H
+#define __CDS_DETAILS_TRIVIAL_ASSIGN_H
+
+#include <cds/details/defs.h>
+
+//@cond
+namespace cds { namespace details {
+
+    template <typename Dest, typename Source>
+    struct trivial_assign
+    {
+        Dest& operator()( Dest& dest, const Source& src )
+        {
+            return dest = src;
+        }
+    };
+}}  // namespace cds::details
+//@endcond
+
+#endif // #ifndef __CDS_DETAILS_TRIVIAL_ASSIGN_H
diff --git a/cds/details/type_padding.h b/cds/details/type_padding.h
new file mode 100644 (file)
index 0000000..a1bf5b0
--- /dev/null
@@ -0,0 +1,56 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_TYPE_PADDING_H
+#define __CDS_DETAILS_TYPE_PADDING_H
+
+namespace cds { namespace details {
+
+    //@cond none
+    template <typename T, int Align, int Modulo>
+    struct type_padding_helper: public T
+    {
+        enum {
+            value = Modulo
+        };
+        char _[Align - Modulo]   ;   // padding
+
+        type_padding_helper() CDS_NOEXCEPT_( noexcept( T() ))
+        {}
+    };
+    template <typename T, int Align>
+    struct type_padding_helper<T, Align, 0>: public T
+    {
+        enum {
+            value = 0
+        };
+
+        type_padding_helper() CDS_NOEXCEPT_( noexcept( T()) )
+        {}
+    };
+    //@endcond
+
+    /// Automatic alignment type \p T to \p AlignFactor
+    /**
+        The class adds appropriate bytes to type T that the following condition is true:
+        \code
+        sizeof( type_padding<T,AlignFactor>::type ) % AlignFactor == 0
+        \endcode
+        It is guaranteed that count of padding bytes no more than AlignFactor - 1.
+
+        \b Applicability: type \p T must not have constructors another that default ctor.
+        For example, \p T may be any POD type.
+    */
+    template <typename T, int AlignFactor>
+    class type_padding {
+    public:
+        /// Result type
+        typedef type_padding_helper<T, AlignFactor, sizeof(T) % AlignFactor>    type;
+
+        /// Padding constant
+        enum {
+            value = type::value
+        };
+    };
+
+}}   // namespace cds::details
+#endif // #ifndef __CDS_DETAILS_TYPE_PADDING_H
diff --git a/cds/details/void_selector.h b/cds/details/void_selector.h
new file mode 100644 (file)
index 0000000..198cfb1
--- /dev/null
@@ -0,0 +1,27 @@
+//$$CDS-header$$
+
+#ifndef __CDS_DETAILS_VOID_SELECTOR_H
+#define __CDS_DETAILS_VOID_SELECTOR_H
+
+#include <cds/details/std/type_traits.h>
+
+namespace cds {
+    namespace details {
+
+        /// Void type selector
+        /**
+            This metafunction is equal to the following expression:
+            \code
+            std::conditional< std::is_same< T, void >::value, Void, NoVoid >::type
+            \endcode
+
+            The \p NoVoid is optional, default is \p NoVoid == T
+        */
+        template <typename T, typename Void, typename NoVoid = T>
+        struct void_selector: public std::conditional< std::is_same< T, void >::value, Void, NoVoid >
+        {};
+
+    }    // namespace details
+} // namespace cds
+
+#endif // #ifndef __CDS_DETAILS_VOID_SELECTOR_H
diff --git a/cds/gc/all.h b/cds/gc/all.h
new file mode 100644 (file)
index 0000000..f5a7973
--- /dev/null
@@ -0,0 +1,10 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_ALL_H
+#define __CDS_GC_ALL_H
+
+#include <cds/gc/hp.h>
+#include <cds/gc/hrc.h>
+#include <cds/gc/ptb.h>
+
+#endif  // #ifndef __CDS_GC_ALL_H
diff --git a/cds/gc/default_gc.h b/cds/gc/default_gc.h
new file mode 100644 (file)
index 0000000..0fb888a
--- /dev/null
@@ -0,0 +1,16 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_DEFAULT_GC_H
+#define __CDS_GC_DEFAULT_GC_H
+
+#include <cds/gc/hp.h>
+
+namespace cds { namespace gc {
+
+    /// Default garbage collector
+    typedef HP     default_gc;
+
+}} // namespace cds::gc
+
+
+#endif  // #ifndef __CDS_GC_DEFAULT_GC_H
diff --git a/cds/gc/details/retired_ptr.h b/cds/gc/details/retired_ptr.h
new file mode 100644 (file)
index 0000000..92d84d3
--- /dev/null
@@ -0,0 +1,92 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_DETAILS_RETIRED_PTR_H
+#define __CDS_GC_DETAILS_RETIRED_PTR_H
+
+#include <cds/details/defs.h>
+
+namespace cds { namespace gc {
+    /// Common implementation details for any GC
+    namespace details {
+
+        /// Pointer to function to free (destruct and deallocate) retired pointer of specific type
+        typedef void (* free_retired_ptr_func )( void * );
+
+        /// Retired pointer
+        /**
+            Pointer to an object that is ready to delete.
+        */
+        struct retired_ptr {
+            /// Pointer type
+            typedef void *          pointer;
+
+            pointer                 m_p    ;        ///< retired pointer
+            free_retired_ptr_func   m_funcFree    ; ///< pointer to the destructor function
+
+            /// Comparison of two retired pointers
+            static bool less( const retired_ptr& p1, const retired_ptr& p2 )
+            {
+                return p1.m_p < p2.m_p;
+            }
+
+            /// Default ctor initializes pointer to NULL
+            retired_ptr()
+                : m_p( NULL )
+                , m_funcFree( NULL )
+            {}
+
+            /// Ctor
+            retired_ptr( pointer p, free_retired_ptr_func func )
+                : m_p( p ),
+                m_funcFree( func )
+            {}
+
+            /// Typecasting ctor
+            template <typename T>
+            retired_ptr( T * p, void (* pFreeFunc)(T *))
+                : m_p( reinterpret_cast<pointer>( p ) )
+                , m_funcFree( reinterpret_cast< free_retired_ptr_func >( pFreeFunc ))
+            {}
+
+            /// Assignment operator
+            retired_ptr& operator =( const retired_ptr& s)
+            {
+                m_p = s.m_p;
+                m_funcFree = s.m_funcFree;
+                return *this;
+            }
+
+            /// Invokes destructor function for the pointer
+            void free()
+            {
+                assert( m_funcFree != NULL );
+                assert( m_p != NULL );
+                m_funcFree( m_p );
+
+                CDS_STRICT_DO( m_p = null_ptr<pointer>() );
+                CDS_STRICT_DO( m_funcFree = null_ptr<free_retired_ptr_func>());
+            }
+        };
+
+        //@cond
+        static inline bool operator <( const retired_ptr& p1, const retired_ptr& p2 )
+        {
+            return retired_ptr::less( p1, p2 );
+        }
+
+        static inline bool operator ==( const retired_ptr& p1, const retired_ptr& p2 )
+        {
+            return p1.m_p == p2.m_p;
+        }
+
+        static inline bool operator !=( const retired_ptr& p1, const retired_ptr& p2 )
+        {
+            return !(p1 == p2);
+        }
+        //@endcond
+
+
+    }  // namespace details
+}}   // namespace cds::gc
+
+#endif // #ifndef __CDS_GC_DETAILS_RETIRED_PTR_H
diff --git a/cds/gc/exception.h b/cds/gc/exception.h
new file mode 100644 (file)
index 0000000..797bbb6
--- /dev/null
@@ -0,0 +1,15 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_EXCEPTION_H
+#define __CDS_GC_EXCEPTION_H
+
+#include <cds/details/defs.h>
+
+namespace cds { namespace gc {
+
+    /// %Exception "Too few hazard pointers"
+    CDS_DECLARE_EXCEPTION( too_few_hazard_pointers, "Too few hazard pointers" );
+
+}} // namespace cds::gc
+
+#endif // #ifndef __CDS_GC_EXCEPTION_H
diff --git a/cds/gc/gc_fwd.h b/cds/gc/gc_fwd.h
new file mode 100644 (file)
index 0000000..7a6d5b1
--- /dev/null
@@ -0,0 +1,19 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_FORWARD_H
+#define __CDS_GC_FORWARD_H
+
+#include <cds/details/defs.h>
+
+//@cond
+namespace cds { namespace gc {
+    class HP;
+    class HRC;
+    class PTB;
+
+    class nogc;
+}} // namespace cds::gc
+
+//@endcond
+
+#endif // #ifndef __CDS_GC_FORWARD_H
diff --git a/cds/gc/guarded_ptr.h b/cds/gc/guarded_ptr.h
new file mode 100644 (file)
index 0000000..be93c56
--- /dev/null
@@ -0,0 +1,218 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_GUARDED_PTR_H
+#define __CDS_GC_GUARDED_PTR_H
+
+#include <cds/details/defs.h>
+
+namespace cds { namespace gc {
+
+    /// Guarded pointer
+    /**
+        A guarded pointer is a pair of the pointer and GC's guard.
+        Usually, it is used for returning a pointer to the item from an lock-free container.
+        The guard prevents the pointer to be early disposed (freed) by GC.
+        After destructing \p %guarded_ptr object the pointer can be automatically disposed (freed) at any time.
+
+        Template arguments:
+        - \p GC - a garbage collector type like cds::gc::HP and any other from cds::gc namespace
+        - \p GuardedType - a type which the guard stores
+        - \p ValueType - a value type
+        - \p Cast - a functor for converting <tt>GuardedType*</tt> to <tt>ValueType*</tt>. Default is \p void (no casting).
+
+        For intrusive containers, \p GuardedType is the same as \p ValueType and no casting is needed.
+        In such case the \p %guarded_ptr is:
+        @code
+        typedef cds::gc::guarded_ptr< cds::gc::HP, foo > intrusive_guarded_ptr;
+        @endcode
+
+        For standard (non-intrusive) containers \p GuardedType is not the same as \p ValueType and casting is needed.
+        For example:
+        @code
+        struct foo {
+            int const   key;
+            std::string value;
+        };
+
+        struct value_accessor {
+            std::string* operator()( foo* pFoo ) const
+            {
+                return &(pFoo->value);
+            }
+        };
+
+        // Guarded ptr
+        typedef cds::gc::guarded_ptr< cds::gc::HP, Foo, std::string, value_accessor > nonintrusive_guarded_ptr;
+        @endcode
+
+        Many set/map container classes from \p libcds declare the typedef for \p %guarded_ptr with appropriate casting functor.
+    */
+    template <class GC, typename GuardedType, typename ValueType=GuardedType, typename Cast=void >
+    class guarded_ptr
+    {
+        //TODO: use moce semantics and explicit operator bool!
+    public:
+        typedef GC          gc         ;   ///< Garbage collector like cds::gc::HP and any other from cds::gc namespace
+        typedef GuardedType guarded_type;  ///< Guarded type
+        typedef ValueType   value_type ;   ///< Value type
+        typedef Cast        value_cast ;   ///< Functor for casting \p guarded_type to \p value_type
+
+    private:
+        //@cond
+        typename gc::Guard  m_guard;
+        //@endcond
+
+    public:
+        /// Creates empty guarded pointer
+        guarded_ptr() CDS_NOEXCEPT
+        {}
+
+        /// Initializes guarded pointer with \p p
+        guarded_ptr( guarded_type * p ) CDS_NOEXCEPT
+        {
+            m_guard.assign( p );
+        }
+
+        /// Copy constructor
+        guarded_ptr( guarded_ptr const& gp ) CDS_NOEXCEPT
+        {
+            m_guard.copy( gp.m_guard );
+        }
+
+        /// Clears the guarded pointer
+        /**
+            \ref release is called if guarded pointer is not \ref empty
+        */
+        ~guarded_ptr() CDS_NOEXCEPT
+        {
+            release();
+        }
+
+        /// Assignment operator
+        guarded_ptr& operator=( guarded_ptr const& gp ) CDS_NOEXCEPT
+        {
+            m_guard.copy( gp.m_guard );
+            return *this;
+        }
+
+        /// Returns a pointer to guarded value
+        value_type * operator ->() const CDS_NOEXCEPT
+        {
+            return value_cast()( m_guard.template get<guarded_type>() );
+        }
+
+        /// Returns a reference to guarded value
+        value_type& operator *() CDS_NOEXCEPT
+        {
+            assert( !empty());
+            return *value_cast()( m_guard.template get<guarded_type>() );
+        }
+
+        /// Returns const reference to guarded value
+        value_type const& operator *() const CDS_NOEXCEPT
+        {
+            assert( !empty());
+            return *value_cast()( m_guard.template get<guarded_type>() );
+        }
+
+        /// Checks if the guarded pointer is \p NULL
+        bool empty() const CDS_NOEXCEPT
+        {
+            return m_guard.template get<guarded_type>() == null_ptr<guarded_type *>();
+        }
+
+        /// Clears guarded pointer
+        /**
+            If the guarded pointer has been released, the pointer can be disposed (freed) at any time.
+            Dereferncing the guarded pointer after \p release() is dangerous.
+        */
+        void release() CDS_NOEXCEPT
+        {
+            m_guard.clear();
+        }
+
+        //@cond
+        // For internal use only!!!
+        typename gc::Guard& guard() CDS_NOEXCEPT
+        {
+            return m_guard;
+        }
+        //@endcond
+    };
+
+
+    //@cond
+    // Intrusive specialization
+    template <class GC, typename T>
+    class guarded_ptr< GC, T, T, void >
+    {
+    public:
+        typedef GC  gc         ;   ///< Garbage collector like cds::gc::HP
+        typedef T   guarded_type;  ///< Guarded type
+        typedef T   value_type ;   ///< Value type
+
+    private:
+        typename gc::Guard  m_guard;
+
+    public:
+        guarded_ptr() CDS_NOEXCEPT
+        {}
+
+        guarded_ptr( value_type * p ) CDS_NOEXCEPT
+        {
+            m_guard.assign( p );
+        }
+
+        guarded_ptr( guarded_ptr const& gp ) CDS_NOEXCEPT
+        {
+            m_guard.copy( gp.m_guard );
+        }
+
+        ~guarded_ptr() CDS_NOEXCEPT
+        {
+            release();
+        }
+
+        guarded_ptr& operator=( guarded_ptr const& gp ) CDS_NOEXCEPT
+        {
+            m_guard.copy( gp.m_guard );
+            return *this;
+        }
+
+        value_type * operator ->() const CDS_NOEXCEPT
+        {
+            return m_guard.template get<value_type>();
+        }
+
+        value_type& operator *() CDS_NOEXCEPT
+        {
+            assert( !empty());
+            return *m_guard.template get<value_type>();
+        }
+
+        value_type const& operator *() const CDS_NOEXCEPT
+        {
+            assert( !empty());
+            return *m_guard.template get<value_type>();
+        }
+
+        bool empty() const CDS_NOEXCEPT
+        {
+            return m_guard.template get<guarded_type>() == null_ptr<guarded_type *>();
+        }
+
+        void release() CDS_NOEXCEPT
+        {
+            m_guard.clear();
+        }
+
+        typename gc::Guard& guard() CDS_NOEXCEPT
+        {
+            return m_guard;
+        }
+    };
+    //@endcond
+
+}} // namespace cds::gc
+
+#endif // #ifndef __CDS_GC_GUARDED_PTR_H
diff --git a/cds/gc/hp.h b/cds/gc/hp.h
new file mode 100644 (file)
index 0000000..2c87f00
--- /dev/null
@@ -0,0 +1,10 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HP_H
+#define __CDS_GC_HP_H
+
+#include <cds/gc/hp_decl.h>
+#include <cds/gc/hp_impl.h>
+#include <cds/details/lib.h>
+
+#endif  // #ifndef __CDS_GC_HP_H
diff --git a/cds/gc/hp_decl.h b/cds/gc/hp_decl.h
new file mode 100644 (file)
index 0000000..4b6d0ed
--- /dev/null
@@ -0,0 +1,567 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HP_DECL_H
+#define __CDS_GC_HP_DECL_H
+
+#include <cds/gc/hzp/hzp.h>
+#include <cds/details/marked_ptr.h>
+
+namespace cds { namespace gc {
+    /// @defgroup cds_garbage_collector Garbage collectors
+
+    /// Hazard Pointer garbage collector
+    /**  @ingroup cds_garbage_collector
+        @headerfile cds/gc/hp.h
+
+        This class realizes a wrapper for Hazard Pointer garbage collector internal implementation.
+
+        Sources:
+            - [2002] Maged M.Michael "Safe memory reclamation for dynamic lock-freeobjects using atomic reads and writes"
+            - [2003] Maged M.Michael "Hazard Pointers: Safe memory reclamation for lock-free objects"
+            - [2004] Andrei Alexandrescy, Maged Michael "Lock-free Data Structures with Hazard Pointers"
+
+        See \ref cds_how_to_use "How to use" section for details of garbage collector applying.
+    */
+    class HP
+    {
+    public:
+        /// Native guarded pointer type
+        typedef gc::hzp::hazard_pointer guarded_pointer;
+
+#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
+        /// Atomic reference
+        /**
+            @headerfile cds/gc/hp.h
+        */
+        template <typename T> using atomic_ref = CDS_ATOMIC::atomic<T *>;
+
+        /// Atomic marked pointer
+        /**
+            @headerfile cds/gc/hp.h
+        */
+        template <typename MarkedPtr> using atomic_marked_ptr = CDS_ATOMIC::atomic<MarkedPtr>;
+
+        /// Atomic type
+        /**
+            @headerfile cds/gc/hp.h
+        */
+        template <typename T> using atomic_type = CDS_ATOMIC::atomic<T>;
+#else
+        template <typename T>
+        class atomic_ref: public CDS_ATOMIC::atomic<T *>
+        {
+            typedef CDS_ATOMIC::atomic<T *> base_class;
+        public:
+#   ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            atomic_ref() = default;
+#   else
+            atomic_ref()
+                : base_class()
+            {}
+#   endif
+            explicit CDS_CONSTEXPR atomic_ref(T * p) CDS_NOEXCEPT
+                : base_class( p )
+            {}
+        };
+
+        template <typename T>
+        class atomic_type: public CDS_ATOMIC::atomic<T>
+        {
+            typedef CDS_ATOMIC::atomic<T> base_class;
+        public:
+#   ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            atomic_type() = default;
+#   else
+            atomic_type() CDS_NOEXCEPT
+                : base_class()
+            {}
+#   endif
+            explicit CDS_CONSTEXPR atomic_type(T const & v) CDS_NOEXCEPT
+                : base_class( v )
+            {}
+        };
+
+        template <typename MarkedPtr>
+        class atomic_marked_ptr: public CDS_ATOMIC::atomic<MarkedPtr>
+        {
+            typedef CDS_ATOMIC::atomic<MarkedPtr> base_class;
+        public:
+#   ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            atomic_marked_ptr() CDS_NOEXCEPT_DEFAULTED_( noexcept(base_class()) ) = default;
+#   else
+            atomic_marked_ptr() CDS_NOEXCEPT_( noexcept(base_class()) )
+                : base_class()
+            {}
+#   endif
+            explicit CDS_CONSTEXPR atomic_marked_ptr(MarkedPtr val) CDS_NOEXCEPT_( noexcept(base_class( val )) )
+                : base_class( val )
+            {}
+            explicit CDS_CONSTEXPR atomic_marked_ptr(typename MarkedPtr::value_type * p) CDS_NOEXCEPT_( noexcept(base_class( p )) )
+                : base_class( p )
+            {}
+        };
+#endif
+
+        /// Thread GC implementation for internal usage
+        typedef hzp::ThreadGC   thread_gc_impl;
+
+        /// Wrapper for hzp::ThreadGC class
+        /**
+            @headerfile cds/gc/hp.h
+            This class performs automatically attaching/detaching Hazard Pointer GC
+            for the current thread.
+        */
+        class thread_gc: public thread_gc_impl
+        {
+            //@cond
+            bool    m_bPersistent;
+            //@endcond
+        public:
+
+            /// Constructor
+            /**
+                The constructor attaches the current thread to the Hazard Pointer GC
+                if it is not yet attached.
+                The \p bPersistent parameter specifies attachment persistence:
+                - \p true - the class destructor will not detach the thread from Hazard Pointer GC.
+                - \p false (default) - the class destructor will detach the thread from Hazard Pointer GC.
+            */
+            thread_gc(
+                bool    bPersistent = false
+            ) ;     //inline in hp_impl.h
+
+            /// Destructor
+            /**
+                If the object has been created in persistent mode, the destructor does nothing.
+                Otherwise it detaches the current thread from Hazard Pointer GC.
+            */
+            ~thread_gc() ;  // inline in hp_impl.h
+        };
+
+        /// Base for container node
+        /**
+            @headerfile cds/gc/hp.h
+            This struct is empty for Hazard Pointer GC
+        */
+        struct container_node
+        {};
+
+        /// Hazard Pointer guard
+        /**
+            @headerfile cds/gc/hp.h
+            This class is a wrapper for hzp::AutoHPGuard.
+        */
+        class Guard: public hzp::AutoHPGuard
+        {
+            //@cond
+            typedef hzp::AutoHPGuard base_class;
+            //@endcond
+
+        public:
+            //@cond
+            Guard() ;   // inline in hp_impl.h
+            //@endcond
+
+            /// Protects a pointer of type \p atomic<T*>
+            /**
+                Return the value of \p toGuard
+
+                The function tries to load \p toGuard and to store it
+                to the HP slot repeatedly until the guard's value equals \p toGuard
+            */
+            template <typename T>
+            T protect( CDS_ATOMIC::atomic<T> const& toGuard )
+            {
+                T pCur = toGuard.load(CDS_ATOMIC::memory_order_relaxed);
+                T pRet;
+                do {
+                    pRet = assign( pCur );
+                    pCur = toGuard.load(CDS_ATOMIC::memory_order_acquire);
+                } while ( pRet != pCur );
+                return pCur;
+            }
+
+            /// Protects a converted pointer of type \p atomic<T*>
+            /**
+                Return the value of \p toGuard
+
+                The function tries to load \p toGuard and to store result of \p f functor
+                to the HP slot repeatedly until the guard's value equals \p toGuard.
+
+                The function is useful for intrusive containers when \p toGuard is a node pointer
+                that should be converted to a pointer to the value type before protecting.
+                The parameter \p f of type Func is a functor that makes this conversion:
+                \code
+                    struct functor {
+                        value_type * operator()( T * p );
+                    };
+                \endcode
+                Really, the result of <tt> f( toGuard.load() ) </tt> is assigned to the hazard pointer.
+            */
+            template <typename T, class Func>
+            T protect( CDS_ATOMIC::atomic<T> const& toGuard, Func f )
+            {
+                T pCur = toGuard.load(CDS_ATOMIC::memory_order_relaxed);
+                T pRet;
+                do {
+                    pRet = pCur;
+                    assign( f( pCur ) );
+                    pCur = toGuard.load(CDS_ATOMIC::memory_order_acquire);
+                } while ( pRet != pCur );
+                return pCur;
+            }
+
+            /// Store \p p to the guard
+            /**
+                The function equals to a simple assignment the value \p p to guard, no loop is performed.
+                Can be used for a pointer that cannot be changed concurrently
+            */
+            template <typename T>
+            T * assign( T * p )
+            {
+                return base_class::operator =(p);
+            }
+
+            /// Copy from \p src guard to \p this guard
+            void copy( Guard const& src )
+            {
+                assign( src.get_native() );
+            }
+
+            /// Store marked pointer \p p to the guard
+            /**
+                The function equals to a simple assignment of <tt>p.ptr()</tt>, no loop is performed.
+                Can be used for a marked pointer that cannot be changed concurrently.
+            */
+            template <typename T, int BITMASK>
+            T * assign( cds::details::marked_ptr<T, BITMASK> p )
+            {
+                return base_class::operator =( p.ptr() );
+            }
+
+            /// Clear value of the guard
+            void clear()
+            {
+                assign( reinterpret_cast<void *>(NULL) );
+            }
+
+            /// Get the value currently protected
+            template <typename T>
+            T * get() const
+            {
+                return reinterpret_cast<T *>( get_native() );
+            }
+
+            /// Get native hazard pointer stored
+            guarded_pointer get_native() const
+            {
+                return base_class::get();
+            }
+        };
+
+        /// Array of Hazard Pointer guards
+        /**
+            @headerfile cds/gc/hp.h
+            This class is a wrapper for hzp::AutoHPArray template.
+            Template parameter \p Count defines the size of HP array.
+        */
+        template <size_t Count>
+        class GuardArray: public hzp::AutoHPArray<Count>
+        {
+            //@cond
+            typedef hzp::AutoHPArray<Count> base_class;
+            //@endcond
+        public:
+            /// Rebind array for other size \p Count2
+            template <size_t Count2>
+            struct rebind {
+                typedef GuardArray<Count2>  other   ;   ///< rebinding result
+            };
+
+        public:
+            //@cond
+            GuardArray()    ;   // inline in hp_impl.h
+            //@endcond
+            /// Protects a pointer of type \p atomic<T*>
+            /**
+                Return the value of \p toGuard
+
+                The function tries to load \p toGuard and to store it
+                to the slot \p nIndex repeatedly until the guard's value equals \p toGuard
+            */
+            template <typename T>
+            T protect(size_t nIndex, CDS_ATOMIC::atomic<T> const& toGuard )
+            {
+                T pRet;
+                do {
+                    pRet = assign( nIndex, toGuard.load(CDS_ATOMIC::memory_order_acquire) );
+                } while ( pRet != toGuard.load(CDS_ATOMIC::memory_order_relaxed));
+
+                return pRet;
+            }
+
+            /// Protects a pointer of type \p atomic<T*>
+            /**
+                Return the value of \p toGuard
+
+                The function tries to load \p toGuard and to store it
+                to the slot \p nIndex repeatedly until the guard's value equals \p toGuard
+
+                The function is useful for intrusive containers when \p toGuard is a node pointer
+                that should be converted to a pointer to the value type before guarding.
+                The parameter \p f of type Func is a functor that makes this conversion:
+                \code
+                    struct functor {
+                        value_type * operator()( T * p );
+                    };
+                \endcode
+                Really, the result of <tt> f( toGuard.load() ) </tt> is assigned to the hazard pointer.
+            */
+            template <typename T, class Func>
+            T protect(size_t nIndex, CDS_ATOMIC::atomic<T> const& toGuard, Func f )
+            {
+                T pRet;
+                do {
+                    assign( nIndex, f( pRet = toGuard.load(CDS_ATOMIC::memory_order_acquire) ));
+                } while ( pRet != toGuard.load(CDS_ATOMIC::memory_order_relaxed));
+
+                return pRet;
+            }
+
+            /// Store \p to the slot \p nIndex
+            /**
+                The function equals to a simple assignment, no loop is performed.
+            */
+            template <typename T>
+            T * assign( size_t nIndex, T * p )
+            {
+                base_class::set(nIndex, p);
+                return p;
+            }
+
+            /// Store marked pointer \p p to the guard
+            /**
+                The function equals to a simple assignment of <tt>p.ptr()</tt>, no loop is performed.
+                Can be used for a marked pointer that cannot be changed concurrently.
+            */
+            template <typename T, int BITMASK>
+            T * assign( size_t nIndex, cds::details::marked_ptr<T, BITMASK> p )
+            {
+                return assign( nIndex, p.ptr() );
+            }
+
+            /// Copy guarded value from \p src guard to slot at index \p nIndex
+            void copy( size_t nIndex, Guard const& src )
+            {
+                assign( nIndex, src.get_native() );
+            }
+
+            /// Copy guarded value from slot \p nSrcIndex to slot at index \p nDestIndex
+            void copy( size_t nDestIndex, size_t nSrcIndex )
+            {
+                assign( nDestIndex, get_native( nSrcIndex ));
+            }
+
+            /// Clear value of the slot \p nIndex
+            void clear( size_t nIndex)
+            {
+                base_class::clear( nIndex );
+            }
+
+            /// Get current value of slot \p nIndex
+            template <typename T>
+            T * get( size_t nIndex) const
+            {
+                return reinterpret_cast<T *>( get_native( nIndex ) );
+            }
+
+            /// Get native hazard pointer stored
+            guarded_pointer get_native( size_t nIndex ) const
+            {
+                return base_class::operator[](nIndex).get();
+            }
+
+            /// Capacity of the guard array
+            static CDS_CONSTEXPR size_t capacity()
+            {
+                return Count;
+            }
+        };
+
+    public:
+        /// Initializes hzp::GarbageCollector singleton
+        /**
+            The constructor initializes GC singleton with passed parameters.
+            If GC instance is not exist then the function creates the instance.
+            Otherwise it does nothing.
+
+            The Michael's HP reclamation schema depends of three parameters:
+            - \p nHazardPtrCount - hazard pointer count per thread. Usually it is small number (up to 10) depending from
+                the data structure algorithms. By default, if \p nHazardPtrCount = 0, the function
+                uses maximum of the hazard pointer count for CDS library.
+            - \p nMaxThreadCount - max count of thread with using Hazard Pointer GC in your application. Default is 100.
+            - \p nMaxRetiredPtrCount - capacity of array of retired pointers for each thread. Must be greater than
+                <tt> nHazardPtrCount * nMaxThreadCount </tt>. Default is <tt>2 * nHazardPtrCount * nMaxThreadCount </tt>.
+        */
+        HP(
+            size_t nHazardPtrCount = 0,     ///< Hazard pointer count per thread
+            size_t nMaxThreadCount = 0,     ///< Max count of simultaneous working thread in your application
+            size_t nMaxRetiredPtrCount = 0, ///< Capacity of the array of retired objects for the thread
+            hzp::scan_type nScanType = hzp::inplace   ///< Scan type (see \ref hzp::scan_type enum)
+        )
+        {
+            hzp::GarbageCollector::Construct(
+                nHazardPtrCount,
+                nMaxThreadCount,
+                nMaxRetiredPtrCount,
+                nScanType
+            );
+        }
+
+        /// Terminates GC singleton
+        /**
+            The destructor calls \code hzp::GarbageCollector::Destruct( true ) \endcode
+        */
+        ~HP()
+        {
+            hzp::GarbageCollector::Destruct( true );
+        }
+
+        /// Checks if count of hazard pointer is no less than \p nCountNeeded
+        /**
+            If \p bRaiseException is \p true (that is the default), the function raises an exception gc::too_few_hazard_pointers
+            if \p nCountNeeded is more than the count of hazard pointer per thread.
+        */
+        static bool check_available_guards( size_t nCountNeeded, bool bRaiseException = true )
+        {
+            if ( hzp::GarbageCollector::instance().getHazardPointerCount() < nCountNeeded ) {
+                if ( bRaiseException )
+                    throw cds::gc::too_few_hazard_pointers();
+                return false;
+            }
+            return true;
+        }
+
+        /// Returns max Hazard Pointer count
+        size_t max_hazard_count() const
+        {
+            return hzp::GarbageCollector::instance().getHazardPointerCount();
+        }
+
+        /// Returns max count of thread
+        size_t max_thread_count() const
+        {
+            return hzp::GarbageCollector::instance().getMaxThreadCount();
+        }
+
+        /// Returns capacity of retired pointer array
+        size_t retired_array_capacity() const
+        {
+            return hzp::GarbageCollector::instance().getMaxRetiredPtrCount();
+        }
+
+        /// Retire pointer \p p with function \p pFunc
+        /**
+            The function places pointer \p p to array of pointers ready for removing.
+            (so called retired pointer array). The pointer can be safely removed when no hazard pointer points to it.
+            Deleting the pointer is the function \p pFunc call.
+        */
+        template <typename T>
+        static void retire( T * p, void (* pFunc)(T *) )    ;   // inline in hp_impl.h
+
+        /// Retire pointer \p p with functor of type \p Disposer
+        /**
+            The function places pointer \p p to array of pointers ready for removing.
+            (so called retired pointer array). The pointer can be safely removed when no hazard pointer points to it.
+
+            Deleting the pointer is an invocation of some object of type \p Disposer; the interface of \p Disposer is:
+            \code
+            template <typename T>
+            struct disposer {
+                void operator()( T * p )    ;   // disposing operator
+            };
+            \endcode
+            Since the functor call can happen at any time after \p retire call, additional restrictions are imposed to \p Disposer type:
+            - it should be stateless functor
+            - it should be default-constructible
+            - the result of functor call with argument \p p should not depend on where the functor will be called.
+
+            \par Examples:
+            Operator \p delete functor:
+            \code
+            template <typename T>
+            struct disposer {
+                void operator ()( T * p ) {
+                    delete p;
+                }
+            };
+
+            // How to call GC::retire method
+            int * p = new int;
+
+            // ... use p in lock-free manner
+
+            cds::gc::HP::retire<disposer>( p ) ;   // place p to retired pointer array of HP GC
+            \endcode
+
+            Functor based on \p std::allocator :
+            \code
+            template <typename ALLOC = std::allocator<int> >
+            struct disposer {
+                template <typename T>
+                void operator()( T * p ) {
+                    typedef typename ALLOC::templare rebind<T>::other   alloc_t;
+                    alloc_t a;
+                    a.destroy( p );
+                    a.deallocate( p, 1 );
+                }
+            };
+            \endcode
+        */
+        template <class Disposer, typename T>
+        static void retire( T * p ) ;   // inline in hp_impl.h
+
+        /// Get current scan strategy
+        /**@anchor hrc_gc_HP_getScanType
+            See hzp::GarbageCollector::Scan for scan algo description
+        */
+        hzp::scan_type getScanType() const
+        {
+            return hzp::GarbageCollector::instance().getScanType();
+        }
+
+        /// Set current scan strategy
+        /**
+            Scan strategy changing is allowed on the fly.
+
+            About scan strategy see \ref hrc_gc_HP_getScanType "getScanType"
+        */
+        void setScanType(
+            hzp::scan_type nScanType     ///< new scan strategy
+        )
+        {
+            hzp::GarbageCollector::instance().setScanType( nScanType );
+        }
+
+        /// Checks if Hazard Pointer GC is constructed and may be used
+        static bool isUsed()
+        {
+            return hzp::GarbageCollector::isUsed();
+        }
+
+
+        /// Forced GC cycle call for current thread
+        /**
+            Usually, this function should not be called directly.
+        */
+        static void scan()  ;   // inline in hp_impl.h
+
+        /// Synonym for \ref scan()
+        static void force_dispose()
+        {
+            scan();
+        }
+    };
+}}  // namespace cds::gc
+
+#endif  // #ifndef __CDS_GC_HP_DECL_H
diff --git a/cds/gc/hp_impl.h b/cds/gc/hp_impl.h
new file mode 100644 (file)
index 0000000..d2006e3
--- /dev/null
@@ -0,0 +1,57 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HP_IMPL_H
+#define __CDS_GC_HP_IMPL_H
+
+#include <cds/threading/model.h>
+#include <cds/details/static_functor.h>
+
+//@cond
+namespace cds { namespace gc {
+
+    inline HP::thread_gc::thread_gc(
+        bool    bPersistent
+        )
+        : m_bPersistent( bPersistent )
+    {
+        if ( !threading::Manager::isThreadAttached() )
+            threading::Manager::attachThread();
+    }
+
+    inline HP::thread_gc::~thread_gc()
+    {
+        if ( !m_bPersistent )
+            cds::threading::Manager::detachThread();
+    }
+
+    inline HP::Guard::Guard()
+        : Guard::base_class( cds::threading::getGC<HP>() )
+    {}
+
+    template <size_t COUNT>
+    inline HP::GuardArray<COUNT>::GuardArray()
+        : GuardArray::base_class( cds::threading::getGC<HP>() )
+    {}
+
+    template <typename T>
+    inline void HP::retire( T * p, void (* pFunc)(T *) )
+    {
+        cds::threading::getGC<HP>().retirePtr( p, pFunc );
+    }
+
+    template <class Disposer, typename T>
+    inline void HP::retire( T * p )
+    {
+        cds::threading::getGC<HP>().retirePtr( p, cds::details::static_functor<Disposer, T>::call );
+    }
+
+    inline void HP::scan()
+    {
+        cds::threading::getGC<HP>().scan();
+    }
+
+
+}} // namespace cds::gc
+//@endcond
+
+#endif // #ifndef __CDS_GC_HP_IMPL_H
diff --git a/cds/gc/hrc.h b/cds/gc/hrc.h
new file mode 100644 (file)
index 0000000..344ef31
--- /dev/null
@@ -0,0 +1,10 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HRC_H
+#define __CDS_GC_HRC_H
+
+#include <cds/gc/hrc_decl.h>
+#include <cds/gc/hrc_impl.h>
+#include <cds/details/lib.h>
+
+#endif // #ifndef __CDS_GC_HRC_H
diff --git a/cds/gc/hrc/details/hrc_fwd.h b/cds/gc/hrc/details/hrc_fwd.h
new file mode 100644 (file)
index 0000000..7d44e77
--- /dev/null
@@ -0,0 +1,16 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HRC_SCHEMA_FWD_H
+#define __CDS_GC_HRC_SCHEMA_FWD_H
+
+namespace cds { namespace gc { namespace hrc {
+
+    // forward declaration
+    class GarbageCollector;
+    class ThreadGC;
+
+    class ContainerNode;
+    class Container;
+}}}
+
+#endif // #ifndef __CDS_GC_HRC_SCHEMA_FWD_H
diff --git a/cds/gc/hrc/details/hrc_inline.h b/cds/gc/hrc/details/hrc_inline.h
new file mode 100644 (file)
index 0000000..a116582
--- /dev/null
@@ -0,0 +1,64 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HRC_SCHEMA_INLINE_H
+#define __CDS_GC_HRC_SCHEMA_INLINE_H
+
+//@cond
+namespace cds { namespace gc { namespace hrc {
+
+    //-------------------------------------------------------------------
+    // Inlines
+    //-------------------------------------------------------------------
+
+    namespace details {
+        inline retired_vector::retired_vector( const GarbageCollector& gc )
+        : m_nFreeList(0)
+        , m_arr( gc.getMaxRetiredPtrCount() )
+        {
+            for ( size_t i = 0; i < m_arr.capacity(); ++i )
+                m_arr[i].m_nNextFree = i + 1;
+            m_arr[ m_arr.capacity() - 1 ].m_nNextFree = m_nEndFreeList;
+        }
+
+        inline thread_descriptor::thread_descriptor( const GarbageCollector& gc )
+        : m_hzp( gc.getHazardPointerCount() )
+        , m_arrRetired( gc )
+        {}
+
+    } // namespace details
+
+    inline ContainerNode::ContainerNode()
+        : m_bTrace( false )
+        , m_bDeleted( false )
+    {
+        CDS_DEBUG_DO( GarbageCollector::instance().dbgNodeConstructed() ; )
+    }
+
+    inline ContainerNode::~ContainerNode()
+    {
+        assert( m_RC == 0 );
+        CDS_DEBUG_DO( GarbageCollector::instance().dbgNodeDestructed() ; )
+    }
+
+    inline void GarbageCollector::try_retire( ThreadGC * pThreadGC )
+    {
+        CDS_DEBUG_DO( unsigned int nAttempt = 0 );
+
+        do {
+            pThreadGC->cleanUpLocal();
+            Scan( pThreadGC );
+            HelpScan( pThreadGC );
+
+            if ( pThreadGC->m_pDesc->m_arrRetired.isFull() )
+                CleanUpAll( pThreadGC );
+
+            // infinite loop?
+            assert( ++nAttempt <= 3 );
+        } while ( pThreadGC->m_pDesc->m_arrRetired.isFull() );
+    }
+
+
+} } } // namespace cds::gc::hrc
+//@endcond
+
+#endif // #ifndef __CDS_GC_HRC_SCHEMA_INLINE_H
diff --git a/cds/gc/hrc/details/hrc_retired.h b/cds/gc/hrc/details/hrc_retired.h
new file mode 100644 (file)
index 0000000..7926289
--- /dev/null
@@ -0,0 +1,193 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HRC_SCHEMA_RETIRED_H
+#define __CDS_GC_HRC_SCHEMA_RETIRED_H
+
+#include <cds/gc/hrc/details/hrc_fwd.h>
+#include <cds/gc/details/retired_ptr.h>
+#include <cds/cxx11_atomic.h>
+#include <cds/details/bounded_array.h>
+
+namespace cds { namespace gc { namespace hrc {
+    namespace details {
+
+        /// Pointer to function to free (destruct and deallocate) retired pointer of specific type
+        typedef gc::details::free_retired_ptr_func free_retired_ptr_func;
+
+        /// Retired node descriptor
+        struct retired_node {
+            CDS_ATOMIC::atomic<ContainerNode *> m_pNode        ;    ///< node to destroy
+            free_retired_ptr_func               m_funcFree     ;    ///< pointer to the destructor function
+            size_t                              m_nNextFree    ;    ///< Next free item in retired array
+            CDS_ATOMIC::atomic<unsigned int>    m_nClaim       ;    ///< Access to reclaimed node
+            CDS_ATOMIC::atomic<bool>            m_bDone        ;    ///< the record is in work (concurrent access flag)
+
+            /// Default ctor
+            retired_node()
+                : m_pNode( null_ptr<ContainerNode *>() )
+                , m_funcFree( null_ptr<free_retired_ptr_func>() )
+                , m_nNextFree(0)
+                , m_nClaim(0)
+                , m_bDone( false )
+            {}
+
+            /// Assignment ctor
+            retired_node(
+                ContainerNode * pNode           ///< Node to retire
+                ,free_retired_ptr_func func     ///< Destructor function
+                )
+                : m_pNode( pNode )
+                , m_funcFree( func )
+                , m_nClaim(0)
+                , m_bDone( false )
+            {}
+
+            /// Compares two \ref retired_node
+            static bool Less( const retired_node& p1, const retired_node& p2 )
+            {
+                return p1.m_pNode.load( CDS_ATOMIC::memory_order_relaxed ) < p2.m_pNode.load( CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Assignment operator
+            retired_node& set( ContainerNode * pNode, free_retired_ptr_func func )
+            {
+                m_bDone.store( false, CDS_ATOMIC::memory_order_relaxed );
+                m_nClaim.store( 0, CDS_ATOMIC::memory_order_relaxed );
+                m_funcFree = func;
+                m_pNode.store( pNode, CDS_ATOMIC::memory_order_release );
+                CDS_COMPILER_RW_BARRIER;
+                return *this;
+            }
+
+            /// Invokes destructor function for the pointer
+            void free()
+            {
+                assert( m_funcFree != null_ptr<free_retired_ptr_func>() );
+                m_funcFree( m_pNode.load( CDS_ATOMIC::memory_order_relaxed ));
+            }
+        };
+
+        /// Compare two retired node
+        /**
+            This comparison operator is needed for sorting pointers on
+            deallocation step
+        */
+        static inline bool operator <( const retired_node& p1, const retired_node& p2 )
+        {
+            return retired_node::Less( p1, p2 );
+        }
+
+        /// Array of ready for destroying pointers
+        /**
+            The array object is belonged to one thread: only owner thread may write to this array,
+            any other thread can read one.
+        */
+        class retired_vector
+        {
+            typedef cds::details::bounded_array<retired_node> vector_type  ;   ///< type of vector of retired pointer (implicit CDS_DEFAULT_ALLOCATOR dependency)
+
+            //@cond
+            static const size_t m_nEndFreeList = size_t(0) -  1 ;    ///< End of free list
+            //@endcond
+            size_t          m_nFreeList ; ///< Index of first free item in m_arr
+            vector_type     m_arr       ; ///< Array of retired pointers (implicit \ref CDS_DEFAULT_ALLOCATOR dependence)
+
+        public:
+            /// Iterator over retired pointer vector
+            typedef vector_type::iterator                       iterator;
+            /// Const iterator type
+            typedef vector_type::const_iterator                 const_iterator;
+
+        public:
+            /// Ctor
+            retired_vector( const GarbageCollector& mgr )    ;    // inline
+            ~retired_vector()
+            {}
+
+            ///@anchor hrc_gc_retired_vector_capacity Capacity (max available size) of array
+            size_t capacity() const
+            {
+                return m_arr.capacity();
+            }
+
+            /// Returns count of retired node in array. This function is intended for debug purposes only
+            size_t retiredNodeCount() const
+            {
+                size_t nCount = 0;
+                const size_t nCapacity = capacity();
+                for ( size_t i = 0; i < nCapacity; ++i ) {
+                    if ( m_arr[i].m_pNode.load( CDS_ATOMIC::memory_order_relaxed ) != null_ptr<ContainerNode *>() )
+                        ++nCount;
+                }
+                return nCount;
+            }
+
+            /// Push a new item into the array
+            void push( ContainerNode * p, free_retired_ptr_func pFunc )
+            {
+                assert( !isFull());
+
+                size_t n = m_nFreeList;
+                assert( m_arr[n].m_pNode.load( CDS_ATOMIC::memory_order_relaxed ) == null_ptr<ContainerNode *>() );
+                m_nFreeList = m_arr[n].m_nNextFree;
+                CDS_DEBUG_DO( m_arr[n].m_nNextFree = m_nEndFreeList ; )
+                m_arr[n].set( p, pFunc );
+            }
+
+            /// Pops the item by index \p n from the array
+            void pop( size_t n )
+            {
+                assert( n < capacity() );
+                m_arr[n].m_pNode.store( null_ptr<ContainerNode *>(), CDS_ATOMIC::memory_order_release );
+                m_arr[n].m_nNextFree = m_nFreeList;
+                m_nFreeList = n;
+            }
+
+            /// Checks if array is full
+            bool isFull() const
+            {
+                return m_nFreeList == m_nEndFreeList;
+            }
+
+            /// Get the item by index \p i
+            retired_node& operator []( size_t i )
+            {
+                assert( i < capacity() );
+                return m_arr[i];
+            }
+
+            /// Returns a random-access iterator to the first element in the retired pointer vector
+            /**
+                If the vector is empty, end() == begin().
+            */
+            iterator begin()
+            {
+                return m_arr.begin();
+            }
+
+            /// Const version of begin()
+            const_iterator begin() const
+            {
+                return m_arr.begin();
+            }
+
+            /// A random-access iterator to the end of the vector object.
+            /**
+                If the vector is empty, end() == begin().
+            */
+            iterator end()
+            {
+                return m_arr.end();
+            }
+
+            /// Const version of end()
+            const_iterator end() const
+            {
+                return m_arr.end();
+            }
+        };
+
+    }    // namespace details
+}}}    // namespace cds::gc::hrc
+
+#endif // #ifndef __CDS_GC_HRC_SCHEMA_RETIRED_H
diff --git a/cds/gc/hrc/gc_fwd.h b/cds/gc/hrc/gc_fwd.h
new file mode 100644 (file)
index 0000000..0917055
--- /dev/null
@@ -0,0 +1,15 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HRC_SCHEMA_GC_FWD_H
+#define __CDS_GC_HRC_SCHEMA_GC_FWD_H
+
+#include <cds/details/defs.h>
+
+//@cond
+namespace cds { namespace gc { namespace hrc {
+    // Forward declaration
+    class GC;
+}}} // namespace cds::gc::hrc
+//@endcond
+
+#endif // #ifndef __CDS_GC_HRC_SCHEMA_GC_FWD_H
diff --git a/cds/gc/hrc/hrc.h b/cds/gc/hrc/hrc.h
new file mode 100644 (file)
index 0000000..9fe760f
--- /dev/null
@@ -0,0 +1,690 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HRC_HRC_H
+#define __CDS_GC_HRC_HRC_H
+
+/*
+    Editions:
+        2008.03.08    Maxim.Khiszinsky    Created
+*/
+
+#include <cds/refcounter.h>
+#include <cds/lock/spinlock.h>
+#include <cds/gc/exception.h>
+
+#include <cds/gc/hrc/details/hrc_fwd.h>
+#include <cds/gc/hrc/details/hrc_retired.h>
+
+#include <cds/gc/hzp/details/hp_alloc.h>
+
+#include <cds/details/noncopyable.h>
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   pragma warning(push)
+// warning C4251: 'cds::gc::hzp::GarbageCollector::m_pListHead' : class 'cds::cxx11_atomics::atomic<T>'
+// needs to have dll-interface to be used by clients of class 'cds::gc::hzp::GarbageCollector'
+#   pragma warning(disable: 4251)
+#endif
+
+
+namespace cds { namespace gc {
+
+    // forwards
+    class HRC;
+
+    /// Gidenstam's memory reclamation schema (HRC)
+    /**
+
+    \par Sources:
+        - [2006] A.Gidenstam "Algorithms for synchronization and consistency
+                in concurrent system services", Chapter 5 "Lock-Free Memory Reclamation"
+                Thesis for the degree of Doctor    of Philosophy
+        - [2005] Anders Gidenstam, Marina Papatriantafilou and Philippas Tsigas "Allocating
+                memory in a lock-free manner", Proceedings of the 13th Annual European
+                Symposium on Algorithms (ESA 2005), Lecture Notes in Computer
+                Science Vol. 3669, pages 229 \96 242, Springer-Verlag, 2005
+
+
+        The \p %cds::gc::hrc namespace and its members are internal representation of the GC and should not be used directly.
+        Use \p cds::gc::HRC class in your code.
+
+        This reclamation schema combines Michael's Hazard Pointer schema (see \p cds::gc::hzp)
+        for deferred safe reclamation of unused objects and the reference counting
+        for controlling lifetime of the objects.
+
+        HRC garbage collector is a singleton. The main user-level part of HRC schema is
+        GC class and its nested classes. Before use any HRC-related class you must initialize HRC garbage collector
+        by contructing \p %cds::gc::HRC object in beginning of your <tt>main()</tt>.
+        See \p cds::gc::HRC class for explanation.
+    */
+    namespace hrc {
+
+        /// Base class for all HRC-based container's node
+        /**
+            This interface is placed to the separate class since in the presence of a garbage collector
+            the lifetime of the node is greater than lifetime of its container.
+            Reclaimed node may be physically deleted later than its container.
+            So, the ContainerNode must be smarter than the usual.
+        */
+        class ContainerNode
+        {
+        protected:
+
+            friend class GarbageCollector;
+            friend class ThreadGC;
+            friend class gc::HRC;
+
+            unsigned_ref_counter        m_RC        ;    ///< reference counter
+            CDS_ATOMIC::atomic<bool>    m_bTrace    ;    ///< \p true - node is tracing by Scan
+            CDS_ATOMIC::atomic<bool>    m_bDeleted  ;    ///< \p true - node is deleted
+
+        protected:
+            //@cond
+            ContainerNode() ;               // inline, see hrc_inline.h
+            virtual ~ContainerNode()    ;   // inline, see hrc_inline.h
+            //@endcond
+
+        public:
+            /// Returns count of reference for the node
+            unsigned_ref_counter::ref_counter_type  getRefCount() const CDS_NOEXCEPT
+            {
+                return m_RC.value();
+            }
+
+            /// Increments the reference counter of the node
+            void            incRefCount() CDS_NOEXCEPT
+            {
+                m_RC.inc();
+            }
+
+            /// Decrements the reference counter of the node. Returns \p true if ref counter is 0.
+            bool            decRefCount() CDS_NOEXCEPT
+            {
+                return m_RC.dec();
+            }
+
+            /// Returns the mark whether the node is deleted
+            bool            isDeleted() const CDS_NOEXCEPT
+            {
+                return m_bDeleted.load( CDS_ATOMIC::memory_order_acquire );
+            }
+
+        protected:
+            //@cond
+            void clean( CDS_ATOMIC::memory_order order ) CDS_NOEXCEPT
+            {
+                m_bDeleted.store( false, order );
+                m_bTrace.store( false, order );
+            }
+            //@endcond
+
+        protected:    // GC interface
+            /**
+                [Gidenstam 2006]: "The procedure \p CleanUpNode will make sure that all claimed references from
+                the links of the given node will only point to active nodes, thus removing redundant
+                passages through an arbitrary number of deleted nodes"
+
+                The pseudocode of this method must be like following:
+                \code
+                void cleanUp( ThreadGC * pGC )
+                    for all x where link[x] of node is reference-counted do
+                retry:
+                        node1 := link[x];
+                        if node1 != NULL and node1.m_bDeleted then
+                            node2 := node1->link[x];
+                            pGC->CASRef( this->link[x], node1, node2 );
+                            pGC->releaseRef( node2 );
+                            pGC->releaseRef( node1 );
+                            goto retry;
+                        pGC->releaseRef(node1);
+                \endcode
+
+                Be aware to use hazard pointers inside implementation of this method. cleanUp is called from
+                the container's method when deleting the nodes. However, some hazard pointers may be occupied
+                by container's method. You should allocate new hazard pointers inside \p cleanUp method, for example:
+                \code
+                    gc::hrc::AutoHPArray<2> hpArr( *pGC );
+                \endcode
+            */
+            virtual void    cleanUp( ThreadGC * pGC ) = 0;
+
+            /**
+                [Gidenstam 2006]: "The procedure \p TerminateNode will make sure that none of the links in the
+                given node will have any claim on any other node. TerminateNode is called on
+                a deleted node when there are no claims from any other node or thread to the
+                node"
+
+                The pseudocode of this method must be like following:
+                \code
+                void terminate( ThreadGC * pGC, bool bConcurrent)
+                    if !bConcurrent
+                        for all this->link where link is reference-counted do
+                            link := NULL;
+                    else
+                        for all this->link where link is reference-counted do
+                            repeat node1 := link;
+                            until pGC->CASRef(link,node1,NULL);
+                \endcode
+            */
+            virtual void    terminate( ThreadGC * pGC, bool bConcurrent ) = 0;
+
+        public:
+            /// Method to destroy (deallocate) node. Depends on node's allocator
+            //virtual void    destroy() = 0;
+        };
+
+        //@cond
+        /// HRC GC implementation details
+        namespace details {
+
+            /// Hazard pointer guard
+            typedef gc::hzp::details::HPGuardT<ContainerNode *>    HPGuard;
+
+            /// Array of hazard pointers.
+            /**
+                This is wrapper for cds::gc::hzp::details::HPArray class
+            */
+#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
+            template <size_t Count> using HPArray = gc::hzp::details::HPArrayT<ContainerNode *, Count >;
+#else
+            template <size_t Count>
+            class HPArray: public gc::hzp::details::HPArrayT<ContainerNode *, Count>
+            {};
+#endif
+
+            /// HP record of the thread
+            /**
+                This structure is single writer - multiple reader type. The writer is the thread owned the record
+            */
+            struct thread_descriptor {
+                typedef ContainerNode * hazard_ptr       ; ///< base type of hazard pointer
+
+                hzp::details::HPAllocator<hazard_ptr>   m_hzp           ;   ///< array of hazard pointers. Implicit \ref CDS_DEFAULT_ALLOCATOR dependence
+                details::retired_vector                 m_arrRetired    ;   ///< array of retired pointers
+
+                //@cond
+                thread_descriptor( const GarbageCollector& HzpMgr ) ;    // inline
+                ~thread_descriptor()
+                {}
+                //@endcond
+
+                /// clear all hazard pointers
+                void clear()
+                {
+                    m_hzp.clear();
+                }
+            };
+        }    // namespace details
+        //@endcond
+
+        /// Gidenstam's Garbage Collector
+        /**
+            This GC combines Hazard Pointers (HP) reclamation method by Michael's and the well-known reference counting
+            reclamation schema. The HP method is light-weight algorithm guarding local references only. Reference counting
+            schema is harder than HP with relation to the performance but can guard global references too.
+            Using Gidenstam's GC it can be possible to safely introduce to the lock-free data structures
+            very useful concepts like iterators.
+
+            GarbageCollector is the singleton.
+        */
+        class CDS_EXPORT_API GarbageCollector
+        {
+        public:
+            typedef cds::atomicity::event_counter  event_counter   ;   ///< event counter type
+
+            /// GC internal statistics
+            struct internal_state {
+                size_t              nHPCount                ;   ///< HP count per thread (const)
+                size_t              nMaxThreadCount         ;   ///< Max thread count (const)
+                size_t              nMaxRetiredPtrCount     ;   ///< Max retired pointer count per thread (const)
+                size_t              nHRCRecSize             ;   ///< Size of HRC record, bytes (const)
+
+                size_t              nHRCRecAllocated        ;   ///< Count of HRC record allocations
+                size_t              nHRCRecUsed             ;   ///< Count of HRC record used
+                size_t              nTotalRetiredPtrCount   ;   ///< Current total count of retired pointers
+                size_t              nRetiredPtrInFreeHRCRecs;   ///< Count of retired pointer in free (unused) HP records
+
+
+                event_counter::value_type   evcAllocHRCRec        ; ///< Event count of thread descriptor allocation
+                event_counter::value_type   evcRetireHRCRec        ; ///< Event count of thread descriptor reclamation
+                event_counter::value_type   evcAllocNewHRCRec    ; ///< Event count of new thread descriptor allocation
+                event_counter::value_type   evcDeleteHRCRec        ; ///< Event count of thread descriptor deletion
+                event_counter::value_type   evcScanCall            ; ///< Number of calls Scan
+                event_counter::value_type   evcHelpScanCalls    ; ///< Number of calls HelpScan
+                event_counter::value_type   evcCleanUpAllCalls  ; ///< Number of calls CleanUpAll
+                event_counter::value_type   evcDeletedNode        ; ///< Node deletion event counter
+                event_counter::value_type   evcScanGuarded      ; ///< Count of retired nodes that could not be deleted on Scan phase
+                event_counter::value_type   evcScanClaimGuarded ; ///< Count of retired node that could not be deleted on Scan phase because of m_nClaim != 0
+
+#ifdef CDS_DEBUG
+                event_counter::value_type   evcNodeConstruct    ; ///< Count of constructed ContainerNode
+                event_counter::value_type   evcNodeDestruct     ; ///< Count of destructed ContainerNode
+#endif
+            };
+
+            /// "Global GC object is NULL" exception
+            CDS_DECLARE_EXCEPTION( HRCGarbageCollectorEmpty, "Global cds::gc::hrc::GarbageCollector is NULL" );
+
+            /// Not enough required Hazard Pointer count
+            CDS_DECLARE_EXCEPTION( HRCTooMany, "Not enough required Hazard Pointer count" );
+
+        private:
+            /// Internal statistics by events
+            struct statistics {
+                event_counter  m_AllocHRCThreadDesc        ; ///< Event count of thread descriptor allocation
+                event_counter  m_RetireHRCThreadDesc        ; ///< Event count of thread descriptor reclamation
+                event_counter  m_AllocNewHRCThreadDesc        ; ///< Event count of new thread descriptor allocation
+                event_counter  m_DeleteHRCThreadDesc        ; ///< Event count of deletion of thread descriptor
+                event_counter  m_ScanCalls                    ; ///< Number of calls Scan
+                event_counter  m_HelpScanCalls             ; ///< Number of calls HelpScan
+                event_counter  m_CleanUpAllCalls           ; ///< Number of calls CleanUpAll
+
+                event_counter  m_DeletedNode                ; ///< Node deletion event counter
+                event_counter  m_ScanGuarded               ; ///< Count of retired nodes that could not be deleted on Scan phase
+                event_counter  m_ScanClaimGuarded          ; ///< Count of retired node that could not be deleted on Scan phase because of m_nClaim != 0
+
+#           ifdef CDS_DEBUG
+                event_counter  m_NodeConstructed           ; ///< Count of ContainerNode constructed
+                event_counter  m_NodeDestructed            ; ///< Count of ContainerNode destructed
+#           endif
+            };
+
+            /// HRC control structure of global thread list
+            struct thread_list_node: public details::thread_descriptor
+            {
+                thread_list_node *  m_pNext     ; ///< next list record
+                ThreadGC *          m_pOwner    ; ///< Owner of record
+                CDS_ATOMIC::atomic<cds::OS::ThreadId>   m_idOwner   ; ///< Id of thread owned; 0 - record is free
+                bool                m_bFree        ; ///< Node is help-scanned
+
+                //@cond
+                thread_list_node( const GarbageCollector& HzpMgr )
+                    : thread_descriptor( HzpMgr ),
+                    m_pNext(null_ptr<thread_list_node *>()),
+                    m_pOwner( null_ptr<ThreadGC *>() ),
+                    m_idOwner( cds::OS::nullThreadId() ),
+                    m_bFree( false )
+                {}
+
+                ~thread_list_node()
+                {
+                    assert( m_pOwner == null_ptr<ThreadGC *>() );
+                    assert( m_idOwner.load(CDS_ATOMIC::memory_order_relaxed) == cds::OS::nullThreadId() );
+                }
+                //@endcond
+            };
+
+        private:
+            CDS_ATOMIC::atomic<thread_list_node *> m_pListHead  ;  ///< Head of thread list
+
+            static GarbageCollector *    m_pGC    ;    ///< HRC garbage collector instance
+
+            statistics              m_Stat                  ;    ///< Internal statistics
+            bool                    m_bStatEnabled          ;    ///< @a true - accumulate internal statistics
+
+            const size_t            m_nHazardPointerCount   ;    ///< max count of thread's hazard pointer
+            const size_t            m_nMaxThreadCount       ;    ///< max count of thread
+            const size_t            m_nMaxRetiredPtrCount   ;    ///< max count of retired ptr per thread
+
+        private:
+            //@cond
+            GarbageCollector(
+                size_t nHazardPtrCount,            ///< number of hazard pointers
+                size_t nMaxThreadCount,            ///< max number of threads
+                size_t nRetiredNodeArraySize    ///< size of array of retired node
+            );
+            ~GarbageCollector();
+            //@endcond
+
+            /// Allocates new HRC control structure from the heap (using operator new)
+            thread_list_node *    newHRCThreadDesc();
+
+            /// Deletes \p pNode control structure
+            void                deleteHRCThreadDesc( thread_list_node * pNode );
+
+            /// Clears retired nodes of \p pNode control structure
+            void                clearHRCThreadDesc( thread_list_node * pNode );
+
+            /// Finds HRC control structure for current thread
+            thread_list_node *    getHRCThreadDescForCurrentThread() const;
+
+        public:
+            /// Create global instance of GarbageCollector
+            static void    CDS_STDCALL    Construct(
+                size_t nHazardPtrCount = 0,        ///< number of hazard pointers
+                size_t nMaxThreadCount = 0,        ///< max threads count
+                size_t nMaxNodeLinkCount = 0,    ///< max number of links a @ref ContainerNode can contain
+                size_t nMaxTransientLinks = 0    ///< max number of links in live nodes that may transiently point to a deleted node
+                );
+
+            /// Destroy global instance of GarbageCollector
+            static void    CDS_STDCALL        Destruct();
+
+            /// Get global instance of GarbageCollector
+            static GarbageCollector&   instance()
+            {
+                if ( !m_pGC )
+                    throw HRCGarbageCollectorEmpty();
+                return *m_pGC;
+            }
+
+            /// Checks if global GC object is constructed and may be used
+            static bool isUsed()
+            {
+                return m_pGC != null_ptr<GarbageCollector *>();
+            }
+
+            /// Get max count of hazard pointers as defined in @ref Construct call
+            size_t            getHazardPointerCount() const
+            {
+                return m_nHazardPointerCount;
+            }
+
+            /// Get max thread count as defined in @ref Construct call
+            size_t            getMaxThreadCount() const
+            {
+                return m_nMaxThreadCount;
+            }
+
+            /// Get max retired pointers count. It is calculated by the parameters of @ref Construct call
+            size_t            getMaxRetiredPtrCount() const
+            {
+                return m_nMaxRetiredPtrCount;
+            }
+
+            /// Get internal statistics
+            internal_state& getInternalState( internal_state& stat) const;
+
+            /// Check if statistics enabled
+            bool              isStatisticsEnabled() const
+            {
+                return m_bStatEnabled;
+            }
+
+            /// Enable internal statistics
+            bool              enableStatistics( bool bEnable )
+            {
+                bool bCurEnabled = m_bStatEnabled;
+                m_bStatEnabled = bEnable;
+                return bCurEnabled;
+            }
+
+            /// Checks that required hazard pointer count \p nRequiredCount is less or equal then max hazard pointer count
+            /**
+                If \p nRequiredCount > getHazardPointerCount() then the exception HZPTooMany is thrown
+            */
+            static void checkHPCount( unsigned int nRequiredCount )
+            {
+                if ( instance().getHazardPointerCount() < nRequiredCount )
+                    throw HRCTooMany();
+            }
+
+        public:    // Internals for threads
+
+            /// Allocates HRC thread descriptor (thread interface)
+            details::thread_descriptor * allocateHRCThreadDesc( ThreadGC * pThreadGC );
+
+            /// Retires HRC thread descriptor (thread interface)
+            void retireHRCThreadDesc( details::thread_descriptor * pRec );
+
+            /// The main method of GC
+            /**
+                The procedure searches through all not yet reclaimed nodes deleted by this thread
+                and reclaim only those that does not have any matching hazard pointers and do not have any
+                counted references from any links inside of nodes.
+                @a Scan is called in context of thread owned \p pRec.
+            */
+            void Scan( ThreadGC * pThreadGC );
+
+            /// Manage free thread_descriptor records and move all retired pointers to \p pThreadGC
+            void HelpScan( ThreadGC * pThreadGC );
+
+            /// Global clean up
+            /**
+                The procedure try to remove redundant claimed references from links in deleted nodes
+                that has been deleted by any thread. \p pThreadGC - ThreadGC of calling thread
+            */
+            void CleanUpAll( ThreadGC * pThreadGC );
+
+            //@cond
+            void try_retire( ThreadGC * pThreadGC ) ;   // inline in hrc_inline.h
+            //@endcond
+
+#   ifdef CDS_DEBUG
+        public:
+            //@cond
+            void dbgNodeConstructed() { ++m_Stat.m_NodeConstructed; }
+            void dbgNodeDestructed()  { ++m_Stat.m_NodeDestructed;  }
+            //@endcond
+#   endif
+
+        };
+
+        class AutoHPGuard;
+
+        /// Thread's Garbage collector
+        /**
+            To use HRC reclamation schema each thread object must be linked with the object of ThreadGC class
+            that interacts with GarbageCollector global object. The linkage is performed by calling cds::threading \p Manager::attachThread()
+            on the start of each thread that uses HRC GC. Before terminating the thread linked to HRC GC it is necessary to call
+            cds::threading \p Manager::detachThread().
+        */
+        class ThreadGC: cds::details::noncopyable
+        {
+            GarbageCollector&               m_gc    ; ///< master garbage collector
+            details::thread_descriptor *    m_pDesc ; ///< descriptor of GC data for the thread
+
+            friend class GarbageCollector;
+
+        public:
+            //@cond
+            ThreadGC()
+                : m_gc( GarbageCollector::instance() )
+                , m_pDesc( null_ptr<details::thread_descriptor *>() )
+            {}
+            ~ThreadGC()
+            {
+                fini();
+            }
+            //@endcond
+
+            /// Checks if thread GC is initialized
+            bool    isInitialized() const   { return m_pDesc != null_ptr<details::thread_descriptor *>() ; }
+
+            /// Initialization. Multiple calls is allowed
+            void init()
+            {
+                if ( !m_pDesc )
+                    m_pDesc = m_gc.allocateHRCThreadDesc( this );
+            }
+
+            /// Finalization. Multiple calls is allowed
+            void fini()
+            {
+                if ( m_pDesc ) {
+                    cleanUpLocal();
+                    m_gc.Scan( this );
+                    details::thread_descriptor * pRec = m_pDesc;
+                    m_pDesc = null_ptr<details::thread_descriptor *>();
+                    if  ( pRec )
+                        m_gc.retireHRCThreadDesc( pRec );
+                }
+            }
+        public:    // HRC garbage collector methods
+
+            /// Initializes HP guard \p guard
+            details::HPGuard& allocGuard()
+            {
+                assert( m_pDesc != null_ptr<details::thread_descriptor *>() );
+                return m_pDesc->m_hzp.alloc();
+            }
+
+            /// Frees HP guard \p guard
+            void freeGuard( details::HPGuard& guard )
+            {
+                assert( m_pDesc != null_ptr<details::thread_descriptor *>() );
+                m_pDesc->m_hzp.free( guard );
+            }
+
+            /// Initializes HP guard array \p arr
+            template <size_t Count>
+            void allocGuard( details::HPArray<Count>& arr )
+            {
+                assert( m_pDesc != null_ptr<details::thread_descriptor *>() );
+                m_pDesc->m_hzp.alloc( arr );
+            }
+
+            /// Frees HP guard array \p arr
+            template <size_t Count>
+            void freeGuard( details::HPArray<Count>& arr )
+            {
+                assert( m_pDesc != null_ptr<details::thread_descriptor *>() );
+                m_pDesc->m_hzp.free( arr );
+            }
+
+            /// Retire (deferred delete) node \p pNode guarded by \p hp hazard pointer
+            void retireNode( ContainerNode * pNode, details::HPGuard& hp, details::free_retired_ptr_func pFunc )
+            {
+                assert( !pNode->m_bDeleted.load( CDS_ATOMIC::memory_order_relaxed ) );
+                assert( pNode == hp );
+
+                retireNode( pNode, pFunc );
+                hp.clear();
+            }
+
+            /// Retire (deferred delete) node \p pNode. Do not use this function directly!
+            void retireNode( ContainerNode * pNode, details::free_retired_ptr_func pFunc )
+            {
+                assert( !pNode->m_bDeleted.load( CDS_ATOMIC::memory_order_relaxed ) );
+
+                pNode->m_bDeleted.store( true, CDS_ATOMIC::memory_order_release );
+                pNode->m_bTrace.store( false, CDS_ATOMIC::memory_order_release );
+
+                m_pDesc->m_arrRetired.push( pNode, pFunc );
+
+                if ( m_pDesc->m_arrRetired.isFull() )
+                    m_gc.try_retire( this );
+            }
+
+            //@cond
+            void scan()
+            {
+                m_gc.try_retire( this );
+            }
+            //@endcond
+
+        protected:
+            /// The procedure will try to remove redundant claimed references from link in deleted nodes that has been deleted by this thread
+            void cleanUpLocal()
+            {
+                details::retired_vector::iterator itEnd = m_pDesc->m_arrRetired.end();
+                for ( details::retired_vector::iterator it = m_pDesc->m_arrRetired.begin(); it != itEnd; ++it ) {
+                    details::retired_node& node = *it;
+                    ContainerNode * pNode = node.m_pNode.load(CDS_ATOMIC::memory_order_acquire);
+                    if ( pNode && !node.m_bDone.load(CDS_ATOMIC::memory_order_acquire) )
+                        pNode->cleanUp( this );
+                }
+            }
+        };
+
+        /// Auto HPGuard.
+        class AutoHPGuard
+        {
+            //@cond
+            details::HPGuard&   m_hp  ; ///< hazard pointer
+            ThreadGC&           m_mgr ; ///< Thread GC.
+            //@endcond
+        public:
+            typedef details::HPGuard::hazard_ptr hazard_ptr ;  ///< Hazard pointer type
+
+        public:
+            /// Allocates HP guard from \p mgr
+            AutoHPGuard( ThreadGC& mgr )
+                : m_hp( mgr.allocGuard() )
+                , m_mgr( mgr )
+            {}
+
+            /// Allocates HP guard from \p mgr and protects the pointer \p p of type \p T
+            template <typename T>
+            AutoHPGuard( ThreadGC& mgr, T * p  )
+                : m_hp( mgr.allocGuard() )
+                , m_mgr( mgr )
+            {
+                m_hp = p;
+            }
+
+            /// Frees HP guard
+            ~AutoHPGuard()
+            {
+                m_mgr.freeGuard( m_hp );
+            }
+
+            /// Returns thread GC
+            ThreadGC&    getGC() const CDS_NOEXCEPT
+            {
+                return m_mgr;
+            }
+
+            //@cond
+            template <typename T>
+            T * operator =( T * p ) CDS_NOEXCEPT
+            {
+                return m_hp = p;
+            }
+            //@endcond
+
+            //@cond
+            hazard_ptr get() const CDS_NOEXCEPT
+            {
+                return m_hp;
+            }
+            //@endcond
+
+            /// Clears the hazard pointer
+            void clear() CDS_NOEXCEPT
+            {
+                m_hp.clear();
+            }
+        };
+
+        /// Auto-managed array of hazard pointers
+        /**
+            This class is wrapper around gc::hzp::details::HPArray class.
+        */
+        template <size_t Count>
+        class AutoHPArray: public details::HPArray<Count>
+        {
+            ThreadGC&    m_mgr    ;    ///< Thread GC
+
+        public:
+            /// Allocates array of HP guard from \p mgr
+            AutoHPArray( ThreadGC& mgr )
+                : m_mgr( mgr )
+            {
+                mgr.allocGuard( *this );
+            }
+
+            /// Frees array of HP guard
+            ~AutoHPArray()
+            {
+                m_mgr.freeGuard( *this );
+            }
+
+            /// Returns thread GC
+            ThreadGC&    getGC() const
+            {
+                return m_mgr;
+            }
+        };
+
+
+    }    // namespace hrc
+}} // namespace cds::gc
+
+#include <cds/gc/hrc/details/hrc_inline.h>
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   pragma warning(pop)
+#endif
+
+#endif // #ifndef __CDS_GC_HRC_HRC_H
diff --git a/cds/gc/hrc_decl.h b/cds/gc/hrc_decl.h
new file mode 100644 (file)
index 0000000..8c1c626
--- /dev/null
@@ -0,0 +1,840 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HRC_DECL_H
+#define __CDS_GC_HRC_DECL_H
+
+#include <cds/gc/hrc/hrc.h>
+#include <cds/details/marked_ptr.h>
+
+namespace cds { namespace gc {
+
+    /// Gidenstam's garbage collector
+    /** @ingroup cds_garbage_collector
+        @headerfile cds/gc/hrc.h
+
+        This class is a wrapper for Gidenstam's memory reclamation schema (HRC - Hazard pointer + Reference Counting)
+        internal implementation.
+
+        Sources:
+        - [2006] A.Gidenstam "Algorithms for synchronization and consistency
+            in concurrent system services", Chapter 5 "Lock-Free Memory Reclamation"
+            Thesis for the degree of Doctor    of Philosophy
+        - [2005] Anders Gidenstam, Marina Papatriantafilou and Philippas Tsigas "Allocating
+            memory in a lock-free manner", Proceedings of the 13th Annual European
+            Symposium on Algorithms (ESA 2005), Lecture Notes in Computer
+            Science Vol. 3669, pages 229 \96 242, Springer-Verlag, 2005
+
+        Note that HRC schema does not support cyclic references that significantly limits the applicability of this GC.
+
+        <h1>Usage</h1>
+        In your \p main function you declare a object of class cds::gc::HRC. This declaration
+        initializes internal hrc::GarbageCollector singleton.
+        \code
+        #include <cds/init.h>       // for cds::Initialize and cds::Terminate
+        #include <cds/gc/hrc.h>
+
+        int main(int argc, char** argv)
+        {
+            // Initialize libcds
+            cds::Initialize();
+
+            {
+                // Initialize HRC singleton
+                cds::gc::HRC hpGC();
+
+                // Some useful work
+                ...
+            }
+
+            // Terminate libcds
+            cds::Terminate();
+        }
+        \endcode
+
+        Each thread that uses cds::gc::HRC -based containers must be attached to HRC
+        singleton. To make attachment you should declare a object of class HRC::thread_gc:
+        \code
+        #include <cds/gc/hrc.h>
+
+        int myThreadEntryPoint()
+        {
+            // Attach the thread to HRC singleton
+            cds::gc::HRC::thread_gc myThreadGC();
+
+            // Do some work
+            ...
+
+            // The destructor of myThreadGC object detaches the thread from HRC singleton
+        }
+        \endcode
+
+        In some cases, you should work in a external thread. For example, your application
+        is a plug-in for a server that calls your code in the threads that has been created by server.
+        In this case, you may use persistent mode of HRC::thread_gc. In this mode, the thread attaches
+        to the HRC singleton only if it is not yet attached and never call detaching:
+        \code
+        #include <cds/gc/hrc.h>
+
+        int myThreadEntryPoint()
+        {
+        // Attach the thread in persistent mode
+        cds::gc::HRC::thread_gc myThreadGC( true );
+
+        // Do some work
+        ...
+
+        // The destructor of myThreadGC object does NOT detach the thread from HRC singleton
+        }
+        \endcode
+
+    */
+    class HRC
+    {
+    public:
+
+        /// Thread GC implementation for internal usage
+        typedef hrc::ThreadGC   thread_gc_impl;
+
+        /// Wrapper for hrc::ThreadGC class
+        /**
+            @headerfile cds/gc/hrc.h
+            This class performs automatically attaching/detaching Gidenstam's GC
+            for the current thread.
+        */
+        class thread_gc: public thread_gc_impl
+        {
+            //@cond
+            bool    m_bPersistent;
+            //@endcond
+        public:
+            /// Constructor
+            /**
+                The constructor attaches the current thread to the Gidenstam's GC
+                if it is not yet attached.
+                The \p bPersistent parameter specifies attachment persistence:
+                - \p true - the class destructor will not detach the thread from Gidenstam's GC.
+                - \p false (default) - the class destructor will detach the thread from Gidenstam's GC.
+            */
+            thread_gc(
+                bool    bPersistent = false
+            ) ; // inline in hrc_impl.h
+
+            /// Destructor
+            /**
+                If the object has been created in persistent mode, the destructor does nothing.
+                Otherwise it detaches the current thread from HRC GC.
+            */
+            ~thread_gc()    ;   // inline in hrc_impl.h
+        };
+
+        ///@anchor hrc_gc_HRC_container_node Base for container node
+        typedef hrc::ContainerNode container_node;
+
+        /// Native hazard pointer type
+        typedef container_node * guarded_pointer;
+
+        /// Atomic reference
+        /**
+            @headerfile cds/gc/hrc.h
+        */
+        template <typename T>
+        class atomic_ref: protected CDS_ATOMIC::atomic<T *>
+        {
+            //@cond
+            typedef CDS_ATOMIC::atomic<T *> base_class;
+            //@endcond
+        public:
+            //@cond
+#   ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            atomic_ref() = default;
+#   else
+            atomic_ref() CDS_NOEXCEPT
+                : base_class()
+            {}
+#   endif
+            explicit CDS_CONSTEXPR atomic_ref(T * p) CDS_NOEXCEPT
+                : base_class( p )
+            {}
+            //@endcond
+
+            /// Read reference value
+            T * load( CDS_ATOMIC::memory_order order ) const CDS_NOEXCEPT
+            {
+                return base_class::load( order );
+            }
+            //@cond
+            T * load( CDS_ATOMIC::memory_order order ) const volatile CDS_NOEXCEPT
+            {
+                return base_class::load( order );
+            }
+            //@endcond
+
+            /// Store new value to reference
+            void store( T * pNew, CDS_ATOMIC::memory_order order ) CDS_NOEXCEPT
+            {
+                before_store( pNew );
+                T * pOld = base_class::exchange( pNew, order );
+                after_store( pOld, pNew );
+            }
+            //@cond
+            void store( T * pNew, CDS_ATOMIC::memory_order order ) volatile CDS_NOEXCEPT
+            {
+                before_store( pNew );
+                T * pOld = base_class::exchange( pNew, order );
+                after_store( pOld, pNew );
+            }
+            //@endcond
+
+            /// Updates atomic reference from current value \p pOld to new value \p pNew (strong CAS)
+            /**
+                May be used when concurrent updates are possible
+
+                \p T - class derived from \ref hrc_gc_HRC_container_node "container_node" type
+            */
+            bool compare_exchange_strong( T *& pOld, T * pNew, CDS_ATOMIC::memory_order mo_success, CDS_ATOMIC::memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                before_cas( pNew );
+                bool bSuccess = base_class::compare_exchange_strong( pOld, pNew, mo_success, mo_fail );
+                after_cas( bSuccess, pOld, pNew );
+                return bSuccess;
+            }
+            //@cond
+            bool compare_exchange_strong( T *& pOld, T * pNew, CDS_ATOMIC::memory_order mo_success, CDS_ATOMIC::memory_order mo_fail ) volatile CDS_NOEXCEPT
+            {
+                before_cas( pNew );
+                bool bSuccess = base_class::compare_exchange_strong( pOld, pNew, mo_success, mo_fail );
+                after_cas( bSuccess, pOld, pNew );
+                return bSuccess;
+            }
+            bool compare_exchange_strong( T *& pOld, T * pNew, CDS_ATOMIC::memory_order mo_success ) CDS_NOEXCEPT
+            {
+                return compare_exchange_strong( pOld, pNew, mo_success, CDS_ATOMIC::memory_order_relaxed );
+            }
+            bool compare_exchange_strong( T *& pOld, T * pNew, CDS_ATOMIC::memory_order mo_success ) volatile CDS_NOEXCEPT
+            {
+                return compare_exchange_strong( pOld, pNew, mo_success, CDS_ATOMIC::memory_order_relaxed );
+            }
+            //@endcond
+
+            /// Updates atomic reference from current value \p pOld to new value \p pNew (weak CAS)
+            /**
+                May be used when concurrent updates are possible
+
+                \p T - class derived from \ref hrc_gc_HRC_container_node "container_node" type
+            */
+            bool compare_exchange_weak( T *& pOld, T * pNew, CDS_ATOMIC::memory_order mo_success, CDS_ATOMIC::memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                before_cas( pNew );
+                bool bSuccess = base_class::compare_exchange_weak( pOld, pNew, mo_success, mo_fail );
+                after_cas( bSuccess, pOld, pNew );
+                return bSuccess;
+            }
+            //@cond
+            bool compare_exchange_weak( T *& pOld, T * pNew, CDS_ATOMIC::memory_order mo_success, CDS_ATOMIC::memory_order mo_fail ) volatile CDS_NOEXCEPT
+            {
+                before_cas( pNew );
+                bool bSuccess = base_class::compare_exchange_weak( pOld, pNew, mo_success, mo_fail );
+                after_cas( bSuccess, pOld, pNew );
+                return bSuccess;
+            }
+            bool compare_exchange_weak( T *& pOld, T * pNew, CDS_ATOMIC::memory_order mo_success ) CDS_NOEXCEPT
+            {
+                return compare_exchange_weak( pOld, pNew, mo_success, CDS_ATOMIC::memory_order_relaxed );
+            }
+            bool compare_exchange_weak( T *& pOld, T * pNew, CDS_ATOMIC::memory_order mo_success ) volatile CDS_NOEXCEPT
+            {
+                return compare_exchange_weak( pOld, pNew, mo_success, CDS_ATOMIC::memory_order_relaxed );
+            }
+            //@endcond
+
+        private:
+            //@cond
+            static void before_store( T * pNew ) CDS_NOEXCEPT
+            {
+                if ( pNew )
+                    ++pNew->m_RC;
+            }
+            static void after_store( T * pOld, T * pNew ) CDS_NOEXCEPT
+            {
+                if ( pNew )
+                    pNew->m_bTrace.store( false, CDS_ATOMIC::memory_order_release );
+                if ( pOld )
+                    --pOld->m_RC;
+            }
+            static void before_cas( T * p ) CDS_NOEXCEPT
+            {
+                if ( p ) {
+                    ++p->m_RC;
+                    p->m_bTrace.store( false, CDS_ATOMIC::memory_order_release );
+                }
+            }
+            static void after_cas( bool bSuccess, T * pOld, T * pNew ) CDS_NOEXCEPT
+            {
+                if ( bSuccess ) {
+                    if ( pOld )
+                        --pOld->m_RC;
+                }
+                else {
+                    if ( pNew )
+                        --pNew->m_RC;
+                }
+            }
+            //@endcond
+        };
+
+        /// Atomic marked pointer
+        /**
+            @headerfile cds/gc/hrc.h
+        */
+        template <typename MarkedPtr>
+        class atomic_marked_ptr
+        {
+            //@cond
+            CDS_ATOMIC::atomic< MarkedPtr >     m_a;
+            //@endcond
+        public:
+            /// Marked pointer type
+            typedef MarkedPtr    marked_ptr;
+
+            //@cond
+            atomic_marked_ptr() CDS_NOEXCEPT
+                : m_a( marked_ptr() )
+            {}
+
+            explicit CDS_CONSTEXPR atomic_marked_ptr( typename marked_ptr::value_type * p ) CDS_NOEXCEPT
+                : m_a( marked_ptr(p) )
+            {}
+
+            atomic_marked_ptr( typename marked_ptr::value_type * ptr, int nMask ) CDS_NOEXCEPT
+                : m_a( marked_ptr(ptr, nMask) )
+            {}
+
+            explicit atomic_marked_ptr( marked_ptr const&  ptr ) CDS_NOEXCEPT
+                : m_a( ptr )
+            {}
+            //@endcond
+
+
+            /// Read reference value
+            marked_ptr load(CDS_ATOMIC::memory_order order) const CDS_NOEXCEPT
+            {
+                return m_a.load(order);
+            }
+
+            /// Store new value to reference
+            void store( marked_ptr pNew, CDS_ATOMIC::memory_order order ) CDS_NOEXCEPT
+            {
+                before_store( pNew.ptr() );
+                marked_ptr pOld = m_a.exchange( pNew, order );
+                after_store( pOld.ptr(), pNew.ptr() );
+            }
+
+            /// Store new value to reference
+            void store( typename marked_ptr::pointer_type pNew, CDS_ATOMIC::memory_order order ) CDS_NOEXCEPT
+            {
+                before_store( pNew );
+                marked_ptr pOld = m_a.exchange( marked_ptr(pNew), order );
+                after_store( pOld.ptr(), pNew );
+            }
+
+            /// Updates atomic reference from current value \p pOld to new value \p pNew (weak CAS)
+            /**
+                May be used when concurrent updates are possible
+
+                \p T - class derived from \ref hrc_gc_HRC_container_node "container_node" type
+            */
+            bool compare_exchange_weak( marked_ptr& pOld, marked_ptr pNew, CDS_ATOMIC::memory_order mo_success, CDS_ATOMIC::memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                before_cas( pNew.ptr() );
+                bool bSuccess = m_a.compare_exchange_weak( pOld, pNew, mo_success, mo_fail );
+                after_cas( bSuccess, pOld.ptr(), pNew.ptr() );
+                return bSuccess;
+            }
+            //@cond
+            bool compare_exchange_weak( marked_ptr& pOld, marked_ptr pNew, CDS_ATOMIC::memory_order mo_success ) CDS_NOEXCEPT
+            {
+                before_cas( pNew.ptr() );
+                bool bSuccess = m_a.compare_exchange_weak( pOld, pNew, mo_success );
+                after_cas( bSuccess, pOld.ptr(), pNew.ptr() );
+                return bSuccess;
+            }
+            //@endcond
+
+            /// Updates atomic reference from current value \p pOld to new value \p pNew (strong CAS)
+            /**
+                May be used when concurrent updates are possible
+
+                \p T - class derived from \ref hrc_gc_HRC_container_node "container_node" type
+            */
+            bool compare_exchange_strong( marked_ptr& pOld, marked_ptr pNew, CDS_ATOMIC::memory_order mo_success, CDS_ATOMIC::memory_order mo_fail ) CDS_NOEXCEPT
+            {
+                // protect pNew
+                before_cas( pNew.ptr() );
+                bool bSuccess = m_a.compare_exchange_strong( pOld, pNew, mo_success, mo_fail );
+                after_cas( bSuccess, pOld.ptr(), pNew.ptr() );
+                return bSuccess;
+            }
+            //@cond
+            bool compare_exchange_strong( marked_ptr& pOld, marked_ptr pNew, CDS_ATOMIC::memory_order mo_success ) CDS_NOEXCEPT
+            {
+                before_cas( pNew.ptr() );
+                bool bSuccess = m_a.compare_exchange_strong( pOld, pNew, mo_success );
+                after_cas( bSuccess, pOld.ptr(), pNew.ptr() );
+                return bSuccess;
+            }
+            //@endcond
+
+        private:
+            //@cond
+            static void before_store( typename marked_ptr::pointer_type p ) CDS_NOEXCEPT
+            {
+                if ( p )
+                    ++p->m_RC;
+            }
+            static void after_store( typename marked_ptr::pointer_type pOld, typename marked_ptr::pointer_type pNew ) CDS_NOEXCEPT
+            {
+                if ( pNew )
+                    pNew->m_bTrace.store( false, CDS_ATOMIC::memory_order_release );
+                if ( pOld )
+                    --pOld->m_RC;
+            }
+            static void before_cas( typename marked_ptr::pointer_type p ) CDS_NOEXCEPT
+            {
+                if ( p ) {
+                    ++p->m_RC;
+                    p->m_bTrace.store( false, CDS_ATOMIC::memory_order_release );
+                }
+            }
+            static void after_cas( bool bSuccess, typename marked_ptr::pointer_type pOld, typename marked_ptr::pointer_type pNew ) CDS_NOEXCEPT
+            {
+                if ( bSuccess ) {
+                    if ( pOld )
+                        --pOld->m_RC;
+                }
+                else {
+                    if ( pNew )
+                        --pNew->m_RC;
+                }
+            }
+            //@endcond
+        };
+
+        /// HRC guard
+        /**
+            @headerfile cds/gc/hrc.h
+            This class is a wrapper for hrc::AutoHPGuard.
+        */
+        class Guard: public hrc::AutoHPGuard
+        {
+            //@cond
+            typedef hrc::AutoHPGuard base_class;
+            //@endcond
+
+        public:
+            /// Default constructor
+            Guard() ;   // inline in hrc_impl.h
+
+            /// Protects atomic pointer
+            /**
+                Return the value of \p toGuard
+
+                The function tries to load \p toGuard and to store it
+                to the HP slot repeatedly until the guard's value equals \p toGuard
+            */
+            template <typename T>
+            T * protect( atomic_ref<T> const& toGuard )
+            {
+                T * pCur = toGuard.load(CDS_ATOMIC::memory_order_relaxed);
+                T * pRet;
+                do {
+                    pRet = assign( pCur );
+                    pCur = toGuard.load(CDS_ATOMIC::memory_order_acquire);
+                } while ( pRet != pCur );
+                return pCur;
+            }
+
+            /// Protects a converted pointer of type \p atomic<T*>
+            /**
+                Return the value of \p toGuard
+
+                The function tries to load \p toGuard and to store result of \p f functor
+                to the HP slot repeatedly until the guard's value equals \p toGuard.
+
+                The function is useful for intrusive containers when \p toGuard is a node pointer
+                that should be converted to a pointer to the value type before guarding.
+                The parameter \p f of type Func is a functor that makes this conversion:
+                \code
+                    struct functor {
+                        value_type * operator()( T * p );
+                    };
+                \endcode
+                Really, the result of <tt> f( toGuard.load() ) </tt> is assigned to the hazard pointer.
+            */
+            template <typename T, class Func>
+            T * protect( atomic_ref<T> const& toGuard, Func f )
+            {
+                T * pCur = toGuard.load(CDS_ATOMIC::memory_order_relaxed);
+                T * pRet;
+                do {
+                    pRet = pCur;
+                    assign( f( pCur ) );
+                    pCur = toGuard.load(CDS_ATOMIC::memory_order_acquire);
+                } while ( pRet != pCur );
+                return pCur;
+            }
+
+            /// Protects a atomic marked reference \p link
+            /**
+                Returns current value of \p link.
+
+                The function tries to load \p link and to store it
+                to the guard repeatedly until the guard's value equals \p link
+            */
+            template <typename T>
+            typename atomic_marked_ptr<T>::marked_ptr protect( atomic_marked_ptr<T> const& link )
+            {
+                typename atomic_marked_ptr<T>::marked_ptr p;
+                do {
+                    assign( ( p = link.load(CDS_ATOMIC::memory_order_relaxed)).ptr() );
+                } while ( p != link.load(CDS_ATOMIC::memory_order_acquire) );
+                return p;
+            }
+
+            /// Protects a atomic marked reference \p link
+            /**
+                Returns current value of \p link.
+
+                The function tries to load \p link and to store it
+                to the guard repeatedly until the guard's value equals \p link
+
+                The function is useful for intrusive containers when \p link is a node pointer
+                that should be converted to a pointer to the value type before guarding.
+                The parameter \p f of type Func is a functor that makes this conversion:
+                \code
+                    struct functor {
+                        value_type * operator()( T p );
+                    };
+                \endcode
+                Really, the result of <tt> f( link.load() ) </tt> is assigned to the hazard pointer.
+            */
+            template <typename T, typename Func>
+            typename atomic_marked_ptr<T>::marked_ptr protect( atomic_marked_ptr<T> const& link, Func f )
+            {
+                typename atomic_marked_ptr<T>::marked_ptr pCur;
+                do {
+                    pCur = link.load(CDS_ATOMIC::memory_order_relaxed);
+                    assign( f( pCur ));
+                } while ( pCur != link.load(CDS_ATOMIC::memory_order_acquire) );
+                return pCur;
+            }
+
+            /// Stores \p p to the guard
+            /**
+                The function equals to a simple assignment, no loop is performed.
+                Can be used for a pointer that cannot be changed concurrently.
+            */
+            template <typename T>
+            T * assign( T * p )
+            {
+                return base_class::operator =(p);
+            }
+
+            /// Stores marked pointer \p p to the guard
+            /**
+                The function equals to a simple assignment of <tt>p.ptr()</tt>, no loop is performed.
+                Can be used for a marked pointer that cannot be changed concurrently.
+            */
+            template <typename T, int Bitmask>
+            T * assign( cds::details::marked_ptr<T, Bitmask> p )
+            {
+                return base_class::operator =( p.ptr() );
+            }
+
+            /// Copy from \p src guard to \p this guard
+            void copy( Guard const& src )
+            {
+                assign( src.get_native() );
+            }
+
+            /// Clear value of the guard
+            void clear()
+            {
+                base_class::clear();
+            }
+
+            /// Get the value currently protected
+            template <typename T>
+            T * get() const
+            {
+                return static_cast<T *>( get_native());
+            }
+
+            /// Get native hazard pointer stored
+            guarded_pointer get_native() const
+            {
+                return base_class::get();
+            }
+        };
+
+        /// Array of guards
+        /**
+            @headerfile cds/gc/hrc.h
+            This class is a wrapper for AutoHPArray template.
+            Template parameter \p Limit defines the size of HP array.
+        */
+        template <size_t Limit>
+        class GuardArray: public hrc::AutoHPArray<Limit>
+        {
+            //@cond
+            typedef hrc::AutoHPArray<Limit> base_class;
+            //@endcond
+        public:
+            /// Rebind array for other size \p OtherLimit
+            template <size_t OtherLimit>
+            struct rebind {
+                typedef GuardArray<OtherLimit>  other   ;   ///< rebinding result
+            };
+
+        public:
+            //@cond
+            GuardArray()    ;   // inline in hrc_impl.h
+            GuardArray( thread_gc_impl& threadGC )
+                : base_class( threadGC )
+            {}
+            //@endcond
+
+            /// Protects an atomic reference \p link in slot \p nIndex
+            /**
+                Returns current value of \p link.
+
+                The function tries to load \p pToGuard and to store it
+                to the slot \p nIndex repeatedly until the guard's value equals \p pToGuard
+            */
+            template <typename T>
+            T * protect( size_t nIndex, atomic_ref<T> const& link )
+            {
+                T * p;
+                do {
+                    p = assign( nIndex, link.load(CDS_ATOMIC::memory_order_relaxed) );
+                } while ( p != link.load(CDS_ATOMIC::memory_order_acquire) );
+                return p;
+            }
+
+            /// Protects a atomic marked reference \p link in slot \p nIndex
+            /**
+                Returns current value of \p link.
+
+                The function tries to load \p link and to store it
+                to the slot \p nIndex repeatedly until the guard's value equals \p link
+            */
+            template <typename T>
+            typename atomic_marked_ptr<T>::marked_ptr protect( size_t nIndex, atomic_marked_ptr<T> const& link )
+            {
+                typename atomic_marked_ptr<T>::marked_ptr p;
+                do {
+                    assign( nIndex, ( p = link.load(CDS_ATOMIC::memory_order_relaxed)).ptr() );
+                } while ( p != link.load(CDS_ATOMIC::memory_order_acquire) );
+                return p;
+            }
+
+            /// Protects a pointer of type \p atomic<T*>
+            /**
+                Return the value of \p toGuard
+
+                The function tries to load \p toGuard and to store it
+                to the slot \p nIndex repeatedly until the guard's value equals \p toGuard
+
+                The function is useful for intrusive containers when \p toGuard is a node pointer
+                that should be converted to a pointer to the value type before guarding.
+                The parameter \p f of type Func is a functor that makes this conversion:
+                \code
+                    struct functor {
+                        value_type * operator()( T * p );
+                    };
+                \endcode
+                Really, the result of <tt> f( toGuard.load() ) </tt> is assigned to the hazard pointer.
+            */
+            template <typename T, class Func>
+            T * protect(size_t nIndex, atomic_ref<T> const& toGuard, Func f )
+            {
+                T * pRet;
+                do {
+                    assign( nIndex, f( pRet = toGuard.load(CDS_ATOMIC::memory_order_relaxed) ));
+                } while ( pRet != toGuard.load(CDS_ATOMIC::memory_order_acquire));
+
+                return pRet;
+            }
+
+            /// Protects a atomic marked reference \p link in slot \p nIndex
+            /**
+                Returns current value of \p link.
+
+                The function tries to load \p link and to store it
+                to the slot \p nIndex repeatedly until the guard's value equals \p link
+
+                The function is useful for intrusive containers when \p link is a node pointer
+                that should be converted to a pointer to the value type before guarding.
+                The parameter \p f of type Func is a functor that makes this conversion:
+                \code
+                    struct functor {
+                        value_type * operator()( T p );
+                    };
+                \endcode
+                Really, the result of <tt> f( link.load() ) </tt> is assigned to the hazard pointer.
+            */
+            template <typename T, typename Func>
+            typename atomic_marked_ptr<T>::marked_ptr protect( size_t nIndex, atomic_marked_ptr<T> const& link, Func f )
+            {
+                typename atomic_marked_ptr<T>::marked_ptr p;
+                do {
+                    p = link.load(CDS_ATOMIC::memory_order_relaxed);
+                    assign( nIndex, f( p ) );
+                } while ( p != link.load(CDS_ATOMIC::memory_order_acquire) );
+                return p;
+            }
+
+            /// Store \p to the slot \p nIndex
+            /**
+                The function equals to a simple assignment, no loop is performed.
+            */
+            template <typename T>
+            T * assign( size_t nIndex, T * p )
+            {
+                base_class::set(nIndex, p);
+                return p;
+            }
+
+            /// Store marked pointer \p p to the guard
+            /**
+                The function equals to a simple assignment of <tt>p.ptr()</tt>, no loop is performed.
+                Can be used for a marked pointer that cannot be changed concurrently.
+            */
+            template <typename T, int Bitmask>
+            T * assign( size_t nIndex, cds::details::marked_ptr<T, Bitmask> p )
+            {
+                return base_class::set( nIndex, p.ptr() );
+            }
+
+            /// Copy guarded value from \p src guard to slot at index \p nIndex
+            void copy( size_t nIndex, Guard const& src )
+            {
+                assign( nIndex, src.get_native() );
+            }
+
+            /// Copy guarded value from slot \p nSrcIndex to slot at index \p nDestIndex
+            void copy( size_t nDestIndex, size_t nSrcIndex )
+            {
+                assign( nDestIndex, get_native( nSrcIndex ));
+            }
+
+            /// Clear value of the slot \p nIndex
+            void clear( size_t nIndex)
+            {
+                base_class::clear( nIndex );
+            }
+
+            /// Get current value of slot \p nIndex
+            template <typename T>
+            T * get( size_t nIndex) const
+            {
+                return static_cast<T *>( get_native( nIndex ) );
+            }
+
+            /// Get native hazard pointer stored
+            guarded_pointer get_native( size_t nIndex ) const
+            {
+                return base_class::operator[](nIndex).get();
+            }
+
+            /// Capacity of the guard array
+            static CDS_CONSTEXPR size_t capacity()
+            {
+                return Limit;
+            }
+        };
+
+    public:
+        /// Initializes hrc::GarbageCollector singleton
+        /**
+            The constructor calls hrc::GarbageCollector::Construct with passed parameters.
+            See hrc::GarbageCollector::Construct for explanation of parameters meaning.
+        */
+        HRC(
+            size_t nHazardPtrCount = 0,     ///< number of hazard pointers
+            size_t nMaxThreadCount = 0,     ///< max threads count
+            size_t nMaxNodeLinkCount = 0,   ///< max number of links a @ref hrc::ContainerNode can contain
+            size_t nMaxTransientLinks = 0   ///< max number of links in live nodes that may transiently point to a deleted node
+        )
+        {
+            hrc::GarbageCollector::Construct(
+                nHazardPtrCount,
+                nMaxThreadCount,
+                nMaxNodeLinkCount,
+                nMaxTransientLinks
+            );
+        }
+
+        /// Terminates hrc::GarbageCollector singleton
+        /**
+            The destructor calls \code hrc::GarbageCollector::Destruct() \endcode
+        */
+        ~HRC()
+        {
+            hrc::GarbageCollector::Destruct();
+        }
+
+        /// Checks if count of hazard pointer is no less than \p nCountNeeded
+        /**
+            If \p bRaiseException is \p true (that is the default), the function raises an exception gc::too_few_hazard_pointers
+            if \p nCountNeeded is more than the count of hazard pointer per thread.
+        */
+        static bool check_available_guards( size_t nCountNeeded, bool bRaiseException = true )
+        {
+            if ( hrc::GarbageCollector::instance().getHazardPointerCount() < nCountNeeded ) {
+                if ( bRaiseException )
+                    throw cds::gc::too_few_hazard_pointers();
+                return false;
+            }
+            return true;
+        }
+
+        /// Retire pointer \p p with function \p pFunc
+        /**
+            The function places pointer \p p to array of pointers ready for removing.
+            (so called retired pointer array). The pointer can be safely removed when no guarded pointer points to it.
+            Deleting the pointer is the function \p pFunc call.
+        */
+        template <typename T>
+        static void retire( T * p, void (* pFunc)(T *) )    ;   // inline in hrc_impl.h
+
+        /// Retire pointer \p p with functor of type \p Disposer
+        /**
+            The function places pointer \p p to array of pointers ready for removing.
+            (so called retired pointer array). The pointer can be safely removed when no guard points to it.
+
+            See gc::HP::retire for \p Disposer requirements.
+        */
+        template <class Disposer, typename T>
+        static void retire( T * p ) ;   // inline in hrc_impl.h
+
+        /// Checks if HRC GC is constructed and may be used
+        static bool isUsed()
+        {
+            return hrc::GarbageCollector::isUsed();
+        }
+
+        /// Forced GC cycle call for current thread
+        /**
+            Usually, this function should not be called directly.
+        */
+        static void scan()  ;   // inline in hrc_impl.h
+
+        /// Synonym for \ref scan()
+        static void force_dispose()
+        {
+            scan();
+        }
+    };
+}} // namespace cds::gc
+
+#endif // #ifndef __CDS_GC_HRC_DECL_H
diff --git a/cds/gc/hrc_impl.h b/cds/gc/hrc_impl.h
new file mode 100644 (file)
index 0000000..db45a5b
--- /dev/null
@@ -0,0 +1,57 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HRC_IMPL_H
+#define __CDS_GC_HRC_IMPL_H
+
+#include <cds/threading/model.h>
+#include <cds/details/static_functor.h>
+
+//@cond
+namespace cds { namespace gc {
+
+    inline HRC::thread_gc::thread_gc(
+        bool    bPersistent
+        )
+        : m_bPersistent( bPersistent )
+    {
+        if ( !cds::threading::Manager::isThreadAttached() )
+            cds::threading::Manager::attachThread();
+    }
+
+    inline HRC::thread_gc::~thread_gc()
+    {
+        if ( !m_bPersistent )
+            cds::threading::Manager::detachThread();
+    }
+
+    inline HRC::Guard::Guard()
+        : Guard::base_class( cds::threading::getGC<HRC>() )
+    {}
+
+    template <size_t COUNT>
+    inline HRC::GuardArray<COUNT>::GuardArray()
+        : GuardArray::base_class( threading::getGC<HRC>() )
+    {}
+
+    template <typename T>
+    inline  void HRC::retire( T * p, void (* pFunc)(T *) )
+    {
+        cds::threading::getGC<HRC>().retireNode( p, reinterpret_cast<details::free_retired_ptr_func>(pFunc) );
+    }
+
+    template <class Disposer, typename T>
+    inline void HRC::retire( T * p )
+    {
+        cds::threading::getGC<HRC>().retireNode( p, reinterpret_cast<details::free_retired_ptr_func>( cds::details::static_functor<Disposer, T>::call ));
+    }
+
+    inline void HRC::scan()
+    {
+        cds::threading::getGC<HRC>().scan();
+    }
+
+
+}} // namespace cds::gc
+//@endcond
+
+#endif // #ifndef __CDS_GC_HRC_IMPL_H
diff --git a/cds/gc/hzp/details/hp_alloc.h b/cds/gc/hzp/details/hp_alloc.h
new file mode 100644 (file)
index 0000000..b6e1420
--- /dev/null
@@ -0,0 +1,322 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HZP_DETAILS_HP_ALLOC_H
+#define __CDS_GC_HZP_DETAILS_HP_ALLOC_H
+
+#include <cds/cxx11_atomic.h>
+#include <cds/details/allocator.h>
+#include <cds/gc/hzp/details/hp_fwd.h>
+#include <cds/gc/hzp/details/hp_type.h>
+
+//@cond
+namespace cds {
+    namespace gc { namespace hzp {
+    /// Hazard Pointer schema implementation details
+    namespace details {
+
+        /// Hazard pointer guard
+        /**
+            It is unsafe to use this class directly.
+            Instead, the AutoHPGuard class should be used.
+
+            Template parameter:
+                \li HazardPointer - type of hazard pointer. It is \ref hazard_pointer for Michael's Hazard Pointer reclamation schema
+        */
+        template <typename HazardPointer>
+        class HPGuardT: protected CDS_ATOMIC::atomic<HazardPointer>
+        {
+        public:
+            typedef HazardPointer   hazard_ptr ;    ///< Hazard pointer type
+        private:
+            //@cond
+            typedef CDS_ATOMIC::atomic<hazard_ptr>  base_class;
+            //@endcond
+
+        protected:
+            //@cond
+            template <typename OtherHazardPointer, class Allocator> friend class HPAllocator;
+            //@endcond
+
+        public:
+            HPGuardT() CDS_NOEXCEPT
+                : base_class( null_ptr<hazard_ptr>() )
+            {}
+            ~HPGuardT() CDS_NOEXCEPT
+            {}
+
+            /// Sets HP value. Guards pointer \p p from reclamation.
+            /**
+                Storing has release semantics.
+            */
+            template <typename T>
+            T * operator =( T * p ) CDS_NOEXCEPT
+            {
+                // We use atomic store with explicit memory order because other threads may read this hazard pointer concurrently
+                base_class::store( reinterpret_cast<hazard_ptr>(p), CDS_ATOMIC::memory_order_release );
+                return p;
+            }
+
+            /// Returns current value of hazard pointer
+            /**
+                Loading has acquire semantics
+            */
+            operator hazard_ptr() const CDS_NOEXCEPT
+            {
+                return get();
+            }
+
+            /// Returns current value of hazard pointer
+            /**
+                Loading has acquire semantics
+            */
+            hazard_ptr get() const CDS_NOEXCEPT
+            {
+                return base_class::load( CDS_ATOMIC::memory_order_acquire );
+            }
+
+            /// Clears HP
+            /**
+                Clearing has relaxed semantics.
+            */
+            void clear() CDS_NOEXCEPT
+            {
+                // memory order is not necessary here
+                base_class::store( null_ptr<hazard_ptr>(), CDS_ATOMIC::memory_order_relaxed );
+                //CDS_COMPILER_RW_BARRIER;
+            }
+        };
+
+        /// Specialization of HPGuardT for hazard_pointer type
+        typedef HPGuardT<hazard_pointer> HPGuard;
+
+        /// Array of hazard pointers.
+        /**
+            Array of hazard-pointer. Placing a pointer into this array guards the pointer against reclamation.
+            Template parameter \p Count defines the size of hazard pointer array. \p Count parameter should not exceed
+            GarbageCollector::getHazardPointerCount().
+
+            It is unsafe to use this class directly. Instead, the AutoHPArray should be used.
+
+            While creating the object of HPArray class an array of size \p Count of hazard pointers is reserved by
+            the HP Manager of current thread. The object's destructor cleans all of reserved hazard pointer and
+            returns reserved HP to the HP pool of ThreadGC.
+
+            Usually, it is not necessary to create an object of this class. The object of class ThreadGC contains
+            the HPArray object and implements interface for HP setting and freeing.
+
+            Template parameter:
+                \li HazardPointer - type of hazard pointer. It is hazard_pointer usually
+                \li Count - capacity of array
+
+        */
+        template <typename HazardPointer, size_t Count>
+        class HPArrayT
+        {
+        public:
+            typedef HazardPointer   hazard_ptr_type ;   ///< Hazard pointer type
+            typedef HPGuardT<hazard_ptr_type>   atomic_hazard_ptr    ; ///< Element type of the array
+            static const size_t c_nCapacity = Count ;   ///< Capacity of the array
+
+        private:
+            //@cond
+            atomic_hazard_ptr *     m_arr               ;   ///< Hazard pointer array of size = \p Count
+            template <typename OtherHazardPointer, class Allocator> friend class HPAllocator;
+            //@endcond
+
+        public:
+            /// Constructs uninitialized array.
+            HPArrayT() CDS_NOEXCEPT
+            {}
+
+            /// Destructs object
+            ~HPArrayT() CDS_NOEXCEPT
+            {}
+
+            /// Returns max count of hazard pointer for this array
+            CDS_CONSTEXPR size_t capacity() const
+            {
+                return c_nCapacity;
+            }
+
+            /// Set hazard pointer \p nIndex. 0 <= \p nIndex < \p Count
+            void set( size_t nIndex, hazard_ptr_type hzPtr ) CDS_NOEXCEPT
+            {
+                assert( nIndex < capacity() );
+                m_arr[nIndex] = hzPtr;
+            }
+
+            /// Returns reference to hazard pointer of index \p nIndex (0 <= \p nIndex < \p Count)
+            atomic_hazard_ptr& operator []( size_t nIndex ) CDS_NOEXCEPT
+            {
+                assert( nIndex < capacity() );
+                return m_arr[nIndex];
+            }
+
+            /// Returns reference to hazard pointer of index \p nIndex (0 <= \p nIndex < \p Count) [const version]
+            atomic_hazard_ptr& operator []( size_t nIndex ) const CDS_NOEXCEPT
+            {
+                assert( nIndex < capacity() );
+                return m_arr[nIndex];
+            }
+
+            /// Clears (sets to NULL) hazard pointer \p nIndex
+            void clear( size_t nIndex ) CDS_NOEXCEPT
+            {
+                assert( nIndex < capacity() );
+                m_arr[ nIndex ].clear();
+            }
+        };
+
+        /// Specialization of HPArrayT class for hazard_pointer type
+#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
+        template <size_t Count> using HPArray = HPArrayT<hazard_pointer, Count >;
+#else
+        template <size_t Count>
+        class HPArray: public HPArrayT<hazard_pointer, Count>
+        {};
+#endif
+
+        /// Allocator of hazard pointers for the thread
+        /**
+            The hazard pointer array is the free-list of unused hazard pointer for the thread.
+            The array is managed as a stack.
+            The max size (capacity) of array is defined at ctor time and cannot be changed during object's lifetime
+
+            Each allocator object is thread-private.
+
+            Template parameters:
+                \li HazardPointer - type of hazard pointer (hazard_pointer usually)
+                \li Allocator - memory allocator class, default is \ref CDS_DEFAULT_ALLOCATOR
+
+            This helper class should not be used directly.
+        */
+        template < typename HazardPointer, class Allocator = CDS_DEFAULT_ALLOCATOR >
+        class HPAllocator
+        {
+        public:
+            typedef HazardPointer               hazard_ptr_type     ;   ///< type of hazard pointer
+            typedef HPGuardT<hazard_ptr_type>   atomic_hazard_ptr   ;   ///< Atomic hazard pointer type
+            typedef Allocator                   allocator_type      ;   ///< allocator type
+
+        private:
+            //@cond
+            typedef cds::details::Allocator< atomic_hazard_ptr, allocator_type > allocator_impl;
+
+            atomic_hazard_ptr * m_arrHazardPtr  ;   ///< Array of hazard pointers
+            size_t              m_nTop          ;   ///< The top of stack
+            const size_t        m_nCapacity     ;   ///< Array capacity
+
+            //@endcond
+
+        public:
+            /// Default ctor
+            explicit HPAllocator(
+                size_t  nCapacity            ///< max count of hazard pointer per thread
+                )
+                : m_arrHazardPtr( alloc_array( nCapacity ) )
+                , m_nCapacity( nCapacity )
+            {
+                make_free();
+            }
+
+            /// Dtor
+            ~HPAllocator()
+            {
+                allocator_impl().Delete( m_arrHazardPtr, capacity() );
+            }
+
+            /// Get capacity of array
+            size_t capacity() const CDS_NOEXCEPT
+            {
+                return m_nCapacity;
+            }
+
+            /// Get size of array. The size is equal to the capacity of array
+            size_t size() const CDS_NOEXCEPT
+            {
+                return capacity();
+            }
+
+            /// Checks if all items are allocated
+            bool isFull() const CDS_NOEXCEPT
+            {
+                return m_nTop == 0;
+            }
+
+            /// Allocates hazard pointer
+            atomic_hazard_ptr& alloc() CDS_NOEXCEPT
+            {
+                assert( m_nTop > 0 );
+                --m_nTop;
+                return m_arrHazardPtr[m_nTop];
+            }
+
+            /// Frees previously allocated hazard pointer
+            void free( atomic_hazard_ptr& hp ) CDS_NOEXCEPT
+            {
+                assert( m_nTop < capacity() );
+                hp.clear();
+                ++m_nTop;
+                CDS_COMPILER_RW_BARRIER ;   // ???
+            }
+
+            /// Allocates hazard pointers array
+            /**
+                Allocates \p Count hazard pointers from array \p m_arrHazardPtr
+                Returns initialized object \p arr
+            */
+            template <size_t Count>
+            void alloc( HPArrayT<hazard_ptr_type, Count>& arr ) CDS_NOEXCEPT
+            {
+                assert( m_nTop >= Count );
+                m_nTop -= Count;
+                arr.m_arr = m_arrHazardPtr + m_nTop;
+            }
+
+            /// Frees hazard pointer array
+            /**
+                Frees the array of hazard pointers allocated by previous call \p this->alloc.
+            */
+            template <size_t Count>
+            void free( const HPArrayT<hazard_ptr_type, Count>& arr ) CDS_NOEXCEPT
+            {
+                assert( m_nTop + Count <= capacity());
+                for ( size_t i = m_nTop; i < m_nTop + Count; ++i )
+                    m_arrHazardPtr[ i ].clear();
+                m_nTop += Count;
+            }
+
+            /// Makes all HP free
+            void clear() CDS_NOEXCEPT
+            {
+                make_free();
+            }
+
+            /// Returns to i-th hazard pointer
+            atomic_hazard_ptr& operator []( size_t i ) CDS_NOEXCEPT
+            {
+                assert( i < capacity() );
+                return m_arrHazardPtr[i];
+            }
+
+        private:
+            //@cond
+            void make_free() CDS_NOEXCEPT
+            {
+                for ( size_t i = 0; i < capacity(); ++i )
+                    m_arrHazardPtr[ i ].clear();
+                m_nTop = capacity();
+            }
+
+            atomic_hazard_ptr * alloc_array( size_t nCapacity )
+            {
+                return allocator_impl().NewArray( nCapacity );
+            }
+            //@endcond
+        };
+
+    }}} // namespace gc::hzp::details
+}   // namespace cds
+//@endcond
+
+#endif // #ifndef __CDS_GC_HZP_DETAILS_HP_ALLOC_H
diff --git a/cds/gc/hzp/details/hp_fwd.h b/cds/gc/hzp/details/hp_fwd.h
new file mode 100644 (file)
index 0000000..3183f47
--- /dev/null
@@ -0,0 +1,15 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HZP_DETAILS_HP_FWD_H
+#define __CDS_GC_HZP_DETAILS_HP_FWD_H
+
+namespace cds {
+    namespace gc { namespace hzp {
+
+        // forward declarations
+        class GarbageCollector;
+        class ThreadGC;
+    } }
+}
+
+#endif // #ifndef __CDS_GC_HZP_DETAILS_HP_FWD_H
diff --git a/cds/gc/hzp/details/hp_inline.h b/cds/gc/hzp/details/hp_inline.h
new file mode 100644 (file)
index 0000000..dbb561c
--- /dev/null
@@ -0,0 +1,26 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HZP_DETAILS_HP_INLINE_H
+#define __CDS_GC_HZP_DETAILS_HP_INLINE_H
+
+namespace cds {
+    namespace gc{ namespace hzp { namespace details {
+
+        /************************************************************************/
+        /* INLINES                                                              */
+        /************************************************************************/
+        inline retired_vector::retired_vector( const cds::gc::hzp::GarbageCollector& HzpMgr )
+            : m_arr( HzpMgr.getMaxRetiredPtrCount() ),
+            m_nSize(0)
+        {}
+
+        inline HPRec::HPRec( const cds::gc::hzp::GarbageCollector& HzpMgr )
+            : m_hzp( HzpMgr.getHazardPointerCount() ),
+            m_arrRetired( HzpMgr )
+        {}
+
+    } } }    // namespace gc::hzp::details
+}    // namespace cds
+
+
+#endif // #ifndef __CDS_GC_HZP_DETAILS_HP_INLINE_H
diff --git a/cds/gc/hzp/details/hp_retired.h b/cds/gc/hzp/details/hp_retired.h
new file mode 100644 (file)
index 0000000..fc32ec6
--- /dev/null
@@ -0,0 +1,86 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HZP_DETAILS_HP_RETIRED_H
+#define __CDS_GC_HZP_DETAILS_HP_RETIRED_H
+
+#include <cds/gc/hzp/details/hp_fwd.h>
+#include <cds/gc/hzp/details/hp_type.h>
+
+#include <cds/details/bounded_array.h>
+
+namespace cds {
+    namespace gc{ namespace hzp { namespace details {
+
+        /// Retired pointer
+        typedef cds::gc::details::retired_ptr   retired_ptr;
+
+        /// Array of retired pointers
+        /**
+            The vector of retired pointer ready to delete.
+
+            The Hazard Pointer schema is build on thread-static arrays. For each HP-enabled thread the HP manager allocates
+            array of retired pointers. The array belongs to the thread: owner thread writes to the array, other threads
+            just read it.
+        */
+        class retired_vector {
+            /// Underlying vector implementation
+            typedef cds::details::bounded_array<retired_ptr>    retired_vector_impl;
+
+            retired_vector_impl m_arr   ;   ///< the array of retired pointers
+            size_t              m_nSize ;   ///< Current size of \p m_arr
+
+        public:
+            /// Iterator
+            typedef    retired_vector_impl::iterator    iterator;
+
+            /// Constructor
+            retired_vector( const cds::gc::hzp::GarbageCollector& HzpMgr )    ;    // inline
+            ~retired_vector()
+            {}
+
+            /// Vector capacity.
+            /**
+                The capacity is constant for any thread. It is defined by cds::gc::hzp::GarbageCollector.
+            */
+            size_t capacity() const     { return m_arr.capacity(); }
+
+            /// Current vector size (count of retired pointers in the vector)
+            size_t size() const         { return m_nSize; }
+
+            /// Set vector size. Uses internally
+            void size( size_t nSize )
+            {
+                assert( nSize <= capacity() );
+                m_nSize = nSize;
+            }
+
+            /// Pushes retired pointer to the vector
+            void push( const retired_ptr& p )
+            {
+                assert( m_nSize < capacity() );
+                m_arr[ m_nSize ] = p;
+                ++m_nSize;
+            }
+
+            /// Checks if the vector is full (size() == capacity() )
+            bool isFull() const
+            {
+                return m_nSize >= capacity();
+            }
+
+            /// Begin iterator
+            iterator    begin()    { return m_arr.begin(); }
+            /// End iterator
+            iterator    end()    { return m_arr.begin() +  m_nSize ; }
+
+            /// Clears the vector. After clearing, size() == 0
+            void clear()
+            {
+                m_nSize = 0;
+            }
+        };
+
+    } } }    // namespace gc::hzp::details
+}    // namespace cds
+
+#endif // #ifndef __CDS_GC_HZP_DETAILS_HP_RETIRED_H
diff --git a/cds/gc/hzp/details/hp_type.h b/cds/gc/hzp/details/hp_type.h
new file mode 100644 (file)
index 0000000..7ff9ab3
--- /dev/null
@@ -0,0 +1,23 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HZP_DETAILS_HP_TYPE_H
+#define __CDS_GC_HZP_DETAILS_HP_TYPE_H
+
+#include <cds/gc/details/retired_ptr.h>
+
+namespace cds {
+    namespace gc {
+        namespace hzp {
+
+            /// Hazard pointer
+            typedef void *    hazard_pointer;
+
+            /// Pointer to function to free (destruct and deallocate) retired pointer of specific type
+            typedef cds::gc::details::free_retired_ptr_func free_retired_ptr_func;
+        }
+    }
+}
+
+#endif // #ifndef __CDS_GC_HZP_DETAILS_HP_TYPE_H
+
+
diff --git a/cds/gc/hzp/hzp.h b/cds/gc/hzp/hzp.h
new file mode 100644 (file)
index 0000000..a19c544
--- /dev/null
@@ -0,0 +1,656 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_HZP_HZP_H
+#define __CDS_GC_HZP_HZP_H
+
+#include <cds/cxx11_atomic.h>
+#include <cds/os/thread.h>
+#include <cds/gc/exception.h>
+
+#include <cds/gc/hzp/details/hp_fwd.h>
+#include <cds/gc/hzp/details/hp_alloc.h>
+#include <cds/gc/hzp/details/hp_retired.h>
+
+#include <vector>
+#include <cds/details/noncopyable.h>
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   pragma warning(push)
+    // warning C4251: 'cds::gc::hzp::GarbageCollector::m_pListHead' : class 'cds::cxx11_atomics::atomic<T>'
+    // needs to have dll-interface to be used by clients of class 'cds::gc::hzp::GarbageCollector'
+#   pragma warning(disable: 4251)
+#endif
+
+/*
+    Editions:
+        2007.12.24  khizmax Add statistics and CDS_GATHER_HAZARDPTR_STAT macro
+        2008.03.06  khizmax Refactoring: implementation of HazardPtrMgr is moved to hazardptr.cpp
+        2008.03.08  khizmax Remove HazardPtrMgr singleton. Now you must initialize/destroy HazardPtrMgr calling
+                            HazardPtrMgr::Construct / HazardPtrMgr::Destruct before use (usually in main() function).
+        2008.12.06  khizmax Refactoring. Changes class name, namespace hierarchy, all helper defs have been moved to details namespace
+        2010.01.27  khizmax Introducing memory order constraint
+*/
+
+namespace cds {
+    /**
+        @page cds_garbage_collectors_comparison GC comparison
+        @ingroup cds_garbage_collector
+
+        <table>
+            <tr>
+                <th>Feature</th>
+                <th>%cds::gc::HP</th>
+                <th>%cds::gc::HRC</th>
+                <th>%cds::gc::PTB</th>
+            </tr>
+            <tr>
+                <td>Implementation quality</td>
+                <td>stable</td>
+                <td>unstable</td>
+                <td>stable</td>
+            </tr>
+            <tr>
+                <td>Performance rank (1 - slowest, 5 - fastest)</td>
+                <td>5</td>
+                <td>1</td>
+                <td>4</td>
+            </tr>
+            <tr>
+                <td>Max number of guarded (hazard) pointers per thread</td>
+                <td>limited (specifies in GC object ctor)</td>
+                <td>limited (specifies in GC object ctor)</td>
+                <td>unlimited (dynamically allocated when needed)</td>
+            </tr>
+            <tr>
+                <td>Max number of retired pointers<sup>1</sup></td>
+                <td>bounded</td>
+                <td>bounded</td>
+                <td>bounded</td>
+           </tr>
+            <tr>
+                <td>Array of retired pointers</td>
+                <td>preallocated for each thread, limited in size</td>
+                <td>preallocated for each thread, limited in size</td>
+                <td>global for the entire process, unlimited (dynamically allocated when needed)</td>
+            </tr>
+            <tr>
+                <td>Support direct pointer to item of lock-free container (useful for iterators)</td>
+                <td>not supported</td>
+                <td>potentially supported (not implemented)</td>
+                <td>not supported</td>
+            </tr>
+        </table>
+
+        <sup>1</sup>Unbounded count of retired pointer means a possibility of memory exhaustion.
+    */
+
+    /// Different safe memory reclamation schemas (garbage collectors)
+    /** @ingroup cds_garbage_collector
+
+        This namespace specifies different safe memory reclamation (SMR) algorithms.
+        See \ref cds_garbage_collector "Garbage collectors"
+    */
+    namespace gc {
+
+    /// Michael's Hazard Pointers reclamation schema
+    /**
+    \par Sources:
+        - [2002] Maged M.Michael "Safe memory reclamation for dynamic lock-freeobjects using atomic reads and writes"
+        - [2003] Maged M.Michael "Hazard Pointers: Safe memory reclamation for lock-free objects"
+        - [2004] Andrei Alexandrescy, Maged Michael "Lock-free Data Structures with Hazard Pointers"
+
+
+        The cds::gc::hzp namespace and its members are internal representation of Hazard Pointer GC and should not be used directly.
+        Use cds::gc::HP class in your code.
+
+        Hazard Pointer garbage collector is a singleton. The main user-level part of Hazard Pointer schema is
+        GC class and its nested classes. Before use any HP-related class you must initialize HP garbage collector
+        by contructing cds::gc::HP object in beginning of your main().
+        See cds::gc::HP class for explanation.
+    */
+    namespace hzp {
+
+        namespace details {
+            /// Hazard pointer record of the thread
+            /**
+                The structure of type "single writer - multiple reader": only the owner thread may write to this structure
+                other threads have read-only access.
+            */
+            struct HPRec {
+                HPAllocator<hazard_pointer>    m_hzp        ; ///< array of hazard pointers. Implicit \ref CDS_DEFAULT_ALLOCATOR dependency
+                retired_vector            m_arrRetired ; ///< Retired pointer array
+
+                /// Ctor
+                HPRec( const cds::gc::hzp::GarbageCollector& HzpMgr ) ;    // inline
+                ~HPRec()
+                {}
+
+                /// Clears all hazard pointers
+                void clear()
+                {
+                    m_hzp.clear();
+                }
+            };
+        }    // namespace details
+
+        /// GarbageCollector::Scan phase strategy
+        /**
+            See GarbageCollector::Scan for explanation
+        */
+        enum scan_type {
+            classic,    ///< classic scan as described in Michael's works (see GarbageCollector::classic_scan)
+            inplace     ///< inplace scan without allocation (see GarbageCollector::inplace_scan)
+        };
+
+        /// Hazard Pointer singleton
+        /**
+            Safe memory reclamation schema by Michael "Hazard Pointers"
+
+        \par Sources:
+            \li [2002] Maged M.Michael "Safe memory reclamation for dynamic lock-freeobjects using atomic reads and writes"
+            \li [2003] Maged M.Michael "Hazard Pointers: Safe memory reclamation for lock-free objects"
+            \li [2004] Andrei Alexandrescy, Maged Michael "Lock-free Data Structures with Hazard Pointers"
+
+        */
+        class CDS_EXPORT_API GarbageCollector
+        {
+        public:
+            typedef cds::atomicity::event_counter  event_counter   ;   ///< event counter type
+
+            /// Internal GC statistics
+            struct InternalState {
+                size_t              nHPCount                ;   ///< HP count per thread (const)
+                size_t              nMaxThreadCount         ;   ///< Max thread count (const)
+                size_t              nMaxRetiredPtrCount     ;   ///< Max retired pointer count per thread (const)
+                size_t              nHPRecSize              ;   ///< Size of HP record, bytes (const)
+
+                size_t              nHPRecAllocated         ;   ///< Count of HP record allocations
+                size_t              nHPRecUsed              ;   ///< Count of HP record used
+                size_t              nTotalRetiredPtrCount   ;   ///< Current total count of retired pointers
+                size_t              nRetiredPtrInFreeHPRecs ;   ///< Count of retired pointer in free (unused) HP records
+
+                event_counter::value_type   evcAllocHPRec   ;   ///< Count of HPRec allocations
+                event_counter::value_type   evcRetireHPRec  ;   ///< Count of HPRec retire events
+                event_counter::value_type   evcAllocNewHPRec;   ///< Count of new HPRec allocations from heap
+                event_counter::value_type   evcDeleteHPRec  ;   ///< Count of HPRec deletions
+
+                event_counter::value_type   evcScanCall     ;   ///< Count of Scan calling
+                event_counter::value_type   evcHelpScanCall ;   ///< Count of HelpScan calling
+                event_counter::value_type   evcScanFromHelpScan;///< Count of Scan calls from HelpScan
+
+                event_counter::value_type   evcDeletedNode  ;   ///< Count of deleting of retired objects
+                event_counter::value_type   evcDeferredNode ;   ///< Count of objects that cannot be deleted in Scan phase because of a hazard_pointer guards it
+            };
+
+            /// No GarbageCollector object is created
+            CDS_DECLARE_EXCEPTION( HZPManagerEmpty, "Global Hazard Pointer GarbageCollector is NULL" );
+
+            /// Not enough required Hazard Pointer count
+            CDS_DECLARE_EXCEPTION( HZPTooMany, "Not enough required Hazard Pointer count" );
+
+        private:
+            /// Internal GC statistics
+            struct Statistics {
+                event_counter  m_AllocHPRec            ;    ///< Count of HPRec allocations
+                event_counter  m_RetireHPRec            ;    ///< Count of HPRec retire events
+                event_counter  m_AllocNewHPRec            ;    ///< Count of new HPRec allocations from heap
+                event_counter  m_DeleteHPRec            ;    ///< Count of HPRec deletions
+
+                event_counter  m_ScanCallCount            ;    ///< Count of Scan calling
+                event_counter  m_HelpScanCallCount        ;    ///< Count of HelpScan calling
+                event_counter  m_CallScanFromHelpScan    ;    ///< Count of Scan calls from HelpScan
+
+                event_counter  m_DeletedNode            ;    ///< Count of retired objects deleting
+                event_counter  m_DeferredNode            ;    ///< Count of objects that cannot be deleted in Scan phase because of a hazard_pointer guards it
+            };
+
+            /// Internal list of cds::gc::hzp::details::HPRec
+            struct hplist_node: public details::HPRec
+            {
+                hplist_node *                       m_pNextNode ; ///< next hazard ptr record in list
+                CDS_ATOMIC::atomic<OS::ThreadId>    m_idOwner   ; ///< Owner thread id; 0 - the record is free (not owned)
+                CDS_ATOMIC::atomic<bool>            m_bFree     ; ///< true if record if free (not owned)
+
+                //@cond
+                hplist_node( const GarbageCollector& HzpMgr )
+                    : HPRec( HzpMgr ),
+                    m_pNextNode(NULL),
+                    m_idOwner( OS::nullThreadId() ),
+                    m_bFree( true )
+                {}
+
+                ~hplist_node()
+                {
+                    assert( m_idOwner.load(CDS_ATOMIC::memory_order_relaxed) == OS::nullThreadId() );
+                    assert( m_bFree.load(CDS_ATOMIC::memory_order_relaxed) );
+                }
+                //@endcond
+            };
+
+            CDS_ATOMIC::atomic<hplist_node *>   m_pListHead  ;  ///< Head of GC list
+
+            static GarbageCollector *    m_pHZPManager  ;   ///< GC instance pointer
+
+            Statistics              m_Stat              ;   ///< Internal statistics
+            bool                    m_bStatEnabled      ;   ///< true - statistics enabled
+
+            const size_t            m_nHazardPointerCount   ;   ///< max count of thread's hazard pointer
+            const size_t            m_nMaxThreadCount       ;   ///< max count of thread
+            const size_t            m_nMaxRetiredPtrCount   ;   ///< max count of retired ptr per thread
+            scan_type               m_nScanType             ;   ///< scan type (see \ref scan_type enum)
+
+
+        private:
+            /// Ctor
+            GarbageCollector(
+                size_t nHazardPtrCount = 0,         ///< Hazard pointer count per thread
+                size_t nMaxThreadCount = 0,         ///< Max count of thread
+                size_t nMaxRetiredPtrCount = 0,     ///< Capacity of the array of retired objects
+                scan_type nScanType = inplace       ///< Scan type (see \ref scan_type enum)
+            );
+
+            /// Dtor
+            ~GarbageCollector();
+
+            /// Allocate new HP record
+            hplist_node * NewHPRec();
+
+            /// Permanently deletes HPrecord \p pNode
+            /**
+                Caveat: for performance reason this function is defined as inline and cannot be called directly
+            */
+            void                DeleteHPRec( hplist_node * pNode );
+
+            /// Permanently deletes retired pointer \p p
+            /**
+                Caveat: for performance reason this function is defined as inline and cannot be called directly
+            */
+            void                DeletePtr( details::retired_ptr& p );
+
+            //@cond
+            void detachAllThread();
+            //@endcond
+
+        public:
+            /// Creates GarbageCollector singleton
+            /**
+                GC is the singleton. If GC instance is not exist then the function creates the instance.
+                Otherwise it does nothing.
+
+                The Michael's HP reclamation schema depends of three parameters:
+
+                \p nHazardPtrCount - HP pointer count per thread. Usually it is small number (2-4) depending from
+                                     the data structure algorithms. By default, if \p nHazardPtrCount = 0,
+                                     the function uses maximum of HP count for CDS library.
+
+                \p nMaxThreadCount - max count of thread with using HP GC in your application. Default is 100.
+
+                \p nMaxRetiredPtrCount - capacity of array of retired pointers for each thread. Must be greater than
+                                    \p nHazardPtrCount * \p nMaxThreadCount.
+                                    Default is 2 * \p nHazardPtrCount * \p nMaxThreadCount.
+            */
+            static void    CDS_STDCALL Construct(
+                size_t nHazardPtrCount = 0,     ///< Hazard pointer count per thread
+                size_t nMaxThreadCount = 0,     ///< Max count of simultaneous working thread in your application
+                size_t nMaxRetiredPtrCount = 0, ///< Capacity of the array of retired objects for the thread
+                scan_type nScanType = inplace   ///< Scan type (see \ref scan_type enum)
+            );
+
+            /// Destroys global instance of GarbageCollector
+            /**
+                The parameter \p bDetachAll should be used carefully: if its value is \p true,
+                then the destroying GC automatically detaches all attached threads. This feature
+                can be useful when you have no control over the thread termination, for example,
+                when \p libcds is injected into existing external thread.
+            */
+            static void CDS_STDCALL Destruct(
+                bool bDetachAll = false     ///< Detach all threads
+            );
+
+            /// Returns pointer to GarbageCollector instance
+            static GarbageCollector&   instance()
+            {
+                if ( m_pHZPManager == NULL )
+                    throw HZPManagerEmpty();
+                return *m_pHZPManager;
+            }
+
+            /// Checks if global GC object is constructed and may be used
+            static bool isUsed()
+            {
+                return m_pHZPManager != NULL;
+            }
+
+            /// Returns max Hazard Pointer count defined in construction time
+            size_t            getHazardPointerCount() const        { return m_nHazardPointerCount; }
+
+            /// Returns max thread count defined in construction time
+            size_t            getMaxThreadCount() const             { return m_nMaxThreadCount; }
+
+            /// Returns max size of retired objects array. It is defined in construction time
+            size_t            getMaxRetiredPtrCount() const        { return m_nMaxRetiredPtrCount; }
+
+            // Internal statistics
+
+            /// Get internal statistics
+            InternalState& getInternalState(InternalState& stat) const;
+
+            /// Checks if internal statistics enabled
+            bool              isStatisticsEnabled() const { return m_bStatEnabled; }
+
+            /// Enables/disables internal statistics
+            bool              enableStatistics( bool bEnable )
+            {
+                bool bEnabled = m_bStatEnabled;
+                m_bStatEnabled = bEnable;
+                return bEnabled;
+            }
+
+            /// Checks that required hazard pointer count \p nRequiredCount is less or equal then max hazard pointer count
+            /**
+                If \p nRequiredCount > getHazardPointerCount() then the exception HZPTooMany is thrown
+            */
+            static void checkHPCount( unsigned int nRequiredCount )
+            {
+                if ( instance().getHazardPointerCount() < nRequiredCount )
+                    throw HZPTooMany();
+            }
+
+            /// Get current scan strategy
+            scan_type getScanType() const
+            {
+                return m_nScanType;
+            }
+
+            /// Set current scan strategy
+            /** @anchor hzp_gc_setScanType
+                Scan strategy changing is allowed on the fly.
+            */
+            void setScanType(
+                scan_type nScanType     ///< new scan strategy
+            )
+            {
+                m_nScanType = nScanType;
+            }
+
+        public:    // Internals for threads
+
+            /// Allocates Hazard Pointer GC record. For internal use only
+            details::HPRec * AllocateHPRec();
+
+            /// Free HP record. For internal use only
+            void RetireHPRec( details::HPRec * pRec );
+
+            /// The main garbage collecting function
+            /**
+                This function is called internally by ThreadGC object when upper bound of thread's list of reclaimed pointers
+                is reached.
+
+                There are the following scan algorithm:
+                - \ref hzp_gc_classic_scan "classic_scan" allocates memory for internal use
+                - \ref hzp_gc_inplace_scan "inplace_scan" does not allocate any memory
+
+                Use \ref hzp_gc_setScanType "setScanType" member function to setup appropriate scan algorithm.
+            */
+            void Scan( details::HPRec * pRec )
+            {
+                switch ( m_nScanType ) {
+                    case inplace:
+                        inplace_scan( pRec );
+                        break;
+                    default:
+                        assert(false)   ;   // Forgotten something?..
+                    case classic:
+                        classic_scan( pRec );
+                        break;
+                }
+            }
+
+            /// Helper scan routine
+            /**
+                The function guarantees that every node that is eligible for reuse is eventually freed, barring
+                thread failures. To do so, after executing Scan, a thread executes a HelpScan,
+                where it checks every HP record. If an HP record is inactive, the thread moves all "lost" reclaimed pointers
+                to thread's list of reclaimed pointers.
+
+                The function is called internally by Scan.
+            */
+            void HelpScan( details::HPRec * pThis );
+
+        protected:
+            /// Classic scan algorithm
+            /** @anchor hzp_gc_classic_scan
+                Classical scan algorithm as described in Michael's paper.
+
+                A scan includes four stages. The first stage involves scanning the array HP for non-null values.
+                Whenever a non-null value is encountered, it is inserted in a local list of currently protected pointer.
+                Only stage 1 accesses shared variables. The following stages operate only on private variables.
+
+                The second stage of a scan involves sorting local list of protected pointers to allow
+                binary search in the third stage.
+
+                The third stage of a scan involves checking each reclaimed node
+                against the pointers in local list of protected pointers. If the binary search yields
+                no match, the node is freed. Otherwise, it cannot be deleted now and must kept in thread's list
+                of reclaimed pointers.
+
+                The forth stage prepares new thread's private list of reclaimed pointers
+                that could not be freed during the current scan, where they remain until the next scan.
+
+                This algorithm allocates memory for internal HP array.
+
+                This function is called internally by ThreadGC object when upper bound of thread's list of reclaimed pointers
+                is reached.
+            */
+            void classic_scan( details::HPRec * pRec );
+
+            /// In-place scan algorithm
+            /** @anchor hzp_gc_inplace_scan
+                Unlike the \ref hzp_gc_classic_scan "classic_scan" algorithm, \p inplace_scan does not allocate any memory.
+                All operations are performed in-place.
+            */
+            void inplace_scan( details::HPRec * pRec );
+        };
+
+        /// Thread's hazard pointer manager
+        /**
+            To use Hazard Pointer reclamation schema each thread object must be linked with the object of ThreadGC class
+            that interacts with GarbageCollector global object. The linkage is performed by calling \ref cds_threading "cds::threading::Manager::attachThread()"
+            on the start of each thread that uses HP GC. Before terminating the thread linked to HP GC it is necessary to call
+            \ref cds_threading "cds::threading::Manager::detachThread()".
+        */
+        class ThreadGC: cds::details::noncopyable
+        {
+            GarbageCollector&   m_HzpManager    ; ///< Hazard Pointer GC singleton
+            details::HPRec *    m_pHzpRec       ; ///< Pointer to thread's HZP record
+
+        public:
+            ThreadGC()
+                : m_HzpManager( GarbageCollector::instance() ),
+                m_pHzpRec( NULL )
+            {}
+            ~ThreadGC()
+            {
+                fini();
+            }
+
+            /// Checks if thread GC is initialized
+            bool    isInitialized() const   { return m_pHzpRec != NULL ; }
+
+            /// Initialization. Repeat call is available
+            void init()
+            {
+                if ( !m_pHzpRec )
+                    m_pHzpRec = m_HzpManager.AllocateHPRec();
+            }
+
+            /// Finalization. Repeat call is available
+            void fini()
+            {
+                if ( m_pHzpRec ) {
+                    details::HPRec * pRec = m_pHzpRec;
+                    m_pHzpRec = NULL;
+                    m_HzpManager.RetireHPRec( pRec );
+                }
+            }
+
+            /// Initializes HP guard \p guard
+            details::HPGuard& allocGuard()
+            {
+                assert( m_pHzpRec != NULL );
+                return m_pHzpRec->m_hzp.alloc();
+            }
+
+            /// Frees HP guard \p guard
+            void freeGuard( details::HPGuard& guard )
+            {
+                assert( m_pHzpRec != NULL );
+                m_pHzpRec->m_hzp.free( guard );
+            }
+
+            /// Initializes HP guard array \p arr
+            template <size_t Count>
+            void allocGuard( details::HPArray<Count>& arr )
+            {
+                assert( m_pHzpRec != NULL );
+                m_pHzpRec->m_hzp.alloc( arr );
+            }
+
+            /// Frees HP guard array \p arr
+            template <size_t Count>
+            void freeGuard( details::HPArray<Count>& arr )
+            {
+                assert( m_pHzpRec != NULL );
+                m_pHzpRec->m_hzp.free( arr );
+            }
+
+            /// Places retired pointer \p and its deleter \p pFunc into thread's array of retired pointer for deferred reclamation
+            template <typename T>
+            void retirePtr( T * p, void (* pFunc)(T *) )
+            {
+                retirePtr( details::retired_ptr( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ) ) );
+            }
+
+            /// Places retired pointer \p into thread's array of retired pointer for deferred reclamation
+            void retirePtr( const details::retired_ptr& p )
+            {
+                m_pHzpRec->m_arrRetired.push( p );
+
+                if ( m_pHzpRec->m_arrRetired.isFull() ) {
+                    // Max of retired pointer count is reached. Do scan
+                    scan();
+                }
+            }
+
+            //@cond
+            void scan()
+            {
+                m_HzpManager.Scan( m_pHzpRec );
+                m_HzpManager.HelpScan( m_pHzpRec );
+            }
+            //@endcond
+        };
+
+        /// Auto HPGuard.
+        /**
+            This class encapsulates Hazard Pointer guard to protect a pointer against deletion .
+            It allocates one HP from thread's HP array in constructor and free the HP allocated in destruction time.
+        */
+        class AutoHPGuard
+        {
+            //@cond
+            details::HPGuard&   m_hp    ; ///< Hazard pointer guarded
+            ThreadGC&           m_gc    ; ///< Thread GC
+            //@endcond
+
+        public:
+            typedef details::HPGuard::hazard_ptr hazard_ptr ;  ///< Hazard pointer type
+        public:
+            /// Allocates HP guard from \p gc
+            AutoHPGuard( ThreadGC& gc )
+                : m_hp( gc.allocGuard() )
+                , m_gc( gc )
+            {}
+
+            /// Allocates HP guard from \p gc and protects the pointer \p p of type \p T
+            template <typename T>
+            AutoHPGuard( ThreadGC& gc, T * p  )
+                : m_hp( gc.allocGuard() )
+                , m_gc( gc )
+            {
+                m_hp = p;
+            }
+
+            /// Frees HP guard. The pointer guarded may be deleted after this.
+            ~AutoHPGuard()
+            {
+                m_gc.freeGuard( m_hp );
+            }
+
+            /// Returns thread GC
+            ThreadGC&    getGC() const
+            {
+                return m_gc;
+            }
+
+            /// Protects the pointer \p p against reclamation (guards the pointer).
+            template <typename T>
+            T * operator =( T * p )
+            {
+                return m_hp = p;
+            }
+
+            //@cond
+            hazard_ptr get() const
+            {
+                return m_hp;
+            }
+            //@endcond
+        };
+
+        /// Auto-managed array of hazard pointers
+        /**
+            This class is wrapper around cds::gc::hzp::details::HPArray class.
+            \p Count is the size of HP array
+        */
+        template <size_t Count>
+        class AutoHPArray: public details::HPArray<Count>
+        {
+            ThreadGC&    m_mgr    ;    ///< Thread GC
+
+        public:
+            /// Rebind array for other size \p COUNT2
+            template <size_t Count2>
+            struct rebind {
+                typedef AutoHPArray<Count2>  other   ;   ///< rebinding result
+            };
+
+        public:
+            /// Allocates array of HP guard from \p mgr
+            AutoHPArray( ThreadGC& mgr )
+                : m_mgr( mgr )
+            {
+                mgr.allocGuard( *this );
+            }
+
+            /// Frees array of HP guard
+            ~AutoHPArray()
+            {
+                m_mgr.freeGuard( *this );
+            }
+
+            /// Returns thread GC
+            ThreadGC&    getGC() const { return m_mgr; }
+        };
+
+    }   // namespace hzp
+}}  // namespace cds::gc
+
+// Inlines
+#include <cds/gc/hzp/details/hp_inline.h>
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   pragma warning(pop)
+#endif
+
+#endif  // #ifndef __CDS_GC_HZP_HZP_H
diff --git a/cds/gc/nogc.h b/cds/gc/nogc.h
new file mode 100644 (file)
index 0000000..38560f1
--- /dev/null
@@ -0,0 +1,29 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_NOGC_H
+#define __CDS_GC_NOGC_H
+
+namespace cds { namespace gc {
+
+    /// No garbage collecting
+    /**  @ingroup cds_garbage_collector
+        This empty class is used in \p libcds to mark that a template specialization implements
+        the container without any garbage collector schema.
+
+        Usually, the container with this "GC" does not support the item removal.
+    */
+    class nogc
+    {
+    public:
+        //@cond
+        /// Faked scan
+        static void scan()
+        {}
+        static void force_dispose()
+        {}
+        //@endcond
+    };
+
+}}  // namespace cds::gc
+
+#endif // #define __CDS_GC_NOGC_H
diff --git a/cds/gc/ptb.h b/cds/gc/ptb.h
new file mode 100644 (file)
index 0000000..8096695
--- /dev/null
@@ -0,0 +1,10 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_PTB_H
+#define __CDS_GC_PTB_H
+
+#include <cds/gc/ptb_decl.h>
+#include <cds/gc/ptb_impl.h>
+#include <cds/details/lib.h>
+
+#endif // #ifndef __CDS_GC_PTB_H
diff --git a/cds/gc/ptb/ptb.h b/cds/gc/ptb/ptb.h
new file mode 100644 (file)
index 0000000..a3e0168
--- /dev/null
@@ -0,0 +1,1027 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_PTB_PASS_THE_BUCK_H
+#define __CDS_GC_PTB_PASS_THE_BUCK_H
+
+#include <cds/cxx11_atomic.h>
+#include <cds/gc/details/retired_ptr.h>
+#include <cds/details/aligned_allocator.h>
+#include <cds/details/allocator.h>
+#include <cds/details/noncopyable.h>
+
+#include <cds/lock/spinlock.h>
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   pragma warning(push)
+#   pragma warning(disable:4251)    // C4251: 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
+#endif
+
+namespace cds { namespace gc {
+
+    /// Pass The Buck reclamation schema
+    /**
+        \par Sources:
+        - [2002] M. Herlihy, V. Luchangco, and M. Moir. The repeat offender problem: A mechanism for supporting
+            dynamic-sized lockfree data structures. Technical Report TR-2002-112, Sun Microsystems Laboratories, 2002
+        - [2002] M. Herlihy, V. Luchangco, P. Martin, and M. Moir. Dynamic-sized Lockfree Data Structures.
+            Technical Report TR-2002-110, Sun Microsystems Laboratories, 2002
+        - [2005] M. Herlihy, V. Luchangco, P. Martin, and M. Moir. Nonblocking Memory Management Support
+            for Dynamic-Sized Data Structures. ACM Transactions on Computer Systems, Vol.23, No.2, May 2005
+
+
+        The cds::gc::ptb namespace and its members are internal representation of the Pass-the-Buck GC and should not be used directly.
+        Use cds::gc::PTB class in your code.
+
+        Pass-the-Buck (PTB) garbage collector is a singleton. The main user-level part of PTB schema is
+        GC class and its nested classes. Before use any PTB-related class you must initialize PTB garbage collector
+        by contructing cds::gc::PTB object in beginning of your main().
+        See cds::gc::PTB class for explanation.
+
+        \par Implementation issues
+            The global list of free guards (cds::gc::ptb::details::guard_allocator) is protected by spin-lock (i.e. serialized).
+            It seems that solution should not introduce significant performance bottleneck, because each thread has own set
+            of guards allocated from global list of free guards and access to global list is occurred only when
+            all thread's guard is busy. In this case the thread allocates next block of guards from global list.
+            Guards allocated for the thread is push back to the global list only when the thread terminates.
+    */
+    namespace ptb {
+
+        // Forward declarations
+        class Guard;
+        template <size_t Count> class GuardArray;
+        class ThreadGC;
+        class GarbageCollector;
+
+        /// Retired pointer type
+        typedef cds::gc::details::retired_ptr retired_ptr;
+
+        using cds::gc::details::free_retired_ptr_func;
+
+        /// Details of Pass the Buck algorithm
+        namespace details {
+
+            // Forward declaration
+            class liberate_set;
+
+            /// Retired pointer buffer node
+            struct retired_ptr_node {
+                retired_ptr         m_ptr   ;   ///< retired pointer
+                retired_ptr_node *  m_pNext     ;   ///< next retired pointer in buffer
+                retired_ptr_node *  m_pNextFree ;   ///< next item in free list of retired_ptr_node
+            };
+
+            /// Internal guard representation
+            struct guard_data {
+                typedef retired_ptr_node *      handoff_ptr ;   ///< trapped value type
+                typedef void *  guarded_ptr  ;   ///< type of value guarded
+
+                CDS_ATOMIC::atomic<guarded_ptr>         pPost   ;   ///< pointer guarded
+
+#if 0
+                typedef cds::SpinLock   handoff_spin ;  ///< type of spin-lock for accessing to \p pHandOff field
+                handoff_spin    spinHandOff     ;   ///< access to \p pHandOff field
+                handoff_ptr     pHandOff        ;   ///< trapped pointer
+#endif
+
+                CDS_ATOMIC::atomic<guard_data *>     pGlobalNext ;   ///< next item of global list of allocated guards
+                CDS_ATOMIC::atomic<guard_data *>     pNextFree   ;   ///< pointer to the next item in global or thread-local free-list
+
+                guard_data *             pThreadNext ;   ///< next item of thread's local list of guards
+
+                //@cond
+                guard_data()
+                    : pPost( null_ptr<guarded_ptr>())
+#if 0
+                    , pHandOff( null_ptr<handoff_ptr>() )
+#endif
+                    , pGlobalNext( null_ptr<guard_data *>() )
+                    , pNextFree( null_ptr<guard_data *>() )
+                    , pThreadNext( null_ptr<guard_data *>() )
+                {}
+
+                void init()
+                {
+                    pPost.store( null_ptr<guarded_ptr>(), CDS_ATOMIC::memory_order_relaxed );
+                }
+                //@endcond
+
+                /// Checks if the guard is free, that is, it does not contain any pointer guarded
+                bool isFree() const
+                {
+                    return pPost.load( CDS_ATOMIC::memory_order_acquire ) == null_ptr<guarded_ptr>();
+                }
+            };
+
+            /// Guard allocator
+            template <class Alloc = CDS_DEFAULT_ALLOCATOR>
+            class guard_allocator
+            {
+                cds::details::Allocator<details::guard_data>  m_GuardAllocator    ;   ///< guard allocator
+
+                CDS_ATOMIC::atomic<guard_data *>    m_GuardList ;       ///< Head of allocated guard list (linked by guard_data::pGlobalNext field)
+                CDS_ATOMIC::atomic<guard_data *>    m_FreeGuardList ;   ///< Head of free guard list (linked by guard_data::pNextFree field)
+                SpinLock                m_freeListLock  ;   ///< Access to m_FreeGuardList
+
+                /*
+                    Unfortunately, access to the list of free guard is lock-based.
+                    Lock-free manipulations with guard free-list are ABA-prone.
+                    TODO: working with m_FreeGuardList in lock-free manner.
+                */
+
+            private:
+                /// Allocates new guard from the heap. The function uses aligned allocator
+                guard_data * allocNew()
+                {
+                    //TODO: the allocator should make block allocation
+
+                    details::guard_data * pGuard = m_GuardAllocator.New();
+
+                    // Link guard to the list
+                    // m_GuardList is accumulated list and it cannot support concurrent deletion,
+                    // so, ABA problem is impossible for it
+                    details::guard_data * pHead = m_GuardList.load( CDS_ATOMIC::memory_order_acquire );
+                    do {
+                        pGuard->pGlobalNext.store( pHead, CDS_ATOMIC::memory_order_relaxed );
+                        // pHead is changed by compare_exchange_weak
+                    } while ( !m_GuardList.compare_exchange_weak( pHead, pGuard, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+
+                    pGuard->init();
+                    return pGuard;
+                }
+
+            public:
+                // Default ctor
+                guard_allocator()
+                    : m_GuardList( null_ptr<guard_data *>() )
+                    , m_FreeGuardList( null_ptr<guard_data *>() )
+                {}
+
+                // Destructor
+                ~guard_allocator()
+                {
+                    guard_data * pNext;
+                    for ( guard_data * pData = m_GuardList.load( CDS_ATOMIC::memory_order_relaxed ); pData != null_ptr<guard_data *>(); pData = pNext ) {
+                        pNext = pData->pGlobalNext.load( CDS_ATOMIC::memory_order_relaxed );
+                        m_GuardAllocator.Delete( pData );
+                    }
+                }
+
+                /// Allocates a guard from free list or from heap if free list is empty
+                guard_data * alloc()
+                {
+                    // Try to pop a guard from free-list
+                    details::guard_data * pGuard;
+
+                    {
+                        cds::lock::scoped_lock<SpinLock> al( m_freeListLock );
+                        pGuard = m_FreeGuardList.load(CDS_ATOMIC::memory_order_relaxed);
+                        if ( pGuard )
+                            m_FreeGuardList.store( pGuard->pNextFree.load(CDS_ATOMIC::memory_order_relaxed), CDS_ATOMIC::memory_order_relaxed );
+                    }
+                    if ( !pGuard )
+                        return allocNew();
+
+                    pGuard->init();
+                    return pGuard;
+                }
+
+                /// Frees guard \p pGuard
+                /**
+                    The function places the guard \p pGuard into free-list
+                */
+                void free( guard_data * pGuard )
+                {
+                    pGuard->pPost.store( null_ptr<void *>(), CDS_ATOMIC::memory_order_relaxed );
+
+                    cds::lock::scoped_lock<SpinLock> al( m_freeListLock );
+                    pGuard->pNextFree.store( m_FreeGuardList.load(CDS_ATOMIC::memory_order_relaxed), CDS_ATOMIC::memory_order_relaxed );
+                    m_FreeGuardList.store( pGuard, CDS_ATOMIC::memory_order_relaxed );
+                }
+
+                /// Allocates list of guard
+                /**
+                    The list returned is linked by guard's \p pThreadNext and \p pNextFree fields.
+
+                    cds::gc::ptb::ThreadGC supporting method
+                */
+                guard_data * allocList( size_t nCount )
+                {
+                    assert( nCount != 0 );
+
+                    guard_data * pHead;
+                    guard_data * pLast;
+
+                    pHead =
+                        pLast = alloc();
+
+                    // The guard list allocated is private for the thread,
+                    // so, we can use relaxed memory order
+                    while ( --nCount ) {
+                        guard_data * p = alloc();
+                        pLast->pNextFree.store( pLast->pThreadNext = p, CDS_ATOMIC::memory_order_relaxed );
+                        pLast = p;
+                    }
+
+                    pLast->pNextFree.store( pLast->pThreadNext = null_ptr<guard_data *>(), CDS_ATOMIC::memory_order_relaxed );
+
+                    return pHead;
+                }
+
+                /// Frees list of guards
+                /**
+                    The list \p pList is linked by guard's \p pThreadNext field.
+
+                    cds::gc::ptb::ThreadGC supporting method
+                */
+                void freeList( guard_data * pList )
+                {
+                    assert( pList != null_ptr<guard_data *>() );
+
+                    guard_data * pLast = pList;
+                    while ( pLast->pThreadNext ) {
+                        pLast->pPost.store( null_ptr<void *>(), CDS_ATOMIC::memory_order_relaxed );
+                        guard_data * p;
+                        pLast->pNextFree.store( p = pLast->pThreadNext, CDS_ATOMIC::memory_order_relaxed );
+                        pLast = p;
+                    }
+
+                    cds::lock::scoped_lock<SpinLock> al( m_freeListLock );
+                    pLast->pNextFree.store( m_FreeGuardList.load(CDS_ATOMIC::memory_order_relaxed), CDS_ATOMIC::memory_order_relaxed );
+                    m_FreeGuardList.store( pList, CDS_ATOMIC::memory_order_relaxed );
+                }
+
+                /// Returns the list's head of guards allocated
+                guard_data * begin()
+                {
+                    return m_GuardList.load(CDS_ATOMIC::memory_order_acquire);
+                }
+            };
+
+            /// Retired pointer buffer
+            /**
+                The buffer of retired nodes ready for liberating.
+                When size of buffer exceeds a threshold the GC calls \p liberate procedure to free
+                retired nodes.
+            */
+            class retired_ptr_buffer
+            {
+                CDS_ATOMIC::atomic<retired_ptr_node *>  m_pHead     ;   ///< head of buffer
+                CDS_ATOMIC::atomic<size_t>              m_nItemCount;   ///< buffer's item count
+
+            public:
+                //@cond
+                retired_ptr_buffer()
+                    : m_pHead( null_ptr<retired_ptr_node *>() )
+                    , m_nItemCount(0)
+                {}
+
+                ~retired_ptr_buffer()
+                {
+                    assert( m_pHead.load(CDS_ATOMIC::memory_order_relaxed) == null_ptr<retired_ptr_node *>());
+                }
+                //@endcond
+
+                /// Pushes new node into the buffer. Returns current buffer size
+                size_t push( retired_ptr_node& node )
+                {
+                    retired_ptr_node * pHead = m_pHead.load(CDS_ATOMIC::memory_order_acquire);
+                    do {
+                        node.m_pNext = pHead;
+                        // pHead is changed by compare_exchange_weak
+                    } while ( !m_pHead.compare_exchange_weak( pHead, &node, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+
+                    return m_nItemCount.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed ) + 1;
+                }
+
+                /// Result of \ref ptb_gc_privatve "privatize" function.
+                /**
+                    The \p privatize function returns retired node list as \p first and the size of that list as \p second.
+                */
+                typedef std::pair<retired_ptr_node *, size_t> privatize_result;
+
+                /// Gets current list of retired pointer and clears the list
+                /**@anchor ptb_gc_privatve
+                */
+                privatize_result privatize()
+                {
+                    privatize_result res;
+                    res.first = m_pHead.exchange( null_ptr<retired_ptr_node *>(), CDS_ATOMIC::memory_order_acq_rel );
+
+                    // Item counter is needed only as a threshold for liberate function
+                    // So, we may clear the item counter without synchronization with m_pHead
+                    res.second = m_nItemCount.exchange( 0, CDS_ATOMIC::memory_order_relaxed );
+                    return res;
+                }
+
+                /// Returns current size of buffer (approximate)
+                size_t size() const
+                {
+                    return m_nItemCount.load(CDS_ATOMIC::memory_order_relaxed);
+                }
+            };
+
+            /// Pool of retired pointers
+            /**
+                The class acts as an allocator of retired node.
+                Retired pointers are linked in the lock-free list.
+            */
+            template <class Alloc = CDS_DEFAULT_ALLOCATOR>
+            class retired_ptr_pool {
+                /// Pool item
+                typedef retired_ptr_node    item;
+
+                /// Count of items in block
+                static const size_t m_nItemPerBlock = 1024 / sizeof(item) - 1;
+
+                /// Pool block
+                struct block {
+                    block *     pNext   ;   ///< next block
+                    item        items[m_nItemPerBlock]  ;   ///< item array
+                };
+
+                CDS_ATOMIC::atomic<block *> m_pBlockListHead    ;   ///< head of of allocated block list
+
+                // To solve ABA problem we use epoch-based approach
+                static const unsigned int c_nEpochCount = 4     ;   ///< Max epoch count
+                CDS_ATOMIC::atomic<unsigned int>    m_nCurEpoch ;   ///< Current epoch
+                CDS_ATOMIC::atomic<item *>  m_pEpochFree[c_nEpochCount]  ;   ///< List of free item per epoch
+                CDS_ATOMIC::atomic<item *>  m_pGlobalFreeHead   ;   ///< Head of unallocated item list
+
+                cds::details::Allocator< block, Alloc > m_BlockAllocator    ;   ///< block allocator
+
+            private:
+                //@cond
+                void allocNewBlock()
+                {
+                    // allocate new block
+                    block * pNew = m_BlockAllocator.New();
+
+                    // link items within the block
+                    item * pLastItem = pNew->items + m_nItemPerBlock - 1;
+                    for ( item * pItem = pNew->items; pItem != pLastItem; ++pItem ) {
+                        pItem->m_pNextFree = pItem + 1;
+                        CDS_STRICT_DO( pItem->m_pNext = null_ptr<item *>() );
+                    }
+
+                    // link new block to block list
+                    {
+                        block * pHead = m_pBlockListHead.load(CDS_ATOMIC::memory_order_acquire);
+                        do {
+                            pNew->pNext = pHead;
+                            // pHead is changed by compare_exchange_weak
+                        } while ( !m_pBlockListHead.compare_exchange_weak( pHead, pNew, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+                    }
+
+                    // link block's items to free list
+                    {
+                        item * pHead = m_pGlobalFreeHead.load(CDS_ATOMIC::memory_order_acquire);
+                        do {
+                            pLastItem->m_pNextFree = pHead;
+                            // pHead is changed by compare_exchange_weak
+                        } while ( !m_pGlobalFreeHead.compare_exchange_weak( pHead, pNew->items, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+                    }
+                }
+
+                unsigned int current_epoch() const
+                {
+                    return m_nCurEpoch.load(CDS_ATOMIC::memory_order_acquire) & (c_nEpochCount - 1);
+                }
+                unsigned int next_epoch() const
+                {
+                    return (m_nCurEpoch.load(CDS_ATOMIC::memory_order_acquire) - 1) & (c_nEpochCount - 1);
+                }
+                //@endcond
+
+            public:
+                //@cond
+                retired_ptr_pool()
+                    : m_pBlockListHead(null_ptr<block *>())
+                    , m_nCurEpoch(0)
+                    , m_pGlobalFreeHead( null_ptr<item *>())
+                {
+                    for (unsigned int i = 0; i < sizeof(m_pEpochFree)/sizeof(m_pEpochFree[0]); ++i )
+                        m_pEpochFree[i].store( null_ptr<item *>(), CDS_ATOMIC::memory_order_relaxed );
+
+                    allocNewBlock();
+                }
+
+                ~retired_ptr_pool()
+                {
+                    block * p;
+                    for ( block * pBlock = m_pBlockListHead.load(CDS_ATOMIC::memory_order_relaxed); pBlock; pBlock = p ) {
+                        p = pBlock->pNext;
+                        m_BlockAllocator.Delete( pBlock );
+                    }
+                }
+
+                /// Increments current epoch
+                void inc_epoch()
+                {
+                    m_nCurEpoch.fetch_add( 1, CDS_ATOMIC::memory_order_acq_rel );
+                }
+
+                //@endcond
+
+                /// Allocates new retired pointer
+                retired_ptr_node&  alloc()
+                {
+                    unsigned int nEpoch;
+                    item * pItem;
+                    for (;;) {
+                        pItem = m_pEpochFree[ nEpoch = current_epoch() ].load(CDS_ATOMIC::memory_order_acquire);
+                        if ( !pItem )
+                            goto retry;
+                        if ( m_pEpochFree[nEpoch].compare_exchange_weak( pItem, pItem->m_pNextFree, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                            goto success;
+                    }
+
+                    /*
+                    item * pItem = m_pEpochFree[ nEpoch = current_epoch() ].load(CDS_ATOMIC::memory_order_acquire);
+                    while ( pItem ) {
+                        if ( m_pEpochFree[nEpoch].compare_exchange_weak( pItem, pItem->m_pNextFree, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                            goto success;
+                    }
+                    */
+
+                    // Epoch free list is empty
+                    // Alloc from global free list
+                retry:
+                    pItem = m_pGlobalFreeHead.load( CDS_ATOMIC::memory_order_acquire );
+                    do {
+                        if ( !pItem ) {
+                            allocNewBlock();
+                            goto retry;
+                        }
+                        // pItem is changed by compare_exchange_weak
+                    } while ( !m_pGlobalFreeHead.compare_exchange_weak( pItem, pItem->m_pNextFree, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+
+                success:
+                    CDS_STRICT_DO( pItem->m_pNextFree = null_ptr<item *>() );
+                    return *pItem;
+                }
+
+                /// Allocates and initializes new retired pointer
+                retired_ptr_node& alloc( const retired_ptr& p )
+                {
+                    retired_ptr_node& node = alloc();
+                    node.m_ptr = p;
+                    return node;
+                }
+
+                /// Places the list (pHead, pTail) of retired pointers to pool (frees retired pointers)
+                /**
+                    The list is linked on the m_pNextFree field
+                */
+                void free_range( retired_ptr_node * pHead, retired_ptr_node * pTail )
+                {
+                    assert( pHead != null_ptr<retired_ptr_node *>() );
+                    assert( pTail != null_ptr<retired_ptr_node *>() );
+
+                    unsigned int nEpoch;
+                    item * pCurHead;
+                    do {
+                        pCurHead = m_pEpochFree[nEpoch = next_epoch()].load(CDS_ATOMIC::memory_order_acquire);
+                        pTail->m_pNextFree = pCurHead;
+                    } while ( !m_pEpochFree[nEpoch].compare_exchange_weak( pCurHead, pHead, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+                }
+            };
+
+            /// Uninitialized guard
+            class guard: public cds::details::noncopyable
+            {
+                friend class ThreadGC;
+            protected:
+                details::guard_data * m_pGuard ;    ///< Pointer to guard data
+            public:
+                /// Initialize empty guard.
+                guard()
+                    : m_pGuard(null_ptr<details::guard_data *>())
+                {}
+
+                /// Object destructor, does nothing
+                ~guard()
+                {}
+
+                /// Guards pointer \p p
+                void set( void * p )
+                {
+                    assert( m_pGuard != null_ptr<details::guard_data *>() );
+                    m_pGuard->pPost.store( p, CDS_ATOMIC::memory_order_release );
+                    //CDS_COMPILER_RW_BARRIER;
+                }
+
+                /// Clears the guard
+                void clear()
+                {
+                    assert( m_pGuard != null_ptr<details::guard_data *>() );
+                    m_pGuard->pPost.store( null_ptr<void *>(), CDS_ATOMIC::memory_order_relaxed );
+                    CDS_STRICT_DO( CDS_COMPILER_RW_BARRIER );
+                }
+
+                /// Guards pointer \p p
+                template <typename T>
+                T * operator =( T * p )
+                {
+                    set( reinterpret_cast<void *>( const_cast<T *>(p) ));
+                    return p;
+                }
+
+            public: // for ThreadGC.
+                /*
+                    GCC cannot compile code for template versions of ThreasGC::allocGuard/freeGuard,
+                    the compiler produces error: \91cds::gc::ptb::details::guard_data* cds::gc::ptb::details::guard::m_pGuard\92 is protected
+                    despite the fact that ThreadGC is declared as friend for guard class.
+                    We should not like to declare m_pGuard member as public one.
+                    Therefore, we have to add set_guard/get_guard public functions
+                */
+                /// Set guard data
+                void set_guard( details::guard_data * pGuard )
+                {
+                    assert( m_pGuard == null_ptr<details::guard_data *>() );
+                    m_pGuard = pGuard;
+                }
+
+                /// Get current guard data
+                details::guard_data * get_guard()
+                {
+                    return m_pGuard;
+                }
+                /// Get current guard data
+                details::guard_data * get_guard() const
+                {
+                    return m_pGuard;
+                }
+            };
+
+        } // namespace details
+
+        /// Guard
+        /**
+            This class represents auto guard: ctor allocates a guard from guard pool,
+            dtor returns the guard back to the pool of free guard.
+        */
+        class Guard: public details::guard
+        {
+            //@cond
+            typedef details::guard    base_class;
+            friend class ThreadGC;
+            //@endcond
+
+            ThreadGC&    m_gc    ;    ///< ThreadGC object of current thread
+        public:
+            /// Allocates a guard from \p gc GC. \p gc must be ThreadGC object of current thread
+            Guard(ThreadGC& gc);
+
+            /// Returns guard allocated back to pool of free guards
+            ~Guard();    // inline after GarbageCollector
+
+            /// Returns PTB GC object
+            ThreadGC& getGC()
+            {
+                return m_gc;
+            }
+
+            /// Guards pointer \p p
+            template <typename T>
+            T * operator =( T * p )
+            {
+                return base_class::operator =<T>( p );
+            }
+        };
+
+        /// Array of guards
+        /**
+            This class represents array of auto guards: ctor allocates \p Count guards from guard pool,
+            dtor returns the guards allocated back to the pool.
+        */
+        template <size_t Count>
+        class GuardArray: public cds::details::noncopyable
+        {
+            details::guard      m_arr[Count]    ;    ///< array of guard
+            ThreadGC&           m_gc    ;            ///< ThreadGC object of current thread
+            const static size_t c_nCapacity = Count ;   ///< Array capacity (equal to \p Count template parameter)
+
+        public:
+            /// Rebind array for other size \p OtherCount
+            template <size_t OtherCount>
+            struct rebind {
+                typedef GuardArray<OtherCount>  other   ;   ///< rebinding result
+            };
+
+        public:
+            /// Allocates array of guards from \p gc which must be the ThreadGC object of current thread
+            GuardArray( ThreadGC& gc )    ;    // inline below
+
+            /// Returns guards allocated back to pool
+            ~GuardArray()    ;    // inline below
+
+            /// Returns the capacity of array
+            CDS_CONSTEXPR size_t capacity() const CDS_NOEXCEPT
+            {
+                return c_nCapacity;
+            }
+
+            /// Returns PTB ThreadGC object
+            ThreadGC& getGC() CDS_NOEXCEPT
+            {
+                return m_gc;
+            }
+
+            /// Returns reference to the guard of index \p nIndex (0 <= \p nIndex < \p Count)
+            details::guard& operator []( size_t nIndex )
+            {
+                assert( nIndex < capacity() );
+                return m_arr[nIndex];
+            }
+
+            /// Returns reference to the guard of index \p nIndex (0 <= \p nIndex < \p Count) [const version]
+            const details::guard& operator []( size_t nIndex ) const
+            {
+                assert( nIndex < capacity() );
+                return m_arr[nIndex];
+            }
+
+            /// Set the guard \p nIndex. 0 <= \p nIndex < \p Count
+            template <typename T>
+            void set( size_t nIndex, T * p )
+            {
+                assert( nIndex < capacity() );
+                m_arr[nIndex].set( p );
+            }
+
+            /// Clears (sets to NULL) the guard \p nIndex
+            void clear( size_t nIndex )
+            {
+                assert( nIndex < capacity() );
+                m_arr[nIndex].clear();
+            }
+
+            /// Clears all guards in the array
+            void clearAll()
+            {
+                for ( size_t i = 0; i < capacity(); ++i )
+                    clear(i);
+            }
+        };
+
+        /// Memory manager (Garbage collector)
+        class CDS_EXPORT_API GarbageCollector
+        {
+        private:
+            //@cond
+            friend class ThreadGC;
+
+            /// Internal GC statistics
+            struct internal_stat
+            {
+                CDS_ATOMIC::atomic<size_t>  m_nGuardCount       ;   ///< Total guard count
+                CDS_ATOMIC::atomic<size_t>  m_nFreeGuardCount   ;   ///< Count of free guard
+
+                internal_stat()
+                    : m_nGuardCount(0)
+                    , m_nFreeGuardCount(0)
+                {}
+            };
+            //@endcond
+
+        public:
+            /// Exception "No GarbageCollector object is created"
+            CDS_DECLARE_EXCEPTION( PTBManagerEmpty, "Global PTB GarbageCollector is NULL" );
+
+            /// Internal GC statistics
+            struct InternalState
+            {
+                size_t m_nGuardCount       ;   ///< Total guard count
+                size_t m_nFreeGuardCount   ;   ///< Count of free guard
+
+                //@cond
+                InternalState()
+                    : m_nGuardCount(0)
+                    , m_nFreeGuardCount(0)
+                {}
+
+                InternalState& operator =( internal_stat const& s )
+                {
+                    m_nGuardCount = s.m_nGuardCount.load(CDS_ATOMIC::memory_order_relaxed);
+                    m_nFreeGuardCount = s.m_nFreeGuardCount.load(CDS_ATOMIC::memory_order_relaxed);
+
+                    return *this;
+                }
+                //@endcond
+            };
+
+        private:
+            static GarbageCollector * m_pManager    ;   ///< GC global instance
+
+            details::guard_allocator<>      m_GuardPool         ;   ///< Guard pool
+            details::retired_ptr_pool<>     m_RetiredAllocator  ;   ///< Pool of free retired pointers
+            details::retired_ptr_buffer     m_RetiredBuffer     ;   ///< Retired pointer buffer for liberating
+            //CDS_ATOMIC::atomic<size_t>      m_nInLiberate       ;   ///< number of parallel \p liberate fnction call
+
+            CDS_ATOMIC::atomic<size_t>      m_nLiberateThreshold;   ///< Max size of retired pointer buffer to call liberate
+            const size_t    m_nInitialThreadGuardCount; ///< Initial count of guards allocated for ThreadGC
+
+            internal_stat   m_stat  ;   ///< Internal statistics
+            bool            m_bStatEnabled  ;   ///< Internal Statistics enabled
+
+        public:
+            /// Initializes PTB memory manager singleton
+            /**
+                This member function creates and initializes PTB global object.
+                The function should be called before using CDS data structure based on cds::gc::PTB GC. Usually,
+                this member function is called in the \p main() function. See cds::gc::ptb for example.
+                After calling of this function you may use CDS data structures based on cds::gc::PTB.
+
+                \par Parameters
+                \li \p nLiberateThreshold - the liberate threshold. When count of retired pointers reaches this value,
+                    the \ref ptb_gc_liberate "liberate" member function would be called for freeing retired pointers.
+                    If \p nLiberateThreshold <= 1, \p liberate would called after each \ref ptb_gc_retirePtr "retirePtr" call.
+                \li \p nInitialThreadGuardCount - initial count of guard allocated for ThreadGC. When a thread
+                    is initialized the GC allocates local guard pool for the thread from common guard pool.
+                    By perforce the local thread's guard pool is grown automatically from common pool.
+                    When the thread terminated its guard pool is backed to common GC's pool.
+
+            */
+            static void CDS_STDCALL Construct(
+                size_t nLiberateThreshold = 1024
+                , size_t nInitialThreadGuardCount = 8
+            );
+
+            /// Destroys PTB memory manager
+            /**
+                The member function destroys PTB global object. After calling of this function you may \b NOT
+                use CDS data structures based on cds::gc::PTB. Usually, the \p Destruct function is called
+                at the end of your \p main(). See cds::gc::ptb for example.
+            */
+            static void CDS_STDCALL Destruct();
+
+            /// Returns pointer to GarbageCollector instance
+            /**
+                If PTB GC is not initialized, \p PTBManagerEmpty exception is thrown
+            */
+            static GarbageCollector&   instance()
+            {
+                if ( m_pManager == null_ptr<GarbageCollector *>() )
+                    throw PTBManagerEmpty();
+                return *m_pManager;
+            }
+
+            /// Checks if global GC object is constructed and may be used
+            static bool isUsed() CDS_NOEXCEPT
+            {
+                return m_pManager != null_ptr<GarbageCollector *>();
+            }
+
+        public:
+            //@{
+            /// Internal interface
+
+            /// Allocates a guard
+            details::guard_data * allocGuard()
+            {
+                return m_GuardPool.alloc();
+            }
+
+            /// Frees guard \p g for reusing in future
+            void freeGuard(details::guard_data * pGuard )
+            {
+                m_GuardPool.free( pGuard );
+            }
+
+            /// Allocates guard list for a thread.
+            details::guard_data * allocGuardList( size_t nCount )
+            {
+                return m_GuardPool.allocList( nCount );
+            }
+
+            /// Frees thread's guard list pointed by \p pList
+            void freeGuardList( details::guard_data * pList )
+            {
+                m_GuardPool.freeList( pList );
+            }
+
+            /// Places retired pointer \p and its deleter \p pFunc into thread's array of retired pointer for deferred reclamation
+            /**@anchor ptb_gc_retirePtr
+            */
+            template <typename T>
+            void retirePtr( T * p, void (* pFunc)(T *) )
+            {
+                retirePtr( retired_ptr( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ) ) );
+            }
+
+            /// Places retired pointer \p into thread's array of retired pointer for deferred reclamation
+            void retirePtr( retired_ptr const& p )
+            {
+                if ( m_RetiredBuffer.push( m_RetiredAllocator.alloc(p)) >= m_nLiberateThreshold.load(CDS_ATOMIC::memory_order_relaxed) )
+                    liberate();
+            }
+
+        protected:
+            /// Liberate function
+            /** @anchor ptb_gc_liberate
+                The main function of Pass The Buck algorithm. It tries to free retired pointers if they are not
+                trapped by any guard.
+            */
+            void liberate();
+
+            //@}
+
+        private:
+            //@cond
+#if 0
+            void liberate( details::liberate_set& set );
+#endif
+            //@endcond
+
+        public:
+            /// Get internal statistics
+            InternalState& getInternalState(InternalState& stat) const
+            {
+                return stat = m_stat;
+            }
+
+            /// Checks if internal statistics enabled
+            bool              isStatisticsEnabled() const
+            {
+                return m_bStatEnabled;
+            }
+
+            /// Enables/disables internal statistics
+            bool  enableStatistics( bool bEnable )
+            {
+                bool bEnabled = m_bStatEnabled;
+                m_bStatEnabled = bEnable;
+                return bEnabled;
+            }
+
+        private:
+            //@cond none
+            GarbageCollector( size_t nLiberateThreshold, size_t nInitialThreadGuardCount );
+            ~GarbageCollector();
+            //@endcond
+        };
+
+        /// Thread GC
+        /**
+            To use Pass The Buck reclamation schema each thread object must be linked with the object of ThreadGC class
+            that interacts with GarbageCollector global object. The linkage is performed by calling \ref cds_threading "cds::threading::Manager::attachThread()"
+            on the start of each thread that uses PTB GC. Before terminating the thread linked to PTB GC it is necessary to call
+            \ref cds_threading "cds::threading::Manager::detachThread()".
+
+            The ThreadGC object maintains two list:
+            \li Thread guard list: the list of thread-local guards (linked by \p pThreadNext field)
+            \li Free guard list: the list of thread-local free guards (linked by \p pNextFree field)
+            Free guard list is a subset of thread guard list.
+        */
+        class ThreadGC: public cds::details::noncopyable
+        {
+            GarbageCollector&   m_gc    ;   ///< reference to GC singleton
+            details::guard_data *    m_pList ;   ///< Local list of guards owned by the thread
+            details::guard_data *    m_pFree ;   ///< The list of free guard from m_pList
+
+        public:
+            ThreadGC()
+                : m_gc( GarbageCollector::instance() )
+                , m_pList( null_ptr<details::guard_data *>() )
+                , m_pFree( null_ptr<details::guard_data *>() )
+            {}
+
+            /// Dtor calls fini()
+            ~ThreadGC()
+            {
+                fini();
+            }
+
+            /// Initialization. Repeat call is available
+            void init()
+            {
+                if ( !m_pList ) {
+                    m_pList =
+                        m_pFree = m_gc.allocGuardList( m_gc.m_nInitialThreadGuardCount );
+                }
+            }
+
+            /// Finalization. Repeat call is available
+            void fini()
+            {
+                if ( m_pList ) {
+                    m_gc.freeGuardList( m_pList );
+                    m_pList =
+                        m_pFree = null_ptr<details::guard_data *>();
+                }
+            }
+
+        public:
+            /// Initializes guard \p g
+            void allocGuard( Guard& g )
+            {
+                assert( m_pList != null_ptr<details::guard_data *>() );
+                if ( m_pFree ) {
+                    g.m_pGuard = m_pFree;
+                    m_pFree = m_pFree->pNextFree.load(CDS_ATOMIC::memory_order_relaxed);
+                }
+                else {
+                    g.m_pGuard = m_gc.allocGuard();
+                    g.m_pGuard->pThreadNext = m_pList;
+                    m_pList = g.m_pGuard;
+                }
+            }
+
+            /// Frees guard \p g
+            void freeGuard( Guard& g )
+            {
+                assert( m_pList != null_ptr<details::guard_data *>() );
+                g.m_pGuard->pPost.store( null_ptr<void *>(), CDS_ATOMIC::memory_order_relaxed );
+                g.m_pGuard->pNextFree.store( m_pFree, CDS_ATOMIC::memory_order_relaxed );
+                m_pFree = g.m_pGuard;
+            }
+
+            /// Initializes guard array \p arr
+            template <size_t Count>
+            void allocGuard( GuardArray<Count>& arr )
+            {
+                assert( m_pList != null_ptr<details::guard_data *>() );
+                size_t nCount = 0;
+
+                while ( m_pFree && nCount < Count ) {
+                    arr[nCount].set_guard( m_pFree );
+                    m_pFree = m_pFree->pNextFree.load(CDS_ATOMIC::memory_order_relaxed);
+                    ++nCount;
+                }
+
+                while ( nCount < Count ) {
+                    details::guard& g = arr[nCount++];
+                    g.set_guard( m_gc.allocGuard() );
+                    g.get_guard()->pThreadNext = m_pList;
+                    m_pList = g.get_guard();
+                }
+            }
+
+            /// Frees guard array \p arr
+            template <size_t Count>
+            void freeGuard( GuardArray<Count>& arr )
+            {
+                assert( m_pList != null_ptr<details::guard_data *>() );
+
+                details::guard_data * pGuard;
+                for ( size_t i = 0; i < Count - 1; ++i ) {
+                    pGuard = arr[i].get_guard();
+                    pGuard->pPost.store( null_ptr<void *>(), CDS_ATOMIC::memory_order_relaxed );
+                    pGuard->pNextFree.store( arr[i+1].get_guard(), CDS_ATOMIC::memory_order_relaxed );
+                }
+                pGuard = arr[Count-1].get_guard();
+                pGuard->pPost.store( null_ptr<void *>(), CDS_ATOMIC::memory_order_relaxed );
+                pGuard->pNextFree.store( m_pFree, CDS_ATOMIC::memory_order_relaxed );
+                m_pFree = arr[0].get_guard();
+            }
+
+            /// Places retired pointer \p and its deleter \p pFunc into list of retired pointer for deferred reclamation
+            template <typename T>
+            void retirePtr( T * p, void (* pFunc)(T *) )
+            {
+                m_gc.retirePtr( p, pFunc );
+            }
+
+            //@cond
+            void scan()
+            {
+                m_gc.liberate();
+            }
+            //@endcond
+
+        };
+
+        //////////////////////////////////////////////////////////
+        // Inlines
+
+        inline Guard::Guard(ThreadGC& gc)
+            : m_gc( gc )
+        {
+            getGC().allocGuard( *this );
+        }
+        inline Guard::~Guard()
+        {
+            getGC().freeGuard( *this );
+        }
+
+        template <size_t Count>
+        inline GuardArray<Count>::GuardArray( ThreadGC& gc )
+            : m_gc( gc )
+        {
+            getGC().allocGuard( *this );
+        }
+        template <size_t Count>
+        inline GuardArray<Count>::~GuardArray()
+        {
+            getGC().freeGuard( *this );
+        }
+
+    }   // namespace ptb
+}}  // namespace cds::gc
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   pragma warning(pop)
+#endif
+
+
+#endif // #ifndef __CDS_GC_PTB_PASS_THE_BUCK_H
diff --git a/cds/gc/ptb_decl.h b/cds/gc/ptb_decl.h
new file mode 100644 (file)
index 0000000..790d585
--- /dev/null
@@ -0,0 +1,478 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_PTB_DECL_H
+#define __CDS_GC_PTB_DECL_H
+
+#include <cds/gc/ptb/ptb.h>
+#include <cds/details/marked_ptr.h>
+#include <cds/details/static_functor.h>
+
+namespace cds { namespace gc {
+
+    /// Pass-the-Buck garbage collector
+    /**  @ingroup cds_garbage_collector
+        @headerfile cds/gc/ptb.h
+        This class is a wrapper for Pass-the-Buck garbage collector internal implementation.
+
+        Sources:
+        - [2002] M. Herlihy, V. Luchangco, and M. Moir. The repeat offender problem: A mechanism for supporting
+            dynamic-sized lockfree data structures. Technical Report TR-2002-112, Sun Microsystems Laboratories, 2002
+        - [2002] M. Herlihy, V. Luchangco, P. Martin, and M. Moir. Dynamic-sized Lockfree Data Structures.
+            Technical Report TR-2002-110, Sun Microsystems Laboratories, 2002
+        - [2005] M. Herlihy, V. Luchangco, P. Martin, and M. Moir. Nonblocking Memory Management Support
+            for Dynamic_Sized Data Structures. ACM Transactions on Computer Systems, Vol.23, No.2, May 2005
+
+        See \ref cds_how_to_use "How to use" section for details of garbage collector applying.
+    */
+    class PTB
+    {
+    public:
+        /// Native guarded pointer type
+        typedef void * guarded_pointer;
+
+#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
+        /// Atomic reference
+        /**
+            @headerfile cds/gc/ptb.h
+        */
+        template <typename T> using atomic_ref = CDS_ATOMIC::atomic<T *>;
+
+        /// Atomic type
+        /**
+            @headerfile cds/gc/ptb.h
+        */
+        template <typename T> using atomic_type = CDS_ATOMIC::atomic<T>;
+
+        /// Atomic marked pointer
+        /**
+            @headerfile cds/gc/ptb.h
+        */
+        template <typename MarkedPtr> using atomic_marked_ptr = CDS_ATOMIC::atomic<MarkedPtr>;
+#else
+        template <typename T>
+        class atomic_ref: public CDS_ATOMIC::atomic<T *>
+        {
+            typedef CDS_ATOMIC::atomic<T *> base_class;
+        public:
+#   ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            atomic_ref() = default;
+#   else
+            atomic_ref()
+                : base_class()
+            {}
+#   endif
+            explicit CDS_CONSTEXPR atomic_ref(T * p) CDS_NOEXCEPT
+                : base_class( p )
+            {}
+        };
+
+        template <typename T>
+        class atomic_type: public CDS_ATOMIC::atomic<T>
+        {
+            typedef CDS_ATOMIC::atomic<T> base_class;
+        public:
+#   ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            atomic_type() = default;
+#   else
+            atomic_type() CDS_NOEXCEPT
+                : base_class()
+            {}
+#   endif
+            explicit CDS_CONSTEXPR atomic_type(T const & v) CDS_NOEXCEPT
+                : base_class( v )
+            {}
+        };
+
+        template <typename MarkedPtr>
+        class atomic_marked_ptr: public CDS_ATOMIC::atomic<MarkedPtr>
+        {
+            typedef CDS_ATOMIC::atomic<MarkedPtr> base_class;
+        public:
+#   ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            atomic_marked_ptr() = default;
+#   else
+            atomic_marked_ptr()
+                : base_class()
+            {}
+#   endif
+            explicit CDS_CONSTEXPR atomic_marked_ptr(MarkedPtr val) CDS_NOEXCEPT
+                : base_class( val )
+            {}
+            explicit CDS_CONSTEXPR atomic_marked_ptr(typename MarkedPtr::value_type * p) CDS_NOEXCEPT
+                : base_class( p )
+            {}
+        };
+#endif
+
+        /// Thread GC implementation for internal usage
+        typedef ptb::ThreadGC   thread_gc_impl;
+
+        /// Wrapper for ptb::ThreadGC class
+        /**
+            @headerfile cds/gc/ptb.h
+            This class performs automatically attaching/detaching Pass-the-Buck GC
+            for the current thread.
+        */
+        class thread_gc: public thread_gc_impl
+        {
+            //@cond
+            bool    m_bPersistent;
+            //@endcond
+        public:
+            /// Constructor
+            /**
+                The constructor attaches the current thread to the Pass-the-Buck GC
+                if it is not yet attached.
+                The \p bPersistent parameter specifies attachment persistence:
+                - \p true - the class destructor will not detach the thread from Pass-the-Buck GC.
+                - \p false (default) - the class destructor will detach the thread from Pass-the-Buck GC.
+            */
+            thread_gc(
+                bool    bPersistent = false
+            )   ;   // inline in ptb_impl.h
+
+            /// Destructor
+            /**
+                If the object has been created in persistent mode, the destructor does nothing.
+                Otherwise it detaches the current thread from Pass-the-Buck GC.
+            */
+            ~thread_gc()    ;   // inline in ptb_impl.h
+        };
+
+        /// Base for container node
+        /**
+            @headerfile cds/gc/ptb.h
+            This struct is empty for Pass-the-Buck GC
+        */
+        struct container_node
+        {};
+
+
+        /// Pass-the-Buck guard
+        /**
+            @headerfile cds/gc/ptb.h
+            This class is a wrapper for ptb::Guard.
+        */
+        class Guard: public ptb::Guard
+        {
+            //@cond
+            typedef ptb::Guard base_class;
+            //@endcond
+
+        public:
+            //@cond
+            Guard() ;   // inline in ptb_impl.h
+            //@endcond
+
+            /// Protects a pointer of type <tt> atomic<T*> </tt>
+            /**
+                Return the value of \p toGuard
+
+                The function tries to load \p toGuard and to store it
+                to the HP slot repeatedly until the guard's value equals \p toGuard
+            */
+            template <typename T>
+            T protect( CDS_ATOMIC::atomic<T> const& toGuard )
+            {
+                T pCur = toGuard.load(CDS_ATOMIC::memory_order_relaxed);
+                T pRet;
+                do {
+                    pRet = assign( pCur );
+                    pCur = toGuard.load(CDS_ATOMIC::memory_order_acquire);
+                } while ( pRet != pCur );
+                return pCur;
+            }
+
+            /// Protects a converted pointer of type <tt> atomic<T*> </tt>
+            /**
+                Return the value of \p toGuard
+
+                The function tries to load \p toGuard and to store result of \p f functor
+                to the HP slot repeatedly until the guard's value equals \p toGuard.
+
+                The function is useful for intrusive containers when \p toGuard is a node pointer
+                that should be converted to a pointer to the value type before guarding.
+                The parameter \p f of type Func is a functor that makes this conversion:
+                \code
+                    struct functor {
+                        value_type * operator()( T * p );
+                    };
+                \endcode
+                Really, the result of <tt> f( toGuard.load() ) </tt> is assigned to the hazard pointer.
+            */
+            template <typename T, class Func>
+            T protect( CDS_ATOMIC::atomic<T> const& toGuard, Func f )
+            {
+                T pCur = toGuard.load(CDS_ATOMIC::memory_order_relaxed);
+                T pRet;
+                do {
+                    pRet = pCur;
+                    assign( f( pCur ) );
+                    pCur = toGuard.load(CDS_ATOMIC::memory_order_acquire);
+                } while ( pRet != pCur );
+                return pCur;
+            }
+
+            /// Store \p p to the guard
+            /**
+                The function equals to a simple assignment, no loop is performed.
+                Can be used for a pointer that cannot be changed concurrently.
+            */
+            template <typename T>
+            T * assign( T * p )
+            {
+                return base_class::operator =(p);
+            }
+
+            /// Store marked pointer \p p to the guard
+            /**
+                The function equals to a simple assignment of <tt>p.ptr()</tt>, no loop is performed.
+                Can be used for a marked pointer that cannot be changed concurrently.
+            */
+            template <typename T, int BITMASK>
+            T * assign( cds::details::marked_ptr<T, BITMASK> p )
+            {
+                return base_class::operator =( p.ptr() );
+            }
+
+            /// Copy from \p src guard to \p this guard
+            void copy( Guard const& src )
+            {
+                assign( src.get_native() );
+            }
+
+            /// Clear value of the guard
+            void clear()
+            {
+                base_class::clear();
+            }
+
+            /// Get the value currently protected (relaxed read)
+            template <typename T>
+            T * get() const
+            {
+                return reinterpret_cast<T *>( get_native() );
+            }
+
+            /// Get native guarded pointer stored
+            guarded_pointer get_native() const
+            {
+                return base_class::get_guard()->pPost.load(CDS_ATOMIC::memory_order_relaxed);
+            }
+
+        };
+
+        /// Array of Pass-the-Buck guards
+        /**
+            @headerfile cds/gc/ptb.h
+            This class is a wrapper for ptb::GuardArray template.
+            Template parameter \p Count defines the size of PTB array.
+        */
+        template <size_t Count>
+        class GuardArray: public ptb::GuardArray<Count>
+        {
+            //@cond
+            typedef ptb::GuardArray<Count> base_class;
+            //@endcond
+        public:
+            /// Rebind array for other size \p COUNT2
+            template <size_t OtherCount>
+            struct rebind {
+                typedef GuardArray<OtherCount>  other   ;   ///< rebinding result
+            };
+
+        public:
+            //@cond
+            GuardArray()    ;   // inline in ptb_impl.h
+            //@endcond
+
+            /// Protects a pointer of type \p atomic<T*>
+            /**
+                Return the value of \p toGuard
+
+                The function tries to load \p toGuard and to store it
+                to the slot \p nIndex repeatedly until the guard's value equals \p toGuard
+            */
+            template <typename T>
+            T protect(size_t nIndex, CDS_ATOMIC::atomic<T> const& toGuard )
+            {
+                T pRet;
+                do {
+                    pRet = assign( nIndex, toGuard.load(CDS_ATOMIC::memory_order_relaxed) );
+                } while ( pRet != toGuard.load(CDS_ATOMIC::memory_order_acquire));
+
+                return pRet;
+            }
+
+            /// Protects a pointer of type \p atomic<T*>
+            /**
+                Return the value of \p toGuard
+
+                The function tries to load \p toGuard and to store it
+                to the slot \p nIndex repeatedly until the guard's value equals \p toGuard
+
+                The function is useful for intrusive containers when \p toGuard is a node pointer
+                that should be converted to a pointer to the value type before guarding.
+                The parameter \p f of type Func is a functor that makes this conversion:
+                \code
+                    struct functor {
+                        value_type * operator()( T * p );
+                    };
+                \endcode
+                Really, the result of <tt> f( toGuard.load() ) </tt> is assigned to the hazard pointer.
+            */
+            template <typename T, class Func>
+            T protect(size_t nIndex, CDS_ATOMIC::atomic<T> const& toGuard, Func f )
+            {
+                T pRet;
+                do {
+                    assign( nIndex, f( pRet = toGuard.load(CDS_ATOMIC::memory_order_relaxed) ));
+                } while ( pRet != toGuard.load(CDS_ATOMIC::memory_order_acquire));
+
+                return pRet;
+            }
+
+            /// Store \p to the slot \p nIndex
+            /**
+                The function equals to a simple assignment, no loop is performed.
+            */
+            template <typename T>
+            T * assign( size_t nIndex, T * p )
+            {
+                base_class::set(nIndex, p);
+                return p;
+            }
+
+            /// Store marked pointer \p p to the guard
+            /**
+                The function equals to a simple assignment of <tt>p.ptr()</tt>, no loop is performed.
+                Can be used for a marked pointer that cannot be changed concurrently.
+            */
+            template <typename T, int Bitmask>
+            T * assign( size_t nIndex, cds::details::marked_ptr<T, Bitmask> p )
+            {
+                return assign( nIndex, p.ptr() );
+            }
+
+            /// Copy guarded value from \p src guard to slot at index \p nIndex
+            void copy( size_t nIndex, Guard const& src )
+            {
+                assign( nIndex, src.get_native() );
+            }
+
+            /// Copy guarded value from slot \p nSrcIndex to slot at index \p nDestIndex
+            void copy( size_t nDestIndex, size_t nSrcIndex )
+            {
+                assign( nDestIndex, get_native( nSrcIndex ));
+            }
+
+            /// Clear value of the slot \p nIndex
+            void clear( size_t nIndex)
+            {
+                base_class::clear( nIndex );
+            }
+
+            /// Get current value of slot \p nIndex
+            template <typename T>
+            T * get( size_t nIndex) const
+            {
+                return reinterpret_cast<T *>( get_native( nIndex ) );
+            }
+
+            /// Get native guarded pointer stored
+            guarded_pointer get_native( size_t nIndex ) const
+            {
+                return base_class::operator[](nIndex).get_guard()->pPost.load(CDS_ATOMIC::memory_order_relaxed);
+            }
+
+            /// Capacity of the guard array
+            static CDS_CONSTEXPR size_t capacity()
+            {
+                return Count;
+            }
+        };
+
+    public:
+        /// Initializes ptb::GarbageCollector singleton
+        /**
+            The constructor calls GarbageCollector::Construct with passed parameters.
+            See ptb::GarbageCollector::Construct for explanation of parameters meaning.
+        */
+        PTB(
+            size_t nLiberateThreshold = 1024
+            , size_t nInitialThreadGuardCount = 8
+        )
+        {
+            ptb::GarbageCollector::Construct(
+                nLiberateThreshold,
+                nInitialThreadGuardCount
+            );
+        }
+
+        /// Terminates ptb::GarbageCollector singleton
+        /**
+            The destructor calls \code ptb::GarbageCollector::Destruct() \endcode
+        */
+        ~PTB()
+        {
+            ptb::GarbageCollector::Destruct();
+        }
+
+        /// Checks if count of hazard pointer is no less than \p nCountNeeded
+        /**
+            The function always returns \p true since the guard count is unlimited for
+            PTB garbage collector.
+        */
+        static bool check_available_guards( size_t nCountNeeded, bool /*bRaiseException*/ = true )
+        {
+            CDS_UNUSED( nCountNeeded );
+            return true;
+        }
+
+        /// Retire pointer \p p with function \p pFunc
+        /**
+            The function places pointer \p p to array of pointers ready for removing.
+            (so called retired pointer array). The pointer can be safely removed when no guarded pointer points to it.
+            Deleting the pointer is the function \p pFunc call.
+        */
+        template <typename T>
+        static void retire( T * p, void (* pFunc)(T *) )
+        {
+            ptb::GarbageCollector::instance().retirePtr( p, pFunc );
+        }
+
+        /// Retire pointer \p p with functor of type \p Disposer
+        /**
+            The function places pointer \p p to array of pointers ready for removing.
+            (so called retired pointer array). The pointer can be safely removed when no guarded pointer points to it.
+
+            See gc::HP::retire for \p Disposer requirements.
+        */
+        template <class Disposer, typename T>
+        static void retire( T * p )
+        {
+            retire( p, cds::details::static_functor<Disposer, T>::call );
+        }
+
+        /// Checks if Pass-the-Buck GC is constructed and may be used
+        static bool isUsed()
+        {
+            return ptb::GarbageCollector::isUsed();
+        }
+
+        /// Forced GC cycle call for current thread
+        /**
+            Usually, this function should not be called directly.
+        */
+        static void scan()  ;   // inline in ptb_impl.h
+
+        /// Synonym for \ref scan()
+        static void force_dispose()
+        {
+            scan();
+        }
+    };
+
+}} // namespace cds::gc
+
+#endif // #ifndef __CDS_GC_PTB_DECL_H
diff --git a/cds/gc/ptb_impl.h b/cds/gc/ptb_impl.h
new file mode 100644 (file)
index 0000000..201564c
--- /dev/null
@@ -0,0 +1,43 @@
+//$$CDS-header$$
+
+#ifndef __CDS_GC_PTB_IMPL_H
+#define __CDS_GC_PTB_IMPL_H
+
+#include <cds/threading/model.h>
+
+//@cond
+namespace cds { namespace gc {
+
+    inline PTB::thread_gc::thread_gc(
+        bool    bPersistent
+        )
+        : m_bPersistent( bPersistent )
+    {
+        if ( !cds::threading::Manager::isThreadAttached() )
+            cds::threading::Manager::attachThread();
+    }
+
+    inline PTB::thread_gc::~thread_gc()
+    {
+        if ( !m_bPersistent )
+            cds::threading::Manager::detachThread();
+    }
+
+    inline PTB::Guard::Guard()
+        : Guard::base_class( cds::threading::getGC<PTB>() )
+    {}
+
+    template <size_t COUNT>
+    inline PTB::GuardArray<COUNT>::GuardArray()
+        : GuardArray::base_class( cds::threading::getGC<PTB>() )
+    {}
+
+    inline void PTB::scan()
+    {
+        cds::threading::getGC<PTB>().scan();
+    }
+
+}} // namespace cds::gc
+//@endcond
+
+#endif // #ifndef __CDS_GC_PTB_IMPL_H
diff --git a/cds/init.h b/cds/init.h
new file mode 100644 (file)
index 0000000..6008580
--- /dev/null
@@ -0,0 +1,89 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INIT_H
+#define __CDS_INIT_H
+
+#include <cds/details/defs.h>
+#include <cds/os/topology.h>
+#include <cds/threading/model.h>
+#include <cds/details/lib.h>
+
+namespace cds {
+
+    //@cond
+    namespace details {
+        bool CDS_EXPORT_API init_first_call();
+        bool CDS_EXPORT_API fini_last_call();
+    }   // namespace details
+    //@endcond
+
+    /// Initialize CDS library
+    /**
+        The function initializes \p CDS library framework.
+        Before usage of \p CDS library features your application must initialize it
+        by calling \p Initialize function:
+        @code
+        #include <cds/init.h>
+        #include <cds/gc/hp.h>
+
+        int main()
+        {
+            // // Initialize CDS library
+            cds::Initialize( 0 );
+
+            {
+                // // Initialize Hazard Pointer GC (if it is needed for you)
+                cds::gc::HP();
+
+                // // Now you can use CDS library containers with Hazard Pointer GC
+                ...
+
+            }
+            // // Teminate CDS library
+            cds::Terminate();
+
+            return 0;
+        }
+        @endcode
+
+        You may call \p Initialize several times, only first call is significant others will be ignored.
+        To terminate the \p CDS library correctly, each call to \p Initialize must be balanced by a corresponding call to \ref Terminate.
+
+        Note, that this function does not initialize garbage collectors. To use GC you need you should call
+        GC-specific constructor function to initialize internal structures of GC. See cds::gc and its subnamespace for details.
+    */
+    static inline void Initialize(
+        unsigned int nFeatureFlags = 0  ///< for future use, must be zero.
+    )
+    {
+        CDS_UNUSED( nFeatureFlags );
+
+        if ( cds::details::init_first_call() )
+        {
+            cds::OS::topology::init();
+            cds::threading::ThreadData::s_nProcCount = cds::OS::topology::processor_count();
+            if ( cds::threading::ThreadData::s_nProcCount == 0 )
+                cds::threading::ThreadData::s_nProcCount = 1;
+
+            cds::threading::Manager::init();
+        }
+    }
+
+    /// Terminate CDS library
+    /**
+        This function terminates \p CDS library.
+        After \p Terminate calling many features of the library are unavailable.
+        This call should be the last call of \p CDS library in your application.
+    */
+    static inline void Terminate()
+    {
+        if ( cds::details::fini_last_call() ) {
+            cds::threading::Manager::fini();
+
+            cds::OS::topology::fini();
+        }
+    }
+
+}   // namespace cds
+
+#endif // __CDS_INIT_H
diff --git a/cds/int_algo.h b/cds/int_algo.h
new file mode 100644 (file)
index 0000000..5e20a7b
--- /dev/null
@@ -0,0 +1,74 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INT_ALGO_H
+#define __CDS_INT_ALGO_H
+
+#include <cds/bitop.h>
+
+namespace cds { namespace beans {
+
+    /// Returns largest previous integer for <tt>log2( n )</tt>
+    static inline size_t log2floor( size_t n )
+    {
+        return n ? cds::bitop::MSBnz( n ) : 0;
+    }
+
+    /// Returns smallest following integer for <tt>log2( n )</tt>
+    static inline size_t log2ceil( size_t n )
+    {
+        size_t i = log2floor( n );
+        return size_t( 1 << i ) < n ? i + 1 : i;
+    }
+
+    /// Returns largest previous power of 2 for \p n
+    /**
+        Examples:
+        \code
+        floor2(0) == 1   // !!!
+        floor2(1) == 1
+        floor2(2) == 2
+        floor2(3) == 2
+        floor2(4) == 4
+        floor2(15) == 8
+        floor2(16) == 16
+        floor2(17) == 16
+        \endcode
+    */
+    static inline size_t floor2( size_t n )
+    {
+        return size_t(1) << log2floor( n );
+    }
+
+    /// Returns smallest following power of 2 for \p n
+    /**
+        Examples:
+        \code
+        ceil2(0) == 1   // !!!
+        ceil2(1) == 1
+        ceil2(2) == 2
+        ceil2(3) == 4
+        ceil2(4) == 4
+        ceil2(15) == 16
+        ceil2(16) == 16
+        ceil2(17) == 32
+        \endcode
+    */
+    static inline size_t ceil2( size_t n )
+    {
+        return size_t(1) << log2ceil( n );
+    }
+
+    /// Checks if \p n is power of 2
+    CDS_CONSTEXPR static inline bool is_power2( size_t n ) CDS_NOEXCEPT
+    {
+        return (n & (n - 1)) == 0 && n;
+    }
+
+    /// Returns binary logarithm of \p n if \p n is power of two, otherwise returns 0
+    static inline size_t log2( size_t n )
+    {
+        return is_power2(n) ? log2floor(n) : 0;
+    }
+}}   // namespace cds::beans
+
+#endif  // #ifndef __CDS_INT_ALGO_H
diff --git a/cds/intrusive/base.h b/cds/intrusive/base.h
new file mode 100644 (file)
index 0000000..1247f4b
--- /dev/null
@@ -0,0 +1,160 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_BASE_H
+#define __CDS_INTRUSIVE_BASE_H
+
+#include <cds/intrusive/node_traits.h>
+#include <cds/details/allocator.h>
+#include <cds/backoff_strategy.h>
+
+namespace cds {
+
+/// Intrusive containers
+/**
+    @ingroup cds_intrusive_containers
+    The namespace cds::intrusive contains intrusive lock-free containers.
+    The idea comes from \p boost::intrusive library, see http://boost.org/doc/ as a good introduction to intrusive approach.
+    The intrusive containers of libcds library is developed as close to boost::intrusive
+
+    In terms of lock-free approach, the main advantage of intrusive containers is
+    that no memory allocation is performed to maintain container items.
+    However, additional requirements is imposed for types and values that can be stored in intrusive container.
+    See the container documentation for details.
+
+    Restriction for Gidenstam's garbage collector cds::gc::HRC:
+    the Gidenstam's garbage collector makes additional requirements to type of item in intrusive container.
+    Therefore, for this GC only \p base_hook is allowed as the value of opt::hook option.
+
+    \anchor cds_intrusive_item_destroying
+    \par Destroying items
+
+    It should be very careful when destroying an item removed from intrusive container.
+    In other threads the references to popped item may exists some time after removing.
+    To destroy the removed item in thread-safe manner you should call static function \p retire
+    of garbage collector you use, for example:
+    \code
+    struct destroyer  {
+        void operator ()( my_type * p )
+        {
+            delete p;
+        }
+    };
+
+    typedef cds::intrusive::TreiberStack< cds::gc::HP, my_type, cds::opt::disposer< destroyer > > stack;
+    stack s;
+
+    // ....
+
+    my_type * p = s.pop();
+
+    if ( p ) {
+        // It is wrong
+        // delete p;
+
+        // It is correct
+        cds::gc:HP::retire< destroyer >( p );
+    }
+    \endcode
+    The situation becomes even more complicated when you want store items in different intrusive containers.
+    In this case the best way is using reference counting:
+    \code
+    struct my_type {
+        ...
+        std::atomic<unsigned int> nRefCount;
+
+        my_type()
+            : nRefCount(0)
+        {}
+    };
+
+    struct destroyer  {
+        void operator ()( my_type * p )
+        {
+            if ( --p->nRefCount == 0 )
+                delete p    ;   // delete only after no reference pointing to p
+        }
+    };
+
+    typedef cds::intrusive::TreiberStack< cds::gc::HP, my_type, cds::opt::disposer< destroyer > > stack;
+    typedef cds::intrusive::MSQueue< cds::gc::HP, my_type, cds::opt::disposer< destroyer > > queue;
+    stack s;
+    queue q;
+
+    my_type * v = new my_type();
+
+    v.nRefCount++   ; // increment counter before pushing the item to the stack
+    s.push(v);
+
+    v.nRefCount++   ; // increment counter before pushing the item to the queue
+    q.push(v);
+
+    // ....
+
+    my_type * ps = s.pop();
+    if ( ps ) {
+        // It is wrong
+        // delete ps;
+
+        // It is correct
+        cds::gc:HP::retire< destroyer >( ps );
+    }
+
+    my_type * pq = q.pop();
+    if ( pq ) {
+        // It is wrong
+        // delete pq;
+
+        // It is correct
+        cds::gc:HP::retire< destroyer >( pq );
+    }
+    \endcode
+    Violation of these rules may lead to a crash.
+
+    \par Intrusive containers and Hazard Pointer-like garbage collectors
+
+    If you develop your intrusive container based on <b>libcds</b> library framework, you should
+    take in the account the following.
+    The main idea of garbage collectors (GC) based on Hazard Pointer schema is protecting a shared pointer
+    by publishing it as a "hazard" one i.e. as a pointer that is changing at the current time and cannot be
+    deleted at this moment. In intrusive container paradigm, the pointer to the node of the container
+    and the pointer to the item stored in the container are not equal in the general case.
+    However, any pointer to the node should be castable to the appropriate pointer to the container's item.
+    In general, any item can be placed to some different intrusive containers simultaneously,
+    and each of those container holds a unique pointer to its node that refers to the same item.
+    When we protect a pointer, we want to protect an <b>item</b> pointer that is the invariant
+    for any container stored that item. In your intrusive container, instead of protecting by GC's guard a pointer to an node
+    you should convert it to the pointer to the item and then protect resulting item pointer.
+    Otherwise an unpredictable result may occur.
+
+*/
+namespace intrusive {
+
+    /// @defgroup cds_intrusive_containers Intrusive containers
+    /** @defgroup cds_intrusive_helper Helper structs for intrusive containers
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_stack Stack
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_queue Queue
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_priority_queue Priority queue
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_deque Deque
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_map Set
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_tree Tree
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_list List
+        @ingroup cds_intrusive_containers
+    */
+
+}} // namespace cds::intrusuve
+
+#endif  // #ifndef __CDS_INTRUSIVE_BASE_H
diff --git a/cds/intrusive/basket_queue.h b/cds/intrusive/basket_queue.h
new file mode 100644 (file)
index 0000000..2d4f204
--- /dev/null
@@ -0,0 +1,813 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_BASKET_QUEUE_H
+#define __CDS_INTRUSIVE_BASKET_QUEUE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/details/marked_ptr.h>
+#include <cds/intrusive/queue_stat.h>
+#include <cds/intrusive/single_link_struct.h>
+#include <cds/ref.h>
+#include <cds/intrusive/details/dummy_node_holder.h>
+
+#include <cds/details/std/type_traits.h>
+
+namespace cds { namespace intrusive {
+
+    /// BasketQueue -related definitions
+    /** @ingroup cds_intrusive_helper
+    */
+    namespace basket_queue {
+        /// BasketQueue node
+        /**
+            Template parameters:
+            - GC - garbage collector used
+            - Tag - a tag used to distinguish between different implementation
+        */
+        template <class GC, typename Tag = opt::none>
+        struct node: public GC::container_node
+        {
+            typedef GC      gc  ;   ///< Garbage collector
+            typedef Tag     tag ;   ///< tag
+
+            typedef cds::details::marked_ptr<node, 1>   marked_ptr         ;   ///< marked pointer
+            typedef typename gc::template atomic_marked_ptr< marked_ptr>     atomic_marked_ptr   ;   ///< atomic marked pointer specific for GC
+
+            /// Rebind node for other template parameters
+            template <class GC2, typename Tag2 = tag>
+            struct rebind {
+                typedef node<GC2, Tag2>  other ;    ///< Rebinding result
+            };
+
+            atomic_marked_ptr m_pNext ; ///< pointer to the next node in the container
+
+            node()
+                : m_pNext( null_ptr<node *>() )
+            {}
+        };
+
+        //@cond
+        // Specialization for HRC GC
+        template <typename Tag>
+        struct node< gc::HRC, Tag>: public gc::HRC::container_node
+        {
+            typedef gc::HRC gc  ;   ///< Garbage collector
+            typedef Tag     tag ;   ///< tag
+
+            typedef cds::details::marked_ptr<node, 1>   marked_ptr         ;   ///< marked pointer
+            typedef typename gc::template atomic_marked_ptr< marked_ptr>     atomic_marked_ptr   ;   ///< atomic marked pointer specific for GC
+
+            atomic_marked_ptr m_pNext ; ///< pointer to the next node in the container
+
+            node()
+                : m_pNext(null_ptr<node *>())
+            {}
+
+        protected:
+            virtual void cleanUp( cds::gc::hrc::ThreadGC * pGC )
+            {
+                assert( pGC != null_ptr<cds::gc::hrc::ThreadGC *>() );
+                typename gc::template GuardArray<2> aGuards( *pGC );
+
+                while ( true ) {
+                    marked_ptr pNext = aGuards.protect( 0, m_pNext );
+                    if ( pNext.ptr() && pNext->m_bDeleted.load(CDS_ATOMIC::memory_order_acquire) ) {
+                        marked_ptr p = aGuards.protect( 1, pNext->m_pNext );
+                        m_pNext.compare_exchange_strong( pNext, p, CDS_ATOMIC::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed );
+                        continue;
+                    }
+                    else {
+                        break;
+                    }
+                }
+            }
+
+            virtual void terminate( cds::gc::hrc::ThreadGC * pGC, bool bConcurrent )
+            {
+                if ( bConcurrent ) {
+                    marked_ptr pNext = m_pNext.load(CDS_ATOMIC::memory_order_relaxed);
+                    do {} while ( !m_pNext.compare_exchange_weak( pNext, marked_ptr(), CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) );
+                }
+                else {
+                    m_pNext.store( marked_ptr(), CDS_ATOMIC::memory_order_relaxed );
+                }
+            }
+        };
+        //@endcond
+
+        using single_link::default_hook;
+
+        //@cond
+        template < typename HookType, CDS_DECL_OPTIONS2>
+        struct hook
+        {
+            typedef typename opt::make_options< default_hook, CDS_OPTIONS2>::type  options;
+            typedef typename options::gc    gc;
+            typedef typename options::tag   tag;
+            typedef node<gc, tag> node_type;
+            typedef HookType     hook_type;
+        };
+        //@endcond
+
+
+        /// Base hook
+        /**
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template < CDS_DECL_OPTIONS2 >
+        struct base_hook: public hook< opt::base_hook_tag, CDS_OPTIONS2 >
+        {};
+
+        /// Member hook
+        /**
+            \p MemberOffset defines offset in bytes of \ref node member into your structure.
+            Use \p offsetof macro to define \p MemberOffset
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template < size_t MemberOffset, CDS_DECL_OPTIONS2 >
+        struct member_hook: public hook< opt::member_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            static const size_t c_nMemberOffset = MemberOffset;
+            //@endcond
+        };
+
+        /// Traits hook
+        /**
+            \p NodeTraits defines type traits for node.
+            See \ref node_traits for \p NodeTraits interface description
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template <typename NodeTraits, CDS_DECL_OPTIONS2 >
+        struct traits_hook: public hook< opt::traits_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            typedef NodeTraits node_traits;
+            //@endcond
+        };
+
+
+#if defined(CDS_CXX11_TEMPLATE_ALIAS_SUPPORT) && !defined(CDS_DOXYGEN_INVOKED)
+        template < typename Node, opt::link_check_type LinkType > using get_link_checker = single_link::get_link_checker< Node, LinkType >;
+#else
+        /// Metafunction for selecting appropriate link checking policy
+        template < typename Node, opt::link_check_type LinkType >
+        struct get_link_checker: public single_link::get_link_checker< Node, LinkType >
+        {};
+
+#endif
+
+        /// Basket queue internal statistics. May be used for debugging or profiling
+        /**
+            Basket queue statistics derives from cds::intrusive::queue_stat
+            and extends it by two additional fields specific for the algorithm.
+        */
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat: public cds::intrusive::queue_stat< Counter >
+        {
+            //@cond
+            typedef cds::intrusive::queue_stat< Counter >   base_class;
+            typedef typename base_class::counter_type       counter_type;
+            //@endcond
+
+            counter_type m_TryAddBasket      ;  ///< Count of attemps adding new item to a basket (only or BasketQueue, for other queue this metric is not used)
+            counter_type m_AddBasketCount    ;  ///< Count of events "Enqueue a new item into basket" (only or BasketQueue, for other queue this metric is not used)
+
+            /// Register an attempt t add new item to basket
+            void onTryAddBasket()           { ++m_TryAddBasket; }
+            /// Register event "Enqueue a new item into basket" (only or BasketQueue, for other queue this metric is not used)
+            void onAddBasket()              { ++m_AddBasketCount; }
+
+            //@cond
+            void reset()
+            {
+                base_class::reset();
+                m_TryAddBasket.reset();
+                m_AddBasketCount.reset();
+            }
+
+            stat& operator +=( stat const& s )
+            {
+                base_class::operator +=( s );
+                m_TryAddBasket += s.m_TryAddBasket.get();
+                m_AddBasketCount += s.m_AddBasketCount.get();
+                return *this;
+            }
+            //@endcond
+        };
+
+        /// Dummy basket queue statistics - no counting is performed. Support interface like \ref stat
+        struct dummy_stat: public cds::intrusive::queue_dummy_stat
+        {
+            //@cond
+            void onTryAddBasket()           {}
+            void onAddBasket()              {}
+
+            void reset() {}
+            dummy_stat& operator +=( dummy_stat const& )
+            {
+                return *this;
+            }
+            //@endcond
+        };
+
+    }   // namespace basket_queue
+
+    /// Basket lock-free queue (intrusive variant)
+    /** @ingroup cds_intrusive_queue
+        Implementation of basket queue algorithm.
+
+        \par Source:
+            [2007] Moshe Hoffman, Ori Shalev, Nir Shavit "The Baskets Queue"
+
+        <b>Key idea</b>
+
+        In the \93basket\94 approach, instead of
+        the traditional ordered list of nodes, the queue consists of an ordered list of groups
+        of nodes (logical baskets). The order of nodes in each basket need not be specified, and in
+        fact, it is easiest to maintain them in FIFO order. The baskets fulfill the following basic
+        rules:
+        - Each basket has a time interval in which all its nodes\92 enqueue operations overlap.
+        - The baskets are ordered by the order of their respective time intervals.
+        - For each basket, its nodes\92 dequeue operations occur after its time interval.
+        - The dequeue operations are performed according to the order of baskets.
+
+        Two properties define the FIFO order of nodes:
+        - The order of nodes in a basket is not specified.
+        - The order of nodes in different baskets is the FIFO-order of their respective baskets.
+
+        In algorithms such as the MS-queue or optimistic
+        queue, threads enqueue items by applying a Compare-and-swap (CAS) operation to the
+        queue\92s tail pointer, and all the threads that fail on a particular CAS operation (and also
+        the winner of that CAS) overlap in time. In particular, they share the time interval of
+        the CAS operation itself. Hence, all the threads that fail to CAS on the tail-node of
+        the queue may be inserted into the same basket. By integrating the basket-mechanism
+        as the back-off mechanism, the time usually spent on backing-off before trying to link
+        onto the new tail, can now be utilized to insert the failed operations into the basket,
+        allowing enqueues to complete sooner. In the meantime, the next successful CAS operations
+        by enqueues allow new baskets to be formed down the list, and these can be
+        filled concurrently. Moreover, the failed operations don\92t retry their link attempt on the
+        new tail, lowering the overall contention on it. This leads to a queue
+        algorithm that unlike all former concurrent queue algorithms requires virtually no tuning
+        of the backoff mechanisms to reduce contention, making the algorithm an attractive
+        out-of-the-box queue.
+
+        In order to enqueue, just as in MSQueue, a thread first tries to link the new node to
+        the last node. If it failed to do so, then another thread has already succeeded. Thus it
+        tries to insert the new node into the new basket that was created by the winner thread.
+        To dequeue a node, a thread first reads the head of the queue to obtain the
+        oldest basket. It may then dequeue any node in the oldest basket.
+
+        <b>Template arguments:</b>
+        - \p GC - garbage collector type: gc::HP, gc::HRC, gc::PTB
+        - \p T - type to be stored in the queue, should be convertible to \ref single_link::node
+        - \p Options - options
+
+        <b>Type of node</b>: \ref single_link::node
+
+        \p Options are:
+        - opt::hook - hook used. Possible values are: basket_queue::base_hook, basket_queue::member_hook, basket_queue::traits_hook.
+            If the option is not specified, <tt>basket_queue::base_hook<></tt> is used.
+            For Gidenstam's gc::HRC, only basket_queue::base_hook is supported.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer. This option is used
+            in \ref dequeue function.
+        - opt::link_checker - the type of node's link fields checking. Default is \ref opt::debug_check_link
+            Note: for gc::HRC garbage collector, link checking policy is always selected as \ref opt::always_check_link.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter (no item counting feature)
+        - opt::stat - the type to gather internal statistics.
+            Possible option value are: \ref basket_queue::stat, \ref basket_queue::dummy_stat,
+            user-provided class that supports basket_queue::stat interface.
+            Default is \ref basket_queue::dummy_stat.
+            Generic option intrusive::queue_stat and intrusive::queue_dummy_stat are acceptable too, however,
+            they will be automatically converted to basket_queue::stat and basket_queue::dummy_stat
+            respectively.
+        - opt::alignment - the alignment for internal queue data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        Garbage collecting schema \p GC must be consistent with the basket_queue::node GC.
+
+        \par About item disposing
+        Like MSQueue, the Baskets queue algo has a key feature: even if the queue is empty it contains one item that is "dummy" one from
+        the standpoint of the algo. See \ref dequeue function doc for explanation.
+
+        \par Examples
+        \code
+        #include <cds/intrusive/basket_queue.h>
+        #include <cds/gc/hp.h>
+
+        namespace ci = cds::inrtusive;
+        typedef cds::gc::HP hp_gc;
+
+        // Basket queue with Hazard Pointer garbage collector, base hook + item disposer:
+        struct Foo: public ci::basket_queue::node< hp_gc >
+        {
+            // Your data
+            ...
+        };
+
+        // Disposer for Foo struct just deletes the object passed in
+        struct fooDisposer {
+            void operator()( Foo * p )
+            {
+                delete p;
+            }
+        };
+
+        typedef ci::BasketQueue< hp_gc,
+            Foo
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<hp_gc> >
+            >
+            ,ci::opt::disposer< fooDisposer >
+        > fooQueue;
+
+        // BasketQueue with Hazard Pointer garbage collector,
+        // member hook + item disposer + item counter,
+        // without alignment of internal queue data:
+        struct Bar
+        {
+            // Your data
+            ...
+            ci::basket_queue::node< hp_gc > hMember;
+        };
+
+        typedef ci::BasketQueue< hp_gc,
+            Foo
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(Bar, hMember)
+                    ,ci::opt::gc<hp_gc>
+                >
+            >
+            ,ci::opt::disposer< fooDisposer >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+            ,cds::opt::alignment< cds::opt::no_special_alignment >
+        > barQueue;
+        \endcode
+    */
+    template <typename GC, typename T, CDS_DECL_OPTIONS9>
+    class BasketQueue
+    {
+        //@cond
+        struct default_options
+        {
+            typedef cds::backoff::empty             back_off;
+            typedef basket_queue::base_hook<>       hook;
+            typedef opt::v::empty_disposer          disposer;
+            typedef atomicity::empty_item_counter   item_counter;
+            typedef basket_queue::dummy_stat        stat;
+            typedef opt::v::relaxed_ordering        memory_model;
+            static const opt::link_check_type link_checker = opt::debug_check_link;
+            enum { alignment = opt::cache_line_alignment };
+        };
+        //@endcond
+
+    public:
+        //@cond
+        typedef typename opt::make_options<
+            typename cds::opt::find_type_traits< default_options, CDS_OPTIONS9 >::type
+            ,CDS_OPTIONS9
+        >::type   options;
+
+        typedef typename std::conditional<
+            std::is_same<typename options::stat, cds::intrusive::queue_stat<> >::value
+            ,basket_queue::stat<>
+            ,typename std::conditional<
+                std::is_same<typename options::stat, cds::intrusive::queue_dummy_stat>::value
+                ,basket_queue::dummy_stat
+                ,typename options::stat
+            >::type
+        >::type stat_type_;
+
+        //@endcond
+
+    public:
+        typedef T  value_type   ;   ///< type of value stored in the queue
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+        typedef typename basket_queue::get_link_checker< node_type, options::link_checker >::type link_checker   ;   ///< link checker
+
+        typedef GC gc          ;   ///< Garbage collector
+        typedef typename options::back_off  back_off    ;   ///< back-off strategy
+        typedef typename options::item_counter item_counter ;   ///< Item counting policy used
+#ifdef CDS_DOXYGEN_INVOKED
+        typedef typename options::stat      stat        ;   ///< Internal statistics policy used
+#else
+        typedef stat_type_  stat;
+#endif
+        typedef typename options::memory_model  memory_model ;   ///< Memory ordering. See cds::opt::memory_model option
+
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS9>
+        struct rebind {
+            typedef BasketQueue< GC2, T2, CDS_OTHER_OPTIONS9> other   ;   ///< Rebinding result
+        };
+
+        static const size_t m_nHazardPtrCount = 6 ; ///< Count of hazard pointer required for the algorithm
+
+    protected:
+        //@cond
+
+        struct internal_disposer
+        {
+            void operator()( value_type * p )
+            {
+                assert( p != null_ptr<value_type *>());
+
+                BasketQueue::clear_links( node_traits::to_node_ptr(p) );
+                disposer()( p );
+            }
+        };
+
+        typedef typename node_type::marked_ptr   marked_ptr;
+        typedef typename node_type::atomic_marked_ptr atomic_marked_ptr;
+
+        typedef intrusive::node_to_value<BasketQueue> node_to_value;
+        typedef typename opt::details::alignment_setter< atomic_marked_ptr, options::alignment >::type aligned_node_ptr;
+        typedef typename opt::details::alignment_setter<
+            cds::intrusive::details::dummy_node< gc, node_type>,
+            options::alignment
+        >::type    dummy_node_type;
+
+        //@endcond
+
+        aligned_node_ptr    m_pHead ;           ///< Queue's head pointer (aligned)
+        aligned_node_ptr    m_pTail ;           ///< Queue's tail pointer (aligned)
+
+        dummy_node_type     m_Dummy ;           ///< dummy node
+        item_counter        m_ItemCounter   ;   ///< Item counter
+        stat                m_Stat  ;           ///< Internal statistics
+        //@cond
+        size_t const        m_nMaxHops;
+        //@endcond
+
+        //@cond
+
+        template <size_t Count>
+        static marked_ptr guard_node( typename gc::template GuardArray<Count>& g, size_t idx, atomic_marked_ptr const& p )
+        {
+            marked_ptr pg;
+            while ( true ) {
+                pg = p.load( memory_model::memory_order_relaxed );
+                g.assign( idx, node_traits::to_value_ptr( pg.ptr() ) );
+                if ( p.load( memory_model::memory_order_acquire) == pg ) {
+                    return pg;
+                }
+            }
+        }
+
+        static marked_ptr guard_node( typename gc::Guard& g, atomic_marked_ptr const& p )
+        {
+            marked_ptr pg;
+            while ( true ) {
+                pg = p.load( memory_model::memory_order_relaxed );
+                g.assign( node_traits::to_value_ptr( pg.ptr() ) );
+                if ( p.load( memory_model::memory_order_acquire) == pg ) {
+                    return pg;
+                }
+            }
+        }
+
+        struct dequeue_result {
+            typename gc::template GuardArray<3>  guards;
+            node_type * pNext;
+        };
+
+        bool do_dequeue( dequeue_result& res, bool bDeque )
+        {
+            // Note:
+            // If bDeque == false then the function is called from empty method and no real dequeuing operation is performed
+
+            back_off bkoff;
+
+            marked_ptr h;
+            marked_ptr t;
+            marked_ptr pNext;
+
+            while ( true ) {
+                h = guard_node( res.guards, 0, m_pHead );
+                t = guard_node( res.guards, 1, m_pTail );
+                pNext = guard_node( res.guards, 2, h->m_pNext );
+
+                if ( h == m_pHead.load( memory_model::memory_order_acquire ) ) {
+                    if ( h.ptr() == t.ptr() ) {
+                        if ( !pNext.ptr() )
+                            return false;
+
+                        {
+                            typename gc::Guard g;
+                            while ( pNext->m_pNext.load(memory_model::memory_order_relaxed).ptr() && m_pTail.load(memory_model::memory_order_relaxed) == t ) {
+                                pNext = guard_node( g, pNext->m_pNext );
+                                res.guards.assign( 2, g.template get<value_type>() );
+                            }
+                        }
+
+                        m_pTail.compare_exchange_weak( t, marked_ptr(pNext.ptr()), memory_model::memory_order_release, memory_model::memory_order_relaxed );
+                    }
+                    else {
+                        marked_ptr iter( h );
+                        size_t hops = 0;
+
+                        typename gc::Guard g;
+
+                        while ( pNext.ptr() && pNext.bits() && iter.ptr() != t.ptr() && m_pHead.load(memory_model::memory_order_relaxed) == h ) {
+                            iter = pNext;
+                            g.assign( res.guards.template get<value_type>(2) );
+                            pNext = guard_node( res.guards, 2, pNext->m_pNext );
+                            ++hops;
+                        }
+
+                        if ( m_pHead.load(memory_model::memory_order_relaxed) != h )
+                            continue;
+
+                        if ( iter.ptr() == t.ptr() )
+                            free_chain( h, iter );
+                        else if ( bDeque ) {
+                            res.pNext = pNext.ptr();
+
+                            if ( iter->m_pNext.compare_exchange_weak( pNext, marked_ptr( pNext.ptr(), 1 ), memory_model::memory_order_release, memory_model::memory_order_relaxed ) ) {
+                                if ( hops >= m_nMaxHops )
+                                    free_chain( h, pNext );
+                                break;
+                            }
+                        }
+                        else
+                            return true;
+                    }
+                }
+
+                if ( bDeque )
+                    m_Stat.onDequeueRace();
+                bkoff();
+            }
+
+            if ( bDeque ) {
+                --m_ItemCounter;
+                m_Stat.onDequeue();
+            }
+
+            return true;
+        }
+
+        void free_chain( marked_ptr head, marked_ptr newHead )
+        {
+            // "head" and "newHead" are guarded
+
+            if ( m_pHead.compare_exchange_strong( head, marked_ptr(newHead.ptr()), memory_model::memory_order_release, memory_model::memory_order_relaxed ))
+            {
+                typename gc::template GuardArray<2> guards;
+                guards.assign( 0, node_traits::to_value_ptr(head.ptr()) );
+                while ( head.ptr() != newHead.ptr() ) {
+                    marked_ptr pNext = guard_node( guards, 1, head->m_pNext );
+                    assert( pNext.bits() != 0 );
+                    dispose_node( head.ptr() );
+                    guards.assign( 0, guards.template get<value_type>(1) );
+                    head = pNext;
+                }
+            }
+        }
+
+        static void clear_links( node_type * pNode )
+        {
+            pNode->m_pNext.store( marked_ptr( null_ptr<node_type *>()), memory_model::memory_order_release );
+        }
+
+        void dispose_node( node_type * p )
+        {
+            if ( p != m_Dummy.get() ) {
+                gc::template retire<internal_disposer>( node_traits::to_value_ptr(p) );
+            }
+            else
+                m_Dummy.retire();
+        }
+        //@endcond
+
+    public:
+        /// Initializes empty queue
+        BasketQueue()
+            : m_pHead( null_ptr<node_type *>() )
+            , m_pTail( null_ptr<node_type *>() )
+            , m_nMaxHops( 3 )
+        {
+            // GC and node_type::gc must be the same
+            static_assert(( std::is_same<gc, typename node_type::gc>::value ), "GC and node_type::gc must be the same");
+
+            // For cds::gc::HRC, only one base_hook is allowed
+            static_assert((
+                std::conditional<
+                    std::is_same<gc, cds::gc::HRC>::value,
+                    std::is_same< typename hook::hook_type, opt::base_hook_tag >,
+                    boost::true_type
+                >::type::value
+            ), "For cds::gc::HRC, only base_hook is allowed");
+
+            // Head/tail initialization should be made via store call
+            // because of gc::HRC manages reference counting
+            m_pHead.store( marked_ptr(m_Dummy.get()), memory_model::memory_order_relaxed );
+            m_pTail.store( marked_ptr(m_Dummy.get()), memory_model::memory_order_relaxed );
+        }
+
+        /// Destructor clears the queue
+        /**
+            Since the baskets queue contains at least one item even
+            if the queue is empty, the destructor may call item disposer.
+        */
+        ~BasketQueue()
+        {
+            clear();
+
+            node_type * pHead = m_pHead.load(memory_model::memory_order_relaxed).ptr();
+            assert( pHead != null_ptr<node_type *>() );
+
+            {
+                node_type * pNext = pHead->m_pNext.load( memory_model::memory_order_relaxed ).ptr();
+                while ( pNext ) {
+                    node_type * p = pNext;
+                    pNext = pNext->m_pNext.load( memory_model::memory_order_relaxed ).ptr();
+                    p->m_pNext.store( marked_ptr(), memory_model::memory_order_relaxed );
+                    dispose_node( p );
+                }
+                pHead->m_pNext.store( marked_ptr(), memory_model::memory_order_relaxed );
+                //m_pTail.store( marked_ptr( pHead ), memory_model::memory_order_relaxed );
+            }
+
+            m_pHead.store( marked_ptr( null_ptr<node_type *>()), memory_model::memory_order_relaxed );
+            m_pTail.store( marked_ptr( null_ptr<node_type *>()), memory_model::memory_order_relaxed );
+
+            dispose_node( pHead );
+        }
+
+        /// Returns queue's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the queue
+            is empty. To check queue emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+        /// Returns reference to internal statistics
+        const stat& statistics() const
+        {
+            return m_Stat;
+        }
+
+        /// Enqueues \p val value into the queue.
+        /** @anchor cds_intrusive_BasketQueue_enqueue
+            The function always returns \p true.
+        */
+        bool enqueue( value_type& val )
+        {
+            node_type * pNew = node_traits::to_node_ptr( val );
+            link_checker::is_empty( pNew );
+
+            typename gc::Guard guard;
+            back_off bkoff;
+
+            marked_ptr t;
+            while ( true ) {
+                t = guard_node( guard, m_pTail );
+
+                marked_ptr pNext = t->m_pNext.load(memory_model::memory_order_acquire );
+
+                if ( pNext.ptr() == null_ptr<node_type *>() ) {
+                    pNew->m_pNext.store( marked_ptr(), memory_model::memory_order_release );
+                    if ( t->m_pNext.compare_exchange_weak( pNext, marked_ptr(pNew), memory_model::memory_order_release, memory_model::memory_order_relaxed ) ) {
+                        if ( !m_pTail.compare_exchange_strong( t, marked_ptr(pNew), memory_model::memory_order_release, memory_model::memory_order_relaxed ))
+                            m_Stat.onAdvanceTailFailed();
+                        break;
+                    }
+
+                    // Try adding to basket
+                    m_Stat.onTryAddBasket();
+
+                    // Reread tail next
+                    typename gc::Guard gNext;
+
+                try_again:
+                    pNext = guard_node( gNext, t->m_pNext );
+
+                    // add to the basket
+                    if ( m_pTail.load(memory_model::memory_order_relaxed) == t
+                         && t->m_pNext.load( memory_model::memory_order_relaxed) == pNext
+                         && !pNext.bits()  )
+                    {
+                        bkoff();
+                        pNew->m_pNext.store( pNext, memory_model::memory_order_release );
+                        if ( t->m_pNext.compare_exchange_weak( pNext, marked_ptr( pNew ), memory_model::memory_order_release, memory_model::memory_order_relaxed )) {
+                            m_Stat.onAddBasket();
+                            break;
+                        }
+                        goto try_again;
+                    }
+                }
+                else {
+                    // Tail is misplaced, advance it
+
+                    typename gc::template GuardArray<2> g;
+                    g.assign( 0, node_traits::to_value_ptr( pNext.ptr() ) );
+                    if ( t->m_pNext.load( memory_model::memory_order_relaxed ) != pNext ) {
+                        m_Stat.onEnqueueRace();
+                        bkoff();
+                        continue;
+                    }
+
+                    marked_ptr p;
+                    bool bTailOk = true;
+                    while ( ( p = pNext->m_pNext.load(memory_model::memory_order_relaxed) ).ptr() != null_ptr<node_type *>() )
+                    {
+                        bTailOk = m_pTail.load( memory_model::memory_order_relaxed ) == t;
+                        if ( !bTailOk )
+                            break;
+
+                        g.assign( 1, node_traits::to_value_ptr( p.ptr() ));
+                        if ( pNext->m_pNext.load(memory_model::memory_order_relaxed) != p )
+                            continue;
+                        pNext = p;
+                        g.assign( 0, g.template get<value_type>( 1 ) );
+                    }
+                    if ( !bTailOk || !m_pTail.compare_exchange_weak( t, marked_ptr( pNext.ptr() ), memory_model::memory_order_release, memory_model::memory_order_relaxed ))
+                        m_Stat.onAdvanceTailFailed();
+
+                    m_Stat.onBadTail();
+                }
+
+                m_Stat.onEnqueueRace();
+            }
+
+            ++m_ItemCounter;
+            m_Stat.onEnqueue();
+
+            return true;
+        }
+
+        /// Dequeues a value from the queue
+        /** @anchor cds_intrusive_BasketQueue_dequeue
+            If the queue is empty the function returns \p NULL.
+
+            <b>Warning</b>: see MSQueue::deque note about item disposing
+        */
+        value_type * dequeue()
+        {
+            dequeue_result res;
+
+            if ( do_dequeue( res, true ))
+                return node_traits::to_value_ptr( *res.pNext );
+            return null_ptr<value_type *>();
+        }
+
+        /// Synonym for \ref cds_intrusive_BasketQueue_enqueue "enqueue" function
+        bool push( value_type& val )
+        {
+            return enqueue( val );
+        }
+
+        /// Synonym for \ref cds_intrusive_BasketQueue_dequeue "dequeue" function
+        value_type * pop()
+        {
+            return dequeue();
+        }
+
+        /// Checks if the queue is empty
+        /**
+            Note that this function is not \p const.
+            The function is based on \ref dequeue algorithm
+            but really does not dequeued any item.
+        */
+        bool empty()
+        {
+            dequeue_result res;
+            return !do_dequeue( res, false );
+        }
+
+        /// Clear the queue
+        /**
+            The function repeatedly calls \ref dequeue until it returns \p NULL.
+            The disposer defined in template \p Options is called for each item
+            that can be safely disposed.
+        */
+        void clear()
+        {
+            while ( dequeue() );
+        }
+    };
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_BASKET_QUEUE_H
diff --git a/cds/intrusive/cuckoo_set.h b/cds/intrusive/cuckoo_set.h
new file mode 100644 (file)
index 0000000..99d1c4b
--- /dev/null
@@ -0,0 +1,2878 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_CUCKOO_SET_H
+#define __CDS_INTRUSIVE_CUCKOO_SET_H
+
+#include <cds/intrusive/base.h>
+#include <cds/opt/compare.h>
+#include <cds/opt/hash.h>
+#include <cds/lock/array.h>
+#include <cds/details/std/type_traits.h>
+#include <cds/ref.h>
+#include <cds/os/thread.h>
+#include <cds/details/std/memory.h>
+#include <cds/details/functor_wrapper.h>
+#include <cds/lock/spinlock.h>
+
+#include <cds/details/std/mutex.h>
+//#include <boost/thread/recursive_mutex.hpp>
+
+namespace cds { namespace intrusive {
+
+    /// CuckooSet-related definitions
+    namespace cuckoo {
+
+        /// Option to define probeset type
+        /**
+            The option specifies probeset type for the CuckooSet.
+            Available values:
+            - \p cds::intrusive::cuckoo::list - the probeset is a single-linked list.
+                The node contains pointer to next node in probeset.
+            - \p cds::intrusive::cuckoo::vector<Capacity> - the probeset is a vector
+                with constant-size \p Capacity where \p Capacity is an <tt>unsigned int</tt> constant.
+                The node does not contain any auxiliary data.
+        */
+        template <typename Type>
+        struct probeset_type
+        {
+            //@cond
+            template <typename Base>
+            struct pack: public Base {
+                typedef Type    probeset_type;
+            };
+            //@endcond
+        };
+
+        /// Option specifying whether to store hash values in the node
+        /**
+             This option reserves additional space in the hook to store the hash value of the object once it's introduced in the container.
+             When this option is used, the unordered container will store the calculated hash value in the hook and rehashing operations won't need
+             to recalculate the hash of the value. This option will improve the performance of unordered containers
+             when rehashing is frequent or hashing the value is a slow operation
+
+             The \p Count template parameter defines the size of hash array. Remember that cuckoo hashing implies at least two
+             hash values per item.
+
+             Possible values of \p Count:
+             - 0 - no hash storing in the node
+             - greater that 1 - store hash values.
+
+             Value 1 is deprecated.
+        */
+        template <unsigned int Count>
+        struct store_hash
+        {
+            //@cond
+            template <typename Base>
+            struct pack: public Base {
+                static unsigned int const store_hash = Count;
+            };
+            //@endcond
+        };
+
+
+        //@cond
+        // Probeset type placeholders
+        struct list_probeset_class;
+        struct vector_probeset_class;
+        //@endcond
+
+        //@cond
+        // Probeset type declarations.
+        struct list;
+        template <unsigned int Capacity>
+        struct vector
+        {
+            static unsigned int const c_nCapacity = Capacity;
+        };
+        //@endcond
+
+        /// CuckooSet node
+        /**
+            Template arguments:
+            - \p ProbesetType - type of probeset. Can be \p cds::intrusive::cuckoo::list
+                or \p cds::intrusive::cuckoo::vector<Capacity>.
+            - \p StoreHashCount - constant that defines whether to store node hash values.
+                See cuckoo::store_hash option for explanation
+            - Tag - a tag used to distinguish between different implementation when two or more
+                \p node is needed in single struct.
+        */
+        template <typename ProbesetType = cuckoo::list, unsigned int StoreHashCount = 0, typename Tag = opt::none>
+        struct node
+#ifdef CDS_DOXYGEN_INVOKED
+        {
+            typedef ProbesetType    probeset_type   ;   ///< Probeset type
+            typedef Tag             tag             ;   ///< Tag
+            static unsigned int const hash_array_size = StoreHashCount ;    ///< The size of hash array
+        }
+#endif
+;
+
+        //@cond
+        template <typename Tag>
+        struct node< cuckoo::list, 0, Tag>
+        {
+            typedef list_probeset_class probeset_class;
+            typedef cuckoo::list        probeset_type;
+            typedef Tag                 tag;
+            static unsigned int const hash_array_size = 0;
+            static unsigned int const probeset_size = 0;
+
+            node *  m_pNext;
+
+            CDS_CONSTEXPR node() CDS_NOEXCEPT
+                : m_pNext( null_ptr<node *>() )
+            {}
+
+            void store_hash( size_t * )
+            {}
+
+            size_t * get_hash() const
+            {
+                // This node type does not store hash values!!!
+                assert(false);
+                return null_ptr<size_t *>();
+            }
+
+            void clear()
+            {
+                m_pNext = null_ptr<node *>();
+            }
+        };
+
+        template <unsigned int StoreHashCount, typename Tag>
+        struct node< cuckoo::list, StoreHashCount, Tag>
+        {
+            typedef list_probeset_class probeset_class;
+            typedef cuckoo::list        probeset_type;
+            typedef Tag                 tag;
+            static unsigned int const hash_array_size = StoreHashCount;
+            static unsigned int const probeset_size = 0;
+
+            node *  m_pNext;
+            size_t  m_arrHash[ hash_array_size ];
+
+            node() CDS_NOEXCEPT
+                : m_pNext( null_ptr<node *>() )
+            {
+                memset( m_arrHash, 0, sizeof(m_arrHash));
+            }
+
+            void store_hash( size_t * pHashes )
+            {
+                memcpy( m_arrHash, pHashes, hash_array_size );
+            }
+
+            size_t * get_hash() const
+            {
+                return const_cast<size_t *>( m_arrHash );
+            }
+
+            void clear()
+            {
+                m_pNext = null_ptr<node *>();
+            }
+
+        };
+
+        template <unsigned int VectorSize, typename Tag>
+        struct node< cuckoo::vector<VectorSize>, 0, Tag>
+        {
+            typedef vector_probeset_class       probeset_class;
+            typedef cuckoo::vector<VectorSize>  probeset_type;
+            typedef Tag                         tag;
+            static unsigned int const hash_array_size = 0;
+            static unsigned int const probeset_size = probeset_type::c_nCapacity;
+
+            node() CDS_NOEXCEPT
+            {}
+
+            void store_hash( size_t * )
+            {}
+
+            size_t * get_hash() const
+            {
+                // This node type does not store hash values!!!
+                assert(false);
+                return null_ptr<size_t *>();
+            }
+
+            void clear()
+            {}
+        };
+
+        template <unsigned int VectorSize, unsigned int StoreHashCount, typename Tag>
+        struct node< cuckoo::vector<VectorSize>, StoreHashCount, Tag>
+        {
+            typedef vector_probeset_class       probeset_class;
+            typedef cuckoo::vector<VectorSize>  probeset_type;
+            typedef Tag                         tag;
+            static unsigned int const hash_array_size = StoreHashCount;
+            static unsigned int const probeset_size = probeset_type::c_nCapacity;
+
+            size_t  m_arrHash[ hash_array_size ];
+
+            node() CDS_NOEXCEPT
+            {
+                memset( m_arrHash, 0, sizeof(m_arrHash));
+            }
+
+            void store_hash( size_t * pHashes )
+            {
+                memcpy( m_arrHash, pHashes, hash_array_size );
+            }
+
+            size_t * get_hash() const
+            {
+                return const_cast<size_t *>( m_arrHash );
+            }
+
+            void clear()
+            {}
+        };
+        //@endcond
+
+
+        //@cond
+        struct default_hook {
+            typedef cuckoo::list probeset_type;
+            static unsigned int const store_hash = 0;
+            typedef opt::none   tag;
+        };
+
+        template < typename HookType, CDS_DECL_OPTIONS3>
+        struct hook
+        {
+            typedef typename opt::make_options< default_hook, CDS_OPTIONS3>::type  options;
+
+            typedef typename options::probeset_type probeset_type;
+            typedef typename options::tag tag;
+            static unsigned int const store_hash = options::store_hash;
+
+            typedef node<probeset_type, store_hash, tag>   node_type;
+
+            typedef HookType        hook_type;
+        };
+        //@endcond
+
+        /// Base hook
+        /**
+            \p Options are:
+            - cuckoo::probeset_type - probeset type. Defaul is \p cuckoo::list
+            - cuckoo::store_hash - store hash values in the node or not. Default is 0 (no storing)
+            - opt::tag - tag to distinguish different nodes in one struct. Default is opt::none
+        */
+        template < CDS_DECL_OPTIONS3 >
+        struct base_hook: public hook< opt::base_hook_tag, CDS_OPTIONS3 >
+        {};
+
+        /// Member hook
+        /**
+            \p MemberOffset defines offset in bytes of \ref node member into your structure.
+            Use \p offsetof macro to define \p MemberOffset
+
+            \p Options are:
+            - cuckoo::probeset_type - probeset type. Defaul is \p cuckoo::list
+            - cuckoo::store_hash - store hash values in the node or not. Default is 0 (no storing)
+            - opt::tag - tag to distinguish different nodes in one struct. Default is opt::none
+        */
+        template < size_t MemberOffset, CDS_DECL_OPTIONS3 >
+        struct member_hook: public hook< opt::member_hook_tag, CDS_OPTIONS3 >
+        {
+            //@cond
+            static const size_t c_nMemberOffset = MemberOffset;
+            //@endcond
+        };
+
+        /// Traits hook
+        /**
+            \p NodeTraits defines type traits for node.
+            See \ref node_traits for \p NodeTraits interface description
+
+            \p Options are:
+            - cuckoo::probeset_type - probeset type. Defaul is \p cuckoo::list
+            - cuckoo::store_hash - store hash values in the node or not. Default is 0 (no storing)
+            - opt::tag - tag to distinguish different nodes in one struct. Default is opt::none
+        */
+        template <typename NodeTraits, CDS_DECL_OPTIONS3 >
+        struct traits_hook: public hook< opt::traits_hook_tag, CDS_OPTIONS3 >
+        {
+            //@cond
+            typedef NodeTraits node_traits;
+            //@endcond
+        };
+
+        /// Internal statistics for \ref striping mutex policy
+        struct striping_stat {
+            typedef cds::atomicity::event_counter   counter_type;   ///< Counter type
+
+            counter_type   m_nCellLockCount    ;  ///< Count of obtaining cell lock
+            counter_type   m_nCellTryLockCount ;  ///< Count of cell \p try_lock attempts
+            counter_type   m_nFullLockCount    ;  ///< Count of obtaining full lock
+            counter_type   m_nResizeLockCount  ;  ///< Count of obtaining resize lock
+            counter_type   m_nResizeCount      ;  ///< Count of resize event
+
+            //@cond
+            void    onCellLock()    { ++m_nCellLockCount; }
+            void    onCellTryLock() { ++m_nCellTryLockCount; }
+            void    onFullLock()    { ++m_nFullLockCount; }
+            void    onResizeLock()  { ++m_nResizeLockCount;   }
+            void    onResize()      { ++m_nResizeCount; }
+            //@endcond
+        };
+
+        /// Dummy internal statistics for \ref striping mutex policy
+        struct empty_striping_stat {
+            //@cond
+            void    onCellLock()    const {}
+            void    onCellTryLock() const {}
+            void    onFullLock()    const {}
+            void    onResizeLock()  const {}
+            void    onResize()      const {}
+            //@endcond
+        };
+
+        /// Lock striping concurrent access policy
+        /**
+            This is one of available opt::mutex_policy option type for CuckooSet
+
+            Lock striping is very simple technique.
+            The cuckoo set consists of the bucket tables and the array of locks.
+            There is single lock array for each bucket table, at least, the count of bucket table is 2.
+            Initially, the capacity of lock array and each bucket table is the same.
+            When set is resized, bucket table capacity will be doubled but lock array will not.
+            The lock \p i protects each bucket \p j, where <tt> j = i mod L </tt>,
+            where \p L - the size of lock array.
+
+            The policy contains an internal array of \p RecursiveLock locks.
+
+            Template arguments:
+            - \p RecursiveLock - the type of recursive mutex. The default is \p cds_std::recursive_mutex. The mutex type should be default-constructible.
+                Note that a recursive spin-lock is not suitable for lock striping for performance reason.
+            - \p Arity - unsigned int constant that specifies an arity. The arity is the count of hash functors, i.e., the
+                count of lock arrays. Default value is 2.
+            - \p Alloc - allocator type used for lock array memory allocation. Default is \p CDS_DEFAULT_ALLOCATOR.
+            - \p Stat - internal statistics type. Note that this template argument is automatically selected by \ref CuckooSet
+                class according to its \p opt::stat option.
+        */
+        template <
+            class RecursiveLock = cds_std::recursive_mutex,
+            unsigned int Arity = 2,
+            class Alloc = CDS_DEFAULT_ALLOCATOR,
+            class Stat = empty_striping_stat
+        >
+        class striping
+        {
+        public:
+            typedef RecursiveLock   lock_type       ;   ///< lock type
+            typedef Alloc           allocator_type  ;   ///< allocator type
+            static unsigned int const c_nArity = Arity ;    ///< the arity
+            typedef Stat            statistics_type ;   ///< Internal statistics type (\ref striping_stat or \ref empty_striping_stat)
+
+            //@cond
+            typedef striping_stat       real_stat;
+            typedef empty_striping_stat empty_stat;
+
+            template <typename Stat2>
+            struct rebind_statistics {
+                typedef striping<lock_type, c_nArity, allocator_type, Stat2> other;
+            };
+            //@endcond
+
+            typedef cds::lock::array< lock_type, cds::lock::pow2_select_policy, allocator_type >    lock_array_type ;   ///< lock array type
+
+        protected:
+            //@cond
+            class lock_array: public lock_array_type
+            {
+            public:
+                // placeholder ctor
+                lock_array(): lock_array_type( typename lock_array_type::select_cell_policy(2) ) {}
+
+                // real ctor
+                lock_array( size_t nCapacity ): lock_array_type( nCapacity, typename lock_array_type::select_cell_policy(nCapacity) ) {}
+            };
+
+            class scoped_lock: public cds::lock::scoped_lock< lock_array_type >
+            {
+                typedef cds::lock::scoped_lock< lock_array_type > base_class;
+            public:
+                scoped_lock( lock_array& arrLock, size_t nHash ): base_class( arrLock, nHash ) {}
+            };
+            //@endcond
+
+        protected:
+            //@cond
+            lock_array      m_Locks[c_nArity] ;   ///< array of lock_array_type
+            statistics_type m_Stat              ; ///< internal statistics
+            //@endcond
+
+        public:
+            //@cond
+            class scoped_cell_lock {
+                lock_type * m_guard[c_nArity];
+
+            public:
+                scoped_cell_lock( striping& policy, size_t const* arrHash )
+                {
+                    for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                        m_guard[i] = &( policy.m_Locks[i].at( policy.m_Locks[i].lock( arrHash[i] )));
+                    }
+                    policy.m_Stat.onCellLock();
+                }
+
+                ~scoped_cell_lock()
+                {
+                    for ( unsigned int i = 0; i < c_nArity; ++i )
+                        m_guard[i]->unlock();
+                }
+            };
+
+            class scoped_cell_trylock
+            {
+                typedef typename lock_array_type::lock_type lock_type;
+
+                lock_type * m_guard[c_nArity];
+                bool        m_bLocked;
+
+            public:
+                scoped_cell_trylock( striping& policy, size_t const* arrHash )
+                {
+                    size_t nCell = policy.m_Locks[0].try_lock( arrHash[0] );
+                    m_bLocked = nCell != lock_array_type::c_nUnspecifiedCell;
+                    if ( m_bLocked ) {
+                        m_guard[0] = &(policy.m_Locks[0].at(nCell));
+                        for ( unsigned int i = 1; i < c_nArity; ++i ) {
+                            m_guard[i] = &( policy.m_Locks[i].at( policy.m_Locks[i].lock( arrHash[i] )) );
+                        }
+                    }
+                    else {
+                        std::fill( m_guard, m_guard + c_nArity, null_ptr<lock_type *>() );
+                    }
+                    policy.m_Stat.onCellTryLock();
+                }
+                ~scoped_cell_trylock()
+                {
+                    if ( m_bLocked ) {
+                        for ( unsigned int i = 0; i < c_nArity; ++i )
+                            m_guard[i]->unlock();
+                    }
+                }
+
+                bool locked() const
+                {
+                    return m_bLocked;
+                }
+            };
+
+            class scoped_full_lock {
+                cds::lock::scoped_lock< lock_array_type >   m_guard;
+            public:
+                scoped_full_lock( striping& policy )
+                    : m_guard( policy.m_Locks[0] )
+                {
+                    policy.m_Stat.onFullLock();
+                }
+
+                /// Ctor for scoped_resize_lock - no statistics is incremented
+                scoped_full_lock( striping& policy, bool )
+                    : m_guard( policy.m_Locks[0] )
+                {}
+            };
+
+            class scoped_resize_lock: public scoped_full_lock {
+            public:
+                scoped_resize_lock( striping& policy )
+                    : scoped_full_lock( policy, false )
+                {
+                    policy.m_Stat.onResizeLock();
+                }
+            };
+            //@endcond
+
+        public:
+            /// Constructor
+            striping(
+                size_t nLockCount          ///< The size of lock array. Must be power of two.
+            )
+            {
+                // Trick: initialize the array of locks
+                for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                    lock_array * pArr = m_Locks + i;
+                    pArr->lock_array::~lock_array();
+                    new ( pArr ) lock_array( nLockCount );
+                }
+            }
+
+            /// Returns lock array size
+            /**
+                Lock array size is unchanged during \p striping object lifetime
+            */
+            size_t lock_count() const
+            {
+                return m_Locks[0].size();
+            }
+
+            //@cond
+            void resize( size_t )
+            {
+                m_Stat.onResize();
+            }
+            //@endcond
+
+            /// Returns the arity of striping mutex policy
+            CDS_CONSTEXPR unsigned int arity() const CDS_NOEXCEPT
+            {
+                return c_nArity;
+            }
+
+            /// Returns internal statistics
+            statistics_type const& statistics() const
+            {
+                return m_Stat;
+            }
+        };
+
+        /// Internal statistics for \ref refinable mutex policy
+        struct refinable_stat {
+            typedef cds::atomicity::event_counter   counter_type    ;   ///< Counter type
+
+            counter_type   m_nCellLockCount         ;   ///< Count of obtaining cell lock
+            counter_type   m_nCellLockWaitResizing  ;   ///< Count of loop iteration to wait for resizing
+            counter_type   m_nCellLockArrayChanged  ;   ///< Count of event "Lock array has been changed when obtaining cell lock"
+            counter_type   m_nCellLockFailed        ;   ///< Count of event "Cell lock failed because of the array is owned by other thread"
+
+            counter_type   m_nSecondCellLockCount   ;   ///< Count of obtaining cell lock when another cell is already locked
+            counter_type   m_nSecondCellLockFailed  ;   ///< Count of unsuccess obtaining cell lock when another cell is already locked
+
+            counter_type   m_nFullLockCount         ;   ///< Count of obtaining full lock
+            counter_type   m_nFullLockIter          ;   ///< Count of unsuccessfull iteration to obtain full lock
+
+            counter_type   m_nResizeLockCount       ;   ///< Count of obtaining resize lock
+            counter_type   m_nResizeLockIter        ;   ///< Count of unsuccessfull iteration to obtain resize lock
+            counter_type   m_nResizeLockArrayChanged;   ///< Count of event "Lock array has been changed when obtaining resize lock"
+            counter_type   m_nResizeCount           ;   ///< Count of resize event
+
+            //@cond
+            void    onCellLock()    { ++m_nCellLockCount; }
+            void    onCellWaitResizing() { ++m_nCellLockWaitResizing; }
+            void    onCellArrayChanged() { ++m_nCellLockArrayChanged; }
+            void    onCellLockFailed()   { ++m_nCellLockFailed; }
+            void    onSecondCellLock()   { ++m_nSecondCellLockCount; }
+            void    onSecondCellLockFailed() { ++m_nSecondCellLockFailed; }
+            void    onFullLock()         { ++m_nFullLockCount; }
+            void    onFullLockIter()     { ++m_nFullLockIter; }
+            void    onResizeLock()       { ++m_nResizeLockCount;   }
+            void    onResizeLockIter()   { ++m_nResizeLockIter; }
+            void    onResizeLockArrayChanged() { ++m_nResizeLockArrayChanged; }
+            void    onResize()           { ++m_nResizeCount; }
+            //@endcond
+        };
+
+        /// Dummy internal statistics for \ref refinable mutex policy
+        struct empty_refinable_stat {
+            //@cond
+            void    onCellLock()            const {}
+            void    onCellWaitResizing()    const {}
+            void    onCellArrayChanged()    const {}
+            void    onCellLockFailed()      const {}
+            void    onSecondCellLock()      const {}
+            void    onSecondCellLockFailed() const {}
+            void    onFullLock()            const {}
+            void    onFullLockIter()        const {}
+            void    onResizeLock()          const {}
+            void    onResizeLockIter()      const {}
+            void    onResizeLockArrayChanged() const {}
+            void    onResize()              const {}
+            //@endcond
+        };
+
+        /// Refinable concurrent access policy
+        /**
+            This is one of available opt::mutex_policy option type for CuckooSet
+
+            Refining is like a striping technique (see cuckoo::striping)
+            but it allows growing the size of lock array when resizing the hash table.
+            So, the sizes of hash table and lock array are equal.
+
+            Template arguments:
+            - \p RecursiveLock - the type of mutex. Reentrant (recursive) mutex is required.
+                The default is \p cds_std::recursive_mutex. The mutex type should be default-constructible.
+            - \p Arity - unsigned int constant that specifies an arity. The arity is the count of hash functors, i.e., the
+                count of lock arrays. Default value is 2.
+            - \p BackOff - back-off strategy. Default is cds::backoff::yield
+            - \p Alloc - allocator type used for lock array memory allocation. Default is \p CDS_DEFAULT_ALLOCATOR.
+            - \p Stat - internal statistics type. Note that this template argument is automatically selected by \ref CuckooSet
+                class according to its \p opt::stat option.
+        */
+        template <
+            class RecursiveLock = cds_std::recursive_mutex,
+            unsigned int Arity = 2,
+            typename BackOff = cds::backoff::yield,
+            class Alloc = CDS_DEFAULT_ALLOCATOR,
+            class Stat = empty_refinable_stat
+        >
+        class refinable
+        {
+        public:
+            typedef RecursiveLock   lock_type       ;   ///< lock type
+            typedef Alloc           allocator_type  ;   ///< allocator type
+            typedef BackOff         back_off        ;   ///< back-off strategy
+            typedef Stat            statistics_type ;   ///< internal statistics type
+            static unsigned int const c_nArity = Arity; ///< the arity
+
+            //@cond
+            typedef refinable_stat          real_stat;
+            typedef empty_refinable_stat    empty_stat;
+
+            template <typename Stat2>
+            struct rebind_statistics {
+                typedef refinable< lock_type, c_nArity, back_off, allocator_type, Stat2>    other;
+            };
+            //@endcond
+
+        protected:
+            //@cond
+            typedef cds::lock::trivial_select_policy  lock_selection_policy;
+
+            class lock_array_type
+                : public cds::lock::array< lock_type, lock_selection_policy, allocator_type >
+                , public std::enable_shared_from_this< lock_array_type >
+            {
+                typedef cds::lock::array< lock_type, lock_selection_policy, allocator_type >    lock_array_base;
+            public:
+                lock_array_type( size_t nCapacity )
+                    : lock_array_base( nCapacity )
+                {}
+            };
+            typedef std::shared_ptr< lock_array_type >  lock_array_ptr;
+            typedef cds::details::Allocator< lock_array_type, allocator_type >  lock_array_allocator;
+
+            typedef unsigned long long  owner_t;
+            typedef cds::OS::ThreadId   threadId_t;
+
+            typedef cds::lock::Spin     spinlock_type;
+            typedef cds::lock::scoped_lock< spinlock_type > scoped_spinlock;
+            //@endcond
+
+        protected:
+            //@cond
+            static owner_t const c_nOwnerMask = (((owner_t) 1) << (sizeof(owner_t) * 8 - 1)) - 1;
+
+            CDS_ATOMIC::atomic< owner_t >   m_Owner     ;   ///< owner mark (thread id + boolean flag)
+            CDS_ATOMIC::atomic<size_t>      m_nCapacity ;   ///< lock array capacity
+            lock_array_ptr                  m_arrLocks[ c_nArity ]  ; ///< Lock array. The capacity of array is specified in constructor.
+            spinlock_type                   m_access    ;   ///< access to m_arrLocks
+            statistics_type                 m_Stat      ;   ///< internal statistics
+            //@endcond
+
+        protected:
+            //@cond
+            struct lock_array_disposer {
+                void operator()( lock_array_type * pArr )
+                {
+                    lock_array_allocator().Delete( pArr );
+                }
+            };
+
+            lock_array_ptr create_lock_array( size_t nCapacity )
+            {
+                return lock_array_ptr( lock_array_allocator().New( nCapacity ), lock_array_disposer() );
+            }
+
+            void acquire( size_t const * arrHash, lock_array_ptr * pLockArr, lock_type ** parrLock )
+            {
+                owner_t me = (owner_t) cds::OS::getCurrentThreadId();
+                owner_t who;
+
+                back_off bkoff;
+                while ( true ) {
+
+                    {
+                        scoped_spinlock sl(m_access);
+                        for ( unsigned int i = 0; i < c_nArity; ++i )
+                            pLockArr[i] = m_arrLocks[i];
+                    }
+
+                    // wait while resizing
+                    while ( true ) {
+                        who = m_Owner.load( CDS_ATOMIC::memory_order_acquire );
+                        if ( !( who & 1 ) || (who >> 1) == (me & c_nOwnerMask) )
+                            break;
+                        bkoff();
+                        m_Stat.onCellWaitResizing();
+                    }
+
+                    if ( pLockArr[0] != m_arrLocks[0] ) {
+                        m_Stat.onCellArrayChanged();
+                    }
+                    else {
+
+                        size_t const nMask = pLockArr[0]->size() - 1;
+                        assert( cds::beans::is_power2( nMask + 1 ));
+
+                        for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                            parrLock[i] = &( pLockArr[i]->at( arrHash[i] & nMask ));
+                            parrLock[i]->lock();
+                        }
+
+                        who = m_Owner.load( CDS_ATOMIC::memory_order_acquire );
+                        if ( ( !(who & 1) || (who >> 1) == (me & c_nOwnerMask) ) && m_arrLocks[0] == pLockArr[0] ) {
+                            m_Stat.onCellLock();
+                            return;
+                        }
+
+                        for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                            parrLock[i]->unlock();
+                        }
+
+                        m_Stat.onCellLockFailed();
+                    }
+
+                    // clears pLockArr can lead to calling dtor for each item of pLockArr[i] that may be a heavy-weighted operation
+                    // (each pLockArr[i] is a shared pointer to array of a ton of mutexes)
+                    // It is better to do this before the next loop iteration where we will use spin-locked assignment to pLockArr
+                    // Destructing a lot of mutexes under spin-lock is a bad solution
+                    for ( unsigned int i = 0; i < c_nArity; ++i )
+                        pLockArr[i].reset();
+                }
+            }
+
+            bool try_second_acquire( size_t const * arrHash, lock_type ** parrLock )
+            {
+                // It is assumed that the current thread already has a lock
+                // and requires a second lock for other hash
+
+                size_t const nMask = m_nCapacity.load(CDS_ATOMIC::memory_order_acquire) - 1;
+                size_t nCell = m_arrLocks[0]->try_lock( arrHash[0] & nMask);
+                if ( nCell == lock_array_type::c_nUnspecifiedCell ) {
+                    m_Stat.onSecondCellLockFailed();
+                    return false;
+                }
+                parrLock[0] = &(m_arrLocks[0]->at(nCell));
+
+                for ( unsigned int i = 1; i < c_nArity; ++i ) {
+                    parrLock[i] = &( m_arrLocks[i]->at( m_arrLocks[i]->lock( arrHash[i] & nMask)) );
+                }
+
+                m_Stat.onSecondCellLock();
+                return true;
+            }
+
+            void acquire_all()
+            {
+                owner_t me = (owner_t) cds::OS::getCurrentThreadId();
+
+                back_off bkoff;
+                while ( true ) {
+                    owner_t ownNull = 0;
+                    if ( m_Owner.compare_exchange_strong( ownNull, (me << 1) | 1, CDS_ATOMIC::memory_order_acq_rel, CDS_ATOMIC::memory_order_relaxed )) {
+                        m_arrLocks[0]->lock_all();
+
+                        m_Stat.onFullLock();
+                        return;
+                    }
+                    bkoff();
+                    m_Stat.onFullLockIter();
+                }
+            }
+
+            void release_all()
+            {
+                m_arrLocks[0]->unlock_all();
+                m_Owner.store( 0, CDS_ATOMIC::memory_order_release );
+            }
+
+            void acquire_resize( lock_array_ptr * pOldLocks )
+            {
+                owner_t me = (owner_t) cds::OS::getCurrentThreadId();
+
+                while ( true ) {
+                    {
+                        scoped_spinlock sl(m_access);
+                        for ( unsigned int i = 0; i < c_nArity; ++i )
+                            pOldLocks[i] = m_arrLocks[i];
+                    }
+
+                    // global lock
+                    owner_t ownNull = 0;
+                    if ( m_Owner.compare_exchange_strong( ownNull, (me << 1) | 1, CDS_ATOMIC::memory_order_acq_rel, CDS_ATOMIC::memory_order_relaxed )) {
+                        if ( pOldLocks[0] != m_arrLocks[0] ) {
+                            m_Owner.store( 0, CDS_ATOMIC::memory_order_release );
+                            m_Stat.onResizeLockArrayChanged();
+                        }
+                        else {
+                            pOldLocks[0]->lock_all();
+                            m_Stat.onResizeLock();
+                            return;
+                        }
+                    }
+                    else
+                        m_Stat.onResizeLockIter();
+
+                    // clears pOldLocks can lead to calling dtor for each item of pOldLocks[i] that may be a heavy-weighted operation
+                    // (each pOldLocks[i] is a shared pointer to array of a ton of mutexes)
+                    // It is better to do this before the next loop iteration where we will use spin-locked assignment to pOldLocks
+                    // Destructing a lot of mutexes under spin-lock is a bad solution
+                    for ( unsigned int i = 0; i < c_nArity; ++i )
+                        pOldLocks[i].reset();
+                }
+            }
+
+            void release_resize( lock_array_ptr * pOldLocks )
+            {
+                m_Owner.store( 0, CDS_ATOMIC::memory_order_release );
+                pOldLocks[0]->unlock_all();
+            }
+            //@endcond
+
+        public:
+            //@cond
+            class scoped_cell_lock {
+                lock_type * m_arrLock[ c_nArity ];
+                lock_array_ptr  m_arrLockArr[ c_nArity ];
+
+            public:
+                scoped_cell_lock( refinable& policy, size_t const* arrHash )
+                {
+                    policy.acquire( arrHash, m_arrLockArr, m_arrLock );
+                }
+
+                ~scoped_cell_lock()
+                {
+                    for ( unsigned int i = 0; i < c_nArity; ++i )
+                        m_arrLock[i]->unlock();
+                }
+            };
+
+            class scoped_cell_trylock {
+                lock_type * m_arrLock[ c_nArity ];
+                bool        m_bLocked;
+
+            public:
+                scoped_cell_trylock( refinable& policy, size_t const* arrHash )
+                {
+                    m_bLocked = policy.try_second_acquire( arrHash, m_arrLock );
+                }
+
+                ~scoped_cell_trylock()
+                {
+                    if ( m_bLocked ) {
+                        for ( unsigned int i = 0; i < c_nArity; ++i )
+                            m_arrLock[i]->unlock();
+                    }
+                }
+
+                bool locked() const
+                {
+                    return m_bLocked;
+                }
+            };
+
+            class scoped_full_lock {
+                refinable& m_policy;
+            public:
+                scoped_full_lock( refinable& policy )
+                    : m_policy( policy )
+                {
+                    policy.acquire_all();
+                }
+                ~scoped_full_lock()
+                {
+                    m_policy.release_all();
+                }
+            };
+
+            class scoped_resize_lock
+            {
+                refinable&      m_policy;
+                lock_array_ptr  m_arrLocks[ c_nArity ];
+            public:
+                scoped_resize_lock( refinable& policy )
+                    : m_policy(policy)
+                {
+                    policy.acquire_resize( m_arrLocks );
+                }
+                ~scoped_resize_lock()
+                {
+                    m_policy.release_resize( m_arrLocks );
+                }
+            };
+            //@endcond
+
+        public:
+            /// Constructor
+            refinable(
+                size_t nLockCount   ///< The size of lock array. Must be power of two.
+            )   : m_Owner(0)
+                , m_nCapacity( nLockCount )
+            {
+                assert( cds::beans::is_power2( nLockCount ));
+                for ( unsigned int i = 0; i < c_nArity; ++i )
+                    m_arrLocks[i] = create_lock_array( nLockCount );
+            }
+
+            //@cond
+            void resize( size_t nCapacity )
+            {
+                lock_array_ptr pNew[ c_nArity ];
+                for ( unsigned int i = 0; i < c_nArity; ++i )
+                    pNew[i] = create_lock_array( nCapacity );
+
+                /*
+                // Assignment m_arrLocks[i] = pNew[i] may call heavy-weighted dtor for each item of m_arrLocks
+                // that is unacceptable under spin-lock
+                // So, we store copy of m_arrLocks in pOld
+                lock_array_ptr pOld[ c_nArity ];
+                for ( unsigned int i = 0; i < c_nArity; ++i )
+                    pOld[i] = m_arrLocks[i];
+
+                // m_arrLocks assignment will not lead to calling dtor of each item of m_arrLocks
+                // since copy of m_arrLocks locates in pOld and assignment will not be too painful for spin-lock
+                */
+
+                {
+                    scoped_spinlock sl(m_access);
+                    for ( unsigned int i = 0; i < c_nArity; ++i )
+                        m_arrLocks[i] = pNew[i];
+                }
+                m_nCapacity.store( nCapacity, CDS_ATOMIC::memory_order_release );
+
+                m_Stat.onResize();
+            }
+            //@endcond
+
+            /// Returns lock array size
+            /**
+                Lock array size is not a constant for \p refinable policy and can be changed when the set is resized.
+            */
+            size_t lock_count() const
+            {
+                return m_nCapacity.load(CDS_ATOMIC::memory_order_relaxed);
+            }
+
+            /// Returns the arity of \p refinable mutex policy
+            CDS_CONSTEXPR unsigned int arity() const CDS_NOEXCEPT
+            {
+                return c_nArity;
+            }
+
+            /// Returns internal statistics
+            statistics_type const& statistics() const
+            {
+                return m_Stat;
+            }
+        };
+
+        /// CuckooSet internal statistics
+        struct stat {
+            typedef cds::atomicity::event_counter   counter_type ;  ///< Counter type
+
+            counter_type    m_nRelocateCallCount    ; ///< Count of \p relocate function call
+            counter_type    m_nRelocateRoundCount   ; ///< Count of attempts to relocate items
+            counter_type    m_nFalseRelocateCount   ; ///< Count of unneeded attempts of \p relocate call
+            counter_type    m_nSuccessRelocateCount ; ///< Count of successfull item relocating
+            counter_type    m_nRelocateAboveThresholdCount; ///< Count of item relocating above probeset threshold
+            counter_type    m_nFailedRelocateCount  ;   ///< Count of failed relocation attemp (when all probeset is full)
+
+            counter_type    m_nResizeCallCount      ;   ///< Count of \p resize function call
+            counter_type    m_nFalseResizeCount     ;   ///< Count of false \p resize function call (when other thread has been resized the set)
+            counter_type    m_nResizeSuccessNodeMove;   ///< Count of successfull node moving when resizing
+            counter_type    m_nResizeRelocateCall   ;   ///< Count of \p relocate function call from \p resize function
+
+            counter_type    m_nInsertSuccess        ;   ///< Count of successfull \p insert function call
+            counter_type    m_nInsertFailed         ;   ///< Count of failed \p insert function call
+            counter_type    m_nInsertResizeCount    ;   ///< Count of \p resize function call from \p insert
+            counter_type    m_nInsertRelocateCount  ;   ///< Count of \p relocate function call from \p insert
+            counter_type    m_nInsertRelocateFault  ;   ///< Count of failed \p relocate function call from \p insert
+
+            counter_type    m_nEnsureExistCount     ;   ///< Count of call \p ensure function for existing node
+            counter_type    m_nEnsureSuccessCount   ;   ///< Count of successfull \p insert function call for new node
+            counter_type    m_nEnsureResizeCount    ;   ///< Count of \p resize function call from \p ensure
+            counter_type    m_nEnsureRelocateCount  ;   ///< Count of \p relocate function call from \p ensure
+            counter_type    m_nEnsureRelocateFault  ;   ///< Count of failed \p relocate function call from \p ensure
+
+            counter_type    m_nUnlinkSuccess        ;   ///< Count of success \p unlink function call
+            counter_type    m_nUnlinkFailed         ;   ///< Count of failed \p unlink function call
+
+            counter_type    m_nEraseSuccess         ;   ///< Count of success \p erase function call
+            counter_type    m_nEraseFailed          ;   ///< Count of failed \p erase function call
+
+            counter_type    m_nFindSuccess         ;   ///< Count of success \p find function call
+            counter_type    m_nFindFailed          ;   ///< Count of failed \p find function call
+
+            counter_type    m_nFindEqualSuccess         ;   ///< Count of success \p find_equal function call
+            counter_type    m_nFindEqualFailed          ;   ///< Count of failed \p find_equal function call
+
+            counter_type    m_nFindWithSuccess         ;   ///< Count of success \p find_with function call
+            counter_type    m_nFindWithFailed          ;   ///< Count of failed \p find_with function call
+
+            //@cond
+            void    onRelocateCall()        { ++m_nRelocateCallCount; }
+            void    onRelocateRound()       { ++m_nRelocateRoundCount; }
+            void    onFalseRelocateRound()  { ++m_nFalseRelocateCount; }
+            void    onSuccessRelocateRound(){ ++m_nSuccessRelocateCount; }
+            void    onRelocateAboveThresholdRound() { ++m_nRelocateAboveThresholdCount; }
+            void    onFailedRelocate()      { ++m_nFailedRelocateCount; }
+
+            void    onResizeCall()          { ++m_nResizeCallCount; }
+            void    onFalseResizeCall()     { ++m_nFalseResizeCount; }
+            void    onResizeSuccessMove()   { ++m_nResizeSuccessNodeMove; }
+            void    onResizeRelocateCall()  { ++m_nResizeRelocateCall; }
+
+            void    onInsertSuccess()       { ++m_nInsertSuccess; }
+            void    onInsertFailed()        { ++m_nInsertFailed; }
+            void    onInsertResize()        { ++m_nInsertResizeCount; }
+            void    onInsertRelocate()      { ++m_nInsertRelocateCount; }
+            void    onInsertRelocateFault() { ++m_nInsertRelocateFault; }
+
+            void    onEnsureExist()         { ++m_nEnsureExistCount; }
+            void    onEnsureSuccess()       { ++m_nEnsureSuccessCount; }
+            void    onEnsureResize()        { ++m_nEnsureResizeCount; }
+            void    onEnsureRelocate()      { ++m_nEnsureRelocateCount; }
+            void    onEnsureRelocateFault() { ++m_nEnsureRelocateFault; }
+
+            void    onUnlinkSuccess()       { ++m_nUnlinkSuccess; }
+            void    onUnlinkFailed()        { ++m_nUnlinkFailed; }
+
+            void    onEraseSuccess()        { ++m_nEraseSuccess; }
+            void    onEraseFailed()         { ++m_nEraseFailed; }
+
+            void    onFindSuccess()         { ++m_nFindSuccess; }
+            void    onFindFailed()          { ++m_nFindFailed; }
+
+            void    onFindWithSuccess()     { ++m_nFindWithSuccess; }
+            void    onFindWithFailed()      { ++m_nFindWithFailed; }
+            //@endcond
+        };
+
+        /// CuckooSet empty internal statistics
+        struct empty_stat {
+            //@cond
+            void    onRelocateCall()        const {}
+            void    onRelocateRound()       const {}
+            void    onFalseRelocateRound()  const {}
+            void    onSuccessRelocateRound()const {}
+            void    onRelocateAboveThresholdRound() const {}
+            void    onFailedRelocate()      const {}
+
+            void    onResizeCall()          const {}
+            void    onFalseResizeCall()     const {}
+            void    onResizeSuccessMove()   const {}
+            void    onResizeRelocateCall()  const {}
+
+            void    onInsertSuccess()       const {}
+            void    onInsertFailed()        const {}
+            void    onInsertResize()        const {}
+            void    onInsertRelocate()      const {}
+            void    onInsertRelocateFault() const {}
+
+            void    onEnsureExist()         const {}
+            void    onEnsureSuccess()       const {}
+            void    onEnsureResize()        const {}
+            void    onEnsureRelocate()      const {}
+            void    onEnsureRelocateFault() const {}
+
+            void    onUnlinkSuccess()       const {}
+            void    onUnlinkFailed()        const {}
+
+            void    onEraseSuccess()        const {}
+            void    onEraseFailed()         const {}
+
+            void    onFindSuccess()         const {}
+            void    onFindFailed()          const {}
+
+            void    onFindWithSuccess()     const {}
+            void    onFindWithFailed()      const {}
+            //@endcond
+        };
+
+        /// Type traits for CuckooSet class
+        struct type_traits
+        {
+            /// Hook used
+            /**
+                Possible values are: cuckoo::base_hook, cuckoo::member_hook, cuckoo::traits_hook.
+            */
+            typedef base_hook<>         hook;
+
+            /// Hash functors tuple
+            /**
+                This is mandatory type and has no predefined one.
+
+                At least, two hash functors should be provided. All hash functor
+                should be orthogonal (different): for each <tt> i,j: i != j => h[i](x) != h[j](x) </tt>.
+                The hash functors are defined as <tt> std::tuple< H1, H2, ... Hn > </tt>:
+                \@code cds::opt::hash< std::tuple< h1, h2 > > \@endcode
+                The number of hash functors specifies the number \p k - the count of hash tables in cuckoo hashing.
+                Up to 10 different hash functors are supported.
+            */
+            typedef cds::opt::none      hash;
+
+            /// Concurrent access policy
+            /**
+                Available opt::mutex_policy types:
+                - cuckoo::striping - simple, but the lock array is not resizable
+                - cuckoo::refinable - resizable lock array, but more complex access to set data.
+
+                Default is cuckoo::striping.
+            */
+            typedef cuckoo::striping<>               mutex_policy;
+
+            /// Key equality functor
+            /**
+                Default is <tt>std::equal_to<T></tt>
+            */
+            typedef opt::none                       equal_to;
+
+            /// Key comparison functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+            */
+            typedef opt::none                       compare;
+
+            /// specifies binary predicate used for key comparison.
+            /**
+                Default is \p std::less<T>.
+            */
+            typedef opt::none                       less;
+
+            /// Item counter
+            /**
+                The type for item counting feature.
+                Default is cds::atomicity::item_counter
+
+                Only atomic item counter type is allowed.
+            */
+            typedef atomicity::item_counter             item_counter;
+
+            /// Allocator type
+            /**
+                The allocator type for allocating bucket tables.
+            */
+            typedef CDS_DEFAULT_ALLOCATOR       allocator;
+
+            /// Disposer
+            /**
+                The disposer functor is used in CuckooSet::clear member function
+                to free set's node.
+            */
+            typedef intrusive::opt::v::empty_disposer   disposer;
+
+            /// Internal statistics. Available statistics: cuckoo::stat, cuckoo::empty_stat
+            typedef empty_stat                  stat;
+        };
+
+        /// Metafunction converting option list to CuckooSet traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options list see \ref CuckooSet.
+        */
+        template <CDS_DECL_OPTIONS11>
+        struct make_traits {
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< cuckoo::type_traits, CDS_OPTIONS10 >::type
+                ,CDS_OPTIONS11
+            >::type   type ;    ///< Result of metafunction
+        };
+
+        //@cond
+        namespace details {
+            template <typename Node, typename Probeset>
+            class bucket_entry;
+
+            template <typename Node>
+            class bucket_entry<Node, cuckoo::list>
+            {
+            public:
+                typedef Node                        node_type;
+                typedef cuckoo::list_probeset_class probeset_class;
+                typedef cuckoo::list                probeset_type;
+
+            protected:
+                node_type *     pHead;
+                unsigned int    nSize;
+
+            public:
+                class iterator
+                {
+                    node_type * pNode;
+                    friend class bucket_entry;
+
+                public:
+                    iterator()
+                        : pNode( null_ptr<node_type *>())
+                    {}
+                    iterator( node_type * p )
+                        : pNode( p )
+                    {}
+                    iterator( iterator const& it)
+                        : pNode( it.pNode )
+                    {}
+
+                    iterator& operator=( iterator const& it )
+                    {
+                        pNode = it.pNode;
+                        return *this;
+                    }
+
+                    iterator& operator=( node_type * p )
+                    {
+                        pNode = p;
+                        return *this;
+                    }
+
+                    node_type * operator->()
+                    {
+                        return pNode;
+                    }
+                    node_type& operator*()
+                    {
+                        assert( pNode != null_ptr<node_type *>());
+                        return *pNode;
+                    }
+
+                    // preinc
+                    iterator& operator ++()
+                    {
+                        if ( pNode )
+                            pNode = pNode->m_pNext;
+                        return *this;
+                    }
+
+                    bool operator==(iterator const& it ) const
+                    {
+                        return pNode == it.pNode;
+                    }
+                    bool operator!=(iterator const& it ) const
+                    {
+                        return !( *this == it );
+                    }
+                };
+
+            public:
+                bucket_entry()
+                    : pHead( null_ptr<node_type *>())
+                    , nSize(0)
+                {
+                    static_assert(( std::is_same<typename node_type::probeset_type, probeset_type>::value ), "Incompatible node type" );
+                }
+
+                iterator begin()
+                {
+                    return iterator(pHead);
+                }
+                iterator end()
+                {
+                    return iterator();
+                }
+
+                void insert_after( iterator it, node_type * p )
+                {
+                    node_type * pPrev = it.pNode;
+                    if ( pPrev ) {
+                        p->m_pNext = pPrev->m_pNext;
+                        pPrev->m_pNext = p;
+                    }
+                    else {
+                        // insert as head
+                        p->m_pNext = pHead;
+                        pHead = p;
+                    }
+                    ++nSize;
+                }
+
+                void remove( iterator itPrev, iterator itWhat )
+                {
+                    node_type * pPrev = itPrev.pNode;
+                    node_type * pWhat = itWhat.pNode;
+                    assert( (!pPrev && pWhat == pHead) || (pPrev && pPrev->m_pNext == pWhat) );
+
+                    if ( pPrev )
+                        pPrev->m_pNext = pWhat->m_pNext;
+                    else {
+                        assert( pWhat == pHead );
+                        pHead = pHead->m_pNext;
+                    }
+                    pWhat->clear();
+                    --nSize;
+                }
+
+                void clear()
+                {
+                    node_type * pNext;
+                    for ( node_type * pNode = pHead; pNode; pNode = pNext ) {
+                        pNext = pNode->m_pNext;
+                        pNode->clear();
+                    }
+
+                    nSize = 0;
+                    pHead = null_ptr<node_type *>();
+                }
+
+                template <typename Disposer>
+                void clear( Disposer disp )
+                {
+                    node_type * pNext;
+                    for ( node_type * pNode = pHead; pNode; pNode = pNext ) {
+                        pNext = pNode->m_pNext;
+                        pNode->clear();
+                        cds::unref(disp)( pNode );
+                    }
+
+                    nSize = 0;
+                    pHead = null_ptr<node_type *>();
+                }
+
+                unsigned int size() const
+                {
+                    return nSize;
+                }
+            };
+
+            template <typename Node, unsigned int Capacity>
+            class bucket_entry<Node, cuckoo::vector<Capacity> >
+            {
+            public:
+                typedef Node                            node_type;
+                typedef cuckoo::vector_probeset_class   probeset_class;
+                typedef cuckoo::vector<Capacity>        probeset_type;
+
+                static unsigned int const c_nCapacity = probeset_type::c_nCapacity;
+
+            protected:
+                node_type *     m_arrNode[c_nCapacity];
+                unsigned int    m_nSize;
+
+                void shift_up( unsigned int nFrom )
+                {
+                    assert( m_nSize < c_nCapacity );
+
+                    // std alorithm
+                    if ( nFrom < m_nSize )
+                        std::copy_backward( m_arrNode + nFrom, m_arrNode + m_nSize, m_arrNode + m_nSize + 1 );
+
+                    // alternative: low-level byte copying
+                    //memmove( m_arrNode + nFrom + 1, m_arrNode + nFrom, (m_nSize - nFrom) * sizeof(m_arrNode[0]) );
+                }
+
+                void shift_down( node_type ** pFrom )
+                {
+                    assert( m_arrNode <= pFrom && pFrom < m_arrNode + m_nSize);
+                    // std algo
+                    std::copy( pFrom + 1, m_arrNode + m_nSize, pFrom  );
+
+                    // alternative: low-level byte copying
+                    //memmove( pFrom + 1, pFrom, (m_nSize - nFrom - 1) * sizeof(m_arrNode[0]));
+                }
+            public:
+                class iterator
+                {
+                    node_type **    pArr;
+                    friend class bucket_entry;
+
+                public:
+                    iterator()
+                        : pArr( null_ptr<node_type **>() )
+                    {}
+                    iterator( node_type ** p )
+                        : pArr(p)
+                    {}
+                    iterator( iterator const& it)
+                        : pArr( it.pArr )
+                    {}
+
+                    iterator& operator=( iterator const& it )
+                    {
+                        pArr = it.pArr;
+                        return *this;
+                    }
+
+                    node_type * operator->()
+                    {
+                        assert( pArr != null_ptr<node_type **>());
+                        return *pArr;
+                    }
+                    node_type& operator*()
+                    {
+                        assert( pArr != null_ptr<node_type **>());
+                        assert( *pArr != null_ptr<node_type *>());
+                        return *(*pArr);
+                    }
+
+                    // preinc
+                    iterator& operator ++()
+                    {
+                        ++pArr;
+                        return *this;
+                    }
+
+                    bool operator==(iterator const& it ) const
+                    {
+                        return pArr == it.pArr;
+                    }
+                    bool operator!=(iterator const& it ) const
+                    {
+                        return !( *this == it );
+                    }
+                };
+
+            public:
+                bucket_entry()
+                    : m_nSize(0)
+                {
+                    memset( m_arrNode, 0, sizeof(m_arrNode));
+                    static_assert(( std::is_same<typename node_type::probeset_type, probeset_type>::value ), "Incompatible node type" );
+                }
+
+                iterator begin()
+                {
+                    return iterator(m_arrNode);
+                }
+                iterator end()
+                {
+                    return iterator(m_arrNode + size());
+                }
+
+                void insert_after( iterator it, node_type * p )
+                {
+                    assert( m_nSize < c_nCapacity );
+                    assert( !it.pArr || (m_arrNode <= it.pArr && it.pArr <= m_arrNode + m_nSize));
+
+                    if ( it.pArr ) {
+                        shift_up( (unsigned int)(it.pArr - m_arrNode) + 1 );
+                        *(it.pArr + 1) = p;
+                    }
+                    else {
+                        shift_up(0);
+                        m_arrNode[0] = p;
+                    }
+                    ++m_nSize;
+                }
+
+                void remove( iterator /*itPrev*/, iterator itWhat )
+                {
+                    itWhat->clear();
+                    shift_down( itWhat.pArr );
+                    --m_nSize;
+                }
+
+                void clear()
+                {
+                    m_nSize = 0;
+                }
+
+                template <typename Disposer>
+                void clear( Disposer disp )
+                {
+                    for ( unsigned int i = 0; i < m_nSize; ++i ) {
+                        cds::unref(disp)( m_arrNode[i] );
+                    }
+                    m_nSize = 0;
+                }
+
+                unsigned int size() const
+                {
+                    return m_nSize;
+                }
+            };
+
+            template <typename Node, unsigned int ArraySize>
+            struct hash_ops {
+                static void store( Node * pNode, size_t * pHashes )
+                {
+                    memcpy( pNode->m_arrHash, pHashes, sizeof(size_t) * ArraySize );
+                }
+                static bool equal_to( Node& node, unsigned int nTable, size_t nHash )
+                {
+                    return node.m_arrHash[nTable] == nHash;
+                }
+            };
+            template <typename Node>
+            struct hash_ops<Node, 0>
+            {
+                static void store( Node * /*pNode*/, size_t * /*pHashes*/ )
+                {}
+                static bool equal_to( Node& /*node*/, unsigned int /*nTable*/, size_t /*nHash*/ )
+                {
+                    return true;
+                }
+            };
+
+            template <typename NodeTraits, bool Ordered>
+            struct contains;
+
+            template <typename NodeTraits>
+            struct contains<NodeTraits, true>
+            {
+                template <typename BucketEntry, typename Position, typename Q, typename Compare>
+                static bool find( BucketEntry& probeset, Position& pos, unsigned int nTable, size_t nHash, Q const& val, Compare cmp )
+                {
+                    // Ordered version
+                    typedef typename BucketEntry::iterator bucket_iterator;
+
+                    bucket_iterator itPrev;
+
+                    for ( bucket_iterator it = probeset.begin(), itEnd = probeset.end(); it != itEnd; ++it ) {
+                        int cmpRes = cmp( *NodeTraits::to_value_ptr(*it), val );
+                        if ( cmpRes >= 0 ) {
+                            pos.itFound = it;
+                            pos.itPrev = itPrev;
+                            return cmpRes == 0;
+                        }
+
+                        itPrev = it;
+                    }
+
+                    pos.itPrev = itPrev;
+                    pos.itFound = probeset.end();
+                    return false;
+                }
+            };
+
+            template <typename NodeTraits>
+            struct contains<NodeTraits, false>
+            {
+                template <typename BucketEntry, typename Position, typename Q, typename EqualTo>
+                static bool find( BucketEntry& probeset, Position& pos, unsigned int nTable, size_t nHash, Q const& val, EqualTo eq )
+                {
+                    // Unordered version
+                    typedef typename BucketEntry::iterator  bucket_iterator;
+                    typedef typename BucketEntry::node_type node_type;
+
+                    bucket_iterator itPrev;
+
+                    for ( bucket_iterator it = probeset.begin(), itEnd = probeset.end(); it != itEnd; ++it ) {
+                        if ( hash_ops<node_type, node_type::hash_array_size>::equal_to( *it, nTable, nHash ) && eq( *NodeTraits::to_value_ptr(*it), val )) {
+                            pos.itFound = it;
+                            pos.itPrev = itPrev;
+                            return true;
+                        }
+                        itPrev = it;
+                    }
+
+                    pos.itPrev = itPrev;
+                    pos.itFound = probeset.end();
+                    return false;
+                }
+            };
+
+        }   // namespace details
+        //@endcond
+
+    } // namespace cuckoo
+
+    /// Cuckoo hash set
+    /** @ingroup cds_intrusive_map
+
+        Source
+            - [2007] M.Herlihy, N.Shavit, M.Tzafrir "Concurrent Cuckoo Hashing. Technical report"
+            - [2008] Maurice Herlihy, Nir Shavit "The Art of Multiprocessor Programming"
+
+        <b>About Cuckoo hashing</b>
+
+            [From <i>"The Art of Multiprocessor Programming"</i>]
+            Cuckoo hashing is a hashing algorithm in which a newly added item displaces any earlier item
+            occupying the same slot. For brevity, a table is a k-entry array of items. For a hash set f size
+            N = 2k we use a two-entry array of tables, and two independent hash functions,
+            <tt> h0, h1: KeyRange -> 0,...,k-1</tt>
+            mapping the set of possible keys to entries in he array. To test whether a value \p x is in the set,
+            <tt>find(x)</tt> tests whether either <tt>table[0][h0(x)]</tt> or <tt>table[1][h1(x)]</tt> is
+            equal to \p x. Similarly, <tt>erase(x)</tt>checks whether \p x is in either <tt>table[0][h0(x)]</tt>
+            or <tt>table[1][h1(x)]</tt>, ad removes it if found.
+
+            The <tt>insert(x)</tt> successively "kicks out" conflicting items until every key has a slot.
+            To add \p x, the method swaps \p x with \p y, the current occupant of <tt>table[0][h0(x)]</tt>.
+            If the prior value was \p NULL, it is done. Otherwise, it swaps the newly nest-less value \p y
+            for the current occupant of <tt>table[1][h1(y)]</tt> in the same way. As before, if the prior value
+            was \p NULL, it is done. Otherwise, the method continues swapping entries (alternating tables)
+            until it finds an empty slot. We might not find an empty slot, either because the table is full,
+            or because the sequence of displacement forms a cycle. We therefore need an upper limit on the
+            number of successive displacements we are willing to undertake. When this limit is exceeded,
+            we resize the hash table, choose new hash functions and start over.
+
+            For concurrent cuckoo hashing, rather than organizing the set as a two-dimensional table of
+            items, we use two-dimensional table of probe sets, where a probe set is a constant-sized set
+            of items with the same hash code. Each probe set holds at most \p PROBE_SIZE items, but the algorithm
+            tries to ensure that when the set is quiescent (i.e no method call in progress) each probe set
+            holds no more than <tt>THRESHOLD < PROBE_SET</tt> items. While method calls are in-flight, a probe
+            set may temporarily hold more than \p THRESHOLD but never more than \p PROBE_SET items.
+
+            In current implementation, a probe set can be defined either as a (single-linked) list
+            or as a fixed-sized vector, optionally ordered.
+
+            In description above two-table cuckoo hashing (<tt>k = 2</tt>) has been considered.
+            We can generalize this approach for <tt>k >= 2</tt> when we have \p k hash functions
+            <tt>h[0], ... h[k-1]</tt> and \p k tables <tt>table[0], ... table[k-1]</tt>.
+
+            The search in probe set is linear, the complexity is <tt> O(PROBE_SET) </tt>.
+            The probe set may be ordered or not. Ordered probe set can be more efficient since
+            the average search complexity is <tt>O(PROBE_SET/2)</tt>.
+            However, the overhead of sorting can eliminate a gain of ordered search.
+
+            The probe set is ordered if opt::compare or opt::less is specified in \p Traits template
+            parameter. Otherwise, the probe set is unordered and \p Traits must contain
+            opt::equal_to option.
+
+            The cds::intrusive::cuckoo namespace contains \p %CuckooSet-related declarations.
+
+        Template arguments:
+        - \p T - the type stored in the set.  The type must be based on cuckoo::node (for cuckoo::base_hook)
+            or it must have a member of type %cuckoo::node (for cuckoo::member_hook),
+            or it must be convertible to \p %cuckoo::node (for cuckoo::traits_hook)
+        - \p Traits - type traits. See cuckoo::type_traits for explanation. It is possible to declare option-based
+            set with cuckoo::make_traits metafunction result as \p Traits template argument.
+
+        Template argument list \p Options... of cuckoo::make_traits metafunction are:
+        - intrusive::opt::hook - hook used. Possible values are: cuckoo::base_hook, cuckoo::member_hook, cuckoo::traits_hook.
+            If the option is not specified, <tt>%cuckoo::base_hook<></tt> is used.
+        - opt::hash - hash functor tuple, mandatory option. At least, two hash functors should be provided. All hash functor
+            should be orthogonal (different): for each <tt> i,j: i != j => h[i](x) != h[j](x) </tt>.
+            The hash functors are passed as <tt> std::tuple< H1, H2, ... Hn > </tt>. The number of hash functors specifies
+            the number \p k - the count of hash tables in cuckoo hashing. If the compiler supports variadic templates
+            then k is unlimited, otherwise up to 10 different hash functors are supported.
+        - opt::mutex_policy - concurrent access policy.
+            Available policies: cuckoo::striping, cuckoo::refinable.
+            Default is cuckoo::striping.
+        - opt::equal_to - key equality functor like \p std::equal_to.
+            If this functor is defined then the probe-set will be unordered.
+            If opt::compare or opt::less option is specified too, then the probe-set will be ordered
+            and opt::equal_to will be ignored.
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+            If opt::compare or opt::less option is specified, then the probe-set will be ordered.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+            If opt::compare or opt::less option is specified, then the probe-set will be ordered.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::item_counter
+            The item counter should be atomic.
+        - opt::allocator - the allocator type using for allocating bucket tables.
+            Default is \p CDS_DEFAULT_ALLOCATOR
+        - intrusive::opt::disposer - the disposer type used in \ref clear() member function for
+            freeing nodes. Default is intrusive::opt::v::empty_disposer
+        - opt::stat - internal statistics. Possibly types: cuckoo::stat, cuckoo::empty_stat.
+            Default is cuckoo::empty_stat
+
+        The probe set options cuckoo::probeset_type and cuckoo::store_hash are taken from \p node type
+        specified by \p opt::hook option.
+
+        <b>How to use</b>
+
+        You should incorporate cuckoo::node into your struct \p T and provide
+        appropriate cuckoo::type_traits::hook in your \p Traits template parameters. Usually, for \p Traits you
+        define a struct based on cuckoo::type_traits.
+
+        Example for base hook and list-based probe-set:
+        \code
+        #include <cds/intrusive/cuckoo_set.h>
+
+        // Data stored in cuckoo set
+        // We use list as probe-set container and store hash values in the node
+        // (since we use two hash functions we should store 2 hash values per node)
+        struct my_data: public cds::intrusive::cuckoo::node< cds::intrusive::cuckoo::list, 2 >
+        {
+            // key field
+            std::string     strKey;
+
+            // other data
+            // ...
+        };
+
+        // Provide equal_to functor for my_data since we will use unordered probe-set
+        struct my_data_equal_to {
+            bool operator()( const my_data& d1, const my_data& d2 ) const
+            {
+                return d1.strKey.compare( d2.strKey ) == 0;
+            }
+
+            bool operator()( const my_data& d, const std::string& s ) const
+            {
+                return d.strKey.compare(s) == 0;
+            }
+
+            bool operator()( const std::string& s, const my_data& d ) const
+            {
+                return s.compare( d.strKey ) == 0;
+            }
+        };
+
+        // Provide two hash functor for my_data
+        struct hash1 {
+            size_t operator()(std::string const& s) const
+            {
+                return cds::opt::v::hash<std::string>( s );
+            }
+            size_t operator()( my_data const& d ) const
+            {
+                return (*this)( d.strKey );
+            }
+        };
+
+        struct hash2: private hash1 {
+            size_t operator()(std::string const& s) const
+            {
+                size_t h = ~( hash1::operator()(s));
+                return ~h + 0x9e3779b9 + (h << 6) + (h >> 2);
+            }
+            size_t operator()( my_data const& d ) const
+            {
+                return (*this)( d.strKey );
+            }
+        };
+
+        // Declare type traits
+        struct my_traits: public cds::intrusive::cuckoo::type_traits
+        {
+            typedef cds::intrusive::cuckoo::base_hook<
+                cds::intrusive::cuckoo::probeset_type< my_data::probeset_type >
+                ,cds::intrusive::cuckoo::store_hash< my_data::hash_array_size >
+            >   hook;
+            typedef my_data_equa_to equal_to;
+            typedef std::tuple< hash1, hash2 >  hash;
+        };
+
+        // Declare CuckooSet type
+        typedef cds::intrusive::CuckooSet< my_data, my_traits > my_cuckoo_set;
+
+        // Equal option-based declaration
+        typedef cds::intrusive::CuckooSet< my_data,
+            cds::intrusive::cuckoo::make_traits<
+                cds::intrusive::opt::hook< cds::intrusive::cuckoo::base_hook<
+                    cds::intrusive::cuckoo::probeset_type< my_data::probeset_type >
+                    ,cds::intrusive::cuckoo::store_hash< my_data::hash_array_size >
+                > >
+                ,cds::opt::hash< std::tuple< hash1, hash2 > >
+                ,cds::opt::equal_to< my_data_equal_to >
+            >::type
+        > opt_cuckoo_set;
+        \endcode
+
+        If we provide \p compare function instead of \p equal_to for \p my_data
+        we get as a result a cuckoo set with ordered probe set that may improve
+        performance.
+        Example for base hook and ordered vector-based probe-set:
+
+        \code
+        #include <cds/intrusive/cuckoo_set.h>
+
+        // Data stored in cuckoo set
+        // We use a vector of capacity 4 as probe-set container and store hash values in the node
+        // (since we use two hash functions we should store 2 hash values per node)
+        struct my_data: public cds::intrusive::cuckoo::node< cds::intrusive::cuckoo::vector<4>, 2 >
+        {
+            // key field
+            std::string     strKey;
+
+            // other data
+            // ...
+        };
+
+        // Provide compare functor for my_data since we want to use ordered probe-set
+        struct my_data_compare {
+            int operator()( const my_data& d1, const my_data& d2 ) const
+            {
+                return d1.strKey.compare( d2.strKey );
+            }
+
+            int operator()( const my_data& d, const std::string& s ) const
+            {
+                return d.strKey.compare(s);
+            }
+
+            int operator()( const std::string& s, const my_data& d ) const
+            {
+                return s.compare( d.strKey );
+            }
+        };
+
+        // Provide two hash functor for my_data
+        struct hash1 {
+            size_t operator()(std::string const& s) const
+            {
+                return cds::opt::v::hash<std::string>( s );
+            }
+            size_t operator()( my_data const& d ) const
+            {
+                return (*this)( d.strKey );
+            }
+        };
+
+        struct hash2: private hash1 {
+            size_t operator()(std::string const& s) const
+            {
+                size_t h = ~( hash1::operator()(s));
+                return ~h + 0x9e3779b9 + (h << 6) + (h >> 2);
+            }
+            size_t operator()( my_data const& d ) const
+            {
+                return (*this)( d.strKey );
+            }
+        };
+
+        // Declare type traits
+        struct my_traits: public cds::intrusive::cuckoo::type_traits
+        {
+            typedef cds::intrusive::cuckoo::base_hook<
+                cds::intrusive::cuckoo::probeset_type< my_data::probeset_type >
+                ,cds::intrusive::cuckoo::store_hash< my_data::hash_array_size >
+            >   hook;
+            typedef my_data_compare compare;
+            typedef std::tuple< hash1, hash2 >  hash;
+        };
+
+        // Declare CuckooSet type
+        typedef cds::intrusive::CuckooSet< my_data, my_traits > my_cuckoo_set;
+
+        // Equal option-based declaration
+        typedef cds::intrusive::CuckooSet< my_data,
+            cds::intrusive::cuckoo::make_traits<
+                cds::intrusive::opt::hook< cds::intrusive::cuckoo::base_hook<
+                    cds::intrusive::cuckoo::probeset_type< my_data::probeset_type >
+                    ,cds::intrusive::cuckoo::store_hash< my_data::hash_array_size >
+                > >
+                ,cds::opt::hash< std::tuple< hash1, hash2 > >
+                ,cds::opt::compare< my_data_compare >
+            >::type
+        > opt_cuckoo_set;
+        \endcode
+
+    */
+    template <typename T, typename Traits = cuckoo::type_traits>
+    class CuckooSet
+    {
+    public:
+        typedef T   value_type  ;   ///< The value type stored in the set
+        typedef Traits options  ;   ///< Set traits
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+
+        typedef typename options::hash              hash ;   ///< hash functor tuple wrapped for internal use
+        typedef typename hash::hash_tuple_type      hash_tuple_type ; ///< Type of hash tuple
+
+        typedef typename options::stat              stat    ;   ///< internal statistics type
+
+        typedef typename options::mutex_policy      original_mutex_policy   ;   ///< Concurrent access policy, see cuckoo::type_traits::mutex_policy
+
+        /// Actual mutex policy
+        /**
+            Actual mutex policy is built from mutex policy type provided by \p Traits template argument (see cuckoo::type_traits::mutex_policy)
+            but mutex policy internal statistics is conformed with cukoo::type_traits::stat type provided by \p Traits:
+            - if \p %cuckoo::type_traits::stat is cuckoo::empty_stat then mutex policy statistics is already empty one
+            - otherwise real mutex policy statistics is used
+        */
+        typedef typename original_mutex_policy::template rebind_statistics<
+            typename std::conditional<
+                std::is_same< stat, cuckoo::empty_stat >::value
+                ,typename original_mutex_policy::empty_stat
+                ,typename original_mutex_policy::real_stat
+            >::type
+        >::other    mutex_policy;
+
+        static bool const c_isSorted = !( std::is_same< typename options::compare, opt::none >::value
+                && std::is_same< typename options::less, opt::none >::value ) ; ///< whether the probe set should be ordered
+        static size_t const c_nArity = hash::size ; ///< the arity of cuckoo hashing: the number of hash functors provided; minimum 2.
+
+        /// Key equality functor; used only for unordered probe-set
+        typedef typename opt::details::make_equal_to< value_type, options, !c_isSorted>::type key_equal_to;
+
+        /// key comparing functor based on opt::compare and opt::less option setter. Used only for ordered probe set
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+
+        /// allocator type
+        typedef typename options::allocator     allocator;
+
+        /// item counter type
+        typedef typename options::item_counter  item_counter;
+
+        /// node disposer
+        typedef typename options::disposer      disposer;
+
+    protected:
+        //@cond
+        typedef typename node_type::probeset_class  probeset_class;
+        typedef typename node_type::probeset_type   probeset_type;
+        static unsigned int const c_nNodeHashArraySize = node_type::hash_array_size;
+
+        typedef typename mutex_policy::scoped_cell_lock     scoped_cell_lock;
+        typedef typename mutex_policy::scoped_cell_trylock  scoped_cell_trylock;
+        typedef typename mutex_policy::scoped_full_lock     scoped_full_lock;
+        typedef typename mutex_policy::scoped_resize_lock   scoped_resize_lock;
+
+        typedef cuckoo::details::bucket_entry< node_type, probeset_type >   bucket_entry;
+        typedef typename bucket_entry::iterator                     bucket_iterator;
+        typedef cds::details::Allocator< bucket_entry, allocator >  bucket_table_allocator;
+
+        typedef size_t  hash_array[c_nArity]    ;   ///< hash array
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor {
+            void operator()( value_type& )
+            {}
+        };
+
+        struct empty_erase_functor  {
+            void operator()( value_type const& )
+            {}
+        };
+
+        struct empty_find_functor {
+            template <typename Q>
+            void operator()( value_type& item, Q& val )
+            {}
+        };
+#   endif
+
+#   if !defined(CDS_CXX11_LAMBDA_SUPPORT) || ((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL ) && _MSC_VER == 1600)
+        template <typename Disposer>
+        class disposer_wrapper: protected cds::details::functor_wrapper<Disposer>
+        {
+            typedef cds::details::functor_wrapper<Disposer> base_class;
+        public:
+            disposer_wrapper( Disposer d): base_class(d) {}
+
+            void operator()( node_type * pNode )
+            {
+                base_class::get()( node_traits::to_value_ptr( pNode ));
+            }
+        };
+#   endif
+
+        struct position {
+            bucket_iterator     itPrev;
+            bucket_iterator     itFound;
+        };
+
+        typedef typename std::conditional< c_isSorted
+            , cuckoo::details::contains< node_traits, true >
+            , cuckoo::details::contains< node_traits, false >
+        >::type contains_action;
+
+        template <typename Predicate>
+        struct predicate_wrapper {
+            typedef typename std::conditional< c_isSorted, cds::opt::details::make_comparator_from_less<Predicate>, Predicate>::type   type;
+        };
+
+        typedef typename std::conditional< c_isSorted, key_comparator, key_equal_to >::type key_predicate;
+        //@endcond
+
+    public:
+        static unsigned int const   c_nDefaultProbesetSize = 4  ;   ///< default probeset size
+        static size_t const         c_nDefaultInitialSize = 16  ;   ///< default initial size
+        static unsigned int const   c_nRelocateLimit = c_nArity * 2 - 1 ;   ///< Count of attempts to relocate before giving up
+
+    protected:
+        bucket_entry *      m_BucketTable[ c_nArity ] ; ///< Bucket tables
+
+        size_t              m_nBucketMask           ;   ///< Hash bitmask; bucket table size minus 1.
+        unsigned int const  m_nProbesetSize         ;   ///< Probe set size
+        unsigned int const  m_nProbesetThreshold    ;   ///< Probe set threshold
+
+        hash            m_Hash              ;   ///< Hash functor tuple
+        mutex_policy    m_MutexPolicy       ;   ///< concurrent access policy
+        item_counter    m_ItemCounter       ;   ///< item counter
+        mutable stat    m_Stat              ;   ///< internal statistics
+
+    protected:
+        //@cond
+        static void check_common_constraints()
+        {
+            static_assert( (c_nArity == mutex_policy::c_nArity), "The count of hash functors must be equal to mutex_policy arity" );
+        }
+
+        void check_probeset_properties() const
+        {
+            assert( m_nProbesetThreshold < m_nProbesetSize );
+
+            // if probe set type is cuckoo::vector<N> then m_nProbesetSize == N
+            assert( node_type::probeset_size == 0 || node_type::probeset_size == m_nProbesetSize );
+        }
+
+        template <typename Q>
+        void hashing( size_t * pHashes, Q const& v ) const
+        {
+            m_Hash( pHashes, v );
+        }
+
+        void copy_hash( size_t * pHashes, value_type const& v ) const
+        {
+            if ( c_nNodeHashArraySize )
+                memcpy( pHashes, node_traits::to_node_ptr( v )->get_hash(), sizeof(pHashes[0]) * c_nNodeHashArraySize );
+            else
+                hashing( pHashes, v );
+        }
+
+        bucket_entry& bucket( unsigned int nTable, size_t nHash )
+        {
+            assert( nTable < c_nArity );
+            return m_BucketTable[nTable][nHash & m_nBucketMask];
+        }
+
+        static void store_hash( node_type * pNode, size_t * pHashes )
+        {
+            cuckoo::details::hash_ops< node_type, c_nNodeHashArraySize >::store( pNode, pHashes );
+            //memcpy( pNode->m_arrHash, pHashes, sizeof(size_t) * c_nArity );
+        }
+
+        static bool equal_hash( node_type& node, unsigned int nTable, size_t nHash )
+        {
+            return cuckoo::details::hash_ops< node_type, c_nNodeHashArraySize >::equal_to( node, nTable, nHash );
+        }
+
+        void allocate_bucket_tables( size_t nSize )
+        {
+            assert( cds::beans::is_power2( nSize ) );
+
+            m_nBucketMask = nSize - 1;
+            bucket_table_allocator alloc;
+            for ( unsigned int i = 0; i < c_nArity; ++i )
+                m_BucketTable[i] = alloc.NewArray( nSize );
+        }
+
+        static void free_bucket_tables( bucket_entry ** pTable, size_t nCapacity )
+        {
+            bucket_table_allocator alloc;
+            for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                alloc.Delete( pTable[i], nCapacity );
+                pTable[i] = null_ptr<bucket_entry *>();
+            }
+        }
+        void free_bucket_tables()
+        {
+            free_bucket_tables( m_BucketTable, m_nBucketMask + 1 );
+        }
+
+        static unsigned int const c_nUndefTable = (unsigned int) -1;
+        template <typename Q, typename Predicate >
+        unsigned int contains( position * arrPos, size_t * arrHash, Q const& val, Predicate pred )
+        {
+            // Buckets must be locked
+
+            for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                bucket_entry& probeset = bucket( i, arrHash[i] );
+                if ( contains_action::find( probeset, arrPos[i], i, arrHash[i], val, pred ))
+                    return i;
+            }
+            return c_nUndefTable;
+        }
+
+        template <typename Q, typename Predicate, typename Func>
+        value_type * erase_( Q const& val, Predicate pred, Func f )
+        {
+            hash_array arrHash;
+            hashing( arrHash, val );
+            position arrPos[ c_nArity ];
+
+            {
+                scoped_cell_lock guard( m_MutexPolicy, arrHash );
+
+                unsigned int nTable = contains( arrPos, arrHash, val, pred );
+                if ( nTable != c_nUndefTable ) {
+                    node_type& node = *arrPos[nTable].itFound;
+                    cds::unref(f)( *node_traits::to_value_ptr(node) );
+                    bucket( nTable, arrHash[nTable]).remove( arrPos[nTable].itPrev, arrPos[nTable].itFound );
+                    --m_ItemCounter;
+                    m_Stat.onEraseSuccess();
+                    return node_traits::to_value_ptr( node );
+                }
+            }
+
+            m_Stat.onEraseFailed();
+            return null_ptr<value_type *>();
+        }
+
+        template <typename Q, typename Predicate, typename Func>
+        bool find_( Q& val, Predicate pred, Func f )
+        {
+            hash_array arrHash;
+            position arrPos[ c_nArity ];
+            hashing( arrHash, val );
+            scoped_cell_lock sl( m_MutexPolicy, arrHash );
+
+            unsigned int nTable = contains( arrPos, arrHash, val, pred );
+            if ( nTable != c_nUndefTable ) {
+                cds::unref(f)( *node_traits::to_value_ptr( *arrPos[nTable].itFound ), val );
+                m_Stat.onFindSuccess();
+                return true;
+            }
+
+            m_Stat.onFindFailed();
+            return false;
+        }
+
+        bool relocate( unsigned int nTable, size_t * arrGoalHash )
+        {
+            // arrGoalHash contains hash values for relocating element
+            // Relocating element is first one from bucket( nTable, arrGoalHash[nTable] ) probeset
+
+            m_Stat.onRelocateCall();
+
+            hash_array arrHash;
+            value_type * pVal;
+            for ( unsigned int nRound = 0; nRound < c_nRelocateLimit; ++nRound ) {
+                m_Stat.onRelocateRound();
+
+                while ( true ) {
+                    scoped_cell_lock guard( m_MutexPolicy, arrGoalHash );
+
+                    bucket_entry& refBucket = bucket( nTable, arrGoalHash[nTable] );
+                    if ( refBucket.size() < m_nProbesetThreshold ) {
+                        // probeset is not above the threshold
+                        m_Stat.onFalseRelocateRound();
+                        return true;
+                    }
+
+                    pVal = node_traits::to_value_ptr( *refBucket.begin() );
+                    copy_hash( arrHash, *pVal );
+
+                    scoped_cell_trylock guard2( m_MutexPolicy, arrHash );
+                    if ( !guard2.locked() )
+                        continue ;  // try one more time
+
+                    refBucket.remove( typename bucket_entry::iterator(), refBucket.begin() );
+
+                    unsigned int i = (nTable + 1) % c_nArity;
+
+                    // try insert into free probeset
+                    while ( i != nTable ) {
+                        bucket_entry& bkt = bucket( i, arrHash[i] );
+                        if ( bkt.size() < m_nProbesetThreshold ) {
+                            position pos;
+                            contains_action::find( bkt, pos, i, arrHash[i], *pVal, key_predicate() ) ; // must return false!
+                            bkt.insert_after( pos.itPrev, node_traits::to_node_ptr( pVal ));
+                            m_Stat.onSuccessRelocateRound();
+                            return true;
+                        }
+                        i = ( i + 1 ) % c_nArity;
+                    }
+
+                    // try insert into partial probeset
+                    i = (nTable + 1) % c_nArity;
+                    while ( i != nTable ) {
+                        bucket_entry& bkt = bucket( i, arrHash[i] );
+                        if ( bkt.size() < m_nProbesetSize ) {
+                            position pos;
+                            contains_action::find( bkt, pos, i, arrHash[i], *pVal, key_predicate() ) ; // must return false!
+                            bkt.insert_after( pos.itPrev, node_traits::to_node_ptr( pVal ));
+                            nTable = i;
+                            memcpy( arrGoalHash, arrHash, sizeof(arrHash));
+                            m_Stat.onRelocateAboveThresholdRound();
+                            goto next_iteration;
+                        }
+                        i = (i + 1) % c_nArity;
+                    }
+
+                    // all probeset is full, relocating fault
+                    refBucket.insert_after( typename bucket_entry::iterator(), node_traits::to_node_ptr( pVal ));
+                    m_Stat.onFailedRelocate();
+                    return false;
+                }
+
+            next_iteration:;
+            }
+            return false;
+        }
+
+        void resize()
+        {
+            m_Stat.onResizeCall();
+
+            size_t nOldCapacity = bucket_count();
+            bucket_entry *      pOldTable[ c_nArity ];
+            {
+                scoped_resize_lock guard( m_MutexPolicy );
+
+                if ( nOldCapacity != bucket_count() ) {
+                    m_Stat.onFalseResizeCall();
+                    return;
+                }
+
+                size_t nCapacity = nOldCapacity * 2;
+
+                m_MutexPolicy.resize( nCapacity );
+                memcpy( pOldTable, m_BucketTable, sizeof(pOldTable));
+                allocate_bucket_tables( nCapacity );
+
+                typedef typename bucket_entry::iterator bucket_iterator;
+                hash_array arrHash;
+                position arrPos[ c_nArity ];
+
+                for ( unsigned int nTable = 0; nTable < c_nArity; ++nTable ) {
+                    bucket_entry * pTable = pOldTable[nTable];
+                    for ( size_t k = 0; k < nOldCapacity; ++k ) {
+                        bucket_iterator itNext;
+                        for ( bucket_iterator it = pTable[k].begin(), itEnd = pTable[k].end(); it != itEnd; it = itNext ) {
+                            itNext = it;
+                            ++itNext;
+
+                            value_type& val = *node_traits::to_value_ptr( *it );
+                            copy_hash( arrHash, val );
+                            contains( arrPos, arrHash, val, key_predicate() ) ; // must return c_nUndefTable
+
+                            for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                                bucket_entry& refBucket = bucket( i, arrHash[i] );
+                                if ( refBucket.size() < m_nProbesetThreshold ) {
+                                    refBucket.insert_after( arrPos[i].itPrev, &*it );
+                                    m_Stat.onResizeSuccessMove();
+                                    goto do_next;
+                                }
+                            }
+
+                            for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                                bucket_entry& refBucket = bucket( i, arrHash[i] );
+                                if ( refBucket.size() < m_nProbesetSize ) {
+                                    refBucket.insert_after( arrPos[i].itPrev, &*it );
+                                    assert( refBucket.size() > 1 );
+                                    copy_hash( arrHash, *node_traits::to_value_ptr( *refBucket.begin()) );
+                                    m_Stat.onResizeRelocateCall();
+                                    relocate( i, arrHash );
+                                    break;
+                                }
+                            }
+                        do_next:;
+                        }
+                    }
+                }
+            }
+            free_bucket_tables( pOldTable, nOldCapacity );
+        }
+
+        CDS_CONSTEXPR static unsigned int calc_probeset_size( unsigned int nProbesetSize ) CDS_NOEXCEPT
+        {
+            return nProbesetSize
+                ? nProbesetSize
+                : ( node_type::probeset_size ? node_type::probeset_size : c_nDefaultProbesetSize )
+;
+        }
+        //@endcond
+
+    public:
+        /// Default constructor
+        /**
+            Initial size = \ref c_nDefaultInitialSize
+
+            Probe set size:
+            - \p c_nDefaultProbesetSize if \p probeset_type is \p cuckoo::list
+            - \p Capacity if \p probeset_type is <tt> cuckoo::vector<Capacity> </tt>
+
+            Probe set threshold = probe set size - 1
+        */
+        CuckooSet()
+            : m_nProbesetSize( calc_probeset_size(0) )
+            , m_nProbesetThreshold( m_nProbesetSize - 1 )
+            , m_MutexPolicy( c_nDefaultInitialSize )
+        {
+            check_common_constraints();
+            check_probeset_properties();
+
+            allocate_bucket_tables( c_nDefaultInitialSize );
+        }
+
+        /// Constructs the set object with given probe set size and threshold
+        /**
+            If probe set type is <tt> cuckoo::vector<Capacity> </tt> vector
+            then \p nProbesetSize should be equal to vector's \p Capacity.
+        */
+        CuckooSet(
+            size_t nInitialSize                 ///< Initial set size; if 0 - use default initial size \ref c_nDefaultInitialSize
+            , unsigned int nProbesetSize        ///< probe set size
+            , unsigned int nProbesetThreshold = 0   ///< probe set threshold, <tt>nProbesetThreshold < nProbesetSize</tt>. If 0, nProbesetThreshold = nProbesetSize - 1
+        )
+            : m_nProbesetSize( calc_probeset_size(nProbesetSize) )
+            , m_nProbesetThreshold( nProbesetThreshold ? nProbesetThreshold : m_nProbesetSize - 1 )
+            , m_MutexPolicy( cds::beans::ceil2(nInitialSize ? nInitialSize : c_nDefaultInitialSize ))
+        {
+            check_common_constraints();
+            check_probeset_properties();
+
+            allocate_bucket_tables( nInitialSize ? cds::beans::ceil2( nInitialSize ) : c_nDefaultInitialSize );
+        }
+
+        /// Constructs the set object with given hash functor tuple
+        /**
+            The probe set size and threshold are set as default, see CuckooSet()
+        */
+        CuckooSet(
+            hash_tuple_type const& h    ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+            : m_nProbesetSize( calc_probeset_size(0) )
+            , m_nProbesetThreshold( m_nProbesetSize -1 )
+            , m_Hash( h )
+            , m_MutexPolicy( c_nDefaultInitialSize )
+        {
+            check_common_constraints();
+            check_probeset_properties();
+
+            allocate_bucket_tables( c_nDefaultInitialSize );
+        }
+
+        /// Constructs the set object with given probe set properties and hash functor tuple
+        /**
+            If probe set type is <tt> cuckoo::vector<Capacity> </tt> vector
+            then \p nProbesetSize should be equal to vector's \p Capacity.
+        */
+        CuckooSet(
+            size_t nInitialSize                 ///< Initial set size; if 0 - use default initial size \ref c_nDefaultInitialSize
+            , unsigned int nProbesetSize        ///< probe set size, positive integer
+            , unsigned int nProbesetThreshold   ///< probe set threshold, <tt>nProbesetThreshold < nProbesetSize</tt>. If 0, nProbesetThreshold = nProbesetSize - 1
+            , hash_tuple_type const& h    ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+            : m_nProbesetSize( calc_probeset_size(nProbesetSize) )
+            , m_nProbesetThreshold( nProbesetThreshold ? nProbesetThreshold : m_nProbesetSize - 1)
+            , m_Hash( h )
+            , m_MutexPolicy( cds::beans::ceil2(nInitialSize ? nInitialSize : c_nDefaultInitialSize ))
+        {
+            check_common_constraints();
+            check_probeset_properties();
+
+            allocate_bucket_tables( nInitialSize ? cds::beans::ceil2( nInitialSize ) : c_nDefaultInitialSize );
+        }
+
+#   ifdef CDS_MOVE_SEMANTICS_SUPPORT
+        /// Constructs the set object with given hash functor tuple (move semantics)
+        /**
+            The probe set size and threshold are set as default, see CuckooSet()
+        */
+        CuckooSet(
+            hash_tuple_type&& h     ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+            : m_nProbesetSize( calc_probeset_size(0) )
+            , m_nProbesetThreshold( m_nProbesetSize / 2 )
+            , m_Hash( std::forward<hash_tuple_type>(h) )
+            , m_MutexPolicy( c_nDefaultInitialSize )
+        {
+            check_common_constraints();
+            check_probeset_properties();
+
+            allocate_bucket_tables( c_nDefaultInitialSize );
+        }
+
+        /// Constructs the set object with given probe set properties and hash functor tuple (move semantics)
+        /**
+            If probe set type is <tt> cuckoo::vector<Capacity> </tt> vector
+            then \p nProbesetSize should be equal to vector's \p Capacity.
+        */
+        CuckooSet(
+            size_t nInitialSize                 ///< Initial set size; if 0 - use default initial size \ref c_nDefaultInitialSize
+            , unsigned int nProbesetSize        ///< probe set size, positive integer
+            , unsigned int nProbesetThreshold   ///< probe set threshold, <tt>nProbesetThreshold < nProbesetSize</tt>. If 0, nProbesetThreshold = nProbesetSize - 1
+            , hash_tuple_type&& h    ///< hash functor tuple of type <tt>std::tuple<H1, H2, ... Hn></tt> where <tt> n == \ref c_nArity </tt>
+        )
+            : m_nProbesetSize( calc_probeset_size(nProbesetSize) )
+            , m_nProbesetThreshold( nProbesetThreshold ? nProbesetThreshold : m_nProbesetSize - 1)
+            , m_Hash( std::forward<hash_tuple_type>(h) )
+            , m_MutexPolicy( cds::beans::ceil2(nInitialSize ? nInitialSize : c_nDefaultInitialSize ))
+        {
+            check_common_constraints();
+            check_probeset_properties();
+
+            allocate_bucket_tables( nInitialSize ? cds::beans::ceil2( nInitialSize ) : c_nDefaultInitialSize );
+        }
+#   endif   // ifdef CDS_MOVE_SEMANTICS_SUPPORT
+
+        /// Destructor
+        ~CuckooSet()
+        {
+            free_bucket_tables();
+        }
+
+    public:
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert( val, []( value_type& ) {} );
+#       else
+            return insert( val, empty_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted.
+
+            The user-defined functor is called only if the inserting is success and can be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            hash_array arrHash;
+            position arrPos[ c_nArity ];
+            unsigned int nGoalTable;
+
+            hashing( arrHash, val );
+            node_type * pNode = node_traits::to_node_ptr( val );
+            store_hash( pNode, arrHash );
+
+            while (true) {
+                {
+                    scoped_cell_lock guard( m_MutexPolicy, arrHash );
+
+                    if ( contains( arrPos, arrHash, val, key_predicate() ) != c_nUndefTable ) {
+                        m_Stat.onInsertFailed();
+                        return false;
+                    }
+
+                    for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                        bucket_entry& refBucket = bucket( i, arrHash[i] );
+                        if ( refBucket.size() < m_nProbesetThreshold ) {
+                            refBucket.insert_after( arrPos[i].itPrev, pNode );
+                            cds::unref(f)( val );
+                            ++m_ItemCounter;
+                            m_Stat.onInsertSuccess();
+                            return true;
+                        }
+                    }
+
+                    for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                        bucket_entry& refBucket = bucket( i, arrHash[i] );
+                        if ( refBucket.size() < m_nProbesetSize ) {
+                            refBucket.insert_after( arrPos[i].itPrev, pNode );
+                            cds::unref(f)( val );
+                            ++m_ItemCounter;
+                            nGoalTable = i;
+                            assert( refBucket.size() > 1 );
+                            copy_hash( arrHash, *node_traits::to_value_ptr( *refBucket.begin()) );
+                            goto do_relocate;
+                        }
+                    }
+                }
+
+                m_Stat.onInsertResize();
+                resize();
+            }
+
+        do_relocate:
+            m_Stat.onInsertRelocate();
+            if ( !relocate( nGoalTable, arrHash )) {
+                m_Stat.onInsertRelocateFault();
+                m_Stat.onInsertResize();
+                resize();
+            }
+
+            m_Stat.onInsertSuccess();
+            return true;
+        }
+
+        /// Ensures that the \p val exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the set, then \p val is inserted into the set.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refers to the same thing.
+
+            The functor may change non-key fields of the \p item.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is \p true if operation is successful,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            hash_array arrHash;
+            position arrPos[ c_nArity ];
+            unsigned int nGoalTable;
+
+            hashing( arrHash, val );
+            node_type * pNode = node_traits::to_node_ptr( val );
+            store_hash( pNode, arrHash );
+
+            while (true) {
+                {
+                    scoped_cell_lock guard( m_MutexPolicy, arrHash );
+
+                    unsigned int nTable = contains( arrPos, arrHash, val, key_predicate() );
+                    if ( nTable != c_nUndefTable ) {
+                        cds::unref(func)( false, *node_traits::to_value_ptr( *arrPos[nTable].itFound ), val );
+                        m_Stat.onEnsureExist();
+                        return std::make_pair( true, false );
+                    }
+
+                    node_type * pNode = node_traits::to_node_ptr( val );
+                    store_hash( pNode, arrHash );
+
+                    for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                        bucket_entry& refBucket = bucket( i, arrHash[i] );
+                        if ( refBucket.size() < m_nProbesetThreshold ) {
+                            refBucket.insert_after( arrPos[i].itPrev, pNode );
+                            cds::unref(func)( true, val, val );
+                            ++m_ItemCounter;
+                            m_Stat.onEnsureSuccess();
+                            return std::make_pair( true, true );
+                        }
+                    }
+
+                    for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                        bucket_entry& refBucket = bucket( i, arrHash[i] );
+                        if ( refBucket.size() < m_nProbesetSize ) {
+                            refBucket.insert_after( arrPos[i].itPrev, pNode );
+                            cds::unref(func)( true, val, val );
+                            ++m_ItemCounter;
+                            nGoalTable = i;
+                            assert( refBucket.size() > 1 );
+                            copy_hash( arrHash, *node_traits::to_value_ptr( *refBucket.begin()) );
+                            goto do_relocate;
+                        }
+                    }
+                }
+
+                m_Stat.onEnsureResize();
+                resize();
+            }
+
+        do_relocate:
+            m_Stat.onEnsureRelocate();
+            if ( !relocate( nGoalTable, arrHash )) {
+                m_Stat.onEnsureRelocateFault();
+                m_Stat.onEnsureResize();
+                resize();
+            }
+
+            m_Stat.onEnsureSuccess();
+            return std::make_pair( true, true );
+        }
+
+        /// Unlink the item \p val from the set
+        /**
+            The function searches the item \p val in the set and unlink it
+            if it is found and is equal to \p val (here, the equality means that
+            \p val belongs to the set: if \p item is an item found then
+            unlink is successful iif <tt>&val == &item</tt>)
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+            hash_array arrHash;
+            hashing( arrHash, val );
+            position arrPos[ c_nArity ];
+
+            {
+                scoped_cell_lock guard( m_MutexPolicy, arrHash );
+
+                unsigned int nTable = contains( arrPos, arrHash, val, key_predicate() );
+                if ( nTable != c_nUndefTable && node_traits::to_value_ptr(*arrPos[nTable].itFound) == &val ) {
+                    bucket( nTable, arrHash[nTable]).remove( arrPos[nTable].itPrev, arrPos[nTable].itFound );
+                    --m_ItemCounter;
+                    m_Stat.onUnlinkSuccess();
+                    return true;
+                }
+            }
+
+            m_Stat.onUnlinkFailed();
+            return false;
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_CuckooSet_erase
+            The function searches an item with key equal to \p val in the set,
+            unlinks it from the set, and returns a pointer to unlinked item.
+
+            If the item with key equal to \p val is not found the function return \p NULL.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        value_type * erase( Q const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase( val, [](value_type const&) {} );
+#       else
+            return erase( val, empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_CuckooSet_erase "erase(Q const&)"
+            but \p pred is used for key comparing.
+            If cuckoo set is ordered, then \p Predicate should have the interface and semantics like \p std::less.
+            If cuckoo set is unordered, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p Predicate must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Predicate>
+        value_type * erase_with( Q const& val, Predicate pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( val, typename predicate_wrapper<Predicate>::type(), [](value_type const&) {} );
+#       else
+            return erase_( val, typename predicate_wrapper<Predicate>::type(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Delete the item from the set
+        /** \anchor cds_intrusive_CuckooSet_erase_func
+            The function searches an item with key equal to \p val in the set,
+            call \p f functor with item found, unlinks it from the set, and returns a pointer to unlinked item.
+
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            If the item with key equal to \p val is not found the function return \p NULL.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q, typename Func>
+        value_type * erase( Q const& val, Func f )
+        {
+            return erase_( val, key_predicate(), f );
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_CuckooSet_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            If you use ordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::less.
+            If you use unordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p Predicate must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Predicate, typename Func>
+        value_type * erase_with( Q const& val, Predicate pred, Func f )
+        {
+            return erase_( val, typename predicate_wrapper<Predicate>::type(), f );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_CuckooSet_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_( val, key_predicate(), f );
+        }
+
+        /// Find the key \p val using \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_CuckooSet_find_func "find(Q&, Func)"
+            but \p pred is used for key comparison.
+            If you use ordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::less.
+            If you use unordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Predicate, typename Func>
+        bool find_with( Q& val, Predicate pred, Func f )
+        {
+            return find_( val, typename predicate_wrapper<Predicate>::type(), f );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_CuckooSet_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_( val, key_predicate(), f );
+        }
+
+        /// Find the key \p val using \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_CuckooSet_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparison.
+            If you use ordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::less.
+            If you use unordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Predicate, typename Func>
+        bool find_with( Q const& val, Predicate pred, Func f )
+        {
+            return find_( val, typename predicate_wrapper<Predicate>::type(), f );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_CuckooSet_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool find( Q const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return find( val, [](value_type&, Q const& ) {} );
+#       else
+            return find( val, empty_find_functor() );
+#       endif
+        }
+
+        /// Find the key \p val using \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_CuckooSet_find_val "find(Q const&)"
+            but \p pred is used for key comparison.
+            If you use ordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::less.
+            If you use unordered cuckoo set, then \p Predicate should have the interface and semantics like \p std::equal_to.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Predicate>
+        bool find_with( Q const& val, Predicate pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return find_with( val, typename predicate_wrapper<Predicate>::type(), [](value_type& , Q const& ) {} );
+#       else
+            return find_with( val, typename predicate_wrapper<Predicate>::type(), empty_find_functor() );
+#       endif
+        }
+
+        /// Clears the set
+        /**
+            The function unlinks all items from the set.
+            For any item \ref disposer is called
+        */
+        void clear()
+        {
+            clear_and_dispose( disposer() );
+        }
+
+        /// Clears the set and calls \p disposer for each item
+        /**
+            The function unlinks all items from the set calling \p disposer for each item.
+            \p Disposer functor interface is:
+            \code
+            struct Disposer{
+                void operator()( value_type * p );
+            };
+            \endcode
+
+            The \ref disposer specified in \p Traits options is not called.
+        */
+        template <typename Disposer>
+        void clear_and_dispose( Disposer oDisposer )
+        {
+            // locks entire array
+            scoped_full_lock sl( m_MutexPolicy );
+
+#   if !defined(CDS_CXX11_LAMBDA_SUPPORT) || ((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL ) && _MSC_VER == 1600)
+            disposer_wrapper<Disposer> disp( oDisposer );
+#       endif
+            for ( unsigned int i = 0; i < c_nArity; ++i ) {
+                bucket_entry * pEntry = m_BucketTable[i];
+                bucket_entry * pEnd = pEntry + m_nBucketMask + 1;
+                for ( ; pEntry != pEnd ; ++pEntry ) {
+#       if defined(CDS_CXX11_LAMBDA_SUPPORT) && !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1600)
+                    // MSVC 10: error to call nested typedefs node_traits from lambda
+                    pEntry->clear( [&oDisposer]( node_type * pNode ){ oDisposer( node_traits::to_value_ptr( pNode )) ; } );
+#       else
+                    pEntry->clear( cds::ref(disp) );
+#       endif
+                }
+            }
+            m_ItemCounter.reset();
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns the size of hash table
+        /**
+            The hash table size is non-constant and can be increased via resizing.
+        */
+        size_t bucket_count() const
+        {
+            return m_nBucketMask + 1;
+        }
+
+        /// Returns lock array size
+        size_t lock_count() const
+        {
+            return m_MutexPolicy.lock_count();
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return m_Stat;
+        }
+
+        /// Returns const reference to mutex policy internal statistics
+        typename mutex_policy::statistics_type const& mutex_policy_statistics() const
+        {
+            return m_MutexPolicy.statistics();
+        }
+    };
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_CUCKOO_SET_H
diff --git a/cds/intrusive/deque_stat.h b/cds/intrusive/deque_stat.h
new file mode 100644 (file)
index 0000000..7146542
--- /dev/null
@@ -0,0 +1,82 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_DEQUE_STAT_H
+#define __CDS_INTRUSIVE_DEQUE_STAT_H
+
+#include <cds/cxx11_atomic.h>
+
+namespace cds { namespace intrusive {
+
+    /// Deque internal statistics. May be used for debugging or profiling
+    /** @ingroup cds_intrusive_helper
+        Template argument \p Counter defines type of counter.
+        Default is cds::atomics::event_counter.
+        You may use other counter type like as cds::atomics::item_counter,
+        or even integral type, for example, \p int.
+    */
+    template <typename Counter = cds::atomicity::event_counter >
+    struct deque_stat
+    {
+        typedef Counter     counter_type    ;   ///< Counter type
+
+        counter_type m_PushFrontCount       ;   ///< push front event count
+        counter_type m_PushBackCount        ;   ///< push back event count
+        counter_type m_PopFrontCount        ;   ///< pop front event count
+        counter_type m_PopBackCount         ;   ///< pop back event count
+        counter_type m_PopEmptyCount        ;   ///< pop from empty deque event count
+        counter_type m_PushFrontContentionCount ;   ///< \p push_front contention count
+        counter_type m_PushBackContentionCount ;    ///< \p push_back contention count
+        counter_type m_PopFrontContentionCount ;   ///< \p pop_front contention count
+        counter_type m_PopBackContentionCount ;    ///< \p pop_back contention count
+
+        /// Register \p push_front call
+        void onPushFront()               { ++m_PushFrontCount; }
+
+        /// Register \p push_back call
+        void onPushBack()               { ++m_PushBackCount; }
+
+        /// Register \p pop_front call
+        void onPopFront()                { ++m_PopFrontCount; }
+
+        /// Register \p pop_back call
+        void onPopBack()                { ++m_PopBackCount; }
+
+        /// Register popping from empty deque
+        void onPopEmpty()               { ++m_PopEmptyCount; }
+
+        /// Register "\p push_front contention" event
+        void onPushFrontContention()    { ++m_PushFrontContentionCount; }
+
+        /// Register "\p push_back contention" event
+        void onPushBackContention()     { ++m_PushBackContentionCount; }
+
+        /// Register "\p pop_front contention" event
+        void onPopFrontContention()     { ++m_PopFrontContentionCount; }
+
+        /// Register "\p pop_back contention" event
+        void onPopBackContention()      { ++m_PopBackContentionCount; }
+    };
+
+
+    /// Dummy deque statistics - no counting is performed. Support interface like \ref deque_stat
+    /** @ingroup cds_intrusive_helper
+    */
+    struct deque_dummy_stat
+    {
+        //@cond
+        void onPushFront()              {}
+        void onPushBack()               {}
+        void onPopFront()               {}
+        void onPopBack()                {}
+        void onPopEmpty()               {}
+        void onPushFrontContention()    {}
+        void onPushBackContention()     {}
+        void onPopFrontContention()     {}
+        void onPopBackContention()      {}
+        //@endcond
+    };
+
+}}  // namespace cds::intrusive
+
+
+#endif  // #ifndef __CDS_INTRUSIVE_DEQUE_STAT_H
diff --git a/cds/intrusive/details/dummy_node_holder.h b/cds/intrusive/details/dummy_node_holder.h
new file mode 100644 (file)
index 0000000..5d4120a
--- /dev/null
@@ -0,0 +1,67 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_DETAILS_DUMMY_NODE_HOLDER_H
+#define __CDS_INTRUSIVE_DETAILS_DUMMY_NODE_HOLDER_H
+
+#include <cds/gc/gc_fwd.h>
+#include <cds/details/allocator.h>
+
+//@cond
+namespace cds { namespace intrusive { namespace details {
+
+    template <typename GC, typename Node, typename Alloc = CDS_DEFAULT_ALLOCATOR>
+    class dummy_node: public Node
+    {
+        typedef Node    node_type;
+
+        node_type       m_Dummy;
+    public:
+        node_type *     get()
+        {
+            return &m_Dummy;
+        }
+
+        void retire()
+        {}
+    };
+
+    template <typename Node, typename Alloc>
+    class dummy_node< cds::gc::HRC, Node, Alloc >
+    {
+        typedef Node    node_type;
+        typedef cds::gc::HRC    gc;
+        typedef cds::details::Allocator< node_type, Alloc> allocator_type;
+
+        node_type *     m_pDummy;
+
+        struct dummy_node_disposer {
+            void operator()( node_type * p )
+            {
+                assert( p != null_ptr<node_type *>());
+
+                p->m_pNext.store( null_ptr<node_type *>(), CDS_ATOMIC::memory_order_release );
+                allocator_type().Delete( p );
+            }
+        };
+
+    public:
+        dummy_node()
+            : m_pDummy( allocator_type().New() )
+        {}
+
+        node_type *     get()
+        {
+            return m_pDummy;
+        }
+
+        void retire()
+        {
+            gc::template retire<dummy_node_disposer>( m_pDummy );
+        }
+    };
+
+}}} // namepace cds::intrusive::details
+
+//@endcond
+
+#endif // #ifndef __CDS_INTRUSIVE_DETAILS_DUMMY_NODE_HOLDER_H
diff --git a/cds/intrusive/details/ellen_bintree_base.h b/cds/intrusive/details/ellen_bintree_base.h
new file mode 100644 (file)
index 0000000..d24cb7b
--- /dev/null
@@ -0,0 +1,688 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_DETAILS_ELLEN_BINTREE_BASE_H
+#define __CDS_INTRUSIVE_DETAILS_ELLEN_BINTREE_BASE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/opt/options.h>
+#include <cds/urcu/options.h>
+#include <cds/details/std/type_traits.h>
+#include <cds/details/marked_ptr.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace intrusive {
+
+    /// EllenBinTree related declarations
+    namespace ellen_bintree {
+
+        //Forwards
+        template <class GC> struct base_node;
+        template <class GC, typename Tag = opt::none> struct node;
+        template <class GC, typename Key> struct internal_node;
+
+        /// Update descriptor
+        /**
+            Update descriptor is used internally for helping concurrent threads
+            to complete modifying operation.
+            Usually, you should not use \p update_desc type directly until
+            you want to develop special free-list of update descriptor.
+
+            Template parameters:
+            - \p LeafNode - leaf node type, see \ref node
+            - \p InternalNode - internal node type, see \ref internal_node
+
+            @note Size of update descriptor is constant.
+            It does not depends of template arguments.
+        */
+        template <typename LeafNode, typename InternalNode>
+        struct update_desc {
+            //@cond
+            typedef LeafNode        leaf_node;
+            typedef InternalNode    internal_node;
+
+            typedef cds::details::marked_ptr< update_desc, 3 > update_ptr;
+
+            enum {
+                Clean = 0,
+                DFlag = 1,
+                IFlag = 2,
+                Mark  = 3
+            };
+
+            struct insert_info {
+                internal_node *    pParent;
+                internal_node *    pNew;
+                leaf_node *        pLeaf;
+                bool               bRightLeaf;
+            };
+            struct delete_info {
+                internal_node *    pGrandParent;
+                internal_node *    pParent;
+                leaf_node *        pLeaf;
+                update_desc *      pUpdateParent;
+                bool               bDisposeLeaf; // true if pLeaf should be disposed, false otherwise (for extract operation, RCU)
+                bool               bRightParent;
+                bool               bRightLeaf;
+            };
+
+            union {
+                insert_info     iInfo;
+                delete_info     dInfo;
+            };
+
+            update_desc *   pNextRetire     ;   // for local retired list (RCU)
+
+            update_desc()
+                : pNextRetire( null_ptr<update_desc *>() )
+            {}
+            //@endcond
+        };
+
+        //@cond
+        struct basic_node
+        {
+            enum flags {
+                internal        = 1,    ///< set for internal node
+                key_infinite1   = 2,    ///< set if node's key is Inf1
+                key_infinite2   = 4,    ///< set if node's key is Inf2
+
+                key_infinite = key_infinite1 | key_infinite2    ///< Cumulative infinite flags
+            };
+
+            unsigned int    m_nFlags    ;   ///< Internal flags
+
+            /// Constructs leaf (bIntrenal == false) or internal (bInternal == true) node
+            explicit basic_node( bool bInternal )
+                : m_nFlags( bInternal ? internal : 0 )
+            {}
+
+            /// Checks if the node is a leaf
+            bool is_leaf() const
+            {
+                return !is_internal();
+            }
+
+            /// Checks if the node is internal
+            bool is_internal() const
+            {
+                return (m_nFlags & internal) != 0;
+            }
+
+            /// Returns infinite key, 0 if the node is not infinite
+            unsigned int infinite_key() const
+            {
+                return m_nFlags & key_infinite;
+            }
+
+            /// Sets infinite key for the node (for internal use only!!!)
+            void infinite_key( int nInf )
+            {
+                m_nFlags &= ~key_infinite;
+                switch ( nInf ) {
+                case 1:
+                    m_nFlags |= key_infinite1;
+                    break;
+                case 2:
+                    m_nFlags |= key_infinite2;
+                    break;
+                case 0:
+                    break;
+                default:
+                    assert( false );
+                    break;
+                }
+            }
+        };
+
+        template <class GC>
+        struct base_node: public basic_node
+        {
+            typedef basic_node base_class;
+
+            typedef GC              gc       ;   ///< Garbage collector
+            /// Constructs leaf (bIntrenal == false) or internal (bInternal == true) node
+            explicit base_node( bool bInternal )
+                : base_class( bInternal )
+            {}
+        };
+        //@endcond
+
+        /// Ellen's binary tree leaf node
+        /**
+            Template parameters:
+            - \p GC - one of \ref cds_garbage_collector "garbage collector type"
+            - \p Tag - a tag used to distinguish between different implementation. An incomplete type may be used as a tag.
+        */
+        template <typename GC,
+#   ifdef CDS_DOXYGEN_INVOKED
+            typename Tag = opt::none
+#   else
+            typename Tag
+#   endif
+        >
+        struct node
+#   ifndef CDS_DOXYGEN_INVOKED
+            : public base_node< GC >
+#   endif
+        {
+            //@cond
+            typedef base_node< GC >   base_class;
+            //@endcond
+
+            typedef GC              gc       ;   ///< Garbage collector type
+            typedef Tag             tag      ;   ///< Tag
+
+            /// Default ctor
+            node()
+                : base_class( false )
+            {}
+        };
+
+        /// Ellen's binary tree internal node
+        /**
+            Template arguments:
+            - \p Key - key type
+            - \p LeafNode - leaf node type
+        */
+        template <typename Key, typename LeafNode>
+        struct internal_node
+#   ifndef CDS_DOXYGEN_INVOKED
+            : public base_node<typename LeafNode::gc>
+#   endif
+        {
+            //@cond
+            typedef base_node<typename LeafNode::gc>   base_class;
+            //@endcond
+
+            typedef Key         key_type    ;   ///< key type
+            typedef LeafNode    leaf_node   ;   ///< type of leaf node
+            typedef update_desc< leaf_node, internal_node > update_desc_type; ///< Update descriptor
+            typedef typename update_desc_type::update_ptr  update_ptr ; ///< Marked pointer to update descriptor
+
+            key_type                         m_Key       ;   ///< Regular key
+            CDS_ATOMIC::atomic<base_class *> m_pLeft     ;   ///< Left subtree
+            CDS_ATOMIC::atomic<base_class *> m_pRight    ;   ///< Right subtree
+            CDS_ATOMIC::atomic<update_ptr>   m_pUpdate   ;   ///< Update descriptor
+            //@cond
+            uintptr_t                           m_nEmptyUpdate; ///< ABA prevention for m_pUpdate, from 0..2^16 step 4
+            //@endcond
+
+            /// Default ctor
+            internal_node()
+                : base_class( true )
+                , m_pLeft( null_ptr<base_class *>() )
+                , m_pRight( null_ptr<base_class *>() )
+                , m_pUpdate( update_ptr() )
+                , m_nEmptyUpdate(0)
+            {}
+
+            //@cond
+            update_ptr null_update_desc()
+            {
+                return update_ptr( reinterpret_cast<update_desc_type *>( (++m_nEmptyUpdate << 2) & 0xFFFF ) );
+            }
+            //@endcond
+        };
+
+        /// Types of EllenBinTree node
+        /**
+            This struct declares different \p %EllenBinTree node types.
+            It can be useful for simplifying \p %EllenBinTree node declaration in your application.
+        */
+        template <typename GC, typename Key, typename Tag = opt::none>
+        struct node_types
+        {
+            typedef node<GC, Tag>                       leaf_node_type      ;   ///< Leaf node type
+            typedef internal_node<Key, leaf_node_type>  internal_node_type  ;   ///< Internal node type
+            typedef update_desc<leaf_node_type, internal_node_type> update_desc_type ;  ///< Update descriptor type
+        };
+
+        //@cond
+        struct undefined_gc;
+        struct default_hook {
+            typedef undefined_gc    gc;
+            typedef opt::none       tag;
+        };
+        //@endcond
+
+        //@cond
+        template < typename HookType, CDS_DECL_OPTIONS2>
+        struct hook
+        {
+            typedef typename opt::make_options< default_hook, CDS_OPTIONS2>::type  options;
+            typedef typename options::gc    gc;
+            typedef typename options::tag   tag;
+            typedef node<gc, tag>           node_type;
+            typedef HookType                hook_type;
+        };
+        //@endcond
+
+        /// Base hook
+        /**
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - a tag
+        */
+        template < CDS_DECL_OPTIONS2 >
+        struct base_hook: public hook< opt::base_hook_tag, CDS_OPTIONS2 >
+        {};
+
+        /// Member hook
+        /**
+            \p MemberOffset defines offset in bytes of \ref node member into your structure.
+            Use \p offsetof macro to define \p MemberOffset
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - a tag
+        */
+        template < size_t MemberOffset, CDS_DECL_OPTIONS2 >
+        struct member_hook: public hook< opt::member_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            static const size_t c_nMemberOffset = MemberOffset;
+            //@endcond
+        };
+
+        /// Traits hook
+        /**
+            \p NodeTraits defines type traits for node.
+            See \ref node_traits for \p NodeTraits interface description
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - a tag
+        */
+        template <typename NodeTraits, CDS_DECL_OPTIONS2 >
+        struct traits_hook: public hook< opt::traits_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            typedef NodeTraits node_traits;
+            //@endcond
+        };
+
+        /// Key extracting functor option setter
+        template <typename Type>
+        struct key_extractor {
+            //@cond
+            template <typename Base> struct pack: public Base
+            {
+                typedef Type key_extractor;
+            };
+            //@endcond
+        };
+
+        /// Update descriptor allocator option setter
+        template <typename Type>
+        struct update_desc_allocator {
+            //@cond
+            template <typename Base> struct pack: public Base
+            {
+                typedef Type update_desc_allocator;
+            };
+            //@endcond
+        };
+
+        /// EllenBinTree internal statistics
+        template <typename Counter = cds::atomicity::event_counter>
+        struct stat {
+            typedef Counter   event_counter ; ///< Event counter type
+
+            event_counter   m_nInternalNodeCreated  ;   ///< Total count of created internal node
+            event_counter   m_nInternalNodeDeleted  ;   ///< Total count of deleted internal node
+            event_counter   m_nUpdateDescCreated    ;   ///< Total count of created update descriptors
+            event_counter   m_nUpdateDescDeleted    ;   ///< Total count of deleted update descriptors
+
+            event_counter   m_nInsertSuccess        ; ///< Count of success insertion
+            event_counter   m_nInsertFailed         ; ///< Count of failed insertion
+            event_counter   m_nInsertRetries        ; ///< Count of unsuccessful retries of insertion
+            event_counter   m_nEnsureExist          ; ///< Count of \p ensure call for existed node
+            event_counter   m_nEnsureNew            ; ///< Count of \p ensure call for new node
+            event_counter   m_nEnsureRetries        ; ///< Count of unsuccessful retries of ensuring
+            event_counter   m_nEraseSuccess         ; ///< Count of successful call of \p erase and \p unlink
+            event_counter   m_nEraseFailed          ; ///< Count of failed call of \p erase and \p unlink
+            event_counter   m_nEraseRetries         ; ///< Count of unsuccessful retries inside erasing/unlinking
+            event_counter   m_nFindSuccess          ; ///< Count of successful \p find call
+            event_counter   m_nFindFailed           ; ///< Count of failed \p find call
+            event_counter   m_nExtractMinSuccess    ; ///< Count of successful call of \p extract_min
+            event_counter   m_nExtractMinFailed     ; ///< Count of failed call of \p extract_min
+            event_counter   m_nExtractMinRetries    ; ///< Count of unsuccessful retries inside \p extract_min
+            event_counter   m_nExtractMaxSuccess    ; ///< Count of successful call of \p extract_max
+            event_counter   m_nExtractMaxFailed     ; ///< Count of failed call of \p extract_max
+            event_counter   m_nExtractMaxRetries    ; ///< Count of unsuccessful retries inside \p extract_max
+            event_counter   m_nSearchRetry          ; ///< How many times the deleting node was encountered while searching
+
+            event_counter   m_nHelpInsert           ; ///< The number of insert help from the other thread
+            event_counter   m_nHelpDelete           ; ///< The number of delete help from the other thread
+            event_counter   m_nHelpMark             ; ///< The number of delete help (mark phase) from the other thread
+            event_counter   m_nHelpGuardSuccess     ; ///< The number of successful guarding of update descriptor data
+            event_counter   m_nHelpGuardFailed      ; ///< The number of failed guarding of update descriptor data
+
+            //@cond
+            void    onInternalNodeCreated()         { ++m_nInternalNodeCreated  ; }
+            void    onInternalNodeDeleted()         { ++m_nInternalNodeDeleted  ; }
+            void    onUpdateDescCreated()           { ++m_nUpdateDescCreated    ; }
+            void    onUpdateDescDeleted()           { ++m_nUpdateDescDeleted    ; }
+            void    onInsertSuccess()               { ++m_nInsertSuccess        ; }
+            void    onInsertFailed()                { ++m_nInsertFailed         ; }
+            void    onInsertRetry()                 { ++m_nInsertRetries        ; }
+            void    onEnsureExist()                 { ++m_nEnsureExist          ; }
+            void    onEnsureNew()                   { ++m_nEnsureNew            ; }
+            void    onEnsureRetry()                 { ++m_nEnsureRetries        ; }
+            void    onEraseSuccess()                { ++m_nEraseSuccess         ; }
+            void    onEraseFailed()                 { ++m_nEraseFailed          ; }
+            void    onEraseRetry()                  { ++m_nEraseRetries         ; }
+            void    onExtractMinSuccess()           { ++m_nExtractMinSuccess    ; }
+            void    onExtractMinFailed()            { ++m_nExtractMinFailed     ; }
+            void    onExtractMinRetry()             { ++m_nExtractMinRetries    ; }
+            void    onExtractMaxSuccess()           { ++m_nExtractMaxSuccess    ; }
+            void    onExtractMaxFailed()            { ++m_nExtractMaxFailed     ; }
+            void    onExtractMaxRetry()             { ++m_nExtractMaxRetries    ; }
+            void    onFindSuccess()                 { ++m_nFindSuccess          ; }
+            void    onFindFailed()                  { ++m_nFindFailed           ; }
+            void    onSearchRetry()                 { ++m_nSearchRetry          ; }
+            void    onHelpInsert()                  { ++m_nHelpInsert           ; }
+            void    onHelpDelete()                  { ++m_nHelpDelete           ; }
+            void    onHelpMark()                    { ++m_nHelpMark             ; }
+            void    onHelpGuardSuccess()            { ++m_nHelpGuardSuccess     ; }
+            void    onHelpGuardFailed()             { ++m_nHelpGuardFailed      ; }
+            //@endcond
+        };
+
+        /// EllenBinTree empty statistics
+        struct empty_stat {
+            //@cond
+            void    onInternalNodeCreated()         {}
+            void    onInternalNodeDeleted()         {}
+            void    onUpdateDescCreated()           {}
+            void    onUpdateDescDeleted()           {}
+            void    onInsertSuccess()               {}
+            void    onInsertFailed()                {}
+            void    onInsertRetry()                 {}
+            void    onEnsureExist()                 {}
+            void    onEnsureNew()                   {}
+            void    onEnsureRetry()                 {}
+            void    onEraseSuccess()                {}
+            void    onEraseFailed()                 {}
+            void    onEraseRetry()                  {}
+            void    onExtractMinSuccess()           {}
+            void    onExtractMinFailed()            {}
+            void    onExtractMinRetry()             {}
+            void    onExtractMaxSuccess()           {}
+            void    onExtractMaxFailed()            {}
+            void    onExtractMaxRetry()             {}
+            void    onFindSuccess()                 {}
+            void    onFindFailed()                  {}
+            void    onSearchRetry()                 {}
+            void    onHelpInsert()                  {}
+            void    onHelpDelete()                  {}
+            void    onHelpMark()                    {}
+            void    onHelpGuardSuccess()            {}
+            void    onHelpGuardFailed()             {}
+            //@endcond
+        };
+
+        /// Type traits for EllenBinTree class
+        struct type_traits
+        {
+            /// Hook used
+            /**
+                Possible values are: ellen_bintree::base_hook, ellen_bintree::member_hook, ellen_bintree::traits_hook.
+            */
+            typedef base_hook<>       hook;
+
+            /// Key extracting functor
+            /**
+                You should explicit define a valid functor.
+                The functor has the following prototype:
+                \code
+                struct key_extractor {
+                    void operator ()( Key& dest, T const& src );
+                };
+                \endcode
+                It should initialize \p dest key from \p src data.
+                The functor is used to initialize internal nodes.
+            */
+            typedef opt::none           key_extractor;
+
+            /// Key comparison functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+
+                See cds::opt::compare option description for functor interface.
+
+                You should provide \p compare or \p less functor.
+                See \ref cds_intrusive_EllenBinTree_rcu_less "predicate requirements".
+            */
+            typedef opt::none                       compare;
+
+            /// Specifies binary predicate used for key compare.
+            /**
+                See cds::opt::less option description for predicate interface.
+
+                You should provide \p compare or \p less functor.
+                See \ref cds_intrusive_EllenBinTree_rcu_less "predicate requirements".
+            */
+            typedef opt::none                       less;
+
+            /// Disposer
+            /**
+                The functor used for dispose removed items. Default is opt::v::empty_disposer.
+            */
+            typedef opt::v::empty_disposer          disposer;
+
+            /// Item counter
+            /**
+                The type for item counting feature (see cds::opt::item_counter).
+                Default is no item counter (\ref atomicity::empty_item_counter)
+            */
+            typedef atomicity::empty_item_counter     item_counter;
+
+            /// C++ memory ordering model
+            /**
+                List of available memory ordering see opt::memory_model
+            */
+            typedef opt::v::relaxed_ordering        memory_model;
+
+            /// Allocator for update descriptors
+            /**
+                The allocator type is used for \ref update_desc.
+
+                Update descriptor is helping data structure with short lifetime and it is good candidate
+                for pooling. The number of simultaneously existing descriptors is bounded number
+                limited the number of threads working with the tree.
+                Therefore, a bounded lock-free container like \p cds::container::VyukovMPMCCycleQueue
+                is good choice for the free-list of update descriptors,
+                see cds::memory::vyukov_queue_pool free-list implementation.
+
+                Also notice that size of update descriptor is constant and not dependent on the type of data
+                stored in the tree so single free-list object can be used for several \p EllenBinTree object.
+            */
+            typedef CDS_DEFAULT_ALLOCATOR           update_desc_allocator;
+
+            /// Allocator for internal nodes
+            /**
+                The allocator type is used for \ref internal_node.
+            */
+            typedef CDS_DEFAULT_ALLOCATOR           node_allocator;
+
+            /// Internal statistics
+            /**
+                Possible types: \p ellen_bintree::empty_stat (the default), \p ellen_bintree::stat or any
+                other with interface like \p %stat.
+            */
+            typedef empty_stat                      stat;
+
+            /// RCU deadlock checking policy (only for \ref cds_intrusive_EllenBinTree_rcu "RCU-based EllenBinTree")
+            /**
+                List of available options see opt::rcu_check_deadlock
+            */
+            typedef cds::opt::v::rcu_throw_deadlock      rcu_check_deadlock;
+        };
+
+        /// Metafunction converting option list to EllenBinTree traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options list see \ref EllenBinTree.
+        */
+        template <CDS_DECL_OPTIONS12>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS12 >::type
+                ,CDS_OPTIONS12
+            >::type   type;
+#   endif
+        };
+
+        //@cond
+        namespace details {
+
+            template <typename Key, typename T, typename Compare, typename NodeTraits>
+            struct compare
+            {
+                typedef Compare     key_compare;
+                typedef Key         key_type;
+                typedef T           value_type;
+                typedef NodeTraits  node_traits;
+
+                template <typename Q1, typename Q2>
+                int operator()( Q1 const& v1, Q2 const& v2) const
+                {
+                    return key_compare()( v1, v2 );
+                }
+
+                template <typename LeafNode>
+                int operator()( internal_node<key_type, LeafNode> const& n1, internal_node<key_type, LeafNode> const& n2 ) const
+                {
+                    if ( n1.infinite_key() )
+                        return n2.infinite_key() ? n1.infinite_key() - n2.infinite_key() : 1;
+                    else if ( n2.infinite_key() )
+                        return -1;
+                    return operator()( n1.m_Key, n2.m_Key );
+                }
+
+                template <typename LeafNode, typename Q>
+                int operator()( internal_node<key_type, LeafNode> const& n, Q const& v ) const
+                {
+                    if ( n.infinite_key() )
+                        return 1;
+                    return operator()( n.m_Key, v );
+                }
+
+                template <typename LeafNode, typename Q>
+                int operator()( Q const& v, internal_node<key_type, LeafNode> const& n ) const
+                {
+                    if ( n.infinite_key() )
+                        return -1;
+                    return operator()( v, n.m_Key );
+                }
+
+                template <typename GC, typename Tag>
+                int operator()( node<GC, Tag> const& n1, node<GC, Tag> const& n2 ) const
+                {
+                    if ( n1.infinite_key() != n2.infinite_key() )
+                        return n1.infinite_key() - n2.infinite_key();
+                    return operator()( *node_traits::to_value_ptr( n1 ), *node_traits::to_value_ptr( n2 ));
+                }
+
+                template <typename GC, typename Tag, typename Q>
+                int operator()( node<GC, Tag> const& n, Q const& v ) const
+                {
+                    if ( n.infinite_key() )
+                        return 1;
+                    return operator()( *node_traits::to_value_ptr( n ), v );
+                }
+
+                template <typename GC, typename Tag, typename Q>
+                int operator()( Q const& v, node<GC, Tag> const& n ) const
+                {
+                    if ( n.infinite_key() )
+                        return -1;
+                    return operator()( v, *node_traits::to_value_ptr( n ) );
+                }
+
+                template <typename GC>
+                int operator()( base_node<GC> const& n1, base_node<GC> const& n2 ) const
+                {
+                    if ( n1.infinite_key() != n2.infinite_key() )
+                        return n1.infinite_key() - n2.infinite_key();
+                    if ( n1.is_leaf() ) {
+                        if ( n2.is_leaf() )
+                            return operator()( node_traits::to_leaf_node( n1 ), node_traits::to_leaf_node( n2 ));
+                        else
+                            return operator()( node_traits::to_leaf_node( n1 ), node_traits::to_internal_node( n2 ));
+                    }
+
+                    if ( n2.is_leaf() )
+                        return operator()( node_traits::to_internal_node( n1 ), node_traits::to_leaf_node( n2 ));
+                    else
+                        return operator()( node_traits::to_internal_node( n1 ), node_traits::to_internal_node( n2 ));
+                }
+
+                template <typename GC, typename Q>
+                int operator()( base_node<GC> const& n, Q const& v ) const
+                {
+                    if ( n.infinite_key())
+                        return 1;
+                    if ( n.is_leaf() )
+                        return operator()( node_traits::to_leaf_node( n ), v );
+                    return operator()( node_traits::to_internal_node( n ), v );
+                }
+
+                template <typename GC, typename Q>
+                int operator()( Q const& v, base_node<GC> const& n ) const
+                {
+                    return -operator()( n, v );
+                }
+
+                template <typename GC, typename LeafNode >
+                int operator()( base_node<GC> const& i, internal_node<key_type, LeafNode> const& n ) const
+                {
+                    if ( i.is_leaf() )
+                        return operator()( static_cast<LeafNode const&>(i), n );
+                    return operator()( static_cast<internal_node<key_type, LeafNode> const&>(i), n );
+                }
+
+                template <typename GC, typename LeafNode >
+                int operator()( internal_node<key_type, LeafNode> const& n, base_node<GC> const& i ) const
+                {
+                    return -operator()( i, n );
+                }
+
+                template <typename GC, typename Tag >
+                int operator()( node<GC, Tag> const& n, internal_node<key_type, node<GC, Tag> > const& i ) const
+                {
+                    if ( !n.infinite_key() ) {
+                        if ( i.infinite_key() )
+                            return -1;
+                        return operator()( n, i.m_Key );
+                    }
+
+                    if ( !i.infinite_key())
+                        return 1;
+                    return int( n.infinite_key()) - int( i.infinite_key());
+                }
+
+                template <typename GC, typename Tag >
+                int operator()( internal_node<key_type, node<GC, Tag> > const& i, node<GC, Tag> const& n ) const
+                {
+                    return -operator()( n, i );
+                }
+
+            };
+
+        } // namespace details
+        //@endcond
+
+    }   // namespace ellen_bintree
+
+    // Forwards
+    template < class GC, typename Key, typename T, class Traits = ellen_bintree::type_traits >
+    class EllenBinTree;
+
+}} // namespace cds::intrusive
+
+#endif  // #ifndef __CDS_INTRUSIVE_DETAILS_ELLEN_BINTREE_BASE_H
diff --git a/cds/intrusive/ellen_bintree_hp.h b/cds/intrusive/ellen_bintree_hp.h
new file mode 100644 (file)
index 0000000..02e52cc
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_ELLEN_BINTREE_HP_H
+#define __CDS_INTRUSIVE_ELLEN_BINTREE_HP_H
+
+#include <cds/gc/hp.h>
+#include <cds/intrusive/ellen_bintree_impl.h>
+
+#endif  // #ifndef __CDS_INTRUSIVE_ELLEN_BINTREE_HP_H
diff --git a/cds/intrusive/ellen_bintree_impl.h b/cds/intrusive/ellen_bintree_impl.h
new file mode 100644 (file)
index 0000000..30f3617
--- /dev/null
@@ -0,0 +1,1639 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_ELLEN_BINTREE_IMPL_H
+#define __CDS_INTRUSIVE_ELLEN_BINTREE_IMPL_H
+
+#include <cds/intrusive/details/ellen_bintree_base.h>
+#include <cds/opt/compare.h>
+#include <cds/ref.h>
+#include <cds/details/binary_functor_wrapper.h>
+#include <cds/urcu/details/check_deadlock.h>
+#include <cds/details/std/memory.h>
+#include <cds/gc/guarded_ptr.h>
+
+namespace cds { namespace intrusive {
+
+    /// Ellen's et al binary search tree
+    /** @ingroup cds_intrusive_map
+        @ingroup cds_intrusive_tree
+        @anchor cds_intrusive_EllenBinTree
+
+        Source:
+            - [2010] F.Ellen, P.Fatourou, E.Ruppert, F.van Breugel "Non-blocking Binary Search Tree"
+
+        %EllenBinTree is an unbalanced leaf-oriented binary search tree that implements the <i>set</i>
+        abstract data type. Nodes maintains child pointers but not parent pointers.
+        Every internal node has exactly two children, and all data of type \p T currently in
+        the tree are stored in the leaves. Internal nodes of the tree are used to direct \p find
+        operation along the path to the correct leaf. The keys (of \p Key type) stored in internal nodes
+        may or may not be in the set. \p Key type is a subset of \p T type.
+        There should be exactly defined a key extracting functor for converting object of type \p T to
+        object of type \p Key.
+
+        Due to \p extract_min and \p extract_max member functions the \p %EllenBinTree can act as
+        a <i>priority queue</i>. In this case you should provide unique compound key, for example,
+        the priority value plus some uniformly distributed random value.
+
+        @note In the current implementation we do not use helping technique described in the original paper.
+        In Hazard Pointer schema helping is too complicated and does not give any observable benefits.
+        Instead of helping, when a thread encounters a concurrent operation it just spins waiting for
+        the operation done. Such solution allows greatly simplify the implementation of tree.
+
+        @warning Recall the tree is <b>unbalanced</b>. The complexity of operations is <tt>O(log N)</tt>
+        for uniformly distributed random keys, but in worst case the complexity is <tt>O(N)</tt>.
+
+        @note Do not include <tt><cds/intrusive/ellen_bintree_impl.h></tt> header file explicitly.
+        There are header file for each GC type:
+        - <tt><cds/intrusive/ellen_bintree_hp.h></tt> - for Hazard Pointer GC cds::gc::HP
+        - <tt><cds/intrusive/ellen_bintree_ptb.h></tt> - for Pass-the-Buck GC cds::gc::PTB
+        - <tt><cds/intrusive/ellen_bintree_rcu.h></tt> - for RCU GC
+            (see \ref cds_intrusive_EllenBinTree_rcu "RCU-based EllenBinTree")
+
+        <b>Template arguments</b> :
+        - \p GC - garbage collector used, possible types are cds::gc::HP, cds::gc::PTB.
+            Note that cds::gc::HRC is not supported.
+        - \p Key - key type, a subset of \p T
+        - \p T - type to be stored in tree's leaf nodes. The type must be based on ellen_bintree::node
+            (for ellen_bintree::base_hook) or it must have a member of type ellen_bintree::node
+            (for ellen_bintree::member_hook).
+        - \p Traits - type traits. See ellen_bintree::type_traits for explanation.
+
+        It is possible to declare option-based tree with cds::intrusive::ellen_bintree::make_traits metafunction
+        instead of \p Traits template argument.
+        Template argument list \p Options of cds::intrusive::ellen_bintree::make_traits metafunction are:
+        - opt::hook - hook used. Possible values are: ellen_bintree::base_hook, ellen_bintree::member_hook, ellen_bintree::traits_hook.
+            If the option is not specified, <tt>ellen_bintree::base_hook<></tt> is used.
+        - ellen_bintree::key_extractor - key extracting functor, mandatory option. The functor has the following prototype:
+            \code
+                struct key_extractor {
+                    void operator ()( Key& dest, T const& src );
+                };
+            \endcode
+            It should initialize \p dest key from \p src data. The functor is used to initialize internal nodes.
+        - opt::compare - key compare functor. No default functor is provided.
+            If the option is not specified, \p %opt::less is used.
+        - opt::less - specifies binary predicate used for key compare. At least \p %opt::compare or \p %opt::less should be defined.
+        - opt::disposer - the functor used for dispose removed nodes. Default is opt::v::empty_disposer. Due the nature
+            of GC schema the disposer may be called asynchronously. The disposer is used only for leaf nodes.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that means no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - ellen_bintree::update_desc_allocator - an allocator of \ref ellen_bintree::update_desc "update descriptors",
+            default is CDS_DEFAULT_ALLOCATOR.
+            Note that update descriptor is helping data structure with short lifetime and it is good candidate for pooling.
+            The number of simultaneously existing descriptors is bounded and depends on the number of threads
+            working with the tree and GC internals.
+            A bounded lock-free container like \p cds::container::VyukovMPMCCycleQueue is good candidate
+            for the free-list of update descriptors, see cds::memory::vyukov_queue_pool free-list implementation.
+            Also notice that size of update descriptor is constant and not dependent on the type of data
+            stored in the tree so single free-list object can be used for all \p %EllenBinTree objects.
+        - opt::node_allocator - the allocator used for internal nodes. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::stat - internal statistics. Available types: ellen_bintree::stat, ellen_bintree::empty_stat (the default)
+
+        @anchor cds_intrusive_EllenBinTree_less
+        <b>Predicate requirements</b>
+
+        opt::less, opt::compare and other predicates using with member fuctions should accept at least parameters
+        of type \p T and \p Key in any combination.
+        For example, for \p Foo struct with \p std::string key field the appropiate \p less functor is:
+        \code
+        struct Foo: public cds::intrusive::ellen_bintree::node< ... >
+        {
+            std::string m_strKey;
+            ...
+        };
+
+        struct less {
+            bool operator()( Foo const& v1, Foo const& v2 ) const
+            { return v1.m_strKey < v2.m_strKey ; }
+
+            bool operator()( Foo const& v, std::string const& s ) const
+            { return v.m_strKey < s ; }
+
+            bool operator()( std::string const& s, Foo const& v ) const
+            { return s < v.m_strKey ; }
+
+            // Support comparing std::string and char const *
+            bool operator()( std::string const& s, char const * p ) const
+            { return s.compare(p) < 0 ; }
+
+            bool operator()( Foo const& v, char const * p ) const
+            { return v.m_strKey.compare(p) < 0 ; }
+
+            bool operator()( char const * p, std::string const& s ) const
+            { return s.compare(p) > 0; }
+
+            bool operator()( char const * p, Foo const& v ) const
+            { return v.m_strKey.compare(p) > 0; }
+        };
+        \endcode
+    */
+    template < class GC,
+        typename Key,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = ellen_bintree::type_traits
+#else
+        class Traits
+#endif
+    >
+    class EllenBinTree
+    {
+    public:
+        typedef GC      gc              ;   ///< Garbage collector used
+        typedef Key     key_type        ;   ///< type of a key stored in internal nodes; key is a part of \p value_type
+        typedef T       value_type      ;   ///< type of value stored in the binary tree
+        typedef Traits  options         ;   ///< Traits template parameter
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+        typedef typename options::disposer  disposer    ;   ///< leaf node disposer
+
+        typedef cds::gc::guarded_ptr< gc, value_type > guarded_ptr; ///< Guarded pointer
+
+    protected:
+        //@cond
+        typedef ellen_bintree::base_node< gc >                      tree_node       ; ///< Base type of tree node
+        typedef node_type                                           leaf_node       ; ///< Leaf node type
+        typedef ellen_bintree::node_types< gc, key_type, typename leaf_node::tag > node_factory;
+        typedef typename node_factory::internal_node_type internal_node ; ///< Internal node type
+        typedef typename node_factory::update_desc_type   update_desc   ; ///< Update descriptor
+        typedef typename update_desc::update_ptr                    update_ptr  ; ///< Marked pointer to update descriptor
+        //@endcond
+
+    public:
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key compare functor based on opt::compare and opt::less option setter.
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ; ///< Node traits
+#   else
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+        struct node_traits: public get_node_traits< value_type, node_type, hook>::type
+        {
+            static internal_node const& to_internal_node( tree_node const& n )
+            {
+                assert( n.is_internal() );
+                return static_cast<internal_node const&>( n );
+            }
+
+            static leaf_node const& to_leaf_node( tree_node const& n )
+            {
+                assert( n.is_leaf() );
+                return static_cast<leaf_node const&>( n );
+            }
+        };
+#   endif
+
+        typedef typename options::item_counter  item_counter;   ///< Item counting policy used
+        typedef typename options::memory_model  memory_model;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::stat          stat        ;   ///< internal statistics type
+        typedef typename options::key_extractor         key_extractor   ;   ///< key extracting functor
+
+        typedef typename options::node_allocator        node_allocator  ;   ///< Internal node allocator
+        typedef typename options::update_desc_allocator update_desc_allocator ; ///< Update descriptor allocator
+
+    protected:
+        //@cond
+        typedef ellen_bintree::details::compare< key_type, value_type, key_comparator, node_traits > node_compare;
+
+        typedef cds::details::Allocator< internal_node, node_allocator >        cxx_node_allocator;
+        typedef cds::details::Allocator< update_desc, update_desc_allocator >   cxx_update_desc_allocator;
+
+        struct search_result {
+            enum guard_index {
+                Guard_GrandParent,
+                Guard_Parent,
+                Guard_Leaf,
+                Guard_updGrandParent,
+                Guard_updParent,
+
+                // helping
+                Guard_helpLeaf,
+
+                // end of guard indices
+                guard_count
+            };
+
+            typedef typename gc::template GuardArray< guard_count > guard_array;
+            guard_array guards;
+
+            internal_node *     pGrandParent;
+            internal_node *     pParent;
+            leaf_node *         pLeaf;
+            update_ptr          updParent;
+            update_ptr          updGrandParent;
+            bool                bRightLeaf      ; // true if pLeaf is right child of pParent, false otherwise
+            bool                bRightParent    ; // true if pParent is right child of pGrandParent, false otherwise
+
+            search_result()
+                :pGrandParent( null_ptr<internal_node *>() )
+                ,pParent( null_ptr<internal_node *>() )
+                ,pLeaf( null_ptr<leaf_node *>() )
+                ,bRightLeaf( false )
+                ,bRightParent( false )
+            {}
+
+            void clean_help_guards()
+            {
+                guards.clear( Guard_helpLeaf );
+            }
+        };
+        //@endcond
+
+    protected:
+        //@cond
+        internal_node       m_Root          ;   ///< Tree root node (key= Infinite2)
+        leaf_node           m_LeafInf1      ;   ///< Infinite leaf 1 (key= Infinite1)
+        leaf_node           m_LeafInf2      ;   ///< Infinite leaf 2 (key= Infinite2)
+        //@endcond
+
+        item_counter        m_ItemCounter   ;   ///< item counter
+        mutable stat        m_Stat          ;   ///< internal statistics
+
+    protected:
+        //@cond
+        static void free_leaf_node( value_type * p )
+        {
+            disposer()( p );
+        }
+
+        internal_node * alloc_internal_node() const
+        {
+            m_Stat.onInternalNodeCreated();
+            internal_node * pNode = cxx_node_allocator().New();
+            return pNode;
+        }
+
+        static void free_internal_node( internal_node * pNode )
+        {
+            cxx_node_allocator().Delete( pNode );
+        }
+
+        struct internal_node_deleter {
+            void operator()( internal_node * p) const
+            {
+                free_internal_node( p );
+            }
+        };
+
+        typedef std::unique_ptr< internal_node, internal_node_deleter>  unique_internal_node_ptr;
+
+        update_desc * alloc_update_desc() const
+        {
+            m_Stat.onUpdateDescCreated();
+            return cxx_update_desc_allocator().New();
+        }
+
+        static void free_update_desc( update_desc * pDesc )
+        {
+            cxx_update_desc_allocator().Delete( pDesc );
+        }
+
+        void retire_node( tree_node * pNode ) const
+        {
+            if ( pNode->is_leaf() ) {
+                assert( static_cast<leaf_node *>( pNode ) != &m_LeafInf1 );
+                assert( static_cast<leaf_node *>( pNode ) != &m_LeafInf2 );
+
+                gc::template retire( node_traits::to_value_ptr( static_cast<leaf_node *>( pNode )), free_leaf_node );
+            }
+            else {
+                assert( static_cast<internal_node *>( pNode ) != &m_Root );
+                m_Stat.onInternalNodeDeleted();
+
+                gc::template retire( static_cast<internal_node *>( pNode ), free_internal_node );
+            }
+        }
+
+        void retire_update_desc( update_desc * p ) const
+        {
+            m_Stat.onUpdateDescDeleted();
+            gc::template retire( p, free_update_desc );
+        }
+
+        void make_empty_tree()
+        {
+            m_Root.infinite_key( 2 );
+            m_LeafInf1.infinite_key( 1 );
+            m_LeafInf2.infinite_key( 2 );
+            m_Root.m_pLeft.store( &m_LeafInf1, memory_model::memory_order_relaxed );
+            m_Root.m_pRight.store( &m_LeafInf2, memory_model::memory_order_release );
+        }
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct trivial_equal_functor {
+            template <typename Q>
+            bool operator()( Q const& , leaf_node const& ) const
+            {
+                return true;
+            }
+        };
+
+        struct empty_insert_functor {
+            void operator()( value_type& )
+            {}
+        };
+
+        struct assign_guard_functor {
+            typename gc::Guard&    m_guard;
+            assign_guard_functor( typename gc::Guard& guard )
+                : m_guard(guard)
+            {}
+
+            template <typename Q>
+            void operator()( value_type& val, Q& )
+            {
+                m_guard.assign( &val );
+            }
+
+            void operator()( value_type& val )
+            {
+                m_guard.assign( &val );
+            }
+        };
+
+#   endif
+
+#   if !defined(CDS_CXX11_LAMBDA_SUPPORT) || (CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC10)
+        struct unlink_equal_functor {
+            bool operator()( value_type const& v, leaf_node const& n ) const
+            {
+                return &v == node_traits::to_value_ptr( n );
+            }
+        };
+        struct empty_erase_functor  {
+            void operator()( value_type const& )
+            {}
+        };
+#   endif
+        //@endcond
+
+    public:
+        /// Default constructor
+        EllenBinTree()
+        {
+            static_assert( (!std::is_same< key_extractor, opt::none >::value), "The key extractor option must be specified" );
+            make_empty_tree();
+        }
+
+        /// Clears the tree
+        ~EllenBinTree()
+        {
+            unsafe_clear();
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the tree if it does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is placed into the tree, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert( val, []( value_type& ) {} );
+#   else
+            return insert( val, empty_insert_functor() );
+#   endif
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the tree
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this tree's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success and may be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            typename gc::Guard guardInsert;
+            guardInsert.assign( &val );
+
+            unique_internal_node_ptr pNewInternal;
+
+            search_result res;
+            for ( ;; ) {
+                if ( search( res, val, node_compare() )) {
+                    if ( pNewInternal.get() )
+                        m_Stat.onInternalNodeDeleted() ;    // unique_internal_node_ptr deletes internal node
+                    m_Stat.onInsertFailed();
+                    return false;
+                }
+
+                if ( res.updGrandParent.bits() == update_desc::Clean && res.updParent.bits() == update_desc::Clean ) {
+
+                    if ( !pNewInternal.get() )
+                        pNewInternal.reset( alloc_internal_node() );
+
+                    if ( try_insert( val, pNewInternal.get(), res )) {
+                        cds::unref(f)( val );
+                        pNewInternal.release(); // internal node is linked into the tree and should not be deleted
+                        break;
+                    }
+                }
+
+                m_Stat.onInsertRetry();
+            }
+
+            ++m_ItemCounter;
+            m_Stat.onInsertSuccess();
+            return true;
+        }
+
+        /// Ensures that the \p val exists in the tree
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val is not found in the tree, then \p val is inserted into the tree.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the tree
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refer to the same thing.
+
+            The functor can change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the tree.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            typename gc::Guard guardInsert;
+            guardInsert.assign( &val );
+
+            unique_internal_node_ptr pNewInternal;
+
+            search_result res;
+            for ( ;; ) {
+                if ( search( res, val, node_compare() )) {
+                    cds::unref(func)( false, *node_traits::to_value_ptr( res.pLeaf ), val );
+                    if ( pNewInternal.get() )
+                        m_Stat.onInternalNodeDeleted() ;    // unique_internal_node_ptr deletes internal node
+                    m_Stat.onEnsureExist();
+                    return std::make_pair( true, false );
+                }
+
+                if ( res.updGrandParent.bits() == update_desc::Clean && res.updParent.bits() == update_desc::Clean )  {
+
+                    if ( !pNewInternal.get() )
+                        pNewInternal.reset( alloc_internal_node() );
+
+                    if ( try_insert( val, pNewInternal.get(), res )) {
+                        cds::unref(func)( true, val, val );
+                        pNewInternal.release()  ;   // internal node has been linked into the tree and should not be deleted
+                        break;
+                    }
+                }
+                m_Stat.onEnsureRetry();
+            }
+
+            ++m_ItemCounter;
+            m_Stat.onEnsureNew();
+            return std::make_pair( true, true );
+        }
+
+        /// Unlinks the item \p val from the tree
+        /**
+            The function searches the item \p val in the tree and unlink it from the tree
+            if it is found and is equal to \p val.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of the tree, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+#       if defined(CDS_CXX11_LAMBDA_SUPPORT) && !(CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC10)
+            // vc10 generates an error for the lambda - it sees cds::intrusive::node_traits but not class-defined node_traits
+            return erase_( val, node_compare(),
+                []( value_type const& v, leaf_node const& n ) -> bool { return &v == node_traits::to_value_ptr( n ); },
+                [](value_type const&) {} );
+#       else
+            return erase_( val, node_compare(), unlink_equal_functor(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the tree
+        /** \anchor cds_intrusive_EllenBinTree_erase
+            The function searches an item with key equal to \p val in the tree,
+            unlinks it from the tree, and returns \p true.
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool erase( const Q& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( val, node_compare(),
+                []( Q const&, leaf_node const& ) -> bool { return true; },
+                [](value_type const&) {} );
+#       else
+            return erase_( val, node_compare(), trivial_equal_functor(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Delete the item from the tree with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_erase "erase(Q const&)"
+            but \p pred predicate is used for key comparing.
+            \p Less has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( const Q& val, Less pred )
+        {
+            typedef ellen_bintree::details::compare<
+                key_type,
+                value_type,
+                opt::details::make_comparator_from_less<Less>,
+                node_traits
+            > compare_functor;
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( val, compare_functor(),
+                []( Q const&, leaf_node const& ) -> bool { return true; },
+                [](value_type const&) {} );
+#       else
+            return erase_( val, compare_functor(), trivial_equal_functor(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the tree
+        /** \anchor cds_intrusive_EllenBinTree_erase_func
+            The function searches an item with key equal to \p val in the tree,
+            call \p f functor with item found, unlinks it from the tree, and returns \p true.
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor can be passed by reference with <tt>boost:ref</tt>
+
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( val, node_compare(),
+                []( Q const&, leaf_node const& ) -> bool { return true; },
+                f );
+#       else
+            return erase_( val, node_compare(), trivial_equal_functor(), f );
+#       endif
+        }
+
+        /// Delete the item from the tree with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_erase_func "erase(Q const&, Func)"
+            but \p pred predicate is used for key comparing.
+            \p Less has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& val, Less pred, Func f )
+        {
+            typedef ellen_bintree::details::compare<
+                key_type,
+                value_type,
+                opt::details::make_comparator_from_less<Less>,
+                node_traits
+            > compare_functor;
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( val, compare_functor(),
+                []( Q const&, leaf_node const& ) -> bool { return true; },
+                f );
+#       else
+            return erase_( val, compare_functor(), trivial_equal_functor(), f );
+#       endif
+        }
+
+        /// Extracts an item with minimal key from the tree
+        /**
+            The function searches an item with minimal key, unlinks it, and returns pointer to an item found in \p dest parameter.
+            If the tree is empty the function returns \p false.
+
+            @note Due the concurrent nature of the tree, the function extracts <i>nearly</i> minimum key.
+            It means that the function gets leftmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key less than leftmost item's key.
+            So, the function returns the item with minimum key at the moment of tree traversing.
+
+            The guarded pointer \p dest prevents disposer invocation for returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        bool extract_min( guarded_ptr& dest )
+        {
+            return extract_min_( dest.guard());
+        }
+
+        /// Extracts an item with maximal key from the tree
+        /**
+            The function searches an item with maximal key, unlinks it, and returns pointer to an item found in \p dest parameter.
+            If the tree is empty the function returns \p false.
+
+            @note Due the concurrent nature of the tree, the function extracts <i>nearly</i> maximal key.
+            It means that the function gets rightmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key great than rightmost item's key.
+            So, the function returns the item with maximal key at the moment of tree traversing.
+
+            The guarded pointer \p dest prevents disposer invocation for returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        bool extract_max( guarded_ptr& dest )
+        {
+            return extract_max_( dest.guard() );
+        }
+
+        /// Extracts an item from the tree
+        /** \anchor cds_intrusive_EllenBinTree_extract
+            The function searches an item with key equal to \p key in the tree,
+            unlinks it, and returns pointer to an item found in \p dest parameter.
+            If the item  is not found the function returns \p false.
+
+            The guarded pointer \p dest prevents disposer invocation for returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& dest, Q const& key )
+        {
+            return extract_( dest.guard(), key );
+        }
+
+        /// Extracts an item from the tree using \p pred for searching
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_extract "extract(guarded_ptr& dest, Q const&)"
+            but \p pred is used for key compare.
+            \p Less has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& dest, Q const& key, Less pred )
+        {
+            return extract_with_( dest.guard(), key, pred );
+        }
+
+        /// Finds the key \p val
+        /** @anchor cds_intrusive_EllenBinTree_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool find( Q const& val ) const
+        {
+            search_result    res;
+            if ( search( res, val, node_compare() )) {
+                m_Stat.onFindSuccess();
+                return true;
+            }
+
+            m_Stat.onFindFailed();
+            return false;
+        }
+
+        /// Finds the key \p val with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_find_val "find(Q const&)"
+            but \p pred is used for key compare.
+            \p Less functor has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+            \p pred should accept arguments of type \p Q, \p key_type, \p value_type in any combination.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred ) const
+        {
+            typedef ellen_bintree::details::compare<
+                key_type,
+                value_type,
+                opt::details::make_comparator_from_less<Less>,
+                node_traits
+            > compare_functor;
+
+            search_result    res;
+            if ( search( res, val, compare_functor() )) {
+                m_Stat.onFindSuccess();
+                return true;
+            }
+            m_Stat.onFindFailed();
+            return false;
+        }
+
+        /// Finds the key \p val
+        /** @anchor cds_intrusive_EllenBinTree_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the tree \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f ) const
+        {
+            return find_( val, f );
+        }
+
+        /// Finds the key \p val with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_find_func "find(Q&, Func)"
+            but \p pred is used for key comparison.
+            \p Less functor has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f ) const
+        {
+            return find_with_( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** @anchor cds_intrusive_EllenBinTree_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the tree \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f ) const
+        {
+            return find_( val, f );
+        }
+
+        /// Finds the key \p val with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key compare.
+            \p Less functor has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f ) const
+        {
+            return find_with_( val, pred, f );
+        }
+
+        /// Finds \p key and returns the item found
+        /** @anchor cds_intrusive_EllenBinTree_get
+            The function searches the item with key equal to \p key and returns the item found in \p dest parameter.
+            The function returns \p true if \p key is found, \p false otherwise.
+
+            The guarded pointer \p dest prevents disposer invocation for returned item,
+            see cds::gc::guarded_ptr for explanation.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& dest, Q const& key ) const
+        {
+            return get_( dest.guard(), key );
+        }
+
+        /// Finds \p key with predicate \p pred and returns the item found
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_get "get(guarded_ptr&, Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& dest, Q const& key, Less pred ) const
+        {
+            return get_with_( dest.guard(), key, pred );
+        }
+
+        /// Checks if the tree is empty
+        bool empty() const
+        {
+            return m_Root.m_pLeft.load( memory_model::memory_order_relaxed )->is_leaf();
+        }
+
+        /// Clears the tree (thread safe, non-atomic)
+        /**
+            The function unlink all items from the tree.
+            The function is thread safe but not atomic: in multi-threaded environment with parallel insertions
+            this sequence
+            \code
+            tree.clear();
+            assert( tree.empty() );
+            \endcode
+            the assertion could be raised.
+
+            For each leaf the \ref disposer will be called after unlinking.
+        */
+        void clear()
+        {
+            guarded_ptr gp;
+            while ( extract_min(gp));
+        }
+
+        /// Clears the tree (not thread safe)
+        /**
+            This function is not thread safe and may be called only when no other thread deals with the tree.
+            The function is used in the tree destructor.
+        */
+        void unsafe_clear()
+        {
+            while ( true ) {
+                internal_node * pParent = null_ptr< internal_node *>();
+                internal_node * pGrandParent = null_ptr<internal_node *>();
+                tree_node *     pLeaf = const_cast<internal_node *>( &m_Root );
+
+                // Get leftmost leaf
+                while ( pLeaf->is_internal() ) {
+                    pGrandParent = pParent;
+                    pParent = static_cast<internal_node *>( pLeaf );
+                    pLeaf = pParent->m_pLeft.load( memory_model::memory_order_relaxed );
+                }
+
+                if ( pLeaf->infinite_key()) {
+                    // The tree is empty
+                    return;
+                }
+
+                // Remove leftmost leaf and its parent node
+                assert( pGrandParent );
+                assert( pParent );
+                assert( pLeaf->is_leaf() );
+
+                pGrandParent->m_pLeft.store( pParent->m_pRight.load( memory_model::memory_order_relaxed ), memory_model::memory_order_relaxed );
+                free_leaf_node( node_traits::to_value_ptr( static_cast<leaf_node *>( pLeaf ) ) );
+                free_internal_node( pParent );
+            }
+        }
+
+        /// Returns item count in the tree
+        /**
+            Only leaf nodes containing user data are counted.
+
+            The value returned depends on item counter type provided by \p Traits template parameter.
+            If it is atomicity::empty_item_counter this function always returns 0.
+            Therefore, the function is not suitable for checking the tree emptiness, use \ref empty
+            member function for this purpose.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return m_Stat;
+        }
+
+        /// Checks internal consistency (not atomic, not thread-safe)
+        /**
+            The debugging function to check internal consistency of the tree.
+        */
+        bool check_consistency() const
+        {
+            return check_consistency( &m_Root );
+        }
+
+    protected:
+        //@cond
+
+        bool check_consistency( internal_node const * pRoot ) const
+        {
+            tree_node * pLeft  = pRoot->m_pLeft.load( CDS_ATOMIC::memory_order_relaxed );
+            tree_node * pRight = pRoot->m_pRight.load( CDS_ATOMIC::memory_order_relaxed );
+            assert( pLeft );
+            assert( pRight );
+
+            if ( node_compare()( *pLeft, *pRoot ) < 0
+                && node_compare()( *pRoot, *pRight ) <= 0
+                && node_compare()( *pLeft, *pRight ) < 0 )
+            {
+                bool bRet = true;
+                if ( pLeft->is_internal() )
+                    bRet = check_consistency( static_cast<internal_node *>( pLeft ) );
+                assert( bRet );
+
+                if ( bRet && pRight->is_internal() )
+                    bRet = bRet && check_consistency( static_cast<internal_node *>( pRight ));
+                assert( bRet );
+
+                return bRet;
+            }
+            return false;
+        }
+
+        tree_node * protect_child_node( search_result& res, internal_node * pParent, bool bRight, update_ptr updParent ) const
+        {
+            tree_node * p;
+            tree_node * pn = bRight ? pParent->m_pRight.load( memory_model::memory_order_relaxed ) : pParent->m_pLeft.load( memory_model::memory_order_relaxed );
+            do {
+                p = pn;
+                res.guards.assign( search_result::Guard_Leaf, static_cast<internal_node *>( p ));
+                res.guards.assign( search_result::Guard_helpLeaf, node_traits::to_value_ptr( static_cast<leaf_node *>( p ) ));
+                pn = bRight ? pParent->m_pRight.load( memory_model::memory_order_acquire ) : pParent->m_pLeft.load( memory_model::memory_order_acquire );
+            } while ( p != pn );
+
+            // child node is guarded
+            // See whether pParent->m_pUpdate has not been changed
+            if ( pParent->m_pUpdate.load( memory_model::memory_order_acquire ) != updParent ) {
+                // update has been changed - returns nullptr as a flag to search retry
+                return null_ptr<tree_node *>();
+            }
+
+            if ( p && p->is_leaf() )
+                res.guards.copy( search_result::Guard_Leaf, search_result::Guard_helpLeaf );
+            res.guards.clear( search_result::Guard_helpLeaf );
+            return p;
+        }
+
+        update_ptr search_protect_update( search_result& res, CDS_ATOMIC::atomic<update_ptr> const& src ) const
+        {
+            update_ptr ret;
+            update_ptr upd( src.load( memory_model::memory_order_relaxed ) );
+            do {
+                ret = upd;
+                res.guards.assign( search_result::Guard_updParent, upd );
+            } while ( ret != (upd = src.load( memory_model::memory_order_acquire )) );
+            return ret;
+        }
+
+        template <typename KeyValue, typename Compare>
+        bool search( search_result& res, KeyValue const& key, Compare cmp ) const
+        {
+            internal_node * pParent;
+            internal_node * pGrandParent = null_ptr<internal_node *>();
+            update_ptr      updParent;
+            update_ptr      updGrandParent;
+            bool bRightLeaf;
+            bool bRightParent = false;
+
+            int nCmp = 0;
+
+        retry:
+            pParent = null_ptr< internal_node *>();
+            //pGrandParent = null_ptr<internal_node *>();
+            updParent = null_ptr<update_desc *>();
+            bRightLeaf = false;
+            tree_node * pLeaf = const_cast<internal_node *>( &m_Root );
+            while ( pLeaf->is_internal() ) {
+                res.guards.copy( search_result::Guard_GrandParent, search_result::Guard_Parent );
+                pGrandParent = pParent;
+                res.guards.copy( search_result::Guard_Parent, search_result::Guard_Leaf );
+                pParent = static_cast<internal_node *>( pLeaf );
+                bRightParent = bRightLeaf;
+                res.guards.copy( search_result::Guard_updGrandParent, search_result::Guard_updParent );
+                updGrandParent = updParent;
+
+                updParent = search_protect_update( res, pParent->m_pUpdate );
+
+                switch ( updParent.bits() ) {
+                    case update_desc::DFlag:
+                    case update_desc::Mark:
+                        m_Stat.onSearchRetry();
+                        goto retry;
+                }
+
+                nCmp = cmp( key, *pParent );
+                bRightLeaf = nCmp >= 0;
+
+                pLeaf = protect_child_node( res, pParent, bRightLeaf, updParent );
+                if ( !pLeaf ) {
+                    m_Stat.onSearchRetry();
+                    goto retry;
+                }
+            }
+
+            assert( pLeaf->is_leaf() );
+            nCmp = cmp( key, *static_cast<leaf_node *>(pLeaf) );
+
+            res.pGrandParent    = pGrandParent;
+            res.pParent         = pParent;
+            res.pLeaf           = static_cast<leaf_node *>( pLeaf );
+            res.updParent       = updParent;
+            res.updGrandParent  = updGrandParent;
+            res.bRightParent    = bRightParent;
+            res.bRightLeaf      = bRightLeaf;
+
+            return nCmp == 0;
+        }
+
+        bool search_min( search_result& res ) const
+        {
+            internal_node * pParent;
+            internal_node * pGrandParent;
+            update_ptr      updParent;
+            update_ptr      updGrandParent;
+
+        retry:
+            pParent = null_ptr< internal_node *>();
+            pGrandParent = null_ptr<internal_node *>();
+            updParent = null_ptr<update_desc *>();
+            tree_node *     pLeaf = const_cast<internal_node *>( &m_Root );
+            while ( pLeaf->is_internal() ) {
+                res.guards.copy( search_result::Guard_GrandParent, search_result::Guard_Parent );
+                pGrandParent = pParent;
+                res.guards.copy( search_result::Guard_Parent, search_result::Guard_Leaf );
+                pParent = static_cast<internal_node *>( pLeaf );
+                res.guards.copy( search_result::Guard_updGrandParent, search_result::Guard_updParent );
+                updGrandParent = updParent;
+
+                updParent = search_protect_update( res, pParent->m_pUpdate );
+
+                switch ( updParent.bits() ) {
+                    case update_desc::DFlag:
+                    case update_desc::Mark:
+                        m_Stat.onSearchRetry();
+                        goto retry;
+                }
+
+                pLeaf = protect_child_node( res, pParent, false, updParent );
+                if ( !pLeaf ) {
+                    m_Stat.onSearchRetry();
+                    goto retry;
+                }
+            }
+
+            if ( pLeaf->infinite_key())
+                return false;
+
+            res.pGrandParent    = pGrandParent;
+            res.pParent         = pParent;
+            assert( pLeaf->is_leaf() );
+            res.pLeaf           = static_cast<leaf_node *>( pLeaf );
+            res.updParent       = updParent;
+            res.updGrandParent  = updGrandParent;
+            res.bRightParent    = false;
+            res.bRightLeaf      = false;
+
+            return true;
+        }
+
+        bool search_max( search_result& res ) const
+        {
+            internal_node * pParent;
+            internal_node * pGrandParent;
+            update_ptr      updParent;
+            update_ptr      updGrandParent;
+            bool bRightLeaf;
+            bool bRightParent = false;
+
+        retry:
+            pParent = null_ptr< internal_node *>();
+            pGrandParent = null_ptr<internal_node *>();
+            updParent = null_ptr<update_desc *>();
+            bRightLeaf = false;
+            tree_node * pLeaf = const_cast<internal_node *>( &m_Root );
+            while ( pLeaf->is_internal() ) {
+                res.guards.copy( search_result::Guard_GrandParent, search_result::Guard_Parent );
+                pGrandParent = pParent;
+                res.guards.copy( search_result::Guard_Parent, search_result::Guard_Leaf );
+                pParent = static_cast<internal_node *>( pLeaf );
+                bRightParent = bRightLeaf;
+                res.guards.copy( search_result::Guard_updGrandParent, search_result::Guard_updParent );
+                updGrandParent = updParent;
+
+                updParent = search_protect_update( res, pParent->m_pUpdate );
+
+                switch ( updParent.bits() ) {
+                    case update_desc::DFlag:
+                    case update_desc::Mark:
+                        m_Stat.onSearchRetry();
+                        goto retry;
+                }
+
+                bRightLeaf = !pParent->infinite_key();
+                pLeaf = protect_child_node( res, pParent, bRightLeaf, updParent );
+                if ( !pLeaf ) {
+                    m_Stat.onSearchRetry();
+                    goto retry;
+                }
+            }
+
+            if ( pLeaf->infinite_key())
+                return false;
+
+            res.pGrandParent    = pGrandParent;
+            res.pParent         = pParent;
+            assert( pLeaf->is_leaf() );
+            res.pLeaf           = static_cast<leaf_node *>( pLeaf );
+            res.updParent       = updParent;
+            res.updGrandParent  = updGrandParent;
+            res.bRightParent    = bRightParent;
+            res.bRightLeaf      = bRightLeaf;
+
+            return true;
+        }
+
+        void help( update_ptr pUpdate )
+        {
+            // pUpdate must be guarded!
+            switch ( pUpdate.bits() ) {
+                case update_desc::IFlag:
+                    help_insert( pUpdate.ptr() );
+                    m_Stat.onHelpInsert();
+                    break;
+                case update_desc::DFlag:
+                    help_delete( pUpdate.ptr() );
+                    m_Stat.onHelpDelete();
+                    break;
+                case update_desc::Mark:
+                    //m_Stat.onHelpMark();
+                    //help_marked( pUpdate.ptr() );
+                    break;
+            }
+        }
+
+        void help_insert( update_desc * pOp )
+        {
+            // pOp must be guarded
+
+            tree_node * pLeaf = static_cast<tree_node *>( pOp->iInfo.pLeaf );
+            if ( pOp->iInfo.bRightLeaf ) {
+                CDS_VERIFY( pOp->iInfo.pParent->m_pRight.compare_exchange_strong( pLeaf, static_cast<tree_node *>( pOp->iInfo.pNew ),
+                    memory_model::memory_order_relaxed, CDS_ATOMIC::memory_order_relaxed ));
+            }
+            else {
+                CDS_VERIFY( pOp->iInfo.pParent->m_pLeft.compare_exchange_strong( pLeaf, static_cast<tree_node *>( pOp->iInfo.pNew ),
+                    memory_model::memory_order_relaxed, CDS_ATOMIC::memory_order_relaxed ));
+            }
+
+            // Unflag parent
+            update_ptr cur( pOp, update_desc::IFlag );
+            CDS_VERIFY( pOp->iInfo.pParent->m_pUpdate.compare_exchange_strong( cur, pOp->iInfo.pParent->null_update_desc(),
+                memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+        }
+
+        bool check_delete_precondition( search_result& res ) const
+        {
+            // precondition: all member of res must be guarded
+
+            assert( res.pGrandParent != null_ptr<internal_node *>() );
+
+            return
+                static_cast<internal_node *>(
+                    res.bRightParent
+                        ? res.pGrandParent->m_pRight.load(memory_model::memory_order_relaxed)
+                        : res.pGrandParent->m_pLeft.load(memory_model::memory_order_relaxed)
+                    ) == res.pParent
+                &&
+                static_cast<leaf_node *>(
+                    res.bRightLeaf
+                        ? res.pParent->m_pRight.load(memory_model::memory_order_relaxed)
+                        : res.pParent->m_pLeft.load(memory_model::memory_order_relaxed)
+                ) == res.pLeaf;
+        }
+
+        bool help_delete( update_desc * pOp )
+        {
+            // precondition: pOp must be guarded
+
+            update_ptr pUpdate( pOp->dInfo.pUpdateParent );
+            update_ptr pMark( pOp, update_desc::Mark );
+            if ( pOp->dInfo.pParent->m_pUpdate.compare_exchange_strong( pUpdate, pMark, // *
+                memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+            {
+                help_marked( pOp );
+
+                retire_node( pOp->dInfo.pParent );
+                retire_node( pOp->dInfo.pLeaf );
+                retire_update_desc( pOp );
+                return true;
+            }
+            else if ( pUpdate == pMark ) {
+                // some other thread is processing help_marked()
+                help_marked( pOp );
+                m_Stat.onHelpMark();
+                return true;
+            }
+            else {
+                // Undo grandparent dInfo
+                update_ptr pDel( pOp, update_desc::DFlag );
+                if ( pOp->dInfo.pGrandParent->m_pUpdate.compare_exchange_strong( pDel, pOp->dInfo.pGrandParent->null_update_desc(),
+                    memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                {
+                    retire_update_desc( pOp );
+                }
+                return false;
+            }
+        }
+
+        tree_node * protect_sibling( typename gc::Guard& guard, CDS_ATOMIC::atomic<tree_node *>& sibling )
+        {
+            typename gc::Guard guardLeaf;
+
+            tree_node * pSibling;
+            tree_node * p = sibling.load( memory_model::memory_order_relaxed );
+            do {
+                pSibling = p;
+                guard.assign( static_cast<internal_node *>(p) );
+                guardLeaf.assign( node_traits::to_value_ptr( static_cast<leaf_node *>(p)));
+            } while ( pSibling != ( p = sibling.load( memory_model::memory_order_acquire )) );
+
+            if ( pSibling->is_leaf() )
+                guard.copy( guardLeaf );
+
+            return pSibling;
+        }
+
+        void help_marked( update_desc * pOp )
+        {
+            // precondition: pOp must be guarded
+
+            tree_node * pParent = pOp->dInfo.pParent;
+
+            typename gc::Guard guard;
+            tree_node * pOpposite = protect_sibling( guard, pOp->dInfo.bRightLeaf ? pOp->dInfo.pParent->m_pLeft : pOp->dInfo.pParent->m_pRight );
+
+            if ( pOp->dInfo.bRightParent ) {
+                CDS_VERIFY( pOp->dInfo.pGrandParent->m_pRight.compare_exchange_strong( pParent, pOpposite,
+                    memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+            }
+            else {
+                CDS_VERIFY( pOp->dInfo.pGrandParent->m_pLeft.compare_exchange_strong( pParent, pOpposite,
+                    memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+            }
+
+            update_ptr upd( pOp, update_desc::DFlag );
+            CDS_VERIFY( pOp->dInfo.pGrandParent->m_pUpdate.compare_exchange_strong( upd, pOp->dInfo.pGrandParent->null_update_desc(),
+                memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+        }
+
+        bool try_insert( value_type& val, internal_node * pNewInternal, search_result& res )
+        {
+            assert( res.updParent.bits() == update_desc::Clean );
+            assert( res.pLeaf->is_leaf() );
+
+            // check search result
+            if ( ( res.bRightLeaf
+                ? res.pParent->m_pRight.load( memory_model::memory_order_acquire )
+                : res.pParent->m_pLeft.load( memory_model::memory_order_acquire ) ) == res.pLeaf )
+            {
+                leaf_node * pNewLeaf = node_traits::to_node_ptr( val );
+
+                int nCmp = node_compare()( val, *res.pLeaf );
+                if ( nCmp < 0 ) {
+                    if ( res.pGrandParent ) {
+                        assert( !res.pLeaf->infinite_key() );
+                        pNewInternal->infinite_key( 0 );
+                        key_extractor()( pNewInternal->m_Key, *node_traits::to_value_ptr( res.pLeaf ) );
+                    }
+                    else {
+                        assert( res.pLeaf->infinite_key() == tree_node::key_infinite1 );
+                        pNewInternal->infinite_key( 1 );
+                    }
+                    pNewInternal->m_pLeft.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_relaxed );
+                    pNewInternal->m_pRight.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_release );
+                }
+                else {
+                    assert( !res.pLeaf->is_internal() );
+                    pNewInternal->infinite_key( 0 );
+
+                    key_extractor()( pNewInternal->m_Key, val );
+                    pNewInternal->m_pLeft.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_relaxed );
+                    pNewInternal->m_pRight.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_release );
+                    assert( !res.pLeaf->infinite_key());
+                }
+
+                typename gc::Guard guard;
+                update_desc * pOp = alloc_update_desc();
+                guard.assign( pOp );
+
+                pOp->iInfo.pParent = res.pParent;
+                pOp->iInfo.pNew = pNewInternal;
+                pOp->iInfo.pLeaf = res.pLeaf;
+                pOp->iInfo.bRightLeaf = res.bRightLeaf;
+
+                update_ptr updCur( res.updParent.ptr() );
+                if ( res.pParent->m_pUpdate.compare_exchange_strong( updCur, update_ptr( pOp, update_desc::IFlag ),
+                    memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                {
+                    // do insert
+                    help_insert( pOp );
+                    retire_update_desc( pOp );
+                    return true;
+                }
+                else {
+                    m_Stat.onUpdateDescDeleted();
+                    free_update_desc( pOp );
+                }
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare, typename Equal, typename Func>
+        bool erase_( Q const& val, Compare cmp, Equal eq, Func f )
+        {
+            update_desc * pOp = null_ptr<update_desc *>();
+            search_result res;
+
+            for ( ;; ) {
+                if ( !search( res, val, cmp ) || !eq( val, *res.pLeaf ) ) {
+                    if ( pOp )
+                        retire_update_desc( pOp );
+                    m_Stat.onEraseFailed();
+                    return false;
+                }
+
+                if ( res.updGrandParent.bits() == update_desc::Clean && res.updParent.bits() == update_desc::Clean ) {
+                    if ( !pOp )
+                        pOp = alloc_update_desc();
+                    if ( check_delete_precondition( res ) ) {
+                        typename gc::Guard guard;
+                        guard.assign( pOp );
+
+                        pOp->dInfo.pGrandParent = res.pGrandParent;
+                        pOp->dInfo.pParent = res.pParent;
+                        pOp->dInfo.pLeaf = res.pLeaf;
+                        pOp->dInfo.pUpdateParent = res.updParent.ptr();
+                        pOp->dInfo.bRightParent = res.bRightParent;
+                        pOp->dInfo.bRightLeaf = res.bRightLeaf;
+
+                        update_ptr updGP( res.updGrandParent.ptr() );
+                        if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
+                            memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                        {
+                            if ( help_delete( pOp )) {
+                                // res.pLeaf is not deleted yet since it is guarded
+                                cds::unref(f)( *node_traits::to_value_ptr( res.pLeaf ));
+                                break;
+                            }
+                            pOp = null_ptr<update_desc *>();
+                        }
+                    }
+                }
+
+                m_Stat.onEraseRetry();
+            }
+
+            --m_ItemCounter;
+            m_Stat.onEraseSuccess();
+            return true;
+        }
+
+        template <typename Q>
+        bool extract_( typename gc::Guard& guard, Q const& key )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( key, node_compare(),
+                []( Q const&, leaf_node const& ) -> bool { return true; },
+                [&guard]( value_type& found ) { guard.assign( &found ); } );
+#       else
+            assign_guard_functor f( guard );
+            return erase_( key, node_compare(), trivial_equal_functor(), cds::ref(f) );
+#       endif
+        }
+
+        template <typename Q, typename Less>
+        bool extract_with_( typename gc::Guard& guard, Q const& key, Less pred )
+        {
+            typedef ellen_bintree::details::compare<
+                key_type,
+                value_type,
+                opt::details::make_comparator_from_less<Less>,
+                node_traits
+            > compare_functor;
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( key, compare_functor(),
+                []( Q const&, leaf_node const& ) -> bool { return true; },
+                [&guard]( value_type& found ) { guard.assign( &found ); } );
+#       else
+            assign_guard_functor f( guard );
+            return erase_( key, compare_functor(), trivial_equal_functor(), cds::ref(f) );
+#       endif
+        }
+
+        bool extract_max_( typename gc::Guard& guard )
+        {
+            update_desc * pOp = null_ptr<update_desc *>();
+            search_result res;
+
+            for ( ;; ) {
+                if ( !search_max( res )) {
+                    // Tree is empty
+                    if ( pOp )
+                        retire_update_desc( pOp );
+                    m_Stat.onExtractMaxFailed();
+                    return false;
+                }
+
+                if ( res.updGrandParent.bits() == update_desc::Clean && res.updParent.bits() == update_desc::Clean )  {
+                    if ( !pOp )
+                        pOp = alloc_update_desc();
+                    if ( check_delete_precondition( res ) ) {
+                        typename gc::Guard guard;
+                        guard.assign( pOp );
+
+                        pOp->dInfo.pGrandParent = res.pGrandParent;
+                        pOp->dInfo.pParent = res.pParent;
+                        pOp->dInfo.pLeaf = res.pLeaf;
+                        pOp->dInfo.pUpdateParent = res.updParent.ptr();
+                        pOp->dInfo.bRightParent = res.bRightParent;
+                        pOp->dInfo.bRightLeaf = res.bRightLeaf;
+
+                        update_ptr updGP( res.updGrandParent.ptr() );
+                        if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
+                            memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                        {
+                            if ( help_delete( pOp ))
+                                break;
+                            pOp = null_ptr<update_desc *>();
+                        }
+                    }
+                }
+
+                m_Stat.onExtractMaxRetry();
+            }
+
+            --m_ItemCounter;
+            m_Stat.onExtractMaxSuccess();
+            guard.assign( node_traits::to_value_ptr( res.pLeaf ) );
+            return true;
+        }
+
+        bool extract_min_( typename gc::Guard& guard )
+        {
+            update_desc * pOp = null_ptr<update_desc *>();
+            search_result res;
+
+            for ( ;; ) {
+                if ( !search_min( res )) {
+                    // Tree is empty
+                    if ( pOp )
+                        retire_update_desc( pOp );
+                    m_Stat.onExtractMinFailed();
+                    return false;
+                }
+
+                if ( res.updGrandParent.bits() == update_desc::Clean && res.updParent.bits() == update_desc::Clean ) {
+                    if ( !pOp )
+                        pOp = alloc_update_desc();
+                    if ( check_delete_precondition( res ) ) {
+                        typename gc::Guard guard;
+                        guard.assign( pOp );
+
+                        pOp->dInfo.pGrandParent = res.pGrandParent;
+                        pOp->dInfo.pParent = res.pParent;
+                        pOp->dInfo.pLeaf = res.pLeaf;
+                        pOp->dInfo.pUpdateParent = res.updParent.ptr();
+                        pOp->dInfo.bRightParent = res.bRightParent;
+                        pOp->dInfo.bRightLeaf = res.bRightLeaf;
+
+                        update_ptr updGP( res.updGrandParent.ptr() );
+                        if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
+                            memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                        {
+                            if ( help_delete( pOp ))
+                                break;
+                            pOp = null_ptr<update_desc *>();
+                        }
+                    }
+                }
+
+                m_Stat.onExtractMinRetry();
+            }
+
+            --m_ItemCounter;
+            m_Stat.onExtractMinSuccess();
+            guard.assign( node_traits::to_value_ptr( res.pLeaf ));
+            return true;
+        }
+
+        template <typename Q, typename Func>
+        bool find_( Q& val, Func f ) const
+        {
+            search_result    res;
+            if ( search( res, val, node_compare() )) {
+                assert( res.pLeaf );
+                cds::unref(f)( *node_traits::to_value_ptr( res.pLeaf ), val );
+
+                m_Stat.onFindSuccess();
+                return true;
+            }
+
+            m_Stat.onFindFailed();
+            return false;
+        }
+
+        template <typename Q, typename Less, typename Func>
+        bool find_with_( Q& val, Less pred, Func f ) const
+        {
+            typedef ellen_bintree::details::compare<
+                key_type,
+                value_type,
+                opt::details::make_comparator_from_less<Less>,
+                node_traits
+            > compare_functor;
+
+            search_result    res;
+            if ( search( res, val, compare_functor() )) {
+                assert( res.pLeaf );
+                cds::unref(f)( *node_traits::to_value_ptr( res.pLeaf ), val );
+
+                m_Stat.onFindSuccess();
+                return true;
+            }
+
+            m_Stat.onFindFailed();
+            return false;
+        }
+
+        template <typename Q>
+        bool get_( typename gc::Guard& guard, Q const& val ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return find_( val, [&guard]( value_type& found, Q const& ) { guard.assign( &found ); } );
+#       else
+            assign_guard_functor f(guard);
+            return find_( val, cds::ref(f) );
+#       endif
+        }
+
+        template <typename Q, typename Less>
+        bool get_with_( typename gc::Guard& guard, Q const& val, Less pred ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return find_with_( val, pred, [&guard]( value_type& found, Q const& ) { guard.assign( &found ); } );
+#       else
+            assign_guard_functor f(guard);
+            return find_with_( val, pred, cds::ref(f) );
+#       endif
+        }
+
+        //@endcond
+    };
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_ELLEN_BINTREE_IMPL_H
diff --git a/cds/intrusive/ellen_bintree_ptb.h b/cds/intrusive/ellen_bintree_ptb.h
new file mode 100644 (file)
index 0000000..3ed45f2
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_ELLEN_BINTREE_PTB_H
+#define __CDS_INTRUSIVE_ELLEN_BINTREE_PTB_H
+
+#include <cds/gc/ptb.h>
+#include <cds/intrusive/ellen_bintree_impl.h>
+
+#endif  // #ifndef __CDS_INTRUSIVE_ELLEN_BINTREE_PTB_H
diff --git a/cds/intrusive/ellen_bintree_rcu.h b/cds/intrusive/ellen_bintree_rcu.h
new file mode 100644 (file)
index 0000000..52ba3ae
--- /dev/null
@@ -0,0 +1,2071 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_ELLEN_BINTREE_RCU_H
+#define __CDS_INTRUSIVE_ELLEN_BINTREE_RCU_H
+
+#include <cds/intrusive/details/ellen_bintree_base.h>
+#include <cds/opt/compare.h>
+#include <cds/ref.h>
+#include <cds/details/binary_functor_wrapper.h>
+#include <cds/urcu/details/check_deadlock.h>
+#include <cds/details/std/memory.h>
+#include <cds/urcu/exempt_ptr.h>
+
+namespace cds { namespace intrusive {
+    //@cond
+    namespace ellen_bintree {
+
+        template <class RCU>
+        struct base_node<cds::urcu::gc<RCU> >: public basic_node
+        {
+            typedef basic_node base_class;
+
+            base_node * m_pNextRetired;
+
+            typedef cds::urcu::gc<RCU> gc       ;   ///< Garbage collector
+
+            /// Constructs leaf (bIntrenal == false) or internal (bInternal == true) node
+            explicit base_node( bool bInternal )
+                : basic_node( bInternal ? internal : 0 )
+                , m_pNextRetired( null_ptr<base_node *>() )
+            {}
+        };
+
+    } // namespace ellen_bintree
+    //@endcond
+
+    /// Ellen's et al binary search tree (RCU specialization)
+    /** @ingroup cds_intrusive_map
+        @ingroup cds_intrusive_tree
+        @anchor cds_intrusive_EllenBinTree_rcu
+
+        Source:
+            - [2010] F.Ellen, P.Fatourou, E.Ruppert, F.van Breugel "Non-blocking Binary Search Tree"
+
+        %EllenBinTree is an unbalanced leaf-oriented binary search tree that implements the <i>set</i>
+        abstract data type. Nodes maintains child pointers but not parent pointers.
+        Every internal node has exactly two children, and all data of type \p T currently in
+        the tree are stored in the leaves. Internal nodes of the tree are used to direct \p find
+        operation along the path to the correct leaf. The keys (of \p Key type) stored in internal nodes
+        may or may not be in the set. \p Key type is a subset of \p T type.
+        There should be exactly defined a key extracting functor for converting object of type \p T to
+        object of type \p Key.
+
+        Due to \p extract_min and \p extract_max member functions the \p %EllenBinTree can act as
+        a <i>priority queue</i>. In this case you should provide unique compound key, for example,
+        the priority value plus some uniformly distributed random value.
+
+        @warning Recall the tree is <b>unbalanced</b>. The complexity of operations is <tt>O(log N)</tt>
+        for uniformly distributed random keys, but in worst case the complexity is <tt>O(N)</tt>.
+
+        @note In the current implementation we do not use helping technique described in original paper.
+        So, the current implementation is near to fine-grained lock-based tree.
+        Helping will be implemented in future release
+
+        <b>Template arguments</b> :
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p Key - key type, a subset of \p T
+        - \p T - type to be stored in tree's leaf nodes. The type must be based on ellen_bintree::node
+            (for ellen_bintree::base_hook) or it must have a member of type ellen_bintree::node
+            (for ellen_bintree::member_hook).
+        - \p Traits - type traits. See ellen_bintree::type_traits for explanation.
+
+        It is possible to declare option-based tree with cds::intrusive::ellen_bintree::make_traits metafunction
+        instead of \p Traits template argument.
+        Template argument list \p Options of cds::intrusive::ellen_bintree::make_traits metafunction are:
+        - opt::hook - hook used. Possible values are: ellen_bintree::base_hook, ellen_bintree::member_hook, ellen_bintree::traits_hook.
+            If the option is not specified, <tt>ellen_bintree::base_hook<></tt> is used.
+        - ellen_bintree::key_extractor - key extracting functor, mandatory option. The functor has the following prototype:
+            \code
+                struct key_extractor {
+                    void operator ()( Key& dest, T const& src );
+                };
+            \endcode
+            It should initialize \p dest key from \p src data. The functor is used to initialize internal nodes.
+        - opt::compare - key compare functor. No default functor is provided.
+            If the option is not specified, \p %opt::less is used.
+        - opt::less - specifies binary predicate used for key compare. At least \p %opt::compare or \p %opt::less should be defined.
+        - opt::disposer - the functor used for dispose removed nodes. Default is opt::v::empty_disposer. Due the nature
+            of GC schema the disposer may be called asynchronously. The disposer is used only for leaf nodes.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - ellen_bintree::update_desc_allocator - an allocator of \ref ellen_bintree::update_desc "update descriptors",
+            default is CDS_DEFAULT_ALLOCATOR.
+            Note that update descriptor is helping data structure with short lifetime and it is good candidate for pooling.
+            The number of simultaneously existing descriptors is bounded and depends on the number of threads
+            working with the tree and RCU buffer size (if RCU is buffered).
+            Therefore, a bounded lock-free container like \p cds::container::VyukovMPMCCycleQueue is good candidate
+            for the free-list of update descriptors, see cds::memory::vyukov_queue_pool free-list implementation.
+            Also notice that size of update descriptor is constant and not dependent on the type of data
+            stored in the tree so single free-list object can be used for all \p %EllenBinTree objects.
+        - opt::node_allocator - the allocator used for internal nodes. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::stat - internal statistics. Available types: ellen_bintree::stat, ellen_bintree::empty_stat (the default)
+        - opt::rcu_check_deadlock - a deadlock checking policy. Default is opt::v::rcu_throw_deadlock
+
+        @anchor cds_intrusive_EllenBinTree_rcu_less
+        <b>Predicate requirements</b>
+
+        opt::less, opt::compare and other predicates using with member fuctions should accept at least parameters
+        of type \p T and \p Key in any combination.
+        For example, for \p Foo struct with \p std::string key field the appropiate \p less functor is:
+        \code
+        struct Foo: public cds::intrusive::ellen_bintree::node< ... >
+        {
+            std::string m_strKey;
+            ...
+        };
+
+        struct less {
+            bool operator()( Foo const& v1, Foo const& v2 ) const
+            { return v1.m_strKey < v2.m_strKey ; }
+
+            bool operator()( Foo const& v, std::string const& s ) const
+            { return v.m_strKey < s ; }
+
+            bool operator()( std::string const& s, Foo const& v ) const
+            { return s < v.m_strKey ; }
+
+            // Support comparing std::string and char const *
+            bool operator()( std::string const& s, char const * p ) const
+            { return s.compare(p) < 0 ; }
+
+            bool operator()( Foo const& v, char const * p ) const
+            { return v.m_strKey.compare(p) < 0 ; }
+
+            bool operator()( char const * p, std::string const& s ) const
+            { return s.compare(p) > 0; }
+
+            bool operator()( char const * p, Foo const& v ) const
+            { return v.m_strKey.compare(p) > 0; }
+        };
+        \endcode
+
+        @note Before including <tt><cds/intrusive/ellen_bintree_rcu.h></tt> you should include appropriate RCU header file,
+        see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+
+        <b>Usage</b>
+
+        Suppose we have the following Foo struct with string key type:
+        \code
+        struct Foo {
+            std::string     m_strKey    ;   // The key
+            //...                           // other non-key data
+        };
+        \endcode
+
+        We want to utilize RCU-based \p %cds::intrusive::EllenBinTree set for \p Foo data.
+        We may use base hook or member hook. Consider base hook variant.
+        First, we need deriving \p Foo struct from \p cds::intrusive::ellen_bintree::node:
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/intrusive/ellen_bintree_rcu.h>
+
+        // RCU type we use
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >  gpb_rcu;
+
+        struct Foo: public cds::intrusive:ellen_bintree::node< gpb_rcu >
+        {
+            std::string     m_strKey    ;   // The key
+            //...                           // other non-key data
+        };
+        \endcode
+
+        Second, we need to implement auxiliary structures and functors:
+        - key extractor functor for extracting the key from \p Foo object.
+            Such functor is necessary because the tree internal nodes store the keys.
+        - \p less predicate. We want our set should accept \p std::string
+            and <tt>char const *</tt> parameters for searching, so our \p less
+            predicate should be non-trivial, see below.
+        - item counting feature: we want our set's \p size() member function
+            returns actual item count.
+
+        \code
+        // Key extractor functor
+        struct my_key_extractor
+        {
+            void operator ()( std::string& key, Foo const& src ) const
+            {
+                key = src.m_strKey;
+            }
+        };
+
+        // Less predicate
+        struct my_less {
+            bool operator()( Foo const& v1, Foo const& v2 ) const
+            { return v1.m_strKey < v2.m_strKey ; }
+
+            bool operator()( Foo const& v, std::string const& s ) const
+            { return v.m_strKey < s ; }
+
+            bool operator()( std::string const& s, Foo const& v ) const
+            { return s < v.m_strKey ; }
+
+            // Support comparing std::string and char const *
+            bool operator()( std::string const& s, char const * p ) const
+            { return s.compare(p) < 0 ; }
+
+            bool operator()( Foo const& v, char const * p ) const
+            { return v.m_strKey.compare(p) < 0 ; }
+
+            bool operator()( char const * p, std::string const& s ) const
+            { return s.compare(p) > 0; }
+
+            bool operator()( char const * p, Foo const& v ) const
+            { return v.m_strKey.compare(p) > 0; }
+        };
+
+        // Type traits for our set
+        // It is necessary to specify only those typedefs that differ from
+        // cds::intrusive::ellen_bintree::type_traits defaults.
+        struct set_traits: public cds::intrusive::ellen_bintree::type_traits
+        {
+            typedef cds::intrusive::ellen_bintree::base_hook< cds::opt::gc<gpb_rcu> > > hook;
+            typedef my_key_extractor    key_extractor;
+            typedef my_less             less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+        \endcode
+
+        Now we declare \p %EllenBinTree set and use it:
+        \code
+        typedef cds::intrusive::EllenBinTree< gpb_rcu, std::string, Foo, set_traits >   set_type;
+
+        set_type    theSet;
+        // ...
+        \endcode
+
+        Instead of declaring \p set_traits type traits we can use option-based syntax with \p %make_traits metafunction,
+        for example:
+        \code
+        typedef cds::intrusive::EllenBinTree< gpb_rcu, std::string, Foo,
+            typename cds::intrusive::ellen_bintree::make_traits<
+                cds::opt::hook< cds::intrusive::ellen_bintree::base_hook< cds::opt::gc<gpb_rcu> > >
+                ,cds::intrusive::ellen_bintree::key_extractor< my_key_extractor >
+                ,cds::opt::less< my_less >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type2;
+        \endcode
+
+        Functionally, \p set_type and \p set_type2 are equivalent.
+
+        <b>Member-hooked tree</b>
+
+        Sometimes, we cannot use base hook, for example, when the \p Foo structure is external.
+        In such case we can use member hook feature.
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/intrusive/ellen_bintree_rcu.h>
+
+        // Struct Foo is external and its declaration cannot be modified.
+        struct Foo {
+            std::string     m_strKey    ;   // The key
+            //...                           // other non-key data
+        };
+
+        // RCU type we use
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >  gpb_rcu;
+
+        // Foo wrapper
+        struct MyFoo
+        {
+            Foo     m_foo;
+            cds::intrusive:ellen_bintree::node< gpb_rcu >   set_hook  ;   // member hook
+        };
+
+        // Key extractor functor
+        struct member_key_extractor
+        {
+            void operator ()( std::string& key, MyFoo const& src ) const
+            {
+                key = src.m_foo.m_strKey;
+            }
+        };
+
+        // Less predicate
+        struct member_less {
+            bool operator()( MyFoo const& v1, MyFoo const& v2 ) const
+            { return v1.m_foo.m_strKey < v2.m_foo.m_strKey ; }
+
+            bool operator()( MyFoo const& v, std::string const& s ) const
+            { return v.m_foo.m_strKey < s ; }
+
+            bool operator()( std::string const& s, MyFoo const& v ) const
+            { return s < v.m_foo.m_strKey ; }
+
+            // Support comparing std::string and char const *
+            bool operator()( std::string const& s, char const * p ) const
+            { return s.compare(p) < 0 ; }
+
+            bool operator()( MyFoo const& v, char const * p ) const
+            { return v.m_foo.m_strKey.compare(p) < 0 ; }
+
+            bool operator()( char const * p, std::string const& s ) const
+            { return s.compare(p) > 0; }
+
+            bool operator()( char const * p, MyFoo const& v ) const
+            { return v.m_foo.m_strKey.compare(p) > 0; }
+        };
+
+        // Type traits for our member-based set
+        struct member_set_traits: public cds::intrusive::ellen_bintree::type_traits
+        {
+            cds::intrusive::ellen_bintree::member_hook< offsetof(MyFoo, set_hook), cds::opt::gc<gpb_rcu> > > hook;
+            typedef member_key_extractor    key_extractor;
+            typedef member_less             less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+
+        // Tree containing MyFoo objects
+        typedef cds::intrusive::EllenBinTree< gpb_rcu, std::string, MyFoo, member_set_traits >   member_set_type;
+
+        member_set_type    theMemberSet;
+        \endcode
+
+        <b>Multiple containers</b>
+
+        Sometimes we need that our \p Foo struct should be used in several different containers.
+        Suppose, \p Foo struct has two key fields:
+        \code
+        struct Foo {
+            std::string m_strKey    ;   // string key
+            int         m_nKey      ;   // int key
+            //...                       // other non-key data fields
+        };
+        \endcode
+
+        We want to build two intrusive \p %EllenBinTree sets: one indexed on \p Foo::m_strKey field,
+        another indexed on \p Foo::m_nKey field. To decide such case we should use a tag option for
+        tree's hook:
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/intrusive/ellen_bintree_rcu.h>
+
+        // RCU type we use
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >  gpb_rcu;
+
+        // Declare tag structs
+        struct int_tag      ;   // in key tag
+        struct string_tag   ;   // string key tag
+
+        // Foo struct is derived from two ellen_bintree::node class
+        // with different tags
+        struct Foo
+            : public cds::intrusive::ellen_bintree::node< gpb_rcu, cds::opt::tag< string_tag > >
+            , public cds::intrusive::ellen_bintree::node< gpb_rcu >, cds::opt::tag< int_tag >
+        {
+            std::string m_strKey    ;   // string key
+            int         m_nKey      ;   // int key
+            //...                       // other non-key data fields
+        };
+
+        // String key extractor functor
+        struct string_key_extractor
+        {
+            void operator ()( std::string& key, Foo const& src ) const
+            {
+                key = src.m_strKey;
+            }
+        };
+
+        // Int key extractor functor
+        struct int_key_extractor
+        {
+            void operator ()( int& key, Foo const& src ) const
+            {
+                key = src.m_nKey;
+            }
+        };
+
+        // String less predicate
+        struct string_less {
+            bool operator()( Foo const& v1, Foo const& v2 ) const
+            { return v1.m_strKey < v2.m_strKey ; }
+
+            bool operator()( Foo const& v, std::string const& s ) const
+            { return v.m_strKey < s ; }
+
+            bool operator()( std::string const& s, Foo const& v ) const
+            { return s < v.m_strKey ; }
+
+            // Support comparing std::string and char const *
+            bool operator()( std::string const& s, char const * p ) const
+            { return s.compare(p) < 0 ; }
+
+            bool operator()( Foo const& v, char const * p ) const
+            { return v.m_strKey.compare(p) < 0 ; }
+
+            bool operator()( char const * p, std::string const& s ) const
+            { return s.compare(p) > 0; }
+
+            bool operator()( char const * p, Foo const& v ) const
+            { return v.m_strKey.compare(p) > 0; }
+        };
+
+        // Int less predicate
+        struct int_less {
+            bool operator()( Foo const& v1, Foo const& v2 ) const
+            { return v1.m_nKey < v2.m_nKey ; }
+
+            bool operator()( Foo const& v, int n ) const
+            { return v.m_nKey < n ; }
+
+            bool operator()( int n, Foo const& v ) const
+            { return n < v.m_nKey ; }
+        };
+
+        // Type traits for string-indexed set
+        struct string_set_traits: public cds::intrusive::ellen_bintree::type_traits
+        {
+            typedef cds::intrusive::ellen_bintree::base_hook< cds::opt::gc<gpb_rcu> >, cds::opt::tag< string_tag > > hook;
+            typedef string_key_extractor    key_extractor;
+            typedef string_less             less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+
+        // Type traits for int-indexed set
+        struct int_set_traits: public cds::intrusive::ellen_bintree::type_traits
+        {
+            typedef cds::intrusive::ellen_bintree::base_hook< cds::opt::gc<gpb_rcu> >, cds::opt::tag< int_tag > > hook;
+            typedef int_key_extractor    key_extractor;
+            typedef int_less             less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+
+        // Declare string-indexed set
+        typedef cds::intrusive::EllenBinTree< gpb_rcu, std::string, Foo, string_set_traits >   string_set_type;
+        string_set_type theStringSet;
+
+        // Declare int-indexed set
+        typedef cds::intrusive::EllenBinTree< gpb_rcu, int, Foo, int_set_traits >   int_set_type;
+        int_set_type    theIntSet;
+
+        // Now we can use theStringSet and theIntSet in our program
+        // ...
+        \endcode
+    */
+    template < class RCU,
+        typename Key,
+        typename T,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = ellen_bintree::type_traits
+#else
+        class Traits
+#endif
+    >
+    class EllenBinTree< cds::urcu::gc<RCU>, Key, T, Traits >
+    {
+    public:
+        typedef cds::urcu::gc<RCU>  gc  ;   ///< RCU Garbage collector
+        typedef Key     key_type        ;   ///< type of a key stored in internal nodes; key is a part of \p value_type
+        typedef T       value_type      ;   ///< type of value stored in the binary tree
+        typedef Traits  options         ;   ///< Traits template parameter
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+
+        typedef typename options::disposer  disposer    ;   ///< leaf node disposer
+
+    protected:
+        //@cond
+        typedef ellen_bintree::base_node< gc >                      tree_node       ; ///< Base type of tree node
+        typedef node_type                                           leaf_node       ; ///< Leaf node type
+        typedef ellen_bintree::internal_node< key_type, leaf_node > internal_node   ; ///< Internal node type
+        typedef ellen_bintree::update_desc< leaf_node, internal_node> update_desc   ; ///< Update descriptor
+        typedef typename update_desc::update_ptr                    update_ptr      ; ///< Marked pointer to update descriptor
+        //@endcond
+
+    public:
+        typedef cds::urcu::exempt_ptr< gc, value_type, value_type, disposer, void > exempt_ptr ; ///< pointer to extracted node
+
+    public:
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key compare functor based on opt::compare and opt::less option setter.
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ; ///< Node traits
+#   else
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+        struct node_traits: public get_node_traits< value_type, node_type, hook>::type
+        {
+            static internal_node const& to_internal_node( tree_node const& n )
+            {
+                assert( n.is_internal() );
+                return static_cast<internal_node const&>( n );
+            }
+
+            static leaf_node const& to_leaf_node( tree_node const& n )
+            {
+                assert( n.is_leaf() );
+                return static_cast<leaf_node const&>( n );
+            }
+        };
+#   endif
+
+        typedef typename options::item_counter  item_counter;   ///< Item counting policy used
+        typedef typename options::memory_model  memory_model;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::stat          stat        ;   ///< internal statistics type
+        typedef typename options::rcu_check_deadlock    rcu_check_deadlock ; ///< Deadlock checking policy
+        typedef typename options::key_extractor         key_extractor   ;   ///< key extracting functor
+
+        typedef typename options::node_allocator        node_allocator  ;   ///< Internal node allocator
+        typedef typename options::update_desc_allocator update_desc_allocator ; ///< Update descriptor allocator
+
+        typedef typename gc::scoped_lock    rcu_lock;   ///< RCU scoped lock
+
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = false; ///< Group of \p extract_xxx functions do not require external locking
+
+    protected:
+        //@cond
+        typedef ellen_bintree::details::compare< key_type, value_type, key_comparator, node_traits > node_compare;
+
+        typedef cds::urcu::details::check_deadlock_policy< gc, rcu_check_deadlock >   check_deadlock_policy;
+
+        typedef cds::details::Allocator< internal_node, node_allocator >        cxx_node_allocator;
+        typedef cds::details::Allocator< update_desc, update_desc_allocator >   cxx_update_desc_allocator;
+
+        struct search_result {
+            internal_node *     pGrandParent;
+            internal_node *     pParent;
+            leaf_node *         pLeaf;
+            update_ptr          updParent;
+            update_ptr          updGrandParent;
+            bool                bRightLeaf      ; // true if pLeaf is right child of pParent, false otherwise
+            bool                bRightParent    ; // true if pParent is right child of pGrandParent, false otherwise
+
+            search_result()
+                :pGrandParent( null_ptr<internal_node *>() )
+                ,pParent( null_ptr<internal_node *>() )
+                ,pLeaf( null_ptr<leaf_node *>() )
+                ,bRightLeaf( false )
+                ,bRightParent( false )
+            {}
+        };
+        //@endcond
+
+    protected:
+        //@cond
+        internal_node       m_Root          ;   ///< Tree root node (key= Infinite2)
+        leaf_node           m_LeafInf1;
+        leaf_node           m_LeafInf2;
+        //@endcond
+
+        item_counter        m_ItemCounter   ;   ///< item counter
+        mutable stat        m_Stat          ;   ///< internal statistics
+
+    protected:
+        //@cond
+        static void free_leaf_node( value_type * p )
+        {
+            disposer()( p );
+        }
+
+        internal_node * alloc_internal_node() const
+        {
+            m_Stat.onInternalNodeCreated();
+            internal_node * pNode = cxx_node_allocator().New();
+            //pNode->clean();
+            return pNode;
+        }
+
+        static void free_internal_node( internal_node * pNode )
+        {
+            cxx_node_allocator().Delete( pNode );
+        }
+
+        struct internal_node_deleter {
+            void operator()( internal_node * p) const
+            {
+                free_internal_node( p );
+            }
+        };
+
+        typedef std::unique_ptr< internal_node, internal_node_deleter>  unique_internal_node_ptr;
+
+        update_desc * alloc_update_desc() const
+        {
+            m_Stat.onUpdateDescCreated();
+            return cxx_update_desc_allocator().New();
+        }
+
+        static void free_update_desc( update_desc * pDesc )
+        {
+            cxx_update_desc_allocator().Delete( pDesc );
+        }
+
+        class retired_list
+        {
+            update_desc *   pUpdateHead;
+            tree_node *     pNodeHead;
+
+        private:
+            class forward_iterator
+            {
+                update_desc *   m_pUpdate;
+                tree_node *     m_pNode;
+
+            public:
+                forward_iterator( retired_list const& l )
+                    : m_pUpdate( l.pUpdateHead )
+                    , m_pNode( l.pNodeHead )
+                {}
+
+                forward_iterator()
+                    : m_pUpdate( null_ptr<update_desc *>() )
+                    , m_pNode( null_ptr< tree_node *>() )
+                {}
+
+                cds::urcu::retired_ptr operator *()
+                {
+                    if ( m_pUpdate ) {
+                        return cds::urcu::retired_ptr( reinterpret_cast<void *>( m_pUpdate ),
+                            reinterpret_cast<cds::urcu::free_retired_ptr_func>( free_update_desc ) );
+                    }
+                    if ( m_pNode ) {
+                        if ( m_pNode->is_leaf() ) {
+                            return cds::urcu::retired_ptr( reinterpret_cast<void *>( node_traits::to_value_ptr( static_cast<leaf_node *>( m_pNode ))),
+                                reinterpret_cast< cds::urcu::free_retired_ptr_func>( free_leaf_node ) );
+                        }
+                        else {
+                            return cds::urcu::retired_ptr( reinterpret_cast<void *>( static_cast<internal_node *>( m_pNode ) ),
+                                reinterpret_cast<cds::urcu::free_retired_ptr_func>( free_internal_node ) );
+                        }
+                    }
+                    return cds::urcu::retired_ptr( null_ptr<void *>(),
+                        reinterpret_cast<cds::urcu::free_retired_ptr_func>( free_update_desc ) );
+                }
+
+                void operator ++()
+                {
+                    if ( m_pUpdate ) {
+                        m_pUpdate = m_pUpdate->pNextRetire;
+                        return;
+                    }
+                    if ( m_pNode )
+                        m_pNode = m_pNode->m_pNextRetired;
+                }
+
+                friend bool operator ==( forward_iterator const& i1, forward_iterator const& i2 )
+                {
+                    return i1.m_pUpdate == i2.m_pUpdate && i1.m_pNode == i2.m_pNode;
+                }
+                friend bool operator !=( forward_iterator const& i1, forward_iterator const& i2 )
+                {
+                    return !( i1 == i2 );
+                }
+            };
+
+        public:
+            retired_list()
+                : pUpdateHead( null_ptr<update_desc *>() )
+                , pNodeHead( null_ptr<tree_node *>() )
+            {}
+
+            ~retired_list()
+            {
+                gc::batch_retire( forward_iterator(*this), forward_iterator() );
+            }
+
+            void push( update_desc * p )
+            {
+                p->pNextRetire = pUpdateHead;
+                pUpdateHead = p;
+            }
+
+            void push( tree_node * p )
+            {
+                p->m_pNextRetired = pNodeHead;
+                pNodeHead = p;
+            }
+        };
+
+        void retire_node( tree_node * pNode, retired_list& rl ) const
+        {
+            if ( pNode->is_leaf() ) {
+                assert( static_cast<leaf_node *>( pNode ) != &m_LeafInf1 );
+                assert( static_cast<leaf_node *>( pNode ) != &m_LeafInf2 );
+            }
+            else {
+                assert( static_cast<internal_node *>( pNode ) != &m_Root );
+                m_Stat.onInternalNodeDeleted();
+            }
+            rl.push( pNode );
+        }
+
+        void retire_update_desc( update_desc * p, retired_list& rl, bool bDirect ) const
+        {
+            m_Stat.onUpdateDescDeleted();
+            if ( bDirect )
+                free_update_desc( p );
+            else
+                rl.push( p );
+        }
+
+        void make_empty_tree()
+        {
+            m_Root.infinite_key( 2 );
+            m_LeafInf1.infinite_key( 1 );
+            m_LeafInf2.infinite_key( 2 );
+            m_Root.m_pLeft.store( &m_LeafInf1, memory_model::memory_order_relaxed );
+            m_Root.m_pRight.store( &m_LeafInf2, memory_model::memory_order_release );
+        }
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct trivial_equal_functor {
+            template <typename Q>
+            bool operator()( Q const& , leaf_node const& ) const
+            {
+                return true;
+            }
+        };
+
+        struct empty_insert_functor {
+            void operator()( value_type& )
+            {}
+        };
+#   endif
+#   if !defined(CDS_CXX11_LAMBDA_SUPPORT) || (CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC10)
+        struct unlink_equal_functor {
+            bool operator()( value_type const& v, leaf_node const& n ) const
+            {
+                return &v == node_traits::to_value_ptr( n );
+            }
+        };
+        struct empty_erase_functor  {
+            void operator()( value_type const& )
+            {}
+        };
+#   endif
+        //@endcond
+
+    public:
+        /// Default constructor
+        EllenBinTree()
+        {
+            static_assert( (!std::is_same< key_extractor, opt::none >::value), "The key extractor option must be specified" );
+            make_empty_tree();
+        }
+
+        /// Clears the tree
+        ~EllenBinTree()
+        {
+            unsafe_clear();
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the tree if it does not contain
+            an item with key equal to \p val.
+
+            The function applies RCU lock internally.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+#   ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert( val, []( value_type& ) {} );
+#   else
+            return insert( val, empty_insert_functor() );
+#   endif
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the tree
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this tree's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success and may be passed by reference
+            using <tt>boost::ref</tt>
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            check_deadlock_policy::check();
+
+            unique_internal_node_ptr pNewInternal;
+            retired_list updRetire;
+
+            {
+                rcu_lock l;
+
+                search_result res;
+                for ( ;; ) {
+                    if ( search( res, val, node_compare() )) {
+                        if ( pNewInternal.get() )
+                            m_Stat.onInternalNodeDeleted() ;    // unique_internal_node_ptr deletes internal node
+                        m_Stat.onInsertFailed();
+                        return false;
+                    }
+
+                    if ( res.updParent.bits() != update_desc::Clean )
+                        help( res.updParent, updRetire );
+                    else {
+                        if ( !pNewInternal.get() )
+                            pNewInternal.reset( alloc_internal_node() );
+
+                        if ( try_insert( val, pNewInternal.get(), res, updRetire )) {
+                            cds::unref(f)( val );
+                            pNewInternal.release()  ;   // internal node is linked into the tree and should not be deleted
+                            break;
+                        }
+                    }
+
+                    m_Stat.onInsertRetry();
+                }
+            }
+
+            ++m_ItemCounter;
+            m_Stat.onInsertSuccess();
+
+            return true;
+        }
+
+        /// Ensures that the \p val exists in the tree
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val is not found in the tree, then \p val is inserted into the tree.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the tree
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refer to the same thing.
+
+            The functor can change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the tree.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            check_deadlock_policy::check();
+
+            unique_internal_node_ptr pNewInternal;
+            retired_list updRetire;
+
+            {
+                rcu_lock l;
+
+                search_result res;
+                for ( ;; ) {
+                    if ( search( res, val, node_compare() )) {
+                        cds::unref(func)( false, *node_traits::to_value_ptr( res.pLeaf ), val );
+                        if ( pNewInternal.get() )
+                            m_Stat.onInternalNodeDeleted() ;    // unique_internal_node_ptr deletes internal node
+                        m_Stat.onEnsureExist();
+                        return std::make_pair( true, false );
+                    }
+
+                    if ( res.updParent.bits() != update_desc::Clean )
+                        help( res.updParent, updRetire );
+                    else {
+                        if ( !pNewInternal.get() )
+                            pNewInternal.reset( alloc_internal_node() );
+
+                        if ( try_insert( val, pNewInternal.get(), res, updRetire )) {
+                            cds::unref(func)( true, val, val );
+                            pNewInternal.release()  ;   // internal node is linked into the tree and should not be deleted
+                            break;
+                        }
+                    }
+                    m_Stat.onEnsureRetry();
+                }
+            }
+
+            ++m_ItemCounter;
+            m_Stat.onEnsureNew();
+
+            return std::make_pair( true, true );
+        }
+
+        /// Unlinks the item \p val from the tree
+        /**
+            The function searches the item \p val in the tree and unlink it from the tree
+            if it is found and is equal to \p val.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of the tree, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+#       if defined(CDS_CXX11_LAMBDA_SUPPORT) && !(CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC10)
+            // vc10 generates an error for the lambda - it sees cds::intrusive::node_traits but not class-defined node_traits
+            return erase_( val, node_compare(),
+                []( value_type const& v, leaf_node const& n ) -> bool { return &v == node_traits::to_value_ptr( n ); },
+                [](value_type const&) {} );
+#       else
+            return erase_( val, node_compare(), unlink_equal_functor(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the tree
+        /** \anchor cds_intrusive_EllenBinTree_rcu_erase
+            The function searches an item with key equal to \p val in the tree,
+            unlinks it from the tree, and returns \p true.
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        template <typename Q>
+        bool erase( const Q& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( val, node_compare(),
+                []( Q const&, leaf_node const& ) -> bool { return true; },
+                [](value_type const&) {} );
+#       else
+            return erase_( val, node_compare(), trivial_equal_functor(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Delete the item from the tree with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_rcu_erase "erase(Q const&)"
+            but \p pred predicate is used for key comparing.
+            \p Less has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_rcu_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( const Q& val, Less pred )
+        {
+            typedef ellen_bintree::details::compare<
+                key_type,
+                value_type,
+                opt::details::make_comparator_from_less<Less>,
+                node_traits
+            > compare_functor;
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( val, compare_functor(),
+                []( Q const&, leaf_node const& ) -> bool { return true; },
+                [](value_type const&) {} );
+#       else
+            return erase_( val, compare_functor(), trivial_equal_functor(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the tree
+        /** \anchor cds_intrusive_EllenBinTree_rcu_erase_func
+            The function searches an item with key equal to \p val in the tree,
+            call \p f functor with item found, unlinks it from the tree, and returns \p true.
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor can be passed by reference with <tt>boost:ref</tt>
+
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& val, Func f )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( val, node_compare(),
+                []( Q const&, leaf_node const& ) -> bool { return true; },
+                f );
+#       else
+            return erase_( val, node_compare(), trivial_equal_functor(), f );
+#       endif
+        }
+
+        /// Delete the item from the tree with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_rcu_erase_func "erase(Q const&, Func)"
+            but \p pred predicate is used for key comparing.
+            \p Less has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_rcu_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& val, Less pred, Func f )
+        {
+            typedef ellen_bintree::details::compare<
+                key_type,
+                value_type,
+                opt::details::make_comparator_from_less<Less>,
+                node_traits
+            > compare_functor;
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( val, compare_functor(),
+                []( Q const&, leaf_node const& ) -> bool { return true; },
+                f );
+#       else
+            return erase_( val, compare_functor(), trivial_equal_functor(), f );
+#       endif
+        }
+
+        /// Extracts an item with minimal key from the tree
+        /**
+            The function searches an item with minimal key, unlinks it, and returns pointer to an item found in \p result parameter.
+            If the tree is empty the function returns \p false.
+
+            @note Due the concurrent nature of the tree, the function extracts <i>nearly</i> minimum key.
+            It means that the function gets leftmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key less than leftmost item's key.
+            So, the function returns the item with minimum key at the moment of tree traversing.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not call the disposer for the item found.
+            The disposer will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        bool extract_min(exempt_ptr& result)
+        {
+            return extract_min_(result);
+        }
+
+        /// Extracts an item with maximal key from the tree
+        /**
+            The function searches an item with maximal key, unlinks it, and returns pointer to an item found in \p result prameter.
+            If the tree is empty the function returns \p false.
+
+            @note Due the concurrent nature of the tree, the function extracts <i>nearly</i> maximal key.
+            It means that the function gets rightmost leaf of the tree and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key great than rightmost item's key.
+            So, the function returns the item with maximum key at the moment of tree traversing.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not call the disposer for the item found.
+            The disposer will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        bool extract_max(exempt_ptr& result)
+        {
+            return extract_max_(result);
+        }
+
+        /// Extracts an item from the tree
+        /** \anchor cds_intrusive_EllenBinTree_rcu_extract
+            The function searches an item with key equal to \p key in the tree,
+            unlinks it, and returns pointer to an item found in \p result parameter.
+            If the item with the key equal to \p key is not found the function returns \p false.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not call the disposer for the item found.
+            The disposer will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& result, Q const& key )
+        {
+            return extract_( result, key, node_compare() );
+        }
+
+        /// Extracts an item from the set using \p pred for searching
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_rcu_extract "extract(exempt_ptr&, Q const&)"
+            but \p pred is used for key compare.
+            \p Less has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_rcu_less
+            "predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& dest,  Q const& val, Less pred )
+        {
+            return extract_with_( dest, val, pred );
+        }
+
+        /// Finds the key \p val
+        /** @anchor cds_intrusive_EllenBinTree_rcu_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function applies RCU lock internally.
+        */
+        template <typename Q>
+        bool find( Q const& val ) const
+        {
+            rcu_lock l;
+            search_result    res;
+            if ( search( res, val, node_compare() )) {
+                m_Stat.onFindSuccess();
+                return true;
+            }
+
+            m_Stat.onFindFailed();
+            return false;
+        }
+
+        /// Finds the key \p val with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_rcu_find_val "find(Q const&)"
+            but \p pred is used for key compare.
+            \p Less functor has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_rcu_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+            \p pred should accept arguments of type \p Q, \p key_type, \p value_type in any combination.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred ) const
+        {
+            typedef ellen_bintree::details::compare<
+                key_type,
+                value_type,
+                opt::details::make_comparator_from_less<Less>,
+                node_traits
+            > compare_functor;
+
+            rcu_lock l;
+            search_result    res;
+            if ( search( res, val, compare_functor() )) {
+                m_Stat.onFindSuccess();
+                return true;
+            }
+            m_Stat.onFindFailed();
+            return false;
+        }
+
+        /// Finds the key \p val
+        /** @anchor cds_intrusive_EllenBinTree_rcu_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the tree \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f ) const
+        {
+            return find_( val, f );
+        }
+
+        /// Finds the key \p val with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_rcu_find_func "find(Q&, Func)"
+            but \p pred is used for key comparison.
+            \p Less functor has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_rcu_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f ) const
+        {
+            return find_with_( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** @anchor cds_intrusive_EllenBinTree_rcu_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the tree \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f ) const
+        {
+            return find_( val, f );
+        }
+
+        /// Finds the key \p val with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_rcu_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key compare.
+            \p Less functor has the interface like \p std::less and should meet \ref cds_intrusive_EllenBinTree_rcu_less
+            "Predicate requirements".
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f ) const
+        {
+            return find_with_( val, pred, f );
+        }
+
+        /// Finds \p key and return the item found
+        /** \anchor cds_intrusive_EllenBinTree_rcu_get
+            The function searches the item with key equal to \p key and returns the pointer to item found.
+            If \p key is not found it returns \p NULL.
+
+            RCU should be locked before call the function.
+            Returned pointer is valid while RCU is locked.
+        */
+        template <typename Q>
+        value_type * get( Q const& key ) const
+        {
+            return get_( key, node_compare() );
+        }
+
+        /// Finds \p key with \p pred predicate and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_EllenBinTree_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the tree.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& key, Less pred ) const
+        {
+            typedef ellen_bintree::details::compare<
+                key_type,
+                value_type,
+                opt::details::make_comparator_from_less<Less>,
+                node_traits
+            > compare_functor;
+
+            return get_( key, compare_functor());
+        }
+
+        /// Checks if the tree is empty
+        bool empty() const
+        {
+            return m_Root.m_pLeft.load( memory_model::memory_order_relaxed )->is_leaf();
+        }
+
+        /// Clears the tree (thread safe, non-atomic)
+        /**
+            The function unlink all items from the tree.
+            The function is thread safe but not atomic: in multi-threaded environment with parallel insertions
+            this sequence
+            \code
+            set.clear();
+            assert( set.empty() );
+            \endcode
+            the assertion could be raised.
+
+            For each leaf the \ref disposer will be called after unlinking.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        void clear()
+        {
+            exempt_ptr ep;
+            while ( extract_min(ep) )
+                ep.release();
+        }
+
+        /// Clears the tree (not thread safe)
+        /**
+            This function is not thread safe and may be called only when no other thread deals with the tree.
+            The function is used in the tree destructor.
+        */
+        void unsafe_clear()
+        {
+            rcu_lock l;
+
+            while ( true ) {
+                internal_node * pParent = null_ptr< internal_node *>();
+                internal_node * pGrandParent = null_ptr<internal_node *>();
+                tree_node *     pLeaf = const_cast<internal_node *>( &m_Root );
+
+                // Get leftmost leaf
+                while ( pLeaf->is_internal() ) {
+                    pGrandParent = pParent;
+                    pParent = static_cast<internal_node *>( pLeaf );
+                    pLeaf = pParent->m_pLeft.load( memory_model::memory_order_relaxed );
+                }
+
+                if ( pLeaf->infinite_key()) {
+                    // The tree is empty
+                    return;
+                }
+
+                // Remove leftmost leaf and its parent node
+                assert( pGrandParent );
+                assert( pParent );
+                assert( pLeaf->is_leaf() );
+
+                pGrandParent->m_pLeft.store( pParent->m_pRight.load( memory_model::memory_order_relaxed ), memory_model::memory_order_relaxed );
+                free_leaf_node( node_traits::to_value_ptr( static_cast<leaf_node *>( pLeaf ) ) );
+                free_internal_node( pParent );
+            }
+        }
+
+        /// Returns item count in the tree
+        /**
+            Only leaf nodes containing user data are counted.
+
+            The value returned depends on item counter type provided by \p Traits template parameter.
+            If it is atomicity::empty_item_counter this function always returns 0.
+            Therefore, the function is not suitable for checking the tree emptiness, use \ref empty
+            member function for this purpose.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return m_Stat;
+        }
+
+        /// Checks internal consistency (not atomic, not thread-safe)
+        /**
+            The debugging function to check internal consistency of the tree.
+        */
+        bool check_consistency() const
+        {
+            return check_consistency( &m_Root );
+        }
+
+    protected:
+        //@cond
+
+        bool check_consistency( internal_node const * pRoot ) const
+        {
+            tree_node * pLeft  = pRoot->m_pLeft.load( CDS_ATOMIC::memory_order_relaxed );
+            tree_node * pRight = pRoot->m_pRight.load( CDS_ATOMIC::memory_order_relaxed );
+            assert( pLeft );
+            assert( pRight );
+
+            if ( node_compare()( *pLeft, *pRoot ) < 0
+                && node_compare()( *pRoot, *pRight ) <= 0
+                && node_compare()( *pLeft, *pRight ) < 0 )
+            {
+                bool bRet = true;
+                if ( pLeft->is_internal() )
+                    bRet = check_consistency( static_cast<internal_node *>( pLeft ) );
+                assert( bRet );
+
+                if ( bRet && pRight->is_internal() )
+                    bRet = bRet && check_consistency( static_cast<internal_node *>( pRight ));
+                assert( bRet );
+
+                return bRet;
+            }
+            return false;
+        }
+
+        void help( update_ptr pUpdate, retired_list& rl )
+        {
+            /*
+            switch ( pUpdate.bits() ) {
+                case update_desc::IFlag:
+                    help_insert( pUpdate.ptr() );
+                    m_Stat.onHelpInsert();
+                    break;
+                case update_desc::DFlag:
+                    //help_delete( pUpdate.ptr(), rl );
+                    //m_Stat.onHelpDelete();
+                    break;
+                case update_desc::Mark:
+                    //help_marked( pUpdate.ptr() );
+                    //m_Stat.onHelpMark();
+                    break;
+            }
+            */
+        }
+
+        void help_insert( update_desc * pOp )
+        {
+            assert( gc::is_locked() );
+
+            tree_node * pLeaf = static_cast<tree_node *>( pOp->iInfo.pLeaf );
+            if ( pOp->iInfo.bRightLeaf ) {
+                pOp->iInfo.pParent->m_pRight.compare_exchange_strong( pLeaf, static_cast<tree_node *>( pOp->iInfo.pNew ),
+                    memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+            }
+            else {
+                pOp->iInfo.pParent->m_pLeft.compare_exchange_strong( pLeaf, static_cast<tree_node *>( pOp->iInfo.pNew ),
+                    memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            update_ptr cur( pOp, update_desc::IFlag );
+            pOp->iInfo.pParent->m_pUpdate.compare_exchange_strong( cur, pOp->iInfo.pParent->null_update_desc(),
+                      memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        bool check_delete_precondition( search_result& res )
+        {
+            assert( res.pGrandParent != null_ptr<internal_node *>() );
+
+            return
+                static_cast<internal_node *>( res.bRightParent
+                    ? res.pGrandParent->m_pRight.load(memory_model::memory_order_relaxed)
+                    : res.pGrandParent->m_pLeft.load(memory_model::memory_order_relaxed)
+                ) == res.pParent
+                &&
+                static_cast<leaf_node *>( res.bRightLeaf
+                    ? res.pParent->m_pRight.load(memory_model::memory_order_relaxed)
+                    : res.pParent->m_pLeft.load(memory_model::memory_order_relaxed)
+                ) == res.pLeaf;
+        }
+
+        bool help_delete( update_desc * pOp, retired_list& rl )
+        {
+            assert( gc::is_locked() );
+
+            update_ptr pUpdate( pOp->dInfo.pUpdateParent );
+            update_ptr pMark( pOp, update_desc::Mark );
+            if ( pOp->dInfo.pParent->m_pUpdate.compare_exchange_strong( pUpdate, pMark,
+                    memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+            {
+                help_marked( pOp );
+                retire_node( pOp->dInfo.pParent, rl );
+                // For extract operations the leaf should NOT be disposed
+                if ( pOp->dInfo.bDisposeLeaf )
+                    retire_node( pOp->dInfo.pLeaf, rl );
+                retire_update_desc( pOp, rl, false );
+
+                return true;
+            }
+            else if ( pUpdate == pMark ) {
+                // some other thread is processing help_marked()
+                help_marked( pOp );
+                m_Stat.onHelpMark();
+                return true;
+            }
+            else {
+                // pUpdate has been changed by CAS
+                help( pUpdate, rl );
+
+                // Undo grandparent dInfo
+                update_ptr pDel( pOp, update_desc::DFlag );
+                if ( pOp->dInfo.pGrandParent->m_pUpdate.compare_exchange_strong( pDel, pOp->dInfo.pGrandParent->null_update_desc(),
+                    memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                {
+                    retire_update_desc( pOp, rl, false );
+                }
+                return false;
+            }
+        }
+
+        void help_marked( update_desc * pOp )
+        {
+            assert( gc::is_locked() );
+
+            tree_node * p = pOp->dInfo.pParent;
+            if ( pOp->dInfo.bRightParent ) {
+                pOp->dInfo.pGrandParent->m_pRight.compare_exchange_strong( p,
+                    pOp->dInfo.bRightLeaf
+                        ? pOp->dInfo.pParent->m_pLeft.load( memory_model::memory_order_acquire )
+                        : pOp->dInfo.pParent->m_pRight.load( memory_model::memory_order_acquire ),
+                    memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+            }
+            else {
+                pOp->dInfo.pGrandParent->m_pLeft.compare_exchange_strong( p,
+                    pOp->dInfo.bRightLeaf
+                        ? pOp->dInfo.pParent->m_pLeft.load( memory_model::memory_order_acquire )
+                        : pOp->dInfo.pParent->m_pRight.load( memory_model::memory_order_acquire ),
+                    memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            update_ptr upd( pOp, update_desc::DFlag );
+            pOp->dInfo.pGrandParent->m_pUpdate.compare_exchange_strong( upd, pOp->dInfo.pGrandParent->null_update_desc(),
+                memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        template <typename KeyValue, typename Compare>
+        bool search( search_result& res, KeyValue const& key, Compare cmp ) const
+        {
+            assert( gc::is_locked() );
+
+            internal_node * pParent;
+            internal_node * pGrandParent = null_ptr<internal_node *>();
+            tree_node *     pLeaf;
+            update_ptr      updParent;
+            update_ptr      updGrandParent;
+            bool bRightLeaf;
+            bool bRightParent = false;
+
+            int nCmp = 0;
+
+        retry:
+            pParent = null_ptr<internal_node *>();
+            pLeaf = const_cast<internal_node *>( &m_Root );
+            updParent = null_ptr<update_desc *>();
+            bRightLeaf = false;
+            while ( pLeaf->is_internal() ) {
+                pGrandParent = pParent;
+                pParent = static_cast<internal_node *>( pLeaf );
+                bRightParent = bRightLeaf;
+                updGrandParent = updParent;
+                updParent = pParent->m_pUpdate.load( memory_model::memory_order_acquire );
+
+                switch ( updParent.bits() ) {
+                    case update_desc::DFlag:
+                    case update_desc::Mark:
+                        m_Stat.onSearchRetry();
+                        goto retry;
+                }
+
+                nCmp = cmp( key, *pParent );
+                bRightLeaf = nCmp >= 0;
+                pLeaf = nCmp < 0 ? pParent->m_pLeft.load( memory_model::memory_order_acquire )
+                                 : pParent->m_pRight.load( memory_model::memory_order_acquire );
+            }
+
+            assert( pLeaf->is_leaf() );
+            nCmp = cmp( key, *static_cast<leaf_node *>(pLeaf) );
+
+            res.pGrandParent    = pGrandParent;
+            res.pParent         = pParent;
+            res.pLeaf           = static_cast<leaf_node *>( pLeaf );
+            res.updParent       = updParent;
+            res.updGrandParent  = updGrandParent;
+            res.bRightParent    = bRightParent;
+            res.bRightLeaf      = bRightLeaf;
+
+            return nCmp == 0;
+        }
+
+        bool search_min( search_result& res ) const
+        {
+            assert( gc::is_locked() );
+
+            internal_node * pParent;
+            internal_node * pGrandParent = null_ptr<internal_node *>();
+            tree_node *     pLeaf;
+            update_ptr      updParent;
+            update_ptr      updGrandParent;
+
+        retry:
+            pParent = null_ptr< internal_node *>();
+            pLeaf = const_cast<internal_node *>( &m_Root );
+            while ( pLeaf->is_internal() ) {
+                pGrandParent = pParent;
+                pParent = static_cast<internal_node *>( pLeaf );
+                updGrandParent = updParent;
+                updParent = pParent->m_pUpdate.load( memory_model::memory_order_acquire );
+
+                switch ( updParent.bits() ) {
+                    case update_desc::DFlag:
+                    case update_desc::Mark:
+                        m_Stat.onSearchRetry();
+                        goto retry;
+                }
+
+                pLeaf = pParent->m_pLeft.load( memory_model::memory_order_acquire );
+            }
+
+            if ( pLeaf->infinite_key())
+                return false;
+
+            res.pGrandParent    = pGrandParent;
+            res.pParent         = pParent;
+            assert( pLeaf->is_leaf() );
+            res.pLeaf           = static_cast<leaf_node *>( pLeaf );
+            res.updParent       = updParent;
+            res.updGrandParent  = updGrandParent;
+            res.bRightParent    = false;
+            res.bRightLeaf      = false;
+
+            return true;
+        }
+
+        bool search_max( search_result& res ) const
+        {
+            assert( gc::is_locked() );
+
+            internal_node * pParent;
+            internal_node * pGrandParent = null_ptr<internal_node *>();
+            tree_node *     pLeaf;
+            update_ptr      updParent;
+            update_ptr      updGrandParent;
+            bool bRightLeaf;
+            bool bRightParent = false;
+
+        retry:
+            pParent = null_ptr< internal_node *>();
+            pLeaf = const_cast<internal_node *>( &m_Root );
+            bRightLeaf = false;
+            while ( pLeaf->is_internal() ) {
+                pGrandParent = pParent;
+                pParent = static_cast<internal_node *>( pLeaf );
+                bRightParent = bRightLeaf;
+                updGrandParent = updParent;
+                updParent = pParent->m_pUpdate.load( memory_model::memory_order_acquire );
+
+                switch ( updParent.bits() ) {
+                    case update_desc::DFlag:
+                    case update_desc::Mark:
+                        m_Stat.onSearchRetry();
+                        goto retry;
+                }
+
+                if ( pParent->infinite_key()) {
+                    pLeaf = pParent->m_pLeft.load( memory_model::memory_order_acquire );
+                    bRightLeaf = false;
+                }
+                else {
+                    pLeaf = pParent->m_pRight.load( memory_model::memory_order_acquire );
+                    bRightLeaf = true;
+                }
+            }
+
+            if ( pLeaf->infinite_key())
+                return false;
+
+            res.pGrandParent    = pGrandParent;
+            res.pParent         = pParent;
+            assert( pLeaf->is_leaf() );
+            res.pLeaf           = static_cast<leaf_node *>( pLeaf );
+            res.updParent       = updParent;
+            res.updGrandParent  = updGrandParent;
+            res.bRightParent    = bRightParent;
+            res.bRightLeaf      = bRightLeaf;
+
+            return true;
+        }
+
+        template <typename Q, typename Compare, typename Equal, typename Func>
+        bool erase_( Q const& val, Compare cmp, Equal eq, Func f )
+        {
+            check_deadlock_policy::check();
+
+            retired_list updRetire;
+            update_desc * pOp = null_ptr<update_desc *>();
+            search_result res;
+
+            {
+                rcu_lock l;
+                for ( ;; ) {
+                    if ( !search( res, val, cmp ) || !eq( val, *res.pLeaf ) ) {
+                        if ( pOp )
+                            retire_update_desc( pOp, updRetire, false );
+                        m_Stat.onEraseFailed();
+                        return false;
+                    }
+
+                    if ( res.updGrandParent.bits() != update_desc::Clean )
+                        help( res.updGrandParent, updRetire );
+                    else if ( res.updParent.bits() != update_desc::Clean )
+                        help( res.updParent, updRetire );
+                    else {
+                        if ( !pOp )
+                            pOp = alloc_update_desc();
+                        if ( check_delete_precondition( res ) ) {
+                            pOp->dInfo.pGrandParent = res.pGrandParent;
+                            pOp->dInfo.pParent = res.pParent;
+                            pOp->dInfo.pLeaf = res.pLeaf;
+                            pOp->dInfo.bDisposeLeaf = true;
+                            pOp->dInfo.pUpdateParent = res.updParent.ptr();
+                            pOp->dInfo.bRightParent = res.bRightParent;
+                            pOp->dInfo.bRightLeaf = res.bRightLeaf;
+
+                            update_ptr updGP( res.updGrandParent.ptr() );
+                            if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
+                                memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                            {
+                                if ( help_delete( pOp, updRetire )) {
+                                    // res.pLeaf is not deleted yet since RCU is blocked
+                                    cds::unref(f)( *node_traits::to_value_ptr( res.pLeaf ));
+                                    break;
+                                }
+                                pOp = null_ptr<update_desc *>();
+                            }
+                            else {
+                                // updGP has been changed by CAS
+                                help( updGP, updRetire );
+                            }
+                        }
+                    }
+
+                    m_Stat.onEraseRetry();
+                }
+            }
+
+            --m_ItemCounter;
+            m_Stat.onEraseSuccess();
+            return true;
+        }
+
+        template <typename ExemptPtr, typename Q, typename Less>
+        bool extract_with_( ExemptPtr& dest,  Q const& val, Less pred )
+        {
+            typedef ellen_bintree::details::compare<
+                key_type,
+                value_type,
+                opt::details::make_comparator_from_less<Less>,
+                node_traits
+            > compare_functor;
+
+            return extract_( dest, val, compare_functor() );
+        }
+
+        template <typename ExemptPtr, typename Q, typename Compare>
+        bool extract_( ExemptPtr& ptr, Q const& val, Compare cmp )
+        {
+            check_deadlock_policy::check();
+
+            retired_list updRetire;
+            update_desc * pOp = null_ptr<update_desc *>();
+            search_result res;
+
+            {
+                rcu_lock l;
+                for ( ;; ) {
+                    if ( !search( res, val, cmp ) ) {
+                        if ( pOp )
+                            retire_update_desc( pOp, updRetire, false );
+                        m_Stat.onEraseFailed();
+                        return false;
+                    }
+
+                    if ( res.updGrandParent.bits() != update_desc::Clean )
+                        help( res.updGrandParent, updRetire );
+                    else if ( res.updParent.bits() != update_desc::Clean )
+                        help( res.updParent, updRetire );
+                    else {
+                        if ( !pOp )
+                            pOp = alloc_update_desc();
+                        if ( check_delete_precondition( res )) {
+                            pOp->dInfo.pGrandParent = res.pGrandParent;
+                            pOp->dInfo.pParent = res.pParent;
+                            pOp->dInfo.pLeaf = res.pLeaf;
+                            pOp->dInfo.bDisposeLeaf = false;
+                            pOp->dInfo.pUpdateParent = res.updParent.ptr();
+                            pOp->dInfo.bRightParent = res.bRightParent;
+                            pOp->dInfo.bRightLeaf = res.bRightLeaf;
+
+                            update_ptr updGP( res.updGrandParent.ptr() );
+                            if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
+                                memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                            {
+                                if ( help_delete( pOp, updRetire )) {
+                                    ptr = node_traits::to_value_ptr( res.pLeaf );
+                                    break;
+                                }
+                                pOp = null_ptr<update_desc *>();
+                            }
+                            else {
+                                // updGP has been changed by CAS
+                                help( updGP, updRetire );
+                            }
+                        }
+                    }
+
+                    m_Stat.onEraseRetry();
+                }
+            }
+
+            --m_ItemCounter;
+            m_Stat.onEraseSuccess();
+            return true;
+        }
+
+
+        template <typename ExemptPtr>
+        bool extract_max_( ExemptPtr& result )
+        {
+            check_deadlock_policy::check();
+
+            retired_list updRetire;
+            update_desc * pOp = null_ptr<update_desc *>();
+            search_result res;
+
+            {
+                rcu_lock l;
+                for ( ;; ) {
+                    if ( !search_max( res )) {
+                        // Tree is empty
+                        if ( pOp )
+                            retire_update_desc( pOp, updRetire, false );
+                        m_Stat.onExtractMaxFailed();
+                        return false;
+                    }
+
+                    if ( res.updGrandParent.bits() != update_desc::Clean )
+                        help( res.updGrandParent, updRetire );
+                    else if ( res.updParent.bits() != update_desc::Clean )
+                        help( res.updParent, updRetire );
+                    else {
+                        if ( !pOp )
+                            pOp = alloc_update_desc();
+                        if ( check_delete_precondition( res ) ) {
+                            pOp->dInfo.pGrandParent = res.pGrandParent;
+                            pOp->dInfo.pParent = res.pParent;
+                            pOp->dInfo.pLeaf = res.pLeaf;
+                            pOp->dInfo.bDisposeLeaf = false;
+                            pOp->dInfo.pUpdateParent = res.updParent.ptr();
+                            pOp->dInfo.bRightParent = res.bRightParent;
+                            pOp->dInfo.bRightLeaf = res.bRightLeaf;
+
+                            update_ptr updGP( res.updGrandParent.ptr() );
+                            if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
+                                memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                            {
+                                if ( help_delete( pOp, updRetire )) {
+                                    result = node_traits::to_value_ptr( res.pLeaf );
+                                    break;
+                                }
+                                pOp = null_ptr<update_desc *>();
+                            }
+                            else {
+                                // updGP has been changed by CAS
+                                help( updGP, updRetire );
+                            }
+                        }
+                    }
+                    m_Stat.onExtractMaxRetry();
+                }
+            }
+
+            --m_ItemCounter;
+            m_Stat.onExtractMaxSuccess();
+            return true;
+        }
+
+        template <typename ExemptPtr>
+        bool extract_min_(ExemptPtr& result)
+        {
+            check_deadlock_policy::check();
+
+            retired_list updRetire;
+            update_desc * pOp = null_ptr<update_desc *>();
+            search_result res;
+
+            {
+                rcu_lock l;
+                for ( ;; ) {
+                    if ( !search_min( res )) {
+                        // Tree is empty
+                        if ( pOp )
+                            retire_update_desc( pOp, updRetire, false );
+                        m_Stat.onExtractMinFailed();
+                        return false;
+                    }
+
+                    if ( res.updGrandParent.bits() != update_desc::Clean )
+                        help( res.updGrandParent, updRetire );
+                    else if ( res.updParent.bits() != update_desc::Clean )
+                        help( res.updParent, updRetire );
+                    else {
+                        if ( !pOp )
+                            pOp = alloc_update_desc();
+                        if ( check_delete_precondition( res ) ) {
+                            pOp->dInfo.pGrandParent = res.pGrandParent;
+                            pOp->dInfo.pParent = res.pParent;
+                            pOp->dInfo.pLeaf = res.pLeaf;
+                            pOp->dInfo.bDisposeLeaf = false;
+                            pOp->dInfo.pUpdateParent = res.updParent.ptr();
+                            pOp->dInfo.bRightParent = res.bRightParent;
+                            pOp->dInfo.bRightLeaf = res.bRightLeaf;
+
+                            update_ptr updGP( res.updGrandParent.ptr() );
+                            if ( res.pGrandParent->m_pUpdate.compare_exchange_strong( updGP, update_ptr( pOp, update_desc::DFlag ),
+                                memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                            {
+                                if ( help_delete( pOp, updRetire )) {
+                                    result = node_traits::to_value_ptr( res.pLeaf );
+                                    break;
+                                }
+                                pOp = null_ptr<update_desc *>();
+                            }
+                            else {
+                                // updGP has been changed by CAS
+                                help( updGP, updRetire );
+                            }
+                        }
+                    }
+
+                    m_Stat.onExtractMinRetry();
+                }
+            }
+
+            --m_ItemCounter;
+            m_Stat.onExtractMinSuccess();
+            return true;
+        }
+
+        template <typename Q, typename Less, typename Func>
+        bool find_with_( Q& val, Less pred, Func f ) const
+        {
+            typedef ellen_bintree::details::compare<
+                key_type,
+                value_type,
+                opt::details::make_comparator_from_less<Less>,
+                node_traits
+            > compare_functor;
+
+            rcu_lock l;
+            search_result    res;
+            if ( search( res, val, compare_functor() )) {
+                assert( res.pLeaf );
+                cds::unref(f)( *node_traits::to_value_ptr( res.pLeaf ), val );
+
+                m_Stat.onFindSuccess();
+                return true;
+            }
+
+            m_Stat.onFindFailed();
+            return false;
+        }
+
+        template <typename Q, typename Func>
+        bool find_( Q& key, Func f ) const
+        {
+            rcu_lock l;
+            search_result    res;
+            if ( search( res, key, node_compare() )) {
+                assert( res.pLeaf );
+                cds::unref(f)( *node_traits::to_value_ptr( res.pLeaf ), key );
+
+                m_Stat.onFindSuccess();
+                return true;
+            }
+
+            m_Stat.onFindFailed();
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        value_type * get_( Q const& key, Compare cmp ) const
+        {
+            assert( gc::is_locked());
+
+            search_result    res;
+            if ( search( res, key, cmp )) {
+                m_Stat.onFindSuccess();
+                return node_traits::to_value_ptr( res.pLeaf );
+            }
+
+            m_Stat.onFindFailed();
+            return null_ptr<value_type *>();
+        }
+
+
+        bool try_insert( value_type& val, internal_node * pNewInternal, search_result& res, retired_list& updRetire )
+        {
+            assert( gc::is_locked() );
+            assert( res.updParent.bits() == update_desc::Clean );
+
+            // check search result
+            if ( static_cast<leaf_node *>( res.bRightLeaf
+                ? res.pParent->m_pRight.load( memory_model::memory_order_relaxed )
+                : res.pParent->m_pLeft.load( memory_model::memory_order_relaxed ) ) == res.pLeaf )
+            {
+                leaf_node * pNewLeaf = node_traits::to_node_ptr( val );
+
+                int nCmp = node_compare()( val, *res.pLeaf );
+                if ( nCmp < 0 ) {
+                    if ( res.pGrandParent ) {
+                        pNewInternal->infinite_key( 0 );
+                        key_extractor()( pNewInternal->m_Key, *node_traits::to_value_ptr( res.pLeaf ) );
+                        assert( !res.pLeaf->infinite_key() );
+                    }
+                    else {
+                        assert( res.pLeaf->infinite_key() == tree_node::key_infinite1 );
+                        pNewInternal->infinite_key( 1 );
+                    }
+                    pNewInternal->m_pLeft.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_relaxed );
+                    pNewInternal->m_pRight.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_release );
+                }
+                else {
+                    assert( !res.pLeaf->is_internal() );
+                    pNewInternal->infinite_key( 0 );
+
+                    key_extractor()( pNewInternal->m_Key, val );
+                    pNewInternal->m_pLeft.store( static_cast<tree_node *>(res.pLeaf), memory_model::memory_order_relaxed );
+                    pNewInternal->m_pRight.store( static_cast<tree_node *>(pNewLeaf), memory_model::memory_order_release );
+                    assert( !res.pLeaf->infinite_key());
+                }
+
+                update_desc * pOp = alloc_update_desc();
+
+                pOp->iInfo.pParent = res.pParent;
+                pOp->iInfo.pNew = pNewInternal;
+                pOp->iInfo.pLeaf = res.pLeaf;
+                pOp->iInfo.bRightLeaf = res.bRightLeaf;
+
+                update_ptr updCur( res.updParent.ptr() );
+                if ( res.pParent->m_pUpdate.compare_exchange_strong( updCur, update_ptr( pOp, update_desc::IFlag ),
+                    memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                {
+                    // do insert
+                    help_insert( pOp );
+                    retire_update_desc( pOp, updRetire, false );
+                    return true;
+                }
+                else {
+                    // updCur has been updated by CAS
+                    help( updCur, updRetire );
+                    retire_update_desc( pOp, updRetire, true );
+                }
+            }
+            return false;
+        }
+
+        //@endcond
+    };
+
+}} // namespace cds::intrusive
+
+#endif  // #ifndef __CDS_INTRUSIVE_ELLEN_BINTREE_RCU_H
diff --git a/cds/intrusive/fcqueue.h b/cds/intrusive/fcqueue.h
new file mode 100644 (file)
index 0000000..ac56e02
--- /dev/null
@@ -0,0 +1,345 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_FCQUEUE_H
+#define __CDS_INTRUSIVE_FCQUEUE_H
+
+#include <cds/algo/flat_combining.h>
+#include <cds/algo/elimination_opt.h>
+#include <cds/intrusive/options.h>
+#include <boost/intrusive/list.hpp>
+
+namespace cds { namespace intrusive {
+
+    /// FCQueue related definitions
+    namespace fcqueue {
+
+        /// FCQueue internal statistics
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat: public cds::algo::flat_combining::stat<Counter>
+        {
+            typedef cds::algo::flat_combining::stat<Counter>    flat_combining_stat; ///< Flat-combining statistics
+            typedef typename flat_combining_stat::counter_type  counter_type;        ///< Counter type
+
+            counter_type    m_nEnqueue     ;   ///< Count of push operations
+            counter_type    m_nDequeue     ;   ///< Count of success pop operations
+            counter_type    m_nFailedDeq   ;   ///< Count of failed pop operations (pop from empty queue)
+            counter_type    m_nCollided    ;   ///< How many pairs of push/pop were collided, if elimination is enabled
+
+            //@cond
+            void    onEnqueue()                 { ++m_nEnqueue; }
+            void    onDequeue( bool bFailed )   { if ( bFailed ) ++m_nFailedDeq; else ++m_nDequeue;  }
+            void    onCollide()                 { ++m_nCollided; }
+            //@endcond
+        };
+
+        /// FCQueue dummy statistics, no overhead
+        struct empty_stat: public cds::algo::flat_combining::empty_stat
+        {
+            //@cond
+            void    onEnqueue()     {}
+            void    onDequeue(bool) {}
+            void    onCollide()     {}
+            //@endcond
+        };
+
+        /// FCQueue type traits
+        struct type_traits: public cds::algo::flat_combining::type_traits
+        {
+            typedef cds::intrusive::opt::v::empty_disposer  disposer ; ///< Disposer to erase removed elements. Used only in \p FCQueue::clear() function
+            typedef empty_stat      stat;   ///< Internal statistics
+            static CDS_CONSTEXPR_CONST bool enable_elimination = false; ///< Enable \ref cds_elimination_description "elimination"
+        };
+
+        /// Metafunction converting option list to traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options are:
+            - \p opt::lock_type - mutex type, default is \p cds::lock::Spin
+            - \p opt::back_off - back-off strategy, defalt is \p cds::backoff::Default
+            - \p opt::disposer - the functor used for dispose removed items. Default is opt::intrusive::v::empty_disposer.
+                This option is used only in \p FCQueue::clear() function.
+            - \p opt::allocator - allocator type, default is \ref CDS_DEFAULT_ALLOCATOR
+            - \p opt::stat - internal statistics, possible type: \ref stat, \ref empty_stat (the default)
+            - \p opt::memory_model - C++ memory ordering model.
+                List of all available memory ordering see opt::memory_model.
+                Default if cds::opt::v:relaxed_ordering
+            - \p opt::enable_elimination - enable/disable operation \ref cds_elimination_description "elimination"
+                By default, the elimination is disabled.
+        */
+        template <CDS_DECL_OPTIONS8>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS8 >::type
+                ,CDS_OPTIONS8
+            >::type   type;
+#   endif
+        };
+    } // namespace fcqueue
+
+    /// Flat-combining intrusive queue
+    /**
+        @ingroup cds_intrusive_queue
+        @ingroup cds_flat_combining_intrusive
+
+        \ref cds_flat_combining_description "Flat combining" sequential intrusive queue.
+
+        Template parameters:
+        - \p T - a value type stored in the queue
+        - \p Container - sequential intrusive container with \p push_back and \p pop_front functions.
+            Default is \p boost::intrusive::list
+        - \p Traits - type traits of flat combining, default is \p fcqueue::type_traits.
+            \p fcqueue::make_traits metafunction can be used to construct specialized \p %type_traits
+    */
+    template <typename T
+        ,class Container = boost::intrusive::list<T>
+        ,typename Traits = fcqueue::type_traits
+    >
+    class FCQueue
+#ifndef CDS_DOXYGEN_INVOKED
+        : public cds::algo::flat_combining::container
+#endif
+    {
+    public:
+        typedef T           value_type;     ///< Value type
+        typedef Container   container_type; ///< Sequential container type
+        typedef Traits      type_traits;    ///< Queue type traits
+
+        typedef typename type_traits::disposer  disposer;   ///< The disposer functor. The disposer is used only in \ref clear() function
+        typedef typename type_traits::stat  stat;   ///< Internal statistics type
+        static CDS_CONSTEXPR_CONST bool c_bEliminationEnabled = type_traits::enable_elimination; ///< \p true if elimination is enabled
+
+    protected:
+        //@cond
+        /// Queue operation IDs
+        enum fc_operation {
+            op_enq = cds::algo::flat_combining::req_Operation, ///< Enqueue
+            op_deq,                 ///< Dequeue
+            op_clear,               ///< Clear
+            op_clear_and_dispose    ///< Clear and dispose
+        };
+
+        /// Flat combining publication list record
+        struct fc_record: public cds::algo::flat_combining::publication_record
+        {
+            value_type * pVal;  ///< Value to enqueue or dequeue
+            bool         bEmpty; ///< \p true if the queue is empty
+        };
+        //@endcond
+
+        /// Flat combining kernel
+        typedef cds::algo::flat_combining::kernel< fc_record, type_traits > fc_kernel;
+
+    protected:
+        //@cond
+        fc_kernel       m_FlatCombining;
+        container_type  m_Queue;
+        //@endcond
+
+    public:
+        /// Initializes empty queue object
+        FCQueue()
+        {}
+
+        /// Initializes empty queue object and gives flat combining parameters
+        FCQueue(
+            unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
+            ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
+            )
+            : m_FlatCombining( nCompactFactor, nCombinePassCount )
+        {}
+
+        /// Inserts a new element at the end of the queue
+        /**
+            The function always returns \p true.
+        */
+        bool enqueue( value_type& val )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pVal = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_enq, pRec, *this );
+            else
+                m_FlatCombining.combine( op_enq, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onEnqueue();
+            return true;
+        }
+
+        /// Inserts a new element at the end of the queue (a synonym for \ref enqueue)
+        bool push( value_type& val )
+        {
+            return enqueue( val );
+        }
+
+        /// Removes the next element from the queue
+        /**
+            If the queue is empty the function returns \p nullptr
+        */
+        value_type * dequeue()
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pVal = null_ptr<value_type *>();
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_deq, pRec, *this );
+            else
+                m_FlatCombining.combine( op_deq, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+
+            m_FlatCombining.internal_statistics().onDequeue( pRec->bEmpty );
+            return pRec->pVal;
+        }
+
+        /// Removes the next element from the queue (a synonym for \ref dequeue)
+        value_type * pop()
+        {
+            return dequeue();
+        }
+
+        /// Clears the queue
+        /**
+            If \p bDispose is \p true, the disposer provided in \p Traits class' template parameter
+            will be called for each removed element.
+        */
+        void clear( bool bDispose = false )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( bDispose ? op_clear_and_dispose : op_clear, pRec, *this );
+            else
+                m_FlatCombining.combine( bDispose ? op_clear_and_dispose : op_clear, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+        }
+
+        /// Returns the number of elements in the queue.
+        /**
+            Note that <tt>size() == 0</tt> is not mean that the queue is empty because
+            combining record can be in process.
+            To check emptiness use \ref empty function.
+        */
+        size_t size() const
+        {
+            return m_Queue.size();
+        }
+
+        /// Checks if the queue is empty
+        /**
+            If the combining is in process the function waits while it is done.
+        */
+        bool empty() const
+        {
+            m_FlatCombining.wait_while_combining();
+            return m_Queue.empty();
+        }
+
+        /// Internal statistics
+        stat const& statistics() const
+        {
+            return m_FlatCombining.statistics();
+        }
+
+    public: // flat combining cooperation, not for direct use!
+        //@cond
+        /// Flat combining supporting function. Do not call it directly!
+        /**
+            The function is called by \ref cds::algo::flat_combining::kernel "flat combining kernel"
+            object if the current thread becomes a combiner. Invocation of the function means that
+            the queue should perform an action recorded in \p pRec.
+        */
+        void fc_apply( fc_record * pRec )
+        {
+            assert( pRec );
+
+            switch ( pRec->op() ) {
+            case op_enq:
+                assert( pRec->pVal );
+                m_Queue.push_back( *(pRec->pVal ) );
+                break;
+            case op_deq:
+                pRec->bEmpty = m_Queue.empty();
+                if ( !pRec->bEmpty ) {
+                    pRec->pVal = &m_Queue.front();
+                    m_Queue.pop_front();
+                }
+                break;
+            case op_clear:
+                m_Queue.clear();
+                break;
+            case op_clear_and_dispose:
+                m_Queue.clear_and_dispose( disposer() );
+                break;
+            default:
+                assert(false);
+                break;
+            }
+        }
+
+        /// Batch-processing flat combining
+        void fc_process( typename fc_kernel::iterator itBegin, typename fc_kernel::iterator itEnd )
+        {
+            typedef typename fc_kernel::iterator fc_iterator;
+            for ( fc_iterator it = itBegin, itPrev = itEnd; it != itEnd; ++it ) {
+                switch ( it->op() ) {
+                case op_enq:
+                case op_deq:
+                    if ( m_Queue.empty() ) {
+                        if ( itPrev != itEnd && collide( *itPrev, *it ))
+                            itPrev = itEnd;
+                        else
+                            itPrev = it;
+                    }
+                    break;
+                }
+            }
+        }
+        //@endcond
+
+    private:
+        //@cond
+        bool collide( fc_record& rec1, fc_record& rec2 )
+        {
+            assert( m_Queue.empty() );
+
+            switch ( rec1.op() ) {
+                case op_enq:
+                    if ( rec2.op() == op_deq ) {
+                        assert(rec1.pVal);
+                        rec2.pVal = rec1.pVal;
+                        rec2.bEmpty = false;
+                        m_FlatCombining.operation_done( rec1 );
+                        m_FlatCombining.operation_done( rec2 );
+                        m_FlatCombining.internal_statistics().onCollide();
+                        return true;
+                    }
+                    break;
+                case op_deq:
+                    if ( rec2.op() == op_enq ) {
+                        assert(rec2.pVal);
+                        rec1.pVal = rec2.pVal;
+                        rec1.bEmpty = false;
+                        m_FlatCombining.operation_done( rec1 );
+                        m_FlatCombining.operation_done( rec2 );
+                        m_FlatCombining.internal_statistics().onCollide();
+                        return true;
+                    }
+                    break;
+            }
+            return false;
+        }
+        //@endcond
+    };
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_FCQUEUE_H
diff --git a/cds/intrusive/fcstack.h b/cds/intrusive/fcstack.h
new file mode 100644 (file)
index 0000000..517b020
--- /dev/null
@@ -0,0 +1,329 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_FCSTACK_H
+#define __CDS_INTRUSIVE_FCSTACK_H
+
+#include <cds/algo/flat_combining.h>
+#include <cds/algo/elimination_opt.h>
+#include <cds/intrusive/options.h>
+#include <boost/intrusive/slist.hpp>
+
+namespace cds { namespace intrusive {
+
+    /// FCStack related definitions
+    namespace fcstack {
+
+        /// FCStack internal statistics
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat: public cds::algo::flat_combining::stat<Counter>
+        {
+            typedef cds::algo::flat_combining::stat<Counter>    flat_combining_stat; ///< Flat-combining statistics
+            typedef typename flat_combining_stat::counter_type  counter_type;        ///< Counter type
+
+            counter_type    m_nPush     ;   ///< Count of push operations
+            counter_type    m_nPop      ;   ///< Count of success pop operations
+            counter_type    m_nFailedPop;   ///< Count of failed pop operations (pop from empty stack)
+            counter_type    m_nCollided ;   ///< How many pairs of push/pop were collided, if elimination is enabled
+
+            //@cond
+            void    onPush()               { ++m_nPush; }
+            void    onPop( bool bFailed )  { if ( bFailed ) ++m_nFailedPop; else ++m_nPop;  }
+            void    onCollide()            { ++m_nCollided; }
+            //@endcond
+        };
+
+        /// FCStack dummy statistics, no overhead
+        struct empty_stat: public cds::algo::flat_combining::empty_stat
+        {
+            //@cond
+            void    onPush()        {}
+            void    onPop(bool)     {}
+            void    onCollide()     {}
+            //@endcond
+        };
+
+        /// FCStack type traits
+        struct type_traits: public cds::algo::flat_combining::type_traits
+        {
+            typedef cds::intrusive::opt::v::empty_disposer  disposer ; ///< Disposer to erase removed elements. Used only in \p FCStack::clear() function
+            typedef empty_stat      stat;   ///< Internal statistics
+            static CDS_CONSTEXPR_CONST bool enable_elimination = false; ///< Enable \ref cds_elimination_description "elimination"
+        };
+
+        /// Metafunction converting option list to traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options are:
+            - \p opt::lock_type - mutex type, default is \p cds::lock::Spin
+            - \p opt::back_off - back-off strategy, defalt is \p cds::backoff::Default
+            - \p opt::disposer - the functor used for dispose removed items. Default is opt::intrusive::v::empty_disposer.
+                This option is used only in \p FCStack::clear() function.
+            - \p opt::allocator - allocator type, default is \ref CDS_DEFAULT_ALLOCATOR
+            - \p opt::stat - internal statistics, possible type: \ref stat, \ref empty_stat (the default)
+            - \p opt::memory_model - C++ memory ordering model.
+                List of all available memory ordering see opt::memory_model.
+                Default if cds::opt::v:relaxed_ordering
+            - \p opt::enable_elimination - enable/disable operation \ref cds_elimination_description "elimination"
+                By default, the elimination is disabled.
+        */
+        template <CDS_DECL_OPTIONS8>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS8 >::type
+                ,CDS_OPTIONS8
+            >::type   type;
+#   endif
+        };
+
+    } // namespace fcstack
+
+    /// Flat-combining intrusive stack
+    /**
+        @ingroup cds_intrusive_stack
+        @ingroup cds_flat_combining_intrusive
+
+        \ref cds_flat_combining_description "Flat combining" sequential intrusive stack.
+
+        Template parameters:
+        - \p T - a value type stored in the stack
+        - \p Container - sequential intrusive container with \p push_front and \p pop_front functions.
+            Possible containers are \p boost::intrusive::slist (the default), \p boost::inrtrusive::list
+        - \p Traits - type traits of flat combining, default is \p fcstack::type_traits.
+            \p fcstack::make_traits metafunction can be used to construct specialized \p %type_traits
+    */
+    template <typename T
+        ,class Container = boost::intrusive::slist<T>
+        ,typename Traits = fcstack::type_traits
+    >
+    class FCStack
+#ifndef CDS_DOXYGEN_INVOKED
+        : public cds::algo::flat_combining::container
+#endif
+    {
+    public:
+        typedef T           value_type;     ///< Value type
+        typedef Container   container_type; ///< Sequential container type
+        typedef Traits      type_traits;    ///< Stack type traits
+
+        typedef typename type_traits::disposer  disposer;   ///< The disposer functor. The disposer is used only in \ref clear() function
+        typedef typename type_traits::stat  stat;   ///< Internal statistics type
+        static CDS_CONSTEXPR_CONST bool c_bEliminationEnabled = type_traits::enable_elimination; ///< \p true if elimination is enabled
+
+    protected:
+        //@cond
+        /// Stack operation IDs
+        enum fc_operation {
+            op_push = cds::algo::flat_combining::req_Operation, ///< Push
+            op_pop,                 ///< Pop
+            op_clear,               ///< Clear
+            op_clear_and_dispose    ///< Clear and dispose
+        };
+
+        /// Flat combining publication list record
+        struct fc_record: public cds::algo::flat_combining::publication_record
+        {
+            value_type * pVal;  ///< Value to push or pop
+            bool         bEmpty; ///< \p true if the stack is empty
+        };
+        //@endcond
+
+        /// Flat combining kernel
+        typedef cds::algo::flat_combining::kernel< fc_record, type_traits > fc_kernel;
+
+    protected:
+        //@cond
+        fc_kernel       m_FlatCombining;
+        container_type  m_Stack;
+        //@endcond
+
+    public:
+        /// Initializes empty stack object
+        FCStack()
+        {}
+
+        /// Initializes empty stack object and gives flat combining parameters
+        FCStack(
+            unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
+            ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
+            )
+            : m_FlatCombining( nCompactFactor, nCombinePassCount )
+        {}
+
+        /// Inserts a new element at the top of stack
+        /**
+            The content of the new element initialized to a copy of \p val.
+        */
+        bool push( value_type& val )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pVal = &val;
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_push, pRec, *this );
+            else
+                m_FlatCombining.combine( op_push, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+            m_FlatCombining.internal_statistics().onPush();
+            return true;
+        }
+
+        /// Removes the element on top of the stack
+        value_type * pop()
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+            pRec->pVal = null_ptr<value_type *>();
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( op_pop, pRec, *this );
+            else
+                m_FlatCombining.combine( op_pop, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+
+            m_FlatCombining.internal_statistics().onPop( pRec->bEmpty );
+            return pRec->pVal;
+        }
+
+        /// Clears the stack
+        /**
+            If \p bDispose is \p true, the disposer provided in \p Traits class' template parameter
+            will be called for each removed element.
+        */
+        void clear( bool bDispose = false )
+        {
+            fc_record * pRec = m_FlatCombining.acquire_record();
+
+            if ( c_bEliminationEnabled )
+                m_FlatCombining.batch_combine( bDispose ? op_clear_and_dispose : op_clear, pRec, *this );
+            else
+                m_FlatCombining.combine( bDispose ? op_clear_and_dispose : op_clear, pRec, *this );
+
+            assert( pRec->is_done() );
+            m_FlatCombining.release_record( pRec );
+        }
+
+        /// Returns the number of elements in the stack.
+        /**
+            Note that <tt>size() == 0</tt> is not mean that the stack is empty because
+            combining record can be in process.
+            To check emptiness use \ref empty function.
+        */
+        size_t size() const
+        {
+            return m_Stack.size();
+        }
+
+        /// Checks if the stack is empty
+        /**
+            If the combining is in process the function waits while it is done.
+        */
+        bool empty() const
+        {
+            m_FlatCombining.wait_while_combining();
+            return m_Stack.empty();
+        }
+
+        /// Internal statistics
+        stat const& statistics() const
+        {
+            return m_FlatCombining.statistics();
+        }
+
+
+    public: // flat combining cooperation, not for direct use!
+        //@cond
+        /// Flat combining supporting function. Do not call it directly!
+        /**
+            The function is called by \ref cds::algo::flat_combining::kernel "flat combining kernel"
+            object if the current thread becomes a combiner. Invocation of the function means that
+            the stack should perform an action recorded in \p pRec.
+        */
+        void fc_apply( fc_record * pRec )
+        {
+            assert( pRec );
+
+            switch ( pRec->op() ) {
+            case op_push:
+                assert( pRec->pVal );
+                m_Stack.push_front( *(pRec->pVal ) );
+                break;
+            case op_pop:
+                pRec->bEmpty = m_Stack.empty();
+                if ( !pRec->bEmpty ) {
+                    pRec->pVal = &m_Stack.front();
+                    m_Stack.pop_front();
+                }
+                break;
+            case op_clear:
+                m_Stack.clear();
+                break;
+            case op_clear_and_dispose:
+                m_Stack.clear_and_dispose( disposer() );
+                break;
+            default:
+                assert(false);
+                break;
+            }
+        }
+
+        /// Batch-processing flat combining
+        void fc_process( typename fc_kernel::iterator itBegin, typename fc_kernel::iterator itEnd )
+        {
+            typedef typename fc_kernel::iterator fc_iterator;
+            for ( fc_iterator it = itBegin, itPrev = itEnd; it != itEnd; ++it ) {
+                switch ( it->op() ) {
+                case op_push:
+                case op_pop:
+                    if ( itPrev != itEnd && collide( *itPrev, *it ))
+                        itPrev = itEnd;
+                    else
+                        itPrev = it;
+                    break;
+                }
+            }
+        }
+        //@endcond
+
+    private:
+        //@cond
+        bool collide( fc_record& rec1, fc_record& rec2 )
+        {
+            switch ( rec1.op() ) {
+                case op_push:
+                    if ( rec2.op() == op_pop ) {
+                        assert(rec1.pVal);
+                        rec2.pVal = rec1.pVal;
+                        rec2.bEmpty = false;
+                        m_FlatCombining.operation_done( rec1 );
+                        m_FlatCombining.operation_done( rec2 );
+                        m_FlatCombining.internal_statistics().onCollide();
+                        return true;
+                    }
+                    break;
+                case op_pop:
+                    if ( rec2.op() == op_push ) {
+                        assert(rec2.pVal);
+                        rec1.pVal = rec2.pVal;
+                        rec1.bEmpty = false;
+                        m_FlatCombining.operation_done( rec1 );
+                        m_FlatCombining.operation_done( rec2 );
+                        m_FlatCombining.internal_statistics().onCollide();
+                        return true;
+                    }
+                    break;
+            }
+            return false;
+        }
+        //@endcond
+
+    };
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_FCSTACK_H
diff --git a/cds/intrusive/lazy_list_base.h b/cds/intrusive/lazy_list_base.h
new file mode 100644 (file)
index 0000000..ce6ab5a
--- /dev/null
@@ -0,0 +1,320 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_LAZY_LIST_BASE_H
+#define __CDS_INTRUSIVE_LAZY_LIST_BASE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/opt/compare.h>
+#include <cds/details/marked_ptr.h>
+#include <cds/ref.h>
+#include <cds/details/make_const_type.h>
+#include <boost/type_traits/is_same.hpp>
+#include <cds/lock/spinlock.h>
+#include <cds/urcu/options.h>
+
+namespace cds { namespace intrusive {
+
+    /// LazyList ordered list related definitions
+    /** @ingroup cds_intrusive_helper
+    */
+    namespace lazy_list {
+        /// Lazy list node
+        /**
+            Template parameters:
+            - GC - garbage collector
+            - Lock - lock type. Default is cds::lock::Spin
+            - Tag - a tag used to distinguish between different implementation. An incomplete type can be used as a tag.
+        */
+        template <
+            class GC
+            ,typename Lock = lock::Spin
+            ,typename Tag = opt::none
+        >
+        struct node
+        {
+            typedef GC      gc          ;   ///< Garbage collector
+            typedef Lock    lock_type   ;   ///< Lock type
+            typedef Tag     tag         ;   ///< tag
+
+            typedef cds::details::marked_ptr<node, 1>   marked_ptr         ;   ///< marked pointer
+            typedef typename gc::template atomic_marked_ptr< marked_ptr>     atomic_marked_ptr   ;   ///< atomic marked pointer specific for GC
+
+            atomic_marked_ptr   m_pNext ; ///< pointer to the next node in the list + logical deletion mark
+            mutable lock_type   m_Lock  ; ///< Node lock
+
+            /// Checks if node is marked
+            bool is_marked() const
+            {
+                return m_pNext.load(CDS_ATOMIC::memory_order_relaxed).bits() != 0;
+            }
+
+            /// Default ctor
+            node()
+                : m_pNext( null_ptr<node *>())
+            {}
+        };
+
+        //@cond
+        template <typename GC, typename NodeType, typename Alloc >
+        class boundary_nodes
+        {
+            typedef NodeType node_type;
+
+            node_type   m_Head;
+            node_type   m_Tail;
+
+        public:
+            node_type * head()
+            {
+                return &m_Head;
+            }
+            node_type const * head() const
+            {
+                return &m_Head;
+            }
+            node_type * tail()
+            {
+                return &m_Tail;
+            }
+            node_type const * tail() const
+            {
+                return &m_Tail;
+            }
+        };
+        //@endcond
+
+        //@cond
+        template <typename GC, typename Node, typename MemoryModel>
+        struct node_cleaner {
+            void operator()( Node * p )
+            {
+                typedef typename Node::marked_ptr marked_ptr;
+                p->m_pNext.store( marked_ptr(), MemoryModel::memory_order_release );
+            }
+        };
+        //@endcond
+
+        //@cond
+        struct undefined_gc;
+        struct default_hook {
+            typedef undefined_gc    gc;
+            typedef opt::none       tag;
+            typedef lock::Spin      lock_type;
+        };
+        //@endcond
+
+        //@cond
+        template < typename HookType, CDS_DECL_OPTIONS3>
+        struct hook
+        {
+            typedef typename opt::make_options< default_hook, CDS_OPTIONS3>::type  options;
+            typedef typename options::gc        gc;
+            typedef typename options::tag       tag;
+            typedef typename options::lock_type lock_type;
+            typedef node<gc, lock_type, tag>    node_type;
+            typedef HookType        hook_type;
+        };
+        //@endcond
+
+        /// Base hook
+        /**
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::lock_type - lock type used for node locking. Default is lock::Spin
+            - opt::tag - tag
+        */
+        template < CDS_DECL_OPTIONS3 >
+        struct base_hook: public hook< opt::base_hook_tag, CDS_OPTIONS3 >
+        {};
+
+        /// Member hook
+        /**
+            \p MemberOffset defines offset in bytes of \ref node member into your structure.
+            Use \p offsetof macro to define \p MemberOffset
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::lock_type - lock type used for node locking. Default is lock::Spin
+            - opt::tag - tag
+        */
+        template < size_t MemberOffset, CDS_DECL_OPTIONS3 >
+        struct member_hook: public hook< opt::member_hook_tag, CDS_OPTIONS3 >
+        {
+            //@cond
+            static const size_t c_nMemberOffset = MemberOffset;
+            //@endcond
+        };
+
+        /// Traits hook
+        /**
+            \p NodeTraits defines type traits for node.
+            See \ref node_traits for \p NodeTraits interface description
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::lock_type - lock type used for node locking. Default is lock::Spin
+            - opt::tag - tag
+        */
+        template <typename NodeTraits, CDS_DECL_OPTIONS3 >
+        struct traits_hook: public hook< opt::traits_hook_tag, CDS_OPTIONS3 >
+        {
+            //@cond
+            typedef NodeTraits node_traits;
+            //@endcond
+        };
+
+        /// Check link
+        template <typename Node>
+        struct link_checker
+        {
+            //@cond
+            typedef Node node_type;
+            //@endcond
+
+            /// Checks if the link field of node \p pNode is NULL
+            /**
+                An asserting is generated if \p pNode link field is not NULL
+            */
+            static void is_empty( node_type const * pNode )
+            {
+                assert( pNode->m_pNext.load(CDS_ATOMIC::memory_order_relaxed) == null_ptr<node_type const *>());
+            }
+        };
+
+        //@cond
+        template <class GC, typename Node, opt::link_check_type LinkType >
+        struct link_checker_selector;
+
+        template <typename GC, typename Node>
+        struct link_checker_selector< GC, Node, opt::never_check_link >
+        {
+            typedef intrusive::opt::v::empty_link_checker<Node>  type;
+        };
+
+        template <typename GC, typename Node>
+        struct link_checker_selector< GC, Node, opt::debug_check_link >
+        {
+#       ifdef _DEBUG
+            typedef link_checker<Node>  type;
+#       else
+            typedef intrusive::opt::v::empty_link_checker<Node>  type;
+#       endif
+        };
+
+        template <typename GC, typename Node>
+        struct link_checker_selector< GC, Node, opt::always_check_link >
+        {
+            typedef link_checker<Node>  type;
+        };
+        //@endcond
+
+        /// Metafunction for selecting appropriate link checking policy
+        template < typename Node, opt::link_check_type LinkType >
+        struct get_link_checker
+        {
+            //@cond
+            typedef typename link_checker_selector< typename Node::gc, Node, LinkType>::type type;
+            //@endcond
+        };
+
+        /// Type traits for LazyList class
+        struct type_traits
+        {
+            /// Hook used
+            /**
+                Possible values are: lazy_list::base_hook, lazy_list::member_hook, lazy_list::traits_hook.
+            */
+            typedef base_hook<>       hook;
+
+            /// Key comparison functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+            */
+            typedef opt::none                       compare;
+
+            /// specifies binary predicate used for key comparison.
+            /**
+                Default is \p std::less<T>.
+            */
+            typedef opt::none                       less;
+
+            /// back-off strategy used
+            /**
+                If the option is not specified, the cds::backoff::Default is used.
+            */
+            typedef cds::backoff::Default           back_off;
+
+            /// Disposer
+            /**
+                the functor used for dispose removed items. Default is opt::v::empty_disposer.
+            */
+            typedef opt::v::empty_disposer          disposer;
+
+            /// Item counter
+            /**
+                The type for item counting feature.
+                Default is no item counter (\ref atomicity::empty_item_counter)
+            */
+            typedef atomicity::empty_item_counter     item_counter;
+
+            /// Link fields checking feature
+            /**
+                Default is \ref opt::debug_check_link
+            */
+            static const opt::link_check_type link_checker = opt::debug_check_link;
+
+            /// Allocator
+            /**
+                For intrusive lazy list an allocator is needed for dummy tail node allocation.
+            */
+            typedef CDS_DEFAULT_ALLOCATOR           allocator;
+
+            /// C++ memory ordering model
+            /**
+                List of available memory ordering see opt::memory_model
+            */
+            typedef opt::v::relaxed_ordering        memory_model;
+
+            /// RCU deadlock checking policy (only for \ref cds_intrusive_LazyList_rcu "RCU-based LazyList")
+            /**
+                List of available options see opt::rcu_check_deadlock
+            */
+            typedef opt::v::rcu_throw_deadlock      rcu_check_deadlock;
+
+            //@cond
+            // for internal use only!!!
+            typedef opt::none                       boundary_node_type;
+            //@endcond
+        };
+
+        /// Metafunction converting option list to traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+
+            See \ref LazyList, \ref type_traits, \ref cds::opt::make_options.
+
+        */
+        template <CDS_DECL_OPTIONS11>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS11 >::type
+                ,CDS_OPTIONS11
+            >::type   type;
+#   endif
+        };
+
+    } // namespace lazy_list
+
+    //@cond
+    // Forward declaration
+    template < class GC, typename T, class Traits = lazy_list::type_traits >
+    class LazyList;
+    //@endcond
+
+
+}}   // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_LAZY_LIST_BASE_H
diff --git a/cds/intrusive/lazy_list_hp.h b/cds/intrusive/lazy_list_hp.h
new file mode 100644 (file)
index 0000000..b41d9e9
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_LAZY_LIST_HP_H
+#define __CDS_INTRUSIVE_LAZY_LIST_HP_H
+
+#include <cds/intrusive/lazy_list_impl.h>
+#include <cds/gc/hp.h>
+
+#endif // #ifndef __CDS_INTRUSIVE_LAZY_LIST_HP_H
diff --git a/cds/intrusive/lazy_list_hrc.h b/cds/intrusive/lazy_list_hrc.h
new file mode 100644 (file)
index 0000000..dc0c8eb
--- /dev/null
@@ -0,0 +1,152 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_LAZY_LIST_HRC_H
+#define __CDS_INTRUSIVE_LAZY_LIST_HRC_H
+
+#include <cds/intrusive/lazy_list_impl.h>
+#include <cds/gc/hrc.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace intrusive { namespace lazy_list {
+    //@cond
+    // Specialization for HRC GC
+    template <typename Lock, typename Tag>
+    struct node< gc::HRC, Lock, Tag>: public gc::HRC::container_node
+    {
+        typedef gc::HRC gc          ;   ///< Garbage collector
+        typedef Lock    lock_type   ;   ///< Lock type
+        typedef Tag     tag         ;   ///< tag
+
+        typedef cds::details::marked_ptr<node, 1>   marked_ptr         ;   ///< marked pointer
+        typedef typename gc::template atomic_marked_ptr< marked_ptr>     atomic_marked_ptr   ;   ///< atomic marked pointer specific for GC
+
+        atomic_marked_ptr   m_pNext ; ///< pointer to the next node in the list + logical deletion mark
+        mutable lock_type   m_Lock  ; ///< Node lock
+
+        /// Checks if node is marked
+        bool is_marked() const
+        {
+            return m_pNext.load(CDS_ATOMIC::memory_order_relaxed).bits() != 0;
+        }
+
+        node()
+            : m_pNext( null_ptr<node *>() )
+        {}
+
+    protected:
+        virtual void cleanUp( cds::gc::hrc::ThreadGC * pGC )
+        {
+            assert( pGC != null_ptr<cds::gc::hrc::ThreadGC *>() );
+            typename gc::GuardArray<2> aGuards( *pGC );
+
+            while ( true ) {
+                marked_ptr pNextMarked( aGuards.protect( 0, m_pNext ));
+                node * pNext = pNextMarked.ptr();
+                if ( pNext != null_ptr<node *>() && pNext->m_bDeleted.load(CDS_ATOMIC::memory_order_acquire) ) {
+                    marked_ptr p = aGuards.protect( 1, pNext->m_pNext );
+                    m_pNext.compare_exchange_weak( pNextMarked, p, CDS_ATOMIC::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed );
+                    continue;
+                }
+                else {
+                    break;
+                }
+            }
+        }
+
+        virtual void terminate( cds::gc::hrc::ThreadGC * pGC, bool bConcurrent )
+        {
+            if ( bConcurrent ) {
+                marked_ptr pNext( m_pNext.load(CDS_ATOMIC::memory_order_relaxed));
+                do {} while ( !m_pNext.compare_exchange_weak( pNext, marked_ptr(), CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) );
+            }
+            else {
+                m_pNext.store( marked_ptr(), CDS_ATOMIC::memory_order_relaxed );
+            }
+        }
+    };
+    //@endcond
+
+    //@cond
+    template <typename NodeType, typename Alloc >
+    class boundary_nodes< gc::HRC, NodeType, Alloc >
+    {
+        typedef NodeType node_type;
+        typedef cds::details::Allocator< node_type, Alloc> cxx_allocator   ;   ///< allocator for the tail node
+
+        struct boundary_disposer
+        {
+            void operator()( node_type * p )
+            {
+                cxx_allocator().Delete( p );
+            }
+        };
+
+
+        node_type *  m_pHead;
+        node_type *  m_pTail;
+
+    public:
+        boundary_nodes()
+        {
+            m_pHead = cxx_allocator().New();
+            m_pTail = cxx_allocator().New();
+        }
+
+        ~boundary_nodes()
+        {
+            cds::gc::HRC::template retire<boundary_disposer>( m_pHead );
+            cds::gc::HRC::template retire<boundary_disposer>( m_pTail );
+        }
+
+    public:
+        node_type * head()
+        {
+            return m_pHead;
+        }
+        node_type const * head() const
+        {
+            return m_pHead;
+        }
+        node_type * tail()
+        {
+            return m_pTail;
+        }
+        node_type const * tail() const
+        {
+            return m_pTail;
+        }
+    };
+    //@endcond
+
+    //@cond
+    /*
+    template <typename Node, typename MemoryModel>
+    struct node_cleaner< gc::HRC, Node, MemoryModel> {
+        void operator()( Node * p )
+        {
+            typedef typename Node::marked_ptr marked_ptr;
+            p->m_pNext.store( marked_ptr(), MemoryModel::memory_order_release );
+            //p->clean( MemoryModel::memory_order_release );
+        }
+    };
+    */
+    //@endcond
+
+
+    //@cond
+    template <typename NODE>
+    struct link_checker_selector< gc::HRC, NODE, opt::never_check_link >
+    {
+        typedef link_checker<NODE>  type;
+    };
+
+    template <typename NODE>
+    struct link_checker_selector< gc::HRC, NODE, opt::debug_check_link >
+    {
+        typedef link_checker<NODE>  type;
+    };
+    //@endcond
+
+}}}   // namespace cds::intrusive::lazy_list
+
+#endif // #ifndef __CDS_INTRUSIVE_LAZY_LIST_HP_H
diff --git a/cds/intrusive/lazy_list_impl.h b/cds/intrusive/lazy_list_impl.h
new file mode 100644 (file)
index 0000000..e97d4eb
--- /dev/null
@@ -0,0 +1,1234 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_LAZY_LIST_IMPL_H
+#define __CDS_INTRUSIVE_LAZY_LIST_IMPL_H
+
+#include <cds/intrusive/lazy_list_base.h>
+#include <cds/gc/guarded_ptr.h>
+
+
+namespace cds { namespace intrusive {
+
+    /// Lazy ordered single-linked list
+    /** @ingroup cds_intrusive_list
+        \anchor cds_intrusive_LazyList_hp
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Source:
+            - [2005] Steve Heller, Maurice Herlihy, Victor Luchangco, Mark Moir, William N. Scherer III, and Nir Shavit
+              "A Lazy Concurrent List-Based Set Algorithm"
+
+        The lazy list is based on an optimistic locking scheme for inserts and removes,
+        eliminating the need to use the equivalent of an atomically markable
+        reference. It also has a novel wait-free membership \p find operation
+        that does not need to perform cleanup operations and is more efficient.
+
+        Template arguments:
+        - \p GC - Garbage collector used. Note the \p GC must be the same as the GC used for item type \p T (see lazy_list::node).
+        - \p T - type to be stored in the list. The type must be based on lazy_list::node (for lazy_list::base_hook)
+            or it must have a member of type lazy_list::node (for lazy_list::member_hook).
+        - \p Traits - type traits. See lazy_list::type_traits for explanation.
+
+        It is possible to declare option-based list with cds::intrusive::lazy_list::make_traits metafunction istead of \p Traits template
+        argument. For example, the following traits-based declaration of gc::HP lazy list
+        \code
+        #include <cds/intrusive/lazy_list_hp.h>
+        // Declare item stored in your list
+        struct item: public cds::intrusive::lazy_list::node< cds::gc::HP >
+        { ... };
+
+        // Declare comparator for the item
+        struct my_compare { ... }
+
+        // Declare type_traits
+        struct my_traits: public cds::intrusive::lazy_list::type_traits
+        {
+            typedef cds::intrusive::lazy_list::base_hook< cds::opt::gc< cds::gc::HP > >   hook;
+            typedef my_compare compare;
+        };
+
+        // Declare traits-based list
+        typedef cds::intrusive::LazyList< cds::gc::HP, item, my_traits >     traits_based_list;
+        \endcode
+
+        is equivalent for the following option-based list
+        \code
+        #include <cds/intrusive/lazy_list_hp.h>
+
+        // item struct and my_compare are the same
+
+        // Declare option-based list
+        typedef cds::intrusive::LazyList< cds::gc::HP, item,
+            typename cds::intrusive::lazy_list::make_traits<
+                cds::intrusive::opt::hook< cds::intrusive::lazy_list::base_hook< cds::opt::gc< cds::gc::HP > > >    // hook option
+                ,cds::intrusive::opt::compare< my_compare >     // item comparator option
+            >::type
+        >     option_based_list;
+        \endcode
+
+        Template argument list \p Options of cds::intrusive::lazy_list::make_traits metafunction are:
+        - opt::hook - hook used. Possible values are: lazy_list::base_hook, lazy_list::member_hook, lazy_list::traits_hook.
+            If the option is not specified, <tt>lazy_list::base_hook<></tt> and gc::HP is used.
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer. Due the nature
+            of GC schema the disposer may be called asynchronously.
+        - opt::link_checker - the type of node's link fields checking. Default is \ref opt::debug_check_link
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that means no item counting.
+        - opt::allocator - an allocator needed for dummy head and tail nodes. Default is \ref CDS_DEFAULT_ALLOCATOR.
+            The option applies only to gc::HRC garbage collector.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        \par Usage
+        There are different specializations of this template for each garbage collecting schema used.
+        You should select GC needed and include appropriate .h-file:
+        - for gc::HP: \code #include <cds/intrusive/lazy_list_hp.h> \endcode
+        - for gc::PTB: \code #include <cds/intrusive/lazy_list_ptb.h> \endcode
+        - for gc::HRC: \code #include <cds/intrusive/lazy_list_hrc.h> \endcode
+        - for gc::nogc: \code #include <cds/intrusive/lazy_list_nogc.h> \endcode
+        - for \ref cds_urcu_type "RCU" - see \ref cds_intrusive_LazyList_rcu "LazyList RCU specialization"
+
+        Then, you should incorporate lazy_list::node into your struct \p T and provide
+        appropriate lazy_list::type_traits::hook in your \p Traits template parameters. Usually, for \p Traits
+        a struct based on lazy_list::type_traits should be defined.
+
+        Example for gc::PTB and base hook:
+        \code
+        // Include GC-related lazy list specialization
+        #include <cds/intrusive/lazy_list_ptb.h>
+
+        // Data stored in lazy list
+        struct my_data: public cds::intrusive::lazy_list::node< cds::gc::PTB >
+        {
+            // key field
+            std::string     strKey;
+
+            // other data
+            // ...
+        };
+
+        // my_data comparing functor
+        struct compare {
+            int operator()( const my_data& d1, const my_data& d2 )
+            {
+                return d1.strKey.compare( d2.strKey );
+            }
+
+            int operator()( const my_data& d, const std::string& s )
+            {
+                return d.strKey.compare(s);
+            }
+
+            int operator()( const std::string& s, const my_data& d )
+            {
+                return s.compare( d.strKey );
+            }
+        };
+
+
+        // Declare type_traits
+        struct my_traits: public cds::intrusive::lazy_list::type_traits
+        {
+            typedef cds::intrusive::lazy_list::base_hook< cds::opt::gc< cds::gc::PTB > >   hook;
+            typedef my_data_cmp compare;
+        };
+
+        // Declare list type
+        typedef cds::intrusive::LazyList< cds::gc::PTB, my_data, my_traits >     traits_based_list;
+        \endcode
+
+        Equivalent option-based code:
+        \code
+        // GC-related specialization
+        #include <cds/intrusive/lazy_list_ptb.h>
+
+        struct my_data {
+            // see above
+        };
+        struct compare {
+            // see above
+        };
+
+        // Declare option-based list
+        typedef cds::intrusive::LazyList< cds::gc::PTB
+            ,my_data
+            , typename cds::intrusive::lazy_list::make_traits<
+                cds::intrusive::opt::hook< cds::intrusive::lazy_list::base_hook< cds::opt::gc< cds::gc::PTB > > >
+                ,cds::intrusive::opt::compare< my_data_cmp >
+            >::type
+        > option_based_list;
+
+        \endcode
+    */
+    template <
+        class GC
+        ,typename T
+#ifdef CDS_DOXYGEN_INVOKED
+        ,class Traits = lazy_list::type_traits
+#else
+        ,class Traits
+#endif
+    >
+    class LazyList
+    {
+    public:
+        typedef T       value_type      ;   ///< type of value stored in the list
+        typedef Traits  options         ;   ///< Traits template parameter
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key comparison functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+#   endif
+
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+        typedef typename lazy_list::get_link_checker< node_type, options::link_checker >::type link_checker   ;   ///< link checker
+
+        typedef GC  gc          ;   ///< Garbage collector
+        typedef typename options::back_off  back_off    ;   ///< back-off strategy
+        typedef typename options::item_counter item_counter ;   ///< Item counting policy used
+        typedef typename options::memory_model  memory_model;   ///< C++ memory ordering (see lazy_list::type_traits::memory_model)
+
+        typedef cds::gc::guarded_ptr< gc, value_type > guarded_ptr; ///< Guarded pointer
+
+        //@cond
+        // Rebind options (split-list support)
+        template <CDS_DECL_OPTIONS8>
+        struct rebind_options {
+            typedef LazyList<
+                gc
+                , value_type
+                , typename cds::opt::make_options< options, CDS_OPTIONS8>::type
+            >   type;
+        };
+        //@endcond
+
+    protected:
+        typedef typename node_type::marked_ptr          marked_node_ptr ;   ///< Node marked pointer
+        typedef node_type *     auxiliary_head   ;   ///< Auxiliary head type (for split-list support)
+
+    protected:
+        //@cond
+        typedef lazy_list::boundary_nodes<
+            gc
+            ,typename opt::select_default< typename options::boundary_node_type, node_type >::type
+            ,typename options::allocator
+        >   boundary_nodes;
+        boundary_nodes  m_Boundary    ;   ///< Head & tail dummy nodes
+
+        node_type *     head()
+        {
+            return m_Boundary.head();
+        }
+        node_type const * head() const
+        {
+            return m_Boundary.head();
+        }
+        node_type * tail()
+        {
+            return m_Boundary.tail();
+        }
+        node_type const * tail() const
+        {
+            return m_Boundary.tail();
+        }
+        //@endcond
+
+        item_counter    m_ItemCounter   ;   ///< Item counter
+
+        //@cond
+        struct clean_disposer {
+            void operator()( value_type * p )
+            {
+                lazy_list::node_cleaner<gc, node_type, memory_model>()( node_traits::to_node_ptr( p ) );
+                disposer()( p );
+            }
+        };
+
+        /// Position pointer for item search
+        struct position {
+            node_type *     pPred   ;    ///< Previous node
+            node_type *     pCur    ;    ///< Current node
+
+            typename gc::template GuardArray<2> guards  ;   ///< Guards array
+
+            enum {
+                guard_prev_item,
+                guard_current_item
+            };
+
+            /// Locks nodes \p pPred and \p pCur
+            void lock()
+            {
+                pPred->m_Lock.lock();
+                pCur->m_Lock.lock();
+            }
+
+            /// Unlocks nodes \p pPred and \p pCur
+            void unlock()
+            {
+                pCur->m_Lock.unlock();
+                pPred->m_Lock.unlock();
+            }
+        };
+
+        class auto_lock_position {
+            position&   m_pos;
+        public:
+            auto_lock_position( position& pos )
+                : m_pos(pos)
+            {
+                pos.lock();
+            }
+            ~auto_lock_position()
+            {
+                m_pos.unlock();
+            }
+        };
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_erase_functor {
+            void operator()( value_type const & item )
+            {}
+        };
+#   endif
+        //@endcond
+
+    protected:
+        //@cond
+        void link_node( node_type * pNode, node_type * pPred, node_type * pCur )
+        {
+            assert( pPred->m_pNext.load(memory_model::memory_order_relaxed).ptr() == pCur );
+
+            pNode->m_pNext.store( marked_node_ptr(pCur), memory_model::memory_order_release );
+            pPred->m_pNext.store( marked_node_ptr(pNode), memory_model::memory_order_release );
+        }
+
+        void unlink_node( node_type * pPred, node_type * pCur, node_type * pHead )
+        {
+            assert( pPred->m_pNext.load(memory_model::memory_order_relaxed).ptr() == pCur );
+
+            node_type * pNext = pCur->m_pNext.load(memory_model::memory_order_relaxed).ptr();
+            //pCur->m_pNext.store( marked_node_ptr( pNext, 1), memory_model::memory_order_release) ;   // logically deleting
+            pCur->m_pNext.store( marked_node_ptr( pHead, 1 ), memory_model::memory_order_release )    ; // logical removal + back-link for search
+            pPred->m_pNext.store( marked_node_ptr( pNext ), memory_model::memory_order_release); // physically deleting
+            //pCur->m_pNext.store( marked_node_ptr( pHead, 1 ), memory_model::memory_order_release )    ; // back-link for search
+        }
+
+        void retire_node( node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            gc::template retire<clean_disposer>( node_traits::to_value_ptr( *pNode ) );
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type
+        {
+            friend class LazyList;
+
+        protected:
+            value_type * m_pNode;
+            typename gc::Guard  m_Guard;
+
+            void next()
+            {
+                assert( m_pNode != null_ptr<value_type *>() );
+
+                if ( m_pNode ) {
+                    typename gc::Guard g;
+                    node_type * pCur = node_traits::to_node_ptr( m_pNode );
+                    if ( pCur->m_pNext.load(memory_model::memory_order_relaxed).ptr() != null_ptr<node_type *>() ) {      // if pCur is not tail node
+                        node_type * pNext;
+                        do {
+                            pNext = pCur->m_pNext.load(memory_model::memory_order_relaxed).ptr();
+                            g.assign( node_traits::to_value_ptr( pNext ));
+                        } while ( pNext != pCur->m_pNext.load(memory_model::memory_order_relaxed).ptr() );
+
+                        m_pNode = m_Guard.assign( g.template get<value_type>() );
+                    }
+                }
+            }
+
+            void skip_deleted()
+            {
+                if ( m_pNode != null_ptr<value_type *>() ) {
+                    typename gc::Guard g;
+                    node_type * pNode = node_traits::to_node_ptr( m_pNode );
+
+                    // Dummy tail node could not be marked
+                    while ( pNode->is_marked() ) {
+                        node_type * p = pNode->m_pNext.load(memory_model::memory_order_relaxed).ptr();
+                        g.assign( node_traits::to_value_ptr( p ));
+                        if ( p == pNode->m_pNext.load(memory_model::memory_order_relaxed).ptr() )
+                            pNode = p;
+                    }
+                    if ( pNode != node_traits::to_node_ptr( m_pNode ) )
+                        m_pNode = m_Guard.assign( g.template get<value_type>() );
+                }
+            }
+
+            iterator_type( node_type * pNode )
+            {
+                m_pNode = m_Guard.assign( node_traits::to_value_ptr( pNode ));
+                skip_deleted();
+            }
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+            iterator_type()
+                : m_pNode(null_ptr<value_type *>())
+            {}
+
+            iterator_type( iterator_type const& src )
+            {
+                if ( src.m_pNode ) {
+                    m_pNode = m_Guard.assign( src.m_pNode );
+                }
+                else
+                    m_pNode = null_ptr<value_type *>();
+            }
+
+            value_ptr operator ->() const
+            {
+                return m_pNode;
+            }
+
+            value_ref operator *() const
+            {
+                assert( m_pNode != null_ptr<value_type *>() );
+                return *m_pNode;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                next();
+                skip_deleted();
+                return *this;
+            }
+
+            iterator_type& operator = (iterator_type const& src)
+            {
+                m_pNode = src.m_pNode;
+                m_Guard.assign( m_pNode );
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return m_pNode == i.m_pNode;
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return m_pNode != i.m_pNode;
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for lazy list has some features:
+            - it has no post-increment operator
+            - to protect the value, the iterator contains a GC-specific guard + another guard is required locally for increment operator.
+              For some GC (gc::HP, gc::HRC), a guard is limited resource per thread, so an exception (or assertion) "no free guard"
+              may be thrown if a limit of guard count per thread is exceeded.
+            - The iterator cannot be moved across thread boundary since it contains GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the list.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use the iterator on the concurrent container
+            for debug purpose only.
+        */
+        typedef iterator_type<false>    iterator;
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            iterator it( head() );
+            ++it        ;   // skip dummy head
+            return it;
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( tail() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            return get_const_begin();
+        }
+        const_iterator cbegin()
+        {
+            return get_const_begin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return get_const_end();
+        }
+        const_iterator cend()
+        {
+            return get_const_end();
+        }
+        //@}
+
+    private:
+        //@cond
+        const_iterator get_const_begin() const
+        {
+            const_iterator it( const_cast<node_type *>( head() ));
+            ++it        ;   // skip dummy head
+            return it;
+        }
+        const_iterator get_const_end() const
+        {
+            return const_iterator( const_cast<node_type *>( tail() ));
+        }
+        //@endcond
+
+    public:
+        /// Default constructor initializes empty list
+        LazyList()
+        {
+            static_assert( (std::is_same< gc, typename node_type::gc >::value), "GC and node_type::gc must be the same type" );
+
+            //m_pTail = cxx_allocator().New();
+            head()->m_pNext.store( marked_node_ptr( tail() ), memory_model::memory_order_relaxed );
+        }
+
+        /// Destroys the list object
+        ~LazyList()
+        {
+            clear();
+            assert( head()->m_pNext.load(memory_model::memory_order_relaxed).ptr() == tail() );
+            head()->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the list if the list does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is linked into the list, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            return insert_at( head(), val );
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split new item creating into two part:
+            - create item with key only
+            - insert new item into the list
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted.
+            While the functor \p f is working the item \p val is locked.
+            The user-defined functor is called only if the inserting is success and may be passed by reference
+            using <tt>boost::ref</tt>.
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            return insert_at( head(), val, f );
+        }
+
+        /// Ensures that the \p item exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the list, then \p val is inserted into the list.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refer to the same thing.
+
+            The functor may change non-key fields of the \p item.
+            While the functor \p f is working the item \p item is locked.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            return ensure_at( head(), val, func );
+        }
+
+        /// Unlinks the item \p val from the list
+        /**
+            The function searches the item \p val in the list and unlink it from the list
+            if it is found and it is equal to \p val.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of that list, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+            return unlink_at( head(), val );
+        }
+
+        /// Deletes the item from the list
+        /** \anchor cds_intrusive_LazyList_hp_erase_val
+            The function searches an item with key equal to \p val in the list,
+            unlinks it from the list, and returns \p true.
+            If the item with the key equal to \p val is not found the function return \p false.
+        */
+        template <typename Q>
+        bool erase( Q const& val )
+        {
+            return erase_at( head(), val, key_comparator() );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_hp_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& val, Less pred )
+        {
+            return erase_at( head(), val, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Deletes the item from the list
+        /** \anchor cds_intrusive_LazyList_hp_erase_func
+            The function searches an item with key equal to \p val in the list,
+            call \p func functor with item found, unlinks it from the list, and returns \p true.
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            If the item with the key equal to \p val is not found the function return \p false.
+        */
+        template <typename Q, typename Func>
+        bool erase( const Q& val, Func func )
+        {
+            return erase_at( head(), val, key_comparator(), func );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_hp_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( const Q& val, Less pred, Func func )
+        {
+            return erase_at( head(), val, cds::opt::details::make_comparator_from_less<Less>(), func );
+        }
+
+        /// Extracts the item from the list with specified \p key
+        /** \anchor cds_intrusive_LazyList_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the list, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The \ref disposer specified in \p Traits class template parameter is called automatically
+            by garbage collector \p GC specified in class' template parameters when returned \ref guarded_ptr object
+            will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::LazyList< cds::gc::HP, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                theList.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& dest, Q const& key )
+        {
+            return extract_at( head(), dest.guard(), key, key_comparator() );
+        }
+
+        /// Extracts the item from the list with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_hp_extract "extract(guarded_ptr&, Q const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& dest, Q const& key, Less pred )
+        {
+            return extract_at( head(), dest.guard(), key, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_LazyList_hp_find
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item.
+            While the functor \p f is calling the item \p item is locked.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_at( head(), val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_hp_find "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_at( head(), val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_LazyList_hp_find_const
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the \p find function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item.
+            While the functor \p f is calling the item \p item is locked.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_at( head(), val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_hp_find_const "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_at( head(), val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_LazyList_hp_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise
+        */
+        template <typename Q>
+        bool find( Q const & val )
+        {
+            return find_at( head(), val, key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_hp_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+            return find_at( head(), val, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_intrusive_LazyList_hp_get
+            The function searches the item with key equal to \p val
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p val is found, and \p false otherwise.
+            If \p val is not found the \p ptr parameter is not changed.
+
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC automatically when returned \ref guarded_ptr object
+            will be destroyed or released.
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::LazyList< cds::gc::HP, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                if ( theList.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& ptr, Q const& val )
+        {
+            return get_at( head(), ptr.guard(), val, key_comparator() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_hp_get "get( guarded_ptr& ptr, Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& ptr, Q const& val, Less pred )
+        {
+            return get_at( head(), ptr.guard(), val, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Clears the list
+        /**
+            The function unlink all items from the list.
+        */
+        void clear()
+        {
+            typename gc::Guard guard;
+            marked_node_ptr h;
+            while ( !empty() ) {
+                h = head()->m_pNext.load(memory_model::memory_order_relaxed);
+                guard.assign( node_traits::to_value_ptr( h.ptr() ));
+                if ( head()->m_pNext.load(memory_model::memory_order_acquire) == h ) {
+                    head()->m_Lock.lock();
+                    h->m_Lock.lock();
+
+                    unlink_node( head(), h.ptr(), head() );
+
+                    h->m_Lock.unlock();
+                    head()->m_Lock.unlock();
+
+                    retire_node( h.ptr() ) ; // free node
+                }
+            }
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return head()->m_pNext.load(memory_model::memory_order_relaxed).ptr() == tail();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+    protected:
+        //@cond
+        // split-list support
+        bool insert_aux_node( node_type * pNode )
+        {
+            return insert_aux_node( head(), pNode );
+        }
+
+        // split-list support
+        bool insert_aux_node( node_type * pHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+
+            // Hack: convert node_type to value_type.
+            // In principle, auxiliary node can be non-reducible to value_type
+            // We assume that comparator can correctly distinguish aux and regular node.
+            return insert_at( pHead, *node_traits::to_value_ptr( pNode ) );
+        }
+
+        bool insert_at( node_type * pHead, value_type& val )
+        {
+            link_checker::is_empty( node_traits::to_node_ptr( val ) );
+            position pos;
+            key_comparator  cmp;
+
+            while ( true ) {
+                search( pHead, val, pos, key_comparator() );
+                {
+                    auto_lock_position alp( pos );
+                    if ( validate( pos.pPred, pos.pCur )) {
+                        if ( pos.pCur != tail() && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 ) {
+                            // failed: key already in list
+                            return false;
+                        }
+                        else {
+                            link_node( node_traits::to_node_ptr( val ), pos.pPred, pos.pCur );
+                            ++m_ItemCounter;
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+
+        template <typename Func>
+        bool insert_at( node_type * pHead, value_type& val, Func f )
+        {
+            link_checker::is_empty( node_traits::to_node_ptr( val ) );
+            position pos;
+            key_comparator  cmp;
+
+            while ( true ) {
+                search( pHead, val, pos, key_comparator() );
+                {
+                    auto_lock_position alp( pos );
+                    if ( validate( pos.pPred, pos.pCur )) {
+                        if ( pos.pCur != tail() && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 ) {
+                            // failed: key already in list
+                            return false;
+                        }
+                        else {
+                            link_node( node_traits::to_node_ptr( val ), pos.pPred, pos.pCur );
+                            cds::unref(f)( val );
+                            ++m_ItemCounter;
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+
+        template <typename Func>
+        std::pair<bool, bool> ensure_at( node_type * pHead, value_type& val, Func func )
+        {
+            position pos;
+            key_comparator  cmp;
+
+            while ( true ) {
+                search( pHead, val, pos, key_comparator() );
+                {
+                    auto_lock_position alp( pos );
+                    if ( validate( pos.pPred, pos.pCur )) {
+                        if ( pos.pCur != tail() && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 ) {
+                            // key already in the list
+
+                            cds::unref(func)( false, *node_traits::to_value_ptr( *pos.pCur ) , val );
+                            return std::make_pair( true, false );
+                        }
+                        else {
+                            // new key
+                            link_checker::is_empty( node_traits::to_node_ptr( val ) );
+
+                            link_node( node_traits::to_node_ptr( val ), pos.pPred, pos.pCur );
+                            cds::unref(func)( true, val, val );
+                            ++m_ItemCounter;
+                            return std::make_pair( true, true );
+                        }
+                    }
+                }
+            }
+        }
+
+        bool unlink_at( node_type * pHead, value_type& val )
+        {
+            position pos;
+            key_comparator  cmp;
+
+            while ( true ) {
+                search( pHead, val, pos, key_comparator() );
+                {
+                    int nResult = 0;
+                    {
+                        auto_lock_position alp( pos );
+                        if ( validate( pos.pPred, pos.pCur ) ) {
+                            if ( pos.pCur != tail()
+                                && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0
+                                && node_traits::to_value_ptr( pos.pCur ) == &val )
+                            {
+                                // item found
+                                unlink_node( pos.pPred, pos.pCur, pHead );
+                                --m_ItemCounter;
+                                nResult = 1;
+                            }
+                            else
+                                nResult = -1;
+                        }
+                    }
+                    if ( nResult ) {
+                        if ( nResult > 0 ) {
+                            retire_node( pos.pCur );
+                            return true;
+                        }
+                        return false;
+                    }
+                }
+            }
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( node_type * pHead, const Q& val, Compare cmp, Func f, position& pos )
+        {
+            while ( true ) {
+                search( pHead, val, pos, cmp );
+                {
+                    int nResult = 0;
+                    {
+                        auto_lock_position alp( pos );
+                        if ( validate( pos.pPred, pos.pCur )) {
+                            if ( pos.pCur != tail() && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 ) {
+                                // key found
+                                unlink_node( pos.pPred, pos.pCur, pHead );
+                                cds::unref(f)( *node_traits::to_value_ptr( *pos.pCur ) );
+                                --m_ItemCounter;
+                                nResult = 1;
+                            }
+                            else {
+                                nResult = -1;
+                            }
+                        }
+                    }
+                    if ( nResult ) {
+                        if ( nResult > 0 ) {
+                            retire_node( pos.pCur );
+                            return true;
+                        }
+                        return false;
+                    }
+                }
+            }
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( node_type * pHead, const Q& val, Compare cmp, Func f )
+        {
+            position pos;
+            return erase_at( pHead, val, cmp, f, pos );
+        }
+
+        template <typename Q, typename Compare>
+        bool erase_at( node_type * pHead, const Q& val, Compare cmp )
+        {
+            position pos;
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( pHead, val, cmp, [](value_type const &){}, pos );
+#       else
+            return erase_at( pHead, val, cmp, empty_erase_functor(), pos );
+#       endif
+        }
+
+        template <typename Q, typename Compare>
+        bool extract_at( node_type * pHead, typename gc::Guard& gp, const Q& val, Compare cmp )
+        {
+            position pos;
+            if (
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                erase_at( pHead, val, cmp, [](value_type const &){}, pos )
+#       else
+                erase_at( pHead, val, cmp, empty_erase_functor(), pos )
+#       endif
+                )
+            {
+                gp.assign( pos.guards.template get<value_type>(position::guard_current_item) );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_at( node_type * pHead, Q& val, Compare cmp, Func f )
+        {
+            position pos;
+
+            search( pHead, val, pos, cmp );
+            if ( pos.pCur != tail() ) {
+                cds::lock::scoped_lock< typename node_type::lock_type> al( pos.pCur->m_Lock );
+                if ( !pos.pCur->is_marked()
+                    && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 )
+                {
+                    cds::unref(f)( *node_traits::to_value_ptr( *pos.pCur ), val );
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        bool find_at( node_type * pHead, Q const& val, Compare cmp )
+        {
+            position pos;
+
+            search( pHead, val, pos, cmp );
+            return pos.pCur != tail()
+                && !pos.pCur->is_marked()
+                && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0;
+        }
+
+        template <typename Q, typename Compare>
+        bool get_at( node_type * pHead, typename gc::Guard& gp, Q const& val, Compare cmp )
+        {
+            position pos;
+
+            search( pHead, val, pos, cmp );
+            if ( pos.pCur != tail()
+                && !pos.pCur->is_marked()
+                && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 )
+            {
+                gp.assign( pos.guards.template get<value_type>( position::guard_current_item ));
+                return true;
+            }
+            return false;
+        }
+
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename Q, typename Compare>
+        void search( node_type * pHead, const Q& key, position& pos, Compare cmp )
+        {
+            const node_type * pTail = tail();
+
+            marked_node_ptr pCur( pHead );
+            marked_node_ptr pPrev( pHead );
+
+            back_off        bkoff;
+
+            while ( pCur.ptr() != pTail )
+            {
+                if ( pCur.ptr() != pHead ) {
+                    if ( cmp( *node_traits::to_value_ptr( *pCur.ptr() ), key ) >= 0 )
+                        break;
+                }
+
+                pos.guards.copy( position::guard_prev_item, position::guard_current_item );
+                pPrev = pCur;
+
+                for (;;) {
+                    pCur = pPrev->m_pNext.load(memory_model::memory_order_relaxed);
+                    pos.guards.assign( position::guard_current_item, node_traits::to_value_ptr( pCur.ptr() ));
+                    if ( pCur == pPrev->m_pNext.load(memory_model::memory_order_acquire) )
+                        break;
+                    bkoff();
+                }
+                assert( pCur.ptr() != null_ptr<node_type *>() );
+            }
+
+            pos.pCur = pCur.ptr();
+            pos.pPred = pPrev.ptr();
+        }
+
+        static bool validate( node_type * pPred, node_type * pCur )
+        {
+            return !pPred->is_marked()
+                && !pCur->is_marked()
+                && pPred->m_pNext.load(memory_model::memory_order_relaxed) == pCur;
+        }
+
+        //@endcond
+    };
+}}  // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_LAZY_LIST_IMPL_H
diff --git a/cds/intrusive/lazy_list_nogc.h b/cds/intrusive/lazy_list_nogc.h
new file mode 100644 (file)
index 0000000..d0e9b5f
--- /dev/null
@@ -0,0 +1,681 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_LAZY_LIST_NOGC_H
+#define __CDS_INTRUSIVE_LAZY_LIST_NOGC_H
+
+#include <cds/intrusive/lazy_list_base.h>
+#include <cds/gc/nogc.h>
+
+namespace cds { namespace intrusive {
+    namespace lazy_list {
+        /// Lazy list node for gc::nogc
+        /**
+            Template parameters:
+            - Tag - a tag used to distinguish between different implementation
+        */
+        template <typename Lock, typename Tag>
+        struct node<gc::nogc, Lock, Tag>
+        {
+            typedef gc::nogc    gc          ;   ///< Garbage collector
+            typedef Lock        lock_type   ;   ///< Lock type
+            typedef Tag         tag         ;   ///< tag
+
+            CDS_ATOMIC::atomic<node *> m_pNext ; ///< pointer to the next node in the list
+            mutable lock_type   m_Lock  ; ///< Node lock
+
+            node()
+                : m_pNext( null_ptr<node *>())
+            {}
+        };
+    }   // namespace lazy_list
+
+
+    /// Lazy ordered single-linked list (template specialization for gc::nogc)
+    /** @ingroup cds_intrusive_list
+        \anchor cds_intrusive_LazyList_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+
+        See \ref cds_intrusive_LazyList_hp "LazyList" for description of template parameters.
+
+        The interface of the specialization is a slightly different.
+
+        The gc::nogc specialization of LazyList accepts following template argument list
+        \p Options of cds::intrusive::lazy_list::make_traits metafunction:
+        - opt::hook - hook used. Possible values are: lazy_list::base_hook, lazy_list::member_hook, lazy_list::traits_hook.
+            If the option is not specified, <tt>lazy_list::base_hook<></tt> and gc::HP is used.
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer. The disposer
+            provided is used only in \ref clear() function.
+        - opt::link_checker - the type of node's link fields checking. Default is \ref opt::debug_check_link
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        The opt::allocator and opt::back_off is not used for this specialization.
+
+    */
+    template <
+        typename T
+#ifdef CDS_DOXYGEN_INVOKED
+        ,class Traits = lazy_list::type_traits
+#else
+        ,class Traits
+#endif
+    >
+    class LazyList<gc::nogc, T, Traits>
+    {
+    public:
+        typedef T       value_type      ;   ///< type of value stored in the list
+        typedef Traits  options         ;   ///< Traits template parameter
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key comparison functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+#   endif
+
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+        typedef typename lazy_list::get_link_checker< node_type, options::link_checker >::type link_checker   ;   ///< link checker
+
+        typedef gc::nogc  gc    ;   ///< Garbage collector
+        typedef typename options::back_off  back_off        ;   ///< back-off strategy (not used)
+        typedef typename options::item_counter item_counter ;   ///< Item counting policy used
+        typedef typename options::memory_model  memory_model;   ///< C++ memory ordering (see lazy_list::type_traits::memory_model)
+
+        //@cond
+        // Rebind options (split-list support)
+        template <CDS_DECL_OPTIONS8>
+        struct rebind_options {
+            typedef LazyList<
+                gc
+                , value_type
+                , typename cds::opt::make_options< options, CDS_OPTIONS8>::type
+            >   type;
+        };
+        //@endcond
+
+    protected:
+        typedef node_type *     auxiliary_head   ;   ///< Auxiliary head type (for split-list support)
+
+    protected:
+        node_type       m_Head ;            ///< List head (dummy node)
+        node_type       m_Tail;             ///< List tail (dummy node)
+        item_counter    m_ItemCounter   ;   ///< Item counter
+
+        //@cond
+
+        /// Position pointer for item search
+        struct position {
+            node_type *     pPred   ;    ///< Previous node
+            node_type *     pCur    ;    ///< Current node
+
+            /// Locks nodes \p pPred and \p pCur
+            void lock()
+            {
+                pPred->m_Lock.lock();
+                pCur->m_Lock.lock();
+            }
+
+            /// Unlocks nodes \p pPred and \p pCur
+            void unlock()
+            {
+                pCur->m_Lock.unlock();
+                pPred->m_Lock.unlock();
+            }
+        };
+
+        class auto_lock_position {
+            position&   m_pos;
+        public:
+            auto_lock_position( position& pos )
+                : m_pos(pos)
+            {
+                pos.lock();
+            }
+            ~auto_lock_position()
+            {
+                m_pos.unlock();
+            }
+        };
+        //@endcond
+
+    protected:
+        //@cond
+        void clear_links( node_type * pNode )
+        {
+            pNode->m_pNext.store( null_ptr<node_type *>(), memory_model::memory_order_relaxed );
+        }
+
+        template <class Disposer>
+        void dispose_node( node_type * pNode, Disposer disp )
+        {
+            clear_links( pNode );
+            cds::unref(disp)( node_traits::to_value_ptr( *pNode ));
+        }
+
+        template <class Disposer>
+        void dispose_value( value_type& val, Disposer disp )
+        {
+            dispose_node( node_traits::to_node_ptr( val ), disp );
+        }
+
+        void link_node( node_type * pNode, node_type * pPred, node_type * pCur )
+        {
+            assert( pPred->m_pNext.load(memory_model::memory_order_relaxed) == pCur );
+
+            pNode->m_pNext.store( pCur, memory_model::memory_order_release );
+            pPred->m_pNext.store( pNode, memory_model::memory_order_release );
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type
+        {
+            friend class LazyList;
+
+        protected:
+            value_type * m_pNode;
+
+            void next()
+            {
+                assert( m_pNode != null_ptr<value_type *>() );
+
+                node_type * pNode = node_traits::to_node_ptr( m_pNode );
+                node_type * pNext = pNode->m_pNext.load(memory_model::memory_order_relaxed);
+                if ( pNext != null_ptr<node_type *>() )
+                    m_pNode = node_traits::to_value_ptr( pNext );
+            }
+
+            iterator_type( node_type * pNode )
+            {
+                m_pNode = node_traits::to_value_ptr( pNode );
+            }
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+            iterator_type()
+                : m_pNode(null_ptr<value_type *>())
+            {}
+
+            iterator_type( const iterator_type& src )
+                : m_pNode( src.m_pNode )
+            {}
+
+            value_ptr operator ->() const
+            {
+                return m_pNode;
+            }
+
+            value_ref operator *() const
+            {
+                assert( m_pNode != null_ptr<value_type *>() );
+                return *m_pNode;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                next();
+                return *this;
+            }
+
+            /// Post-increment
+            iterator_type operator ++(int)
+            {
+                iterator_type i(*this);
+                next();
+                return i;
+            }
+
+            iterator_type& operator = (const iterator_type& src)
+            {
+                m_pNode = src.m_pNode;
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return m_pNode == i.m_pNode;
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return m_pNode != i.m_pNode;
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        typedef iterator_type<false>    iterator;
+        /// Const forward iterator
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            iterator it( &m_Head );
+            ++it        ;   // skip dummy head
+            return it;
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( &m_Tail );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        const_iterator begin() const
+        {
+            const_iterator it( const_cast<node_type *>( &m_Head ));
+            ++it        ;   // skip dummy head
+            return it;
+        }
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        const_iterator end() const
+        {
+            return const_iterator( const_cast<node_type *>( &m_Tail ));
+        }
+
+    public:
+        /// Default constructor initializes empty list
+        LazyList()
+        {
+            static_assert( (std::is_same< gc, typename node_type::gc >::value), "GC and node_type::gc must be the same type" );
+
+            m_Head.m_pNext.store( &m_Tail, memory_model::memory_order_relaxed );
+        }
+
+        /// Destroys the list object
+        ~LazyList()
+        {
+            clear();
+
+            assert( m_Head.m_pNext.load(memory_model::memory_order_relaxed) == &m_Tail );
+            m_Head.m_pNext.store( null_ptr<node_type *>(), memory_model::memory_order_relaxed );
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the list if the list does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is linked into the list, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            return insert_at( &m_Head, val );
+        }
+
+        /// Ensures that the \p item exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the list, then \p val is inserted into the list.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+            struct functor {
+                void operator()( bool bNew, value_type& item, value_type& val );
+            };
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refers to the same thing.
+
+            The functor may change non-key fields of the \p item.
+            While the functor \p f is calling the item \p item is locked.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns <tt> std::pair<bool, bool>  </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            return ensure_at( &m_Head, val, func );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_LazyList_nogc_find_func
+            The function searches the item with key equal to \p val
+            and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item.
+            While the functor \p f is calling the item found \p item is locked.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_at( &m_Head, val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_LazyList_nogc_find_cfunc
+            The function searches the item with key equal to \p val
+            and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item.
+            While the functor \p f is calling the item found \p item is locked.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_at( &m_Head, val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_nogc_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_at( &m_Head, val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_nogc_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_at( &m_Head, val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_LazyList_nogc_find_val
+            The function searches the item with key equal to \p val
+            and returns pointer to value found or \p NULL.
+        */
+        template <typename Q>
+        value_type * find( Q const& val )
+        {
+            return find_at( &m_Head, val, key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_nogc_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        value_type * find_with( Q const & val, Less pred )
+        {
+            return find_at( &m_Head, val, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Clears the list
+        /**
+            The function unlink all items from the list.
+            For each unlinked item the item disposer \p disp is called after unlinking.
+
+            This function is not thread-safe.
+        */
+        template <typename Disposer>
+        void clear( Disposer disp )
+        {
+            node_type * pHead = m_Head.m_pNext.exchange( &m_Tail, memory_model::memory_order_release );
+
+            while ( pHead != &m_Tail ) {
+                node_type * p = pHead->m_pNext.load(memory_model::memory_order_relaxed);
+                dispose_node( pHead, disp );
+                pHead = p;
+            }
+        }
+
+        /// Clears the list using default disposer
+        /**
+            The function clears the list using default (provided in class template) disposer functor.
+        */
+        void clear()
+        {
+            clear( disposer() );
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return m_Head.m_pNext.load(memory_model::memory_order_relaxed) == &m_Tail;
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+    protected:
+        //@cond
+        // split-list support
+        bool insert_aux_node( node_type * pNode )
+        {
+            return insert_aux_node( &m_Head, pNode );
+        }
+
+        // split-list support
+        bool insert_aux_node( node_type * pHead, node_type * pNode )
+        {
+            assert( pHead != null_ptr<node_type *>() );
+            assert( pNode != null_ptr<node_type *>() );
+
+            // Hack: convert node_type to value_type.
+            // In principle, auxiliary node can be non-reducible to value_type
+            // We assume that comparator can correctly distinguish aux and regular node.
+            return insert_at( pHead, *node_traits::to_value_ptr( pNode ) );
+        }
+
+        bool insert_at( node_type * pHead, value_type& val )
+        {
+            link_checker::is_empty( node_traits::to_node_ptr( val ) );
+            position pos;
+            key_comparator  cmp;
+
+            while ( true ) {
+                search( pHead, val, pos, key_comparator() );
+                {
+                    auto_lock_position alp( pos );
+                    if ( validate( pos.pPred, pos.pCur )) {
+                        if ( pos.pCur != &m_Tail && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 ) {
+                            // failed: key already in list
+                            return false;
+                        }
+                        else {
+                            link_node( node_traits::to_node_ptr( val ), pos.pPred, pos.pCur );
+                            ++m_ItemCounter;
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+
+        iterator insert_at_( node_type * pHead, value_type& val )
+        {
+            if ( insert_at( pHead, val ))
+                return iterator( node_traits::to_node_ptr( val ));
+            return end();
+        }
+
+
+        template <typename Func>
+        std::pair<iterator, bool> ensure_at_( node_type * pHead, value_type& val, Func func )
+        {
+            position pos;
+            key_comparator  cmp;
+
+            while ( true ) {
+                search( pHead, val, pos, key_comparator() );
+                {
+                    auto_lock_position alp( pos );
+                    if ( validate( pos.pPred, pos.pCur )) {
+                        if ( pos.pCur != &m_Tail && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 ) {
+                            // key already in the list
+
+                            cds::unref(func)( false, *node_traits::to_value_ptr( *pos.pCur ) , val );
+                            return std::make_pair( iterator( pos.pCur ), false );
+                        }
+                        else {
+                            // new key
+                            link_checker::is_empty( node_traits::to_node_ptr( val ) );
+
+                            link_node( node_traits::to_node_ptr( val ), pos.pPred, pos.pCur );
+                            cds::unref(func)( true, val, val );
+                            ++m_ItemCounter;
+                            return std::make_pair( iterator( node_traits::to_node_ptr( val )), true );
+                        }
+                    }
+                }
+            }
+        }
+
+        template <typename Func>
+        std::pair<bool, bool> ensure_at( node_type * pHead, value_type& val, Func func )
+        {
+            std::pair<iterator, bool> ret = ensure_at_( pHead, val, func );
+            return std::make_pair( ret.first != end(), ret.second );
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_at( node_type * pHead, Q& val, Compare cmp, Func f )
+        {
+            position pos;
+
+            search( pHead, val, pos, cmp );
+            if ( pos.pCur != &m_Tail ) {
+                cds::lock::scoped_lock< typename node_type::lock_type> al( pos.pCur->m_Lock );
+                if ( cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 )
+                {
+                    cds::unref(f)( *node_traits::to_value_ptr( *pos.pCur ), val );
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        value_type * find_at( node_type * pHead, Q& val, Compare cmp)
+        {
+            iterator it = find_at_( pHead, val, cmp );
+            if ( it != end() )
+                return &*it;
+            return null_ptr<value_type *>();
+        }
+
+        template <typename Q, typename Compare>
+        iterator find_at_( node_type * pHead, Q& val, Compare cmp)
+        {
+            position pos;
+
+            search( pHead, val, pos, cmp );
+            if ( pos.pCur != &m_Tail ) {
+                cds::lock::scoped_lock< typename node_type::lock_type> al( pos.pCur->m_Lock );
+                if ( cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 )
+                {
+                    return iterator( pos.pCur );
+                }
+            }
+            return end();
+        }
+
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename Q, typename Compare>
+        void search( node_type * pHead, const Q& key, position& pos, Compare cmp )
+        {
+            const node_type * pTail = &m_Tail;
+
+            node_type * pCur = pHead;
+            node_type * pPrev = pHead;
+
+            while ( pCur != pTail && ( pCur == pHead || cmp( *node_traits::to_value_ptr( *pCur ), key ) < 0 )) {
+                pPrev = pCur;
+                pCur = pCur->m_pNext.load(memory_model::memory_order_acquire);
+            }
+
+            pos.pCur = pCur;
+            pos.pPred = pPrev;
+        }
+
+        static bool validate( node_type * pPred, node_type * pCur )
+        {
+            return pPred->m_pNext.load(memory_model::memory_order_acquire) == pCur;
+        }
+
+        //@endcond
+    };
+
+}}  // namespace cds::intrusive
+
+#endif  // #ifndef __CDS_INTRUSIVE_LAZY_LIST_NOGC_H
diff --git a/cds/intrusive/lazy_list_ptb.h b/cds/intrusive/lazy_list_ptb.h
new file mode 100644 (file)
index 0000000..49e4cb4
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_LAZY_LIST_PTB_H
+#define __CDS_INTRUSIVE_LAZY_LIST_PTB_H
+
+#include <cds/intrusive/lazy_list_impl.h>
+#include <cds/gc/ptb.h>
+
+#endif // #ifndef __CDS_INTRUSIVE_LAZY_LIST_PTB_H
diff --git a/cds/intrusive/lazy_list_rcu.h b/cds/intrusive/lazy_list_rcu.h
new file mode 100644 (file)
index 0000000..77d8b1d
--- /dev/null
@@ -0,0 +1,1227 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_LAZY_LIST_RCU_H
+#define __CDS_INTRUSIVE_LAZY_LIST_RCU_H
+
+#include <cds/intrusive/lazy_list_base.h>
+#include <cds/urcu/details/check_deadlock.h>
+#include <cds/details/binary_functor_wrapper.h>
+#include <cds/urcu/exempt_ptr.h>
+
+namespace cds { namespace intrusive {
+    namespace lazy_list {
+        /// Lazy list node for \ref cds_urcu_desc "RCU"
+        /**
+            Template parameters:
+            - Tag - a tag used to distinguish between different implementation
+        */
+        template <class RCU, typename Lock, typename Tag>
+        struct node<cds::urcu::gc<RCU>, Lock, Tag>
+        {
+            typedef cds::urcu::gc<RCU>  gc  ;   ///< RCU schema
+            typedef Lock        lock_type   ;   ///< Lock type
+            typedef Tag         tag         ;   ///< tag
+
+            typedef cds::details::marked_ptr<node, 1>   marked_ptr          ;   ///< marked pointer
+            typedef CDS_ATOMIC::atomic<marked_ptr>      atomic_marked_ptr   ;   ///< atomic marked pointer specific for GC
+
+            atomic_marked_ptr   m_pNext ; ///< pointer to the next node in the list
+            mutable lock_type   m_Lock  ; ///< Node lock
+
+            /// Checks if node is marked
+            bool is_marked() const
+            {
+                return m_pNext.load(CDS_ATOMIC::memory_order_relaxed).bits() != 0;
+            }
+
+            /// Default ctor
+            node()
+                : m_pNext( null_ptr<node *>())
+            {}
+
+            /// Clears internal fields
+            void clear()
+            {
+                m_pNext.store( marked_ptr(), CDS_ATOMIC::memory_order_release );
+            }
+        };
+    }   // namespace lazy_list
+
+
+    /// Lazy ordered single-linked list (template specialization for \ref cds_urcu_desc "RCU")
+    /** @ingroup cds_intrusive_list
+        \anchor cds_intrusive_LazyList_rcu
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Template arguments:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p T - type to be stored in the list
+        - \p Traits - type traits. See lazy_list::type_traits for explanation.
+
+        It is possible to declare option-based list with \p %cds::intrusive::lazy_list::make_traits metafunction istead of \p Traits template
+        argument. Template argument list \p Options of cds::intrusive::lazy_list::make_traits metafunction are:
+        - opt::hook - hook used. Possible values are: lazy_list::base_hook, lazy_list::member_hook, lazy_list::traits_hook.
+            If the option is not specified, <tt>lazy_list::base_hook<></tt> is used.
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer
+        - opt::rcu_check_deadlock - a deadlock checking policy. Default is opt::v::rcu_throw_deadlock
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        \par Usage
+            Before including <tt><cds/intrusive/lazy_list_rcu.h></tt> you should include appropriate RCU header file,
+            see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+            For example, for \ref cds_urcu_general_buffered_gc "general-purpose buffered RCU" you should include:
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/intrusive/lazy_list_rcu.h>
+
+            // Now, you can declare lazy list for type Foo and default traits:
+            typedef cds::intrusive::LazyList<cds::urcu::gc< cds::urcu::general_buffered<> >, Foo > rcu_lazy_list;
+            \endcode
+
+    */
+    template <
+        typename RCU
+        ,typename T
+#ifdef CDS_DOXYGEN_INVOKED
+        ,class Traits = lazy_list::type_traits
+#else
+        ,class Traits
+#endif
+    >
+    class LazyList<cds::urcu::gc<RCU>, T, Traits>
+    {
+    public:
+        typedef T       value_type      ;   ///< type of value stored in the list
+        typedef Traits  options         ;   ///< Traits template parameter
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key compare functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+#   endif
+
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+        typedef typename lazy_list::get_link_checker< node_type, options::link_checker >::type link_checker   ;   ///< link checker
+
+        typedef cds::urcu::gc<RCU>                      gc              ;   ///< RCU schema
+        typedef typename options::back_off              back_off        ;   ///< back-off strategy (not used)
+        typedef typename options::item_counter          item_counter    ;   ///< Item counting policy used
+        typedef typename options::memory_model          memory_model    ;   ///< C++ memory ordering (see lazy_list::type_traits::memory_model)
+        typedef typename options::rcu_check_deadlock    rcu_check_deadlock ; ///< Deadlock checking policy
+
+        typedef typename gc::scoped_lock    rcu_lock ; ///< RCU scoped lock
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = true; ///< Group of \p extract_xxx functions require external locking
+
+        //@cond
+        // Rebind options (split-list support)
+        template <CDS_DECL_OPTIONS8>
+        struct rebind_options {
+            typedef LazyList<
+                gc
+                , value_type
+                , typename cds::opt::make_options< options, CDS_OPTIONS8>::type
+            >   type;
+        };
+        //@endcond
+
+    protected:
+        typedef typename node_type::marked_ptr  marked_node_ptr ;   ///< Node marked pointer
+        typedef node_type *     auxiliary_head   ;   ///< Auxiliary head type (for split-list support)
+
+    protected:
+        node_type       m_Head ;            ///< List head (dummy node)
+        node_type       m_Tail;             ///< List tail (dummy node)
+        item_counter    m_ItemCounter   ;   ///< Item counter
+
+        //@cond
+
+        /// Position pointer for item search
+        struct position {
+            node_type *     pPred   ;    ///< Previous node
+            node_type *     pCur    ;    ///< Current node
+
+            /// Locks nodes \p pPred and \p pCur
+            void lock()
+            {
+                pPred->m_Lock.lock();
+                pCur->m_Lock.lock();
+            }
+
+            /// Unlocks nodes \p pPred and \p pCur
+            void unlock()
+            {
+                pCur->m_Lock.unlock();
+                pPred->m_Lock.unlock();
+            }
+        };
+
+        class auto_lock_position {
+            position&   m_pos;
+        public:
+            auto_lock_position( position& pos )
+                : m_pos(pos)
+            {
+                pos.lock();
+            }
+            ~auto_lock_position()
+            {
+                m_pos.unlock();
+            }
+        };
+
+        typedef cds::urcu::details::check_deadlock_policy< gc, rcu_check_deadlock>   check_deadlock_policy;
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_erase_functor {
+            void operator()( value_type const& item )
+            {}
+        };
+
+        struct get_functor {
+            value_type *    pFound;
+
+            get_functor()
+                : pFound(null_ptr<value_type *>())
+            {}
+
+            template <typename Q>
+            void operator()( value_type& item, Q& val )
+            {
+                pFound = &item;
+            }
+        };
+#   endif
+
+        //@endcond
+
+    protected:
+        //@cond
+        static void clear_links( node_type * pNode )
+        {
+            pNode->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+        }
+
+        struct clear_and_dispose {
+            void operator()( value_type * p )
+            {
+                assert( p != null_ptr<value_type *>() );
+                clear_links( node_traits::to_node_ptr(p));
+                disposer()( p );
+            }
+        };
+
+        static void dispose_node( node_type * pNode )
+        {
+            assert( pNode );
+            assert( !gc::is_locked() );
+
+            gc::template retire_ptr<clear_and_dispose>( node_traits::to_value_ptr( *pNode ) );
+        }
+
+        void link_node( node_type * pNode, node_type * pPred, node_type * pCur )
+        {
+            assert( pPred->m_pNext.load(memory_model::memory_order_relaxed).ptr() == pCur );
+
+            pNode->m_pNext.store( marked_node_ptr(pCur), memory_model::memory_order_release );
+            pPred->m_pNext.store( marked_node_ptr(pNode), memory_model::memory_order_release );
+        }
+
+        void unlink_node( node_type * pPred, node_type * pCur, node_type * pHead )
+        {
+            assert( pPred->m_pNext.load(memory_model::memory_order_relaxed).ptr() == pCur );
+            assert( pCur != &m_Tail );
+
+            node_type * pNext = pCur->m_pNext.load(memory_model::memory_order_relaxed).ptr();
+            //pCur->m_pNext.store( marked_node_ptr( pNext, 1), memory_model::memory_order_relaxed) ;   // logically deleting
+            pCur->m_pNext.store( marked_node_ptr( pHead, 1 ), memory_model::memory_order_relaxed )    ; // logical deletion + back-link for search
+            pPred->m_pNext.store( marked_node_ptr( pNext ), memory_model::memory_order_relaxed); // physically deleting
+            //pCur->m_pNext.store( marked_node_ptr( pHead, 1 ), memory_model::memory_order_relaxed )    ; // back-link for search
+        }
+
+        //@endcond
+
+    public:
+        typedef cds::urcu::exempt_ptr< gc, value_type, value_type, clear_and_dispose, void > exempt_ptr ; ///< pointer to extracted node
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type
+        {
+            friend class LazyList;
+
+        protected:
+            value_type * m_pNode;
+
+            void next()
+            {
+                assert( m_pNode != null_ptr<value_type *>() );
+
+                node_type * pNode = node_traits::to_node_ptr( m_pNode );
+                node_type * pNext = pNode->m_pNext.load(memory_model::memory_order_relaxed).ptr();
+                if ( pNext != null_ptr<node_type *>() )
+                    m_pNode = node_traits::to_value_ptr( pNext );
+            }
+
+            void skip_deleted()
+            {
+                if ( m_pNode != null_ptr<value_type *>() ) {
+                    node_type * pNode = node_traits::to_node_ptr( m_pNode );
+
+                    // Dummy tail node could not be marked
+                    while ( pNode->is_marked() )
+                        pNode = pNode->m_pNext.load(memory_model::memory_order_relaxed).ptr();
+
+                    if ( pNode != node_traits::to_node_ptr( m_pNode ) )
+                        m_pNode = node_traits::to_value_ptr( pNode );
+                }
+            }
+
+            iterator_type( node_type * pNode )
+            {
+                m_pNode = node_traits::to_value_ptr( pNode );
+                skip_deleted();
+            }
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+            iterator_type()
+                : m_pNode(null_ptr<value_type *>())
+            {}
+
+            iterator_type( iterator_type const& src )
+                : m_pNode( src.m_pNode )
+            {}
+
+            value_ptr operator ->() const
+            {
+                return m_pNode;
+            }
+
+            value_ref operator *() const
+            {
+                assert( m_pNode != null_ptr<value_type *>() );
+                return *m_pNode;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                next();
+                skip_deleted();
+                return *this;
+            }
+
+            /// Post-increment
+            iterator_type operator ++(int)
+            {
+                iterator_type i(*this);
+                next();
+                skip_deleted();
+                return i;
+            }
+
+            iterator_type& operator = (iterator_type const& src)
+            {
+                m_pNode = src.m_pNode;
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return m_pNode == i.m_pNode;
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return m_pNode != i.m_pNode;
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        typedef iterator_type<false>    iterator;
+        /// Const forward iterator
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            iterator it( &m_Head );
+            ++it        ;   // skip dummy head
+            return it;
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( &m_Tail );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        //@{
+        const_iterator begin() const
+        {
+            return get_const_begin();
+        }
+        const_iterator cbegin()
+        {
+            return get_const_begin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        //@{
+        const_iterator end() const
+        {
+            return get_const_end();
+        }
+        const_iterator cend()
+        {
+            return get_const_end();
+        }
+        //@}
+
+    private:
+        //@cond
+        const_iterator get_const_begin() const
+        {
+            const_iterator it( const_cast<node_type *>( &m_Head ));
+            ++it        ;   // skip dummy head
+            return it;
+        }
+        const_iterator get_const_end() const
+        {
+            return const_iterator( const_cast<node_type *>( &m_Tail ));
+        }
+        //@endcond
+
+    public:
+        /// Default constructor initializes empty list
+        LazyList()
+        {
+            static_assert( (std::is_same< gc, typename node_type::gc >::value), "GC and node_type::gc must be the same type" );
+            m_Head.m_pNext.store( marked_node_ptr( &m_Tail ), memory_model::memory_order_relaxed );
+        }
+
+        /// Destroys the list object
+        ~LazyList()
+        {
+            clear();
+
+            assert( m_Head.m_pNext.load(memory_model::memory_order_relaxed).ptr() == &m_Tail );
+            m_Head.m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the list if the list does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is linked into the list, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            return insert_at( &m_Head, val );
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split new item creating into two part:
+            - create item with key only
+            - insert new item into the list
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted.
+            While the functor \p f is working the item \p val is locked.
+            The user-defined functor is called only if the inserting is success and may be passed by reference
+            using <tt>boost::ref</tt>.
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            return insert_at( &m_Head, val, f );
+        }
+
+        /// Ensures that the \p item exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the list, then \p val is inserted into the list.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+            struct functor {
+                void operator()( bool bNew, value_type& item, value_type& val );
+            };
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refers to the same thing.
+
+            The functor may change non-key fields of the \p item.
+            While the functor \p f is calling the item \p item is locked.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns <tt> std::pair<bool, bool>  </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            return ensure_at( &m_Head, val, func );
+        }
+
+        /// Unlinks the item \p val from the list
+        /**
+            The function searches the item \p val in the list and unlink it from the list
+            if it is found and it is equal to \p val.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of that list, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            The function returns \p true if success and \p false otherwise.
+
+            RCU \p synchronize method can be called.
+            Note that depending on RCU type used the \ref disposer call can be deferred.
+
+            The function can throw cds::urcu::rcu_deadlock exception if deadlock is encountered and
+            deadlock checking policy is opt::v::rcu_throw_deadlock.
+        */
+        bool unlink( value_type& val )
+        {
+            return unlink_at( &m_Head, val );
+        }
+
+        /// Deletes the item from the list
+        /** \anchor cds_intrusive_LazyList_rcu_find_erase
+            The function searches an item with key equal to \p val in the list,
+            unlinks it from the list, and returns \p true.
+            If the item with the key equal to \p val is not found the function return \p false.
+
+            RCU \p synchronize method can be called.
+            Note that depending on RCU type used the \ref disposer call can be deferred.
+
+            The function can throw \ref cds_urcu_rcu_deadlock "cds::urcu::rcu_deadlock" exception if deadlock is encountered and
+            deadlock checking policy is opt::v::rcu_throw_deadlock.
+        */
+        template <typename Q>
+        bool erase( Q const& val )
+        {
+            return erase_at( &m_Head, val, key_comparator() );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_rcu_find_erase "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& val, Less pred )
+        {
+            return erase_at( &m_Head, val, cds::opt::details::make_comparator_from_less<Less>());
+        }
+
+
+        /// Deletes the item from the list
+        /** \anchor cds_intrusive_LazyList_rcu_find_erase_func
+            The function searches an item with key equal to \p val in the list,
+            call \p func functor with item found, unlinks it from the list, and returns \p true.
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            If the item with the key equal to \p val is not found the function return \p false.
+
+            RCU \p synchronize method can be called.
+            Note that depending on RCU type used the \ref disposer call can be deferred.
+
+            The function can throw \ref cds_urcu_rcu_deadlock "cds::urcu::rcu_deadlock" exception if deadlock is encountered and
+            deadlock checking policy is opt::v::rcu_throw_deadlock.
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& val, Func func )
+        {
+            return erase_at( &m_Head, val, key_comparator(), func );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_rcu_find_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& val, Less pred, Func func )
+        {
+            return erase_at( &m_Head, val, cds::opt::details::make_comparator_from_less<Less>(), func );
+        }
+
+        /// Extracts an item from the list
+        /**
+        \anchor cds_intrusive_LazyList_rcu_extract
+            The function searches an item with key equal to \p val in the list,
+            unlinks it from the list, and returns pointer to an item found in \p dest parameter.
+            If the item with the key equal to \p val is not found the function returns \p false,
+            \p dest is empty.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the list
+            and returns a pointer to item found.
+            You should lock RCU before calling this function, and you should manually synchronize RCU
+            outside the RCU lock region before reusing returned pointer.
+
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/intrusive/lazy_list_rcu.h>
+
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::intrusive::LazyList< rcu, Foo > rcu_lazy_list;
+
+            rcu_lazy_list theList;
+            // ...
+
+            rcu_lazy_list::exempt_ptr p1;
+            {
+                // first, we should lock RCU
+                rcu::scoped_lock sl;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theList.extract( p1, 10 )) {
+                    // do something with p1
+                    ...
+                }
+            }
+
+            // We may safely release p1 here
+            // release() passes the pointer to RCU reclamation cycle:
+            // it invokes RCU retire_ptr function with the disposer you provided for the list.
+            p1.release();
+            \endcode
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& dest, Q const& val )
+        {
+            dest = extract_at( &m_Head, val, key_comparator() );
+            return !dest.empty();
+        }
+
+        /// Extracts an item from the list using \p pred predicate for searching
+        /**
+            This function is the analog for \ref cds_intrusive_LazyList_rcu_extract "extract(exempt_ptr&, Q const&)".
+
+            The \p pred is a predicate used for key comparing.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as \ref key_comparator.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& dest, Q const& val, Less pred )
+        {
+            dest = extract_at( &m_Head, val, cds::opt::details::make_comparator_from_less<Less>() );
+            return !dest.empty();
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_LazyList_rcu_find_func
+            The function searches the item with key equal to \p val
+            and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item.
+            While the functor \p f is calling the item found \p item is locked.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f ) const
+        {
+            return find_at( const_cast<node_type *>( &m_Head ), val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_rcu_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f ) const
+        {
+            return find_at( const_cast<node_type *>( &m_Head ), val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_LazyList_rcu_find_cfunc
+            The function searches the item with key equal to \p val
+            and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item.
+            While the functor \p f is calling the item found \p item is locked.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f ) const
+        {
+            return find_at( const_cast<node_type *>( &m_Head ), val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_rcu_find_cfunc "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f ) const
+        {
+            return find_at( const_cast<node_type *>( &m_Head ), val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_LazyList_rcu_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if \p val found or \p false otherwise.
+        */
+        template <typename Q>
+        bool find( Q const& val ) const
+        {
+            return find_at( const_cast<node_type *>( &m_Head ), val, key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_rcu_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred ) const
+        {
+            return find_at( const_cast<node_type *>( &m_Head ), val, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_intrusive_LazyList_rcu_get
+            The function searches the item with key equal to \p val and returns the pointer to item found.
+            If \p val is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::intrusive::LazyList< cds::urcu::gc< cds::urcu::general_buffered<> >, foo, my_traits > ord_list;
+            ord_list theList;
+            // ...
+            {
+                // Lock RCU
+                ord_list::rcu_lock lock;
+
+                foo * pVal = theList.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be retired by disposer at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename Q>
+        value_type * get( Q const& val ) const
+        {
+            return get_at( const_cast<node_type *>( &m_Head ), val, key_comparator());
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_LazyList_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& val, Less pred ) const
+        {
+            return get_at( const_cast<node_type *>( &m_Head ), val, cds::opt::details::make_comparator_from_less<Less>());
+        }
+
+        /// Clears the list using default disposer
+        /**
+            The function clears the list using default (provided in class template) disposer functor.
+
+            RCU \p synchronize method can be called.
+            Note that depending on RCU type used the \ref disposer call can be deferred.
+
+            The function can throw cds::urcu::rcu_deadlock exception if deadlock is encountered and
+            deadlock checking policy is opt::v::rcu_throw_deadlock.
+        */
+        void clear()
+        {
+            if( !empty() ) {
+                check_deadlock_policy::check();
+
+                node_type * pHead;
+                for (;;) {
+                    {
+                        rcu_lock l;
+                        pHead = m_Head.m_pNext.load(memory_model::memory_order_acquire).ptr();
+                        if ( pHead == &m_Tail )
+                            break;
+
+                        m_Head.m_Lock.lock();
+                        pHead->m_Lock.lock();
+
+                        if ( m_Head.m_pNext.load(memory_model::memory_order_relaxed).all() == pHead )
+                            unlink_node( &m_Head, pHead, &m_Head );
+
+                        pHead->m_Lock.unlock();
+                        m_Head.m_Lock.unlock();
+                    }
+
+                    --m_ItemCounter;
+                    dispose_node( pHead );
+                }
+            }
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return m_Head.m_pNext.load(memory_model::memory_order_relaxed).ptr() == &m_Tail;
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+    protected:
+        //@cond
+        // split-list support
+        bool insert_aux_node( node_type * pNode )
+        {
+            return insert_aux_node( &m_Head, pNode );
+        }
+
+        // split-list support
+        bool insert_aux_node( node_type * pHead, node_type * pNode )
+        {
+            assert( pHead != null_ptr<node_type *>() );
+            assert( pNode != null_ptr<node_type *>() );
+
+            // Hack: convert node_type to value_type.
+            // In principle, auxiliary node can be non-reducible to value_type
+            // We assume that comparator can correctly distinguish aux and regular node.
+            return insert_at( pHead, *node_traits::to_value_ptr( pNode ) );
+        }
+
+        bool insert_at( node_type * pHead, value_type& val, bool bLock = true )
+        {
+            link_checker::is_empty( node_traits::to_node_ptr( val ) );
+            position pos;
+            key_comparator  cmp;
+
+            rcu_lock l( bLock );
+            while ( true ) {
+                search( pHead, val, pos );
+                {
+                    auto_lock_position alp( pos );
+                    if ( validate( pos.pPred, pos.pCur )) {
+                        if ( pos.pCur != &m_Tail && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 ) {
+                            // failed: key already in list
+                            return false;
+                        }
+                        else {
+                            link_node( node_traits::to_node_ptr( val ), pos.pPred, pos.pCur );
+                            ++m_ItemCounter;
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+
+        template <typename Func>
+        bool insert_at( node_type * pHead, value_type& val, Func f )
+        {
+            link_checker::is_empty( node_traits::to_node_ptr( val ) );
+            position pos;
+            key_comparator  cmp;
+
+            rcu_lock l;
+            while ( true ) {
+                search( pHead, val, pos );
+                {
+                    auto_lock_position alp( pos );
+                    if ( validate( pos.pPred, pos.pCur )) {
+                        if ( pos.pCur != &m_Tail && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 ) {
+                            // failed: key already in list
+                            return false;
+                        }
+                        else {
+                            link_node( node_traits::to_node_ptr( val ), pos.pPred, pos.pCur );
+                            cds::unref(f)( val );
+                            ++m_ItemCounter;
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+
+        iterator insert_at_( node_type * pHead, value_type& val, bool bLock = true )
+        {
+            rcu_lock l( bLock );
+            if ( insert_at( pHead, val, false ))
+                return iterator( node_traits::to_node_ptr( val ));
+            return end();
+        }
+
+
+        template <typename Func>
+        std::pair<iterator, bool> ensure_at_( node_type * pHead, value_type& val, Func func, bool bLock = true )
+        {
+            position pos;
+            key_comparator  cmp;
+
+            rcu_lock l( bLock );
+            while ( true ) {
+                search( pHead, val, pos );
+                {
+                    auto_lock_position alp( pos );
+                    if ( validate( pos.pPred, pos.pCur )) {
+                        if ( pos.pCur != &m_Tail && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 ) {
+                            // key already in the list
+
+                            cds::unref(func)( false, *node_traits::to_value_ptr( *pos.pCur ) , val );
+                            return std::make_pair( iterator( pos.pCur ), false );
+                        }
+                        else {
+                            // new key
+                            link_checker::is_empty( node_traits::to_node_ptr( val ) );
+
+                            link_node( node_traits::to_node_ptr( val ), pos.pPred, pos.pCur );
+                            cds::unref(func)( true, val, val );
+                            ++m_ItemCounter;
+                            return std::make_pair( iterator( node_traits::to_node_ptr( val )), true );
+                        }
+                    }
+                }
+            }
+        }
+
+        template <typename Func>
+        std::pair<bool, bool> ensure_at( node_type * pHead, value_type& val, Func func, bool bLock = true )
+        {
+            rcu_lock l( bLock );
+            std::pair<iterator, bool> ret = ensure_at_( pHead, val, func, false );
+            return std::make_pair( ret.first != end(), ret.second );
+        }
+
+        bool unlink_at( node_type * pHead, value_type& val )
+        {
+            position pos;
+            key_comparator  cmp;
+            check_deadlock_policy::check();
+
+            while ( true ) {
+                int nResult = 0;
+                {
+                    rcu_lock l;
+                    search( pHead, val, pos );
+                    {
+                        auto_lock_position alp( pos );
+                        if ( validate( pos.pPred, pos.pCur ) ) {
+                            if ( pos.pCur != &m_Tail
+                                && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0
+                                && node_traits::to_value_ptr( pos.pCur ) == &val )
+                            {
+                                // item found
+                                unlink_node( pos.pPred, pos.pCur, pHead );
+                                --m_ItemCounter;
+                                nResult = 1;
+                            }
+                            else
+                                nResult = -1;
+                        }
+                    }
+                }
+
+                if ( nResult ) {
+                    if ( nResult > 0 ) {
+                        dispose_node( pos.pCur );
+                        return true;
+                    }
+                    return false;
+                }
+            }
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( node_type * pHead, Q const& val, Compare cmp, Func f, position& pos )
+        {
+            check_deadlock_policy::check();
+
+            while ( true ) {
+                int nResult = 0;
+                {
+                    rcu_lock l;
+                    search( pHead, val, pos, cmp );
+                    {
+                        auto_lock_position alp( pos );
+                        if ( validate( pos.pPred, pos.pCur )) {
+                            if ( pos.pCur != &m_Tail && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 ) {
+                                // key found
+                                unlink_node( pos.pPred, pos.pCur, pHead );
+                                cds::unref(f)( *node_traits::to_value_ptr( *pos.pCur ) );
+                                --m_ItemCounter;
+                                nResult = 1;
+                            }
+                            else {
+                                nResult = -1;
+                            }
+                        }
+                    }
+                }
+
+                if ( nResult ) {
+                    if ( nResult > 0 ) {
+                        dispose_node( pos.pCur );
+                        return true;
+                    }
+                    return false;
+                }
+            }
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( node_type * pHead, Q const& val, Compare cmp, Func f )
+        {
+            position pos;
+            return erase_at( pHead, val, cmp, f, pos );
+        }
+
+        template <typename Q, typename Compare>
+        bool erase_at( node_type * pHead, Q const& val, Compare cmp )
+        {
+            position pos;
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( pHead, val, cmp, [](value_type const &){}, pos );
+#       else
+            return erase_at( pHead, val, cmp, empty_erase_functor(), pos );
+#       endif
+        }
+
+        template <typename Q, typename Compare>
+        value_type * extract_at( node_type * pHead, Q const& val, Compare cmp )
+        {
+            position pos;
+            assert( gc::is_locked() ) ; // RCU must be locked!!!
+
+            while ( true ) {
+                search( pHead, val, pos, cmp );
+                int nResult = 0;
+                {
+                    auto_lock_position alp( pos );
+                    if ( validate( pos.pPred, pos.pCur )) {
+                        if ( pos.pCur != &m_Tail && cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 ) {
+                            // key found
+                            unlink_node( pos.pPred, pos.pCur, pHead );
+                            --m_ItemCounter;
+                            nResult = 1;
+                        }
+                        else {
+                            nResult = -1;
+                        }
+                    }
+                }
+
+                if ( nResult ) {
+                    if ( nResult > 0 )
+                        return node_traits::to_value_ptr( pos.pCur );
+                    return null_ptr<value_type *>();
+                }
+            }
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_at( node_type * pHead, Q& val, Compare cmp, Func f, bool bLock = true ) const
+        {
+            position pos;
+
+            rcu_lock l( bLock );
+            search( pHead, val, pos, cmp );
+            if ( pos.pCur != &m_Tail ) {
+                cds::lock::scoped_lock< typename node_type::lock_type> al( pos.pCur->m_Lock );
+                if ( cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 )
+                {
+                    cds::unref(f)( *node_traits::to_value_ptr( *pos.pCur ), val );
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        bool find_at( node_type * pHead, Q& val, Compare cmp ) const
+        {
+            rcu_lock l;
+            return find_at_( pHead, val, cmp ) != end();
+        }
+
+        template <typename Q, typename Compare>
+        const_iterator find_at_( node_type * pHead, Q& val, Compare cmp ) const
+        {
+            assert( gc::is_locked() );
+
+            position pos;
+
+            search( pHead, val, pos, cmp );
+            if ( pos.pCur != &m_Tail ) {
+                cds::lock::scoped_lock< typename node_type::lock_type> al( pos.pCur->m_Lock );
+                if ( cmp( *node_traits::to_value_ptr( *pos.pCur ), val ) == 0 )
+                {
+                    return const_iterator( pos.pCur );
+                }
+            }
+            return end();
+        }
+
+        template <typename Q, typename Compare>
+        value_type * get_at( node_type * pHead, Q const& val, Compare cmp ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            value_type * pFound = null_ptr<value_type *>();
+            return find_at( pHead, val, cmp, [&pFound](value_type& found, Q const& ) { pFound = &found; } )
+                ? pFound : null_ptr<value_type *>();
+#       else
+            get_functor gf;
+            return find_at( pHead , val, cmp, cds::ref(gf) ) ? gf.pFound : null_ptr<value_type *>();
+#       endif
+        }
+
+        //@endcond
+
+    protected:
+        //@cond
+        template <typename Q>
+        void search( node_type * pHead, Q const& key, position& pos ) const
+        {
+            search( pHead, key, pos, key_comparator() );
+        }
+
+        template <typename Q, typename Compare>
+        void search( node_type * pHead, Q const& key, position& pos, Compare cmp ) const
+        {
+            // RCU should be locked!!!
+            assert( gc::is_locked() );
+
+            node_type const* pTail = &m_Tail;
+
+            marked_node_ptr pCur(pHead);
+            marked_node_ptr pPrev(pHead);
+
+            while ( pCur.ptr() != pTail && ( pCur.ptr() == pHead || cmp( *node_traits::to_value_ptr( *pCur.ptr() ), key ) < 0 )) {
+                pPrev = pCur;
+                pCur = pCur->m_pNext.load(memory_model::memory_order_relaxed);
+            }
+
+            pos.pCur = pCur.ptr();
+            pos.pPred = pPrev.ptr();
+        }
+
+        static bool validate( node_type * pPred, node_type * pCur )
+        {
+            // RCU lock should be locked!!!
+            assert( gc::is_locked() );
+
+            return !pPred->is_marked()
+                && !pCur->is_marked()
+                && pPred->m_pNext.load(memory_model::memory_order_relaxed) == pCur;
+        }
+
+        //@endcond
+    };
+
+}}  // namespace cds::intrusive
+
+#endif  // #ifndef __CDS_INTRUSIVE_LAZY_LIST_RCU_H
diff --git a/cds/intrusive/michael_deque.h b/cds/intrusive/michael_deque.h
new file mode 100644 (file)
index 0000000..8989034
--- /dev/null
@@ -0,0 +1,993 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_DEQUE_H
+#define __CDS_INTRUSIVE_MICHAEL_DEQUE_H
+
+#include <cds/intrusive/michael_list_impl.h>
+#include <cds/intrusive/michael_set.h>
+#include <cds/intrusive/deque_stat.h>
+#include <cds/ref.h>
+#include <cds/details/aligned_type.h>
+#include <cds/gc/default_gc.h>
+
+#include <cds/details/std/type_traits.h>
+
+namespace cds { namespace intrusive {
+
+    //@cond
+    struct michael_deque_tag;
+    //@endcond
+
+    /// MichaelDeque related definitions
+    /** @ingroup cds_intrusive_helper
+    */
+    namespace michael_deque
+    {
+        /// Anchor contains left/right sibling items
+        /**
+            The anchor object is maintained by one CAS instruction.
+        */
+        struct anchor
+        {
+            unsigned int  idxLeft ;     ///< Left sibling index; the most-significant bit contains left-stable flag
+            unsigned int  idxRight  ;   ///< Right sibling index; the most-significant bit contains right-stable flag
+
+#       ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            //@cond
+            anchor() CDS_NOEXCEPT_DEFAULTED = default;
+            anchor( anchor const& ) CDS_NOEXCEPT_DEFAULTED = default;
+            ~anchor() CDS_NOEXCEPT_DEFAULTED = default;
+            anchor& operator=(anchor const&) CDS_NOEXCEPT_DEFAULTED = default;
+#       if defined(CDS_MOVE_SEMANTICS_SUPPORT) && !defined(CDS_DISABLE_DEFAULT_MOVE_CTOR)
+            anchor( anchor&&) CDS_NOEXCEPT_DEFAULTED = default;
+            anchor& operator=(anchor&&) CDS_NOEXCEPT_DEFAULTED = default;
+#       endif
+            //@endcond
+#       else
+            /// Default ctor does not initialize left/right indices
+            anchor() CDS_NOEXCEPT
+                : idxLeft( 0 )
+                , idxRight( 0 )
+            {
+                static_check();
+            }
+
+            anchor( anchor const& a) CDS_NOEXCEPT
+                : idxLeft( a.idxLeft )
+                , idxRight( a.idxRight )
+            {
+                static_check();
+            }
+#       endif
+
+            /// Constructor sets \p left / \p right indices
+            anchor( unsigned int left, unsigned int right ) CDS_NOEXCEPT
+                : idxLeft( left )
+                , idxRight( right )
+            {
+                static_check();
+            }
+
+            /// Anchor equal operator
+            bool operator ==( anchor const& a) const CDS_NOEXCEPT
+            {
+                return idxLeft == a.idxLeft && idxRight == a.idxRight;
+            }
+
+            /// Anchor non-equal operator
+            bool operator !=( anchor const& a) const CDS_NOEXCEPT
+            {
+                return !( *this == a );
+            }
+
+        private:
+            //@cond
+            static void static_check()
+            {
+                static_assert( sizeof(unsigned int) * 2 <= 8, "The index type must be no more than 32bit long" );
+                static_assert( sizeof(anchor) <= 8, "The anchor type must be no more than 64bit long" );
+            }
+            //@endcond
+        };
+
+        /// Michael's deque node
+        /**
+            Template parameters:
+            - GC - garbage collector
+            - Tag - a tag used to distinguish between different implementation
+        */
+        template <class GC, typename Tag = opt::none>
+        struct node: public michael_list::node< GC, michael_deque_tag >
+        {
+            typedef GC              gc  ;   ///< Garbage collector
+            typedef Tag             tag ;   ///< tag
+
+            //@cond
+            typedef michael_list::node< gc, michael_deque_tag > mapper_node_type;
+            //@endcond
+
+            typedef typename gc::template atomic_type< anchor >   atomic_anchor  ;    ///< atomic reference to left/right node
+
+            CDS_DATA_ALIGNMENT(8) atomic_anchor   m_Links ;   ///< Left/right sibling links
+            unsigned int    m_nIndex;   ///< Item index
+
+            //@cond
+            node()
+            {
+                m_Links.store( anchor(0,0), CDS_ATOMIC::memory_order_release );
+            }
+
+            explicit node( anchor const& a )
+                : m_Links()
+                , m_nIndex(0)
+            {
+                m_Links.store( a, CDS_ATOMIC::memory_order_release );
+            }
+            //@endcond
+        };
+
+        //@cond
+        struct default_hook {
+            typedef cds::gc::default_gc gc;
+            typedef opt::none           tag;
+            typedef unsigned int        index_type;
+        };
+        //@endcond
+
+        //@cond
+        template < typename HookType, CDS_DECL_OPTIONS3>
+        struct hook
+        {
+            typedef typename opt::make_options< default_hook, CDS_OPTIONS3>::type  options;
+            typedef typename options::gc    gc;
+            typedef typename options::tag   tag;
+            typedef typename options::index_type index_type;
+
+            typedef node<gc, tag>   node_type;
+            typedef HookType        hook_type;
+        };
+        //@endcond
+
+
+        /// Base hook
+        /**
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+            - opt::index_type - integral index type
+        */
+        template < CDS_DECL_OPTIONS3 >
+        struct base_hook: public hook< opt::base_hook_tag, CDS_OPTIONS3 >
+        {};
+
+        /// Member hook
+        /**
+            \p MemberOffset defines offset in bytes of \ref node member into your structure.
+            Use \p offsetof macro to define \p MemberOffset
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+            - opt::index_type - integral index type
+        */
+        template < size_t MemberOffset, CDS_DECL_OPTIONS3 >
+        struct member_hook: public hook< opt::member_hook_tag, CDS_OPTIONS3 >
+        {
+            //@cond
+            static const size_t c_nMemberOffset = MemberOffset;
+            //@endcond
+        };
+
+        /// Traits hook
+        /**
+            \p NodeTraits defines type traits for node.
+            See \ref node_traits for \p NodeTraits interface description
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+            - opt::index_type - integral index type
+        */
+        template <typename NodeTraits, CDS_DECL_OPTIONS3 >
+        struct traits_hook: public hook< opt::traits_hook_tag, CDS_OPTIONS3 >
+        {
+            //@cond
+            typedef NodeTraits node_traits;
+            //@endcond
+        };
+
+        /// Deque internal statistics. May be used for debugging or profiling
+        /**
+            Template argument \p Counter defines type of counter.
+            Default is cds::atomics::event_counter.
+            You may use other counter type like as cds::atomics::item_counter,
+            or even integral type, for example, \p int.
+
+            The class extends intrusive::deque_stat interface for MichaelDeque.
+        */
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat: public cds::intrusive::deque_stat<Counter>
+        {
+            //@cond
+            typedef cds::intrusive::deque_stat<Counter> base_class;
+            typedef typename base_class::counter_type   counter_type;
+            //@endcond
+
+            counter_type m_StabilizeFrontCount  ;  ///< stabilize left event count
+            counter_type m_StabilizeBackCount   ;  ///< stabilize right event count
+
+            /// Register "stabilize left" event
+            void onStabilizeFront()          { ++m_StabilizeFrontCount; }
+
+            /// Register "stabilize right" event
+            void onStabilizeBack()          { ++m_StabilizeBackCount; }
+        };
+
+        /// Dummy deque statistics - no counting is performed. Support interface like \ref michael_deque::stat
+        struct dummy_stat: public cds::intrusive::deque_dummy_stat
+        {
+            //@cond
+            void onStabilizeFront() {}
+            void onStabilizeBack()  {}
+            //@endcond
+        };
+
+        //@cond
+        template < typename NodeType, opt::link_check_type LinkType>
+        struct link_checker
+        {
+            typedef NodeType node_type;
+
+            static void is_empty( const node_type * pNode )
+            {
+#           ifdef _DEBUG
+                anchor a = pNode->m_Links.load(CDS_ATOMIC::memory_order_relaxed);
+                assert( a.idxLeft == 0 && a.idxRight == 0 );
+#           endif
+            }
+        };
+
+        template < typename NodeType>
+        struct link_checker<NodeType, opt::never_check_link>
+        {
+            typedef NodeType node_type;
+
+            static void is_empty( const node_type * /*pNode*/ )
+            {}
+        };
+        //@endcond
+    }   // namespace michael_deque
+
+    /// Michael's intrusive deque
+    /** @ingroup cds_intrusive_deque
+        Implementation of Michael's deque algorithm.
+
+        \par Source:
+            [2003] Maged Michael "CAS-based Lock-free Algorithm for Shared Deque"
+
+        <b>Short description</b> (from Michael's paper)
+
+        The deque is represented as a doubly-linked list. Each node in the list contains two link pointers,
+        \p pRight and \p pLeft, and a data field. A shared variable, \p Anchor, holds the two anchor
+        pointers to the leftmost and rightmost nodes in the list, if any, and a three-value
+        status tag. Anchor must fit in a memory block that can be read and manipulated
+        using CAS or LL/SC, atomically. Initially both anchor pointers have null values
+        and the status tag holds the value stable, indicating an empty deque.
+
+        The status tag serves to indicate if the deque is in an unstable state. When
+        a process finds the deque in an unstable state, it must first attempt to take it
+        to a stable state before attempting its own operation.
+
+        The algorithm can use single-word CAS or LL/SC.
+        In \p libcds implementation of the algorithm the node contains two
+        31bit link indices instead of pointers + one bit for status tag;
+        this trick allows use 64bit CAS to manipulate \p Anchor. Internal mapper
+        (based on MichaelHashSet intrusive container)
+        reflects link indices to item pointers. The maximum number of item in
+        the deque is limited by 2**31 that is practically unbounded.
+
+        Template arguments:
+        - \p GC - garbage collector type: gc::HP or gc::PTB. Note that gc::HRC is not supported
+        - \p T - type to be stored in the queue, should be convertible to michael_deque::node
+        - \p Options - options
+
+        Type of node: \ref michael_deque::node
+
+        \p Options are:
+        - opt::hook - hook used. Possible values are: michael_deque::base_hook, michael_deque::member_hook, michael_deque::traits_hook.
+            If the option is not specified, <tt>michael_deque::base_hook<></tt> is used.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer. This option is used
+            in \ref pop_front and \ref pop_back functions.
+        - opt::link_checker - the type of node's link fields checking. Default is \ref opt::debug_check_link
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter (no item counting feature)
+        - opt::stat - the type to gather internal statistics.
+            Possible option value are: \ref michael_deque::stat, \ref michael_deque::dummy_stat, user-provided class that supports michael_deque::stat interface.
+            Default is \ref michael_deque::dummy_stat.
+        - opt::alignment - the alignment for internal deque data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - opt::allocator - allocator using for internal memory mapper based on MichaelHashSet. Default is CDS_DEFAULT_ALLOCATOR.
+    */
+    template <typename GC, typename T, CDS_DECL_OPTIONS10>
+    class MichaelDeque
+    {
+        //@cond
+        struct default_options
+        {
+            typedef cds::backoff::empty             back_off;
+            typedef michael_deque::base_hook<>      hook;
+            typedef opt::v::empty_disposer          disposer;
+            typedef atomicity::empty_item_counter   item_counter;
+            typedef michael_deque::dummy_stat       stat;
+            typedef opt::v::relaxed_ordering        memory_model;
+            static const opt::link_check_type link_checker = opt::debug_check_link;
+            enum { alignment = opt::cache_line_alignment };
+            typedef CDS_DEFAULT_ALLOCATOR           allocator;
+        };
+        //@endcond
+
+    public:
+        //@cond
+        typedef typename opt::make_options<
+            typename cds::opt::find_type_traits< default_options, CDS_OPTIONS10 >::type
+            ,CDS_OPTIONS10
+        >::type   options;
+        //@endcond
+
+    private:
+        //@cond
+        typedef typename std::conditional<
+            std::is_same<typename options::stat, cds::intrusive::deque_stat<> >::value
+            ,michael_deque::stat<>
+            ,typename std::conditional<
+                std::is_same<typename options::stat, cds::intrusive::deque_dummy_stat>::value
+                ,michael_deque::dummy_stat
+                ,typename options::stat
+            >::type
+        >::type stat_type_;
+        //@endcond
+
+
+    public:
+        typedef T  value_type   ;   ///< type of value stored in the deque
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+        typedef michael_deque::link_checker< node_type, options::link_checker > link_checker   ;   ///< link checker
+
+        typedef GC gc                                       ;   ///< Garbage collector
+        typedef typename options::back_off  back_off        ;   ///< back-off strategy
+        typedef typename options::item_counter item_counter ;   ///< Item counting policy used
+        typedef stat_type_   stat                           ;   ///< Internal statistics policy used
+        typedef typename options::memory_model  memory_model;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::allocator allocator_type  ;   ///< Allocator using for internal memory mapping
+
+        typedef typename node_type::atomic_anchor   atomic_anchor   ;   ///< Atomic anchor
+
+    protected:
+        //@cond
+        class index_mapper
+        {
+            struct node_less_comparator
+            {
+                bool operator ()( value_type const & n1, value_type const& n2) const
+                {
+                    return node_traits::to_node_ptr(n1)->m_nIndex < node_traits::to_node_ptr(n2)->m_nIndex;
+                }
+                bool operator ()( unsigned int i, value_type const& n2) const
+                {
+                    return i < node_traits::to_node_ptr(n2)->m_nIndex;
+                }
+                bool operator ()( value_type const & n1, unsigned int i) const
+                {
+                    return node_traits::to_node_ptr(n1)->m_nIndex < i;
+                }
+            };
+
+            struct internal_disposer
+            {
+                void operator()( value_type * p )
+                {
+                    assert( p != null_ptr<value_type *>());
+
+                    MichaelDeque::clear_links( node_traits::to_node_ptr(p) );
+                    disposer()( p );
+                }
+            };
+
+            struct mapper_node_traits
+            {
+                typedef typename node_type::mapper_node_type mapper_node_type;
+
+                static mapper_node_type * to_node_ptr( value_type& v )
+                {
+                    return static_cast<mapper_node_type *>( node_traits::to_node_ptr(v) );
+                }
+
+                static mapper_node_type * to_node_ptr( value_type * v )
+                {
+                    return static_cast<mapper_node_type *>( node_traits::to_node_ptr(v) );
+                }
+
+                static mapper_node_type const * to_node_ptr( value_type const& v )
+                {
+                    return static_cast<mapper_node_type const *>( node_traits::to_node_ptr(v) );
+                }
+
+                static mapper_node_type const * to_node_ptr( value_type const * v )
+                {
+                    return static_cast<mapper_node_type const *>( node_traits::to_node_ptr(v) );
+                }
+
+                static value_type * to_value_ptr( mapper_node_type&  n )
+                {
+                    return node_traits::to_value_ptr( static_cast<node_type&>(n));
+                }
+
+                static value_type * to_value_ptr( mapper_node_type *  n )
+                {
+                    return node_traits::to_value_ptr( static_cast<node_type *>(n));
+                }
+
+                static const value_type * to_value_ptr( mapper_node_type const& n )
+                {
+                    return node_traits::to_value_ptr( static_cast<node_type const&>(n));
+                }
+
+                static const value_type * to_value_ptr( mapper_node_type const * n )
+                {
+                    return node_traits::to_value_ptr( static_cast<node_type const *>(n));
+                }
+            };
+
+            typedef MichaelList< gc, value_type,
+                typename michael_list::make_traits<
+                    opt::hook< michael_list::traits_hook<
+                        mapper_node_traits
+                        ,cds::opt::gc< gc >
+                        ,cds::opt::tag<michael_deque_tag> >
+                    >
+                    ,opt::less< node_less_comparator >
+                    ,opt::back_off< back_off >
+                    ,opt::disposer< internal_disposer >
+                    ,opt::memory_model< memory_model >
+                >::type
+            > mapper_ordered_list;
+
+            struct mapper_hash {
+                size_t operator()( value_type const& v ) const
+                {
+                    return cds::opt::v::hash<unsigned int>()( node_traits::to_node_ptr(v)->m_nIndex );
+                }
+                size_t operator()( unsigned int i ) const
+                {
+                    return cds::opt::v::hash<unsigned int>()(i);
+                }
+            };
+
+            typedef MichaelHashSet< gc, mapper_ordered_list,
+                typename michael_set::make_traits<
+                    opt::hash< mapper_hash >
+                    ,opt::allocator< allocator_type >
+                >::type
+            >   mapper_type;
+
+#       if !(defined(CDS_CXX11_LAMBDA_SUPPORT) && !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1700))
+            struct at_functor {
+                node_type * pNode;
+
+                at_functor()
+                    : pNode( null_ptr<node_type *>())
+                    {}
+
+                void operator()( value_type& v, unsigned int nIdx )
+                {
+                    pNode = node_traits::to_node_ptr(v);
+                    assert( pNode->m_nIndex == nIdx );
+                }
+            };
+#       endif
+
+            mapper_type     m_set;
+            CDS_ATOMIC::atomic<unsigned int>    m_nLastIndex;
+
+        public:
+
+            index_mapper( size_t nEstimatedItemCount, size_t nLoadFactor )
+                : m_set( nEstimatedItemCount, nLoadFactor )
+                , m_nLastIndex(1)
+                {}
+
+            unsigned int map( value_type& v )
+            {
+                while ( true ) {
+                    node_type * pNode = node_traits::to_node_ptr( v );
+                    pNode->m_nIndex = m_nLastIndex.fetch_add( 1, memory_model::memory_order_relaxed );
+                    if ( pNode->m_nIndex && m_set.insert( v ))
+                        return pNode->m_nIndex;
+                }
+            }
+
+            bool unmap( unsigned int nIdx )
+            {
+                return m_set.erase( nIdx );
+            }
+
+            node_type * at( unsigned int nIdx )
+            {
+#   if defined(CDS_CXX11_LAMBDA_SUPPORT) && !((CDS_COMPILER == CDS_COMPILER_MSVC ||CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1700)
+                // MS VC++2010 bug: error C2955: 'cds::intrusive::node_traits' : use of class template requires template argument list
+                // see declaration of 'cds::intrusive::node_traits'
+                node_type * pNode = null_ptr<node_type *>();
+                if ( m_set.find( nIdx,
+                    [&pNode](value_type& v, unsigned int nIdx) {
+                        pNode = node_traits::to_node_ptr(v);
+                        assert( pNode->m_nIndex == nIdx );
+                    })
+                )
+                    return pNode;
+#   else
+                at_functor f;
+                if ( m_set.find( nIdx, cds::ref(f) ))
+                    return f.pNode;
+#   endif
+                return null_ptr<node_type *>();
+            }
+        };
+        //@endcond
+    public:
+
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS10>
+        struct rebind {
+            typedef MichaelDeque< GC2, T2, CDS_OTHER_OPTIONS10> other   ;   ///< Rebinding result
+        };
+
+    protected:
+        typename cds::opt::details::alignment_setter< atomic_anchor, options::alignment >::type  m_Anchor ;   ///< Left/right heads
+        typename cds::opt::details::alignment_setter< index_mapper, options::alignment >::type   m_Mapper ;   ///< Memory mapper
+
+        item_counter            m_ItemCounter   ;   ///< item counter
+        stat                    m_Stat  ;   ///< Internal statistics
+
+        //@cond
+        static const unsigned int c_nIndexMask    = ((unsigned int)(0 - 1)) >> 1;
+        static const unsigned int c_nFlagMask     = ((unsigned int)(1)) << (sizeof(unsigned int) * 8 - 1);
+        static const unsigned int c_nEmptyIndex   = 0;
+        //@endcond
+
+    private:
+        //@cond
+        typedef michael_deque::anchor CDS_TYPE_ALIGNMENT(8) anchor_type;
+        typedef intrusive::node_to_value<MichaelDeque> node_to_value;
+
+        static void clear_links( node_type * pNode )
+        {
+            pNode->m_Links.store( anchor_type(), memory_model::memory_order_release );
+        }
+
+        enum anchor_status {
+            Stable,
+            RPush,
+            LPush
+        };
+
+        static anchor_status status( anchor_type const& a )
+        {
+            if ( a.idxLeft & c_nFlagMask )
+                return LPush;
+            if ( a.idxRight & c_nFlagMask )
+                return RPush;
+            return Stable;
+        }
+
+        static unsigned int index( unsigned int i )
+        {
+            return i & c_nIndexMask;
+        }
+
+        void stabilize( anchor_type& a )
+        {
+            switch ( status(a)) {
+                case LPush:
+                    stabilize_front(a);
+                    break;
+                case RPush:
+                    stabilize_back(a);
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        void stabilize_front( anchor_type& a )
+        {
+            m_Stat.onStabilizeFront();
+
+            typename gc::template GuardArray<3>  guards;
+            node_type * pLeft;
+            node_type * pRight;
+            unsigned int const idxLeft  = index( a.idxLeft );
+            unsigned int const idxRight = index( a.idxRight );
+
+            guards.assign( 0, node_traits::to_value_ptr( pLeft = m_Mapper.at( idxLeft )) );
+            guards.assign( 1, node_traits::to_value_ptr( pRight = m_Mapper.at( idxRight )) );
+            if ( m_Anchor.load( memory_model::memory_order_acquire ) != a )
+                return;
+
+            unsigned int idxPrev = index( pLeft->m_Links.load(memory_model::memory_order_relaxed ).idxRight );
+            node_type * pPrev;
+            guards.assign( 2, node_traits::to_value_ptr( pPrev = m_Mapper.at( idxPrev )) );
+            if ( m_Anchor.load( memory_model::memory_order_acquire ) != a )
+                return;
+
+            anchor_type prevLinks( pPrev->m_Links.load( memory_model::memory_order_acquire ));
+            if ( index( prevLinks.idxLeft ) != idxLeft ) {
+                if ( m_Anchor.load( memory_model::memory_order_acquire ) != a )
+                    return;
+
+                if ( !pPrev->m_Links.compare_exchange_strong( prevLinks, anchor_type( idxLeft, prevLinks.idxRight ), memory_model::memory_order_release, memory_model::memory_order_relaxed ))
+                    return;
+            }
+
+            // clear RPush/LPush flags
+            m_Anchor.compare_exchange_weak( a, anchor_type(idxLeft, idxRight), memory_model::memory_order_release, memory_model::memory_order_relaxed );
+        }
+
+        void stabilize_back( anchor_type& a )
+        {
+            m_Stat.onStabilizeBack();
+
+            typename gc::template GuardArray<3>  guards;
+            node_type * pLeft;
+            node_type * pRight;
+            unsigned int const idxLeft  = index( a.idxLeft );
+            unsigned int const idxRight = index( a.idxRight );
+
+            guards.assign( 0, node_traits::to_value_ptr( pLeft = m_Mapper.at( idxLeft )) );
+            guards.assign( 1, node_traits::to_value_ptr( pRight = m_Mapper.at( idxRight )) );
+            if ( m_Anchor.load( memory_model::memory_order_acquire ) != a )
+                return;
+
+            unsigned int idxPrev = index( pRight->m_Links.load(memory_model::memory_order_relaxed ).idxLeft );
+            node_type * pPrev;
+            guards.assign( 2, node_traits::to_value_ptr( pPrev = m_Mapper.at( idxPrev )) );
+            if ( m_Anchor.load( memory_model::memory_order_acquire ) != a )
+                return;
+
+            anchor_type prevLinks( pPrev->m_Links.load( memory_model::memory_order_acquire ));
+            if ( index( prevLinks.idxRight ) != idxRight ) {
+                if ( m_Anchor.load( memory_model::memory_order_acquire ) != a )
+                    return;
+
+                if ( !pPrev->m_Links.compare_exchange_strong( prevLinks, anchor_type( prevLinks.idxLeft, idxRight ), memory_model::memory_order_release, memory_model::memory_order_relaxed ))
+                    return;
+            }
+
+            // clear RPush/LPush flags
+            m_Anchor.compare_exchange_weak( a, anchor_type(idxLeft, idxRight), memory_model::memory_order_release, memory_model::memory_order_relaxed );
+        }
+
+        //@endcond
+
+    protected:
+        //@cond
+        struct pop_result {
+            value_type *                        pPopped;
+            unsigned int                        nIdxPopped;
+            typename gc::template GuardArray<2> guards;
+        };
+
+        void dispose_result( pop_result& res )
+        {
+            m_Mapper.unmap( res.nIdxPopped );
+        }
+
+        bool do_pop_back( pop_result& res )
+        {
+            back_off bkoff;
+            anchor_type a;
+
+            while ( true ) {
+                a = m_Anchor.load( memory_model::memory_order_acquire );
+
+                if ( a.idxRight == c_nEmptyIndex ) {
+                    m_Stat.onPopEmpty();
+                    return false;
+                }
+
+                if ( a.idxLeft == a.idxRight ) {
+                    if ( m_Anchor.compare_exchange_weak( a, anchor_type( c_nEmptyIndex, c_nEmptyIndex ), memory_model::memory_order_release, memory_model::memory_order_relaxed ))
+                        break;
+                    bkoff();
+                }
+                else if ( status( a ) == Stable ) {
+                    unsigned int idxLeft  = index( a.idxLeft );
+                    unsigned int idxRight = index( a.idxRight );
+                    node_type * pLeft;
+                    res.guards.assign( 0, node_traits::to_value_ptr( pLeft = m_Mapper.at( idxLeft )) );
+                    node_type * pRight;
+                    res.guards.assign( 1, node_traits::to_value_ptr( pRight = m_Mapper.at( idxRight )) );
+
+                    if ( m_Anchor.load( memory_model::memory_order_acquire ) != a ) {
+                        m_Stat.onPopBackContention();
+                        continue;
+                    }
+
+                    unsigned int nPrev = pRight->m_Links.load( memory_model::memory_order_acquire ).idxLeft;
+                    if ( m_Anchor.compare_exchange_weak( a, anchor_type( a.idxLeft, nPrev ), memory_model::memory_order_release, memory_model::memory_order_relaxed ) )
+                        break;
+                    bkoff();
+                    m_Stat.onPopBackContention();
+                }
+                else
+                    stabilize( a );
+            }
+
+            res.nIdxPopped = a.idxRight;
+            res.pPopped = node_traits::to_value_ptr( m_Mapper.at( a.idxRight ));
+
+            --m_ItemCounter;
+            m_Stat.onPopBack();
+
+            return true;
+        }
+
+        bool do_pop_front( pop_result& res )
+        {
+            back_off bkoff;
+            anchor_type a;
+
+            while ( true ) {
+                a = m_Anchor.load( memory_model::memory_order_acquire );
+
+                if ( a.idxLeft == c_nEmptyIndex ) {
+                    m_Stat.onPopEmpty();
+                    return false;
+                }
+
+                if ( a.idxLeft == a.idxRight ) {
+                    if ( m_Anchor.compare_exchange_weak( a, anchor_type( c_nEmptyIndex, c_nEmptyIndex ), memory_model::memory_order_release, memory_model::memory_order_relaxed ))
+                        break;
+                    bkoff();
+                }
+                else if ( status( a ) == Stable ) {
+                    unsigned int idxLeft  = index( a.idxLeft );
+                    unsigned int idxRight = index( a.idxRight );
+                    node_type * pLeft;
+                    res.guards.assign( 0, node_traits::to_value_ptr( pLeft = m_Mapper.at( idxLeft )) );
+                    node_type * pRight;
+                    res.guards.assign( 1, node_traits::to_value_ptr( pRight = m_Mapper.at( idxRight )) );
+
+                    if ( m_Anchor.load( memory_model::memory_order_acquire ) != a ) {
+                        m_Stat.onPopFrontContention();
+                        continue;
+                    }
+
+                    unsigned int nPrev = pLeft->m_Links.load( memory_model::memory_order_acquire ).idxRight;
+                    if ( m_Anchor.compare_exchange_weak( a, anchor_type( nPrev, a.idxRight ), memory_model::memory_order_release, memory_model::memory_order_relaxed ) )
+                        break;
+                    bkoff();
+                    m_Stat.onPopFrontContention();
+                }
+                else
+                    stabilize( a );
+            }
+
+            res.nIdxPopped = a.idxLeft;
+            res.pPopped = node_traits::to_value_ptr( m_Mapper.at( a.idxLeft ));
+
+            --m_ItemCounter;
+            m_Stat.onPopFront();
+
+            return true;
+        }
+
+        //@endcond
+
+    public:
+        /// Default constructor
+        /**
+            Initializes the deque object with up to <tt>2**16 - 2</tt> items
+        */
+        MichaelDeque()
+            :m_Anchor()
+            ,m_Mapper( 4096, 4 )
+        {
+            m_Anchor.store( anchor_type( c_nEmptyIndex, c_nEmptyIndex ), CDS_ATOMIC::memory_order_release );
+
+            // GC and node_type::gc must be the same
+            static_assert(( std::is_same<gc, typename node_type::gc>::value ), "GC and node_type::gc must be the same");
+
+            // cds::gc::HRC is not allowed
+            static_assert(( !std::is_same<gc, cds::gc::HRC>::value ), "cds::gc::HRC is not allowed here");
+        }
+
+        /// Constructor
+        /**
+            Initializes the deque object with estimated item count \p nMaxItemCount.
+            \p nLoadFactor is a parameter of internal memory mapper based on MichaelHashSet;
+            see MichaelHashSet ctor for details
+        */
+        MichaelDeque( unsigned int nMaxItemCount, unsigned int nLoadFactor = 4 )
+            :m_Anchor()
+            ,m_Mapper( nMaxItemCount, nLoadFactor )
+        {
+            m_Anchor.store( anchor_type( c_nEmptyIndex, c_nEmptyIndex ), CDS_ATOMIC::memory_order_release );
+
+            // GC and node_type::gc must be the same
+            static_assert(( std::is_same<gc, typename node_type::gc>::value ), "GC and node_type::gc must be the same");
+
+            // cds::gc::HRC is not allowed
+            static_assert(( !std::is_same<gc, cds::gc::HRC>::value ), "cds::gc::HRC is not allowed here");
+        }
+
+        /// Destructor clears the deque
+        ~MichaelDeque()
+        {
+            clear();
+        }
+
+    public:
+        /// Push back (right) side
+        /**
+            Push new item \p val to right side of the deque.
+        */
+        bool push_back( value_type& val )
+        {
+            back_off bkoff;
+
+            node_type * pNode = node_traits::to_node_ptr( val );
+            link_checker::is_empty( pNode );
+
+            unsigned int nIdx = m_Mapper.map( val );
+            if ( nIdx == c_nEmptyIndex )
+                return false;
+
+            while ( true ) {
+                anchor_type a = m_Anchor.load( memory_model::memory_order_acquire );
+                if ( a.idxRight == c_nEmptyIndex ) {
+                    if ( m_Anchor.compare_exchange_weak( a, anchor_type( nIdx, nIdx ), memory_model::memory_order_release, memory_model::memory_order_relaxed ))
+                        break;
+                    bkoff();
+                    m_Stat.onPushBackContention();
+                }
+                else if ( status(a) == Stable ) {
+                    pNode->m_Links.store( anchor_type( a.idxRight, c_nEmptyIndex ), memory_model::memory_order_release );
+                    anchor_type aNew( a.idxLeft, nIdx | c_nFlagMask );
+                    if ( m_Anchor.compare_exchange_weak( a, aNew, memory_model::memory_order_release, memory_model::memory_order_relaxed) ) {
+                        stabilize_back( aNew );
+                        break;
+                    }
+                    bkoff();
+                    m_Stat.onPushBackContention();
+                }
+                else
+                    stabilize( a );
+            }
+
+            ++m_ItemCounter;
+            m_Stat.onPushBack();
+            return true;
+        }
+
+        /// Push front (left) side
+        /**
+            Push new item \p val to left side of the deque.
+        */
+        bool push_front( value_type& val )
+        {
+            back_off bkoff;
+            node_type * pNode = node_traits::to_node_ptr( val );
+            link_checker::is_empty( pNode );
+
+            unsigned int nIdx = m_Mapper.map( val );
+            if ( nIdx == c_nEmptyIndex )
+                return false;
+
+            while ( true ) {
+                anchor_type a = m_Anchor.load( memory_model::memory_order_acquire );
+                if ( a.idxLeft == c_nEmptyIndex ) {
+                    if ( m_Anchor.compare_exchange_weak( a, anchor_type( nIdx, nIdx ), memory_model::memory_order_release, memory_model::memory_order_relaxed ))
+                        break;
+                    bkoff();
+                    m_Stat.onPushFrontContention();
+                }
+                else if ( status(a) == Stable ) {
+                    pNode->m_Links.store( anchor_type( c_nEmptyIndex, a.idxLeft ), memory_model::memory_order_release );
+                    anchor_type aNew( nIdx | c_nFlagMask, a.idxRight );
+                    if ( m_Anchor.compare_exchange_weak( a, aNew, memory_model::memory_order_release, memory_model::memory_order_relaxed )) {
+                        stabilize_front( aNew );
+                        break;
+                    }
+                    bkoff();
+                    m_Stat.onPushFrontContention();
+                }
+                else
+                    stabilize( a );
+            }
+
+            ++m_ItemCounter;
+            m_Stat.onPushFront();
+            return true;
+        }
+
+        /// Pop back
+        /**
+            Pops rightmost item from the deque. If the deque is empty then returns \p NULL.
+
+            For popped object the disposer specified in \p Options template parameters is called.
+        */
+        value_type * pop_back()
+        {
+            pop_result res;
+            if ( do_pop_back( res )) {
+                dispose_result( res );
+                return res.pPopped;
+            }
+
+            return null_ptr<value_type *>();
+        }
+
+        /// Pop front
+        /**
+            Pops leftmost item from the deque. If the deque is empty then returns \p NULL.
+
+            For popped object the disposer specified in \p Options template parameters is called.
+        */
+        value_type * pop_front()
+        {
+            pop_result res;
+            if ( do_pop_front( res )) {
+                dispose_result( res );
+                return res.pPopped;
+            }
+
+            return null_ptr<value_type *>();
+        }
+
+        /// Returns deque's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact does not mean that the deque
+            is empty. To check deque emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+        /// Checks if the dequeue is empty
+        bool empty() const
+        {
+            anchor_type a = m_Anchor.load( memory_model::memory_order_relaxed );
+            return a.idxLeft == c_nEmptyIndex && a.idxRight == c_nEmptyIndex;
+        }
+
+        /// Clear the deque
+        /**
+            The function repeatedly calls \ref pop_back until it returns \p NULL.
+            The disposer defined in template \p Options is called for each item
+            that can be safely disposed.
+        */
+        void clear()
+        {
+            while ( pop_back() != null_ptr<value_type *>() );
+        }
+
+        /// Returns reference to internal statistics
+        const stat& statistics() const
+        {
+            return m_Stat;
+        }
+    };
+
+
+}}  // namespace cds::intrusive
+
+
+#endif // #ifndef __CDS_INTRUSIVE_MICHAEL_DEQUE_H
diff --git a/cds/intrusive/michael_list_base.h b/cds/intrusive/michael_list_base.h
new file mode 100644 (file)
index 0000000..96fff3f
--- /dev/null
@@ -0,0 +1,263 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_LIST_BASE_H
+#define __CDS_INTRUSIVE_MICHAEL_LIST_BASE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/opt/compare.h>
+#include <cds/cxx11_atomic.h>
+#include <cds/details/marked_ptr.h>
+#include <cds/ref.h>
+#include <cds/details/make_const_type.h>
+#include <cds/details/std/type_traits.h>
+#include <cds/urcu/options.h>
+
+namespace cds { namespace intrusive {
+
+    /// MichaelList ordered list related definitions
+    /** @ingroup cds_intrusive_helper
+    */
+    namespace michael_list {
+        /// Michael's list node
+        /**
+            Template parameters:
+            - GC - garbage collector
+            - Tag - a tag used to distinguish between different implementation
+        */
+        template <class GC, typename Tag = opt::none>
+        struct node
+        {
+            typedef GC              gc  ;   ///< Garbage collector
+            typedef Tag             tag ;   ///< tag
+
+            typedef cds::details::marked_ptr<node, 1>   marked_ptr         ;   ///< marked pointer
+            typedef typename gc::template atomic_marked_ptr< marked_ptr>     atomic_marked_ptr   ;   ///< atomic marked pointer specific for GC
+
+            atomic_marked_ptr m_pNext ; ///< pointer to the next node in the container
+
+            CDS_CONSTEXPR node() CDS_NOEXCEPT
+                : m_pNext( null_ptr<node *>() )
+            {}
+        };
+
+        //@cond
+        template <typename GC, typename Node, typename MemoryModel>
+        struct node_cleaner {
+            void operator()( Node * p )
+            {
+                typedef typename Node::marked_ptr marked_ptr;
+                p->m_pNext.store( marked_ptr(), MemoryModel::memory_order_release );
+            }
+        };
+        //@endcond
+
+        //@cond
+        struct undefined_gc;
+        struct default_hook {
+            typedef undefined_gc    gc;
+            typedef opt::none       tag;
+        };
+        //@endcond
+
+        //@cond
+        template < typename HookType, CDS_DECL_OPTIONS2>
+        struct hook
+        {
+            typedef typename opt::make_options< default_hook, CDS_OPTIONS2>::type  options;
+            typedef typename options::gc    gc;
+            typedef typename options::tag   tag;
+            typedef node<gc, tag>   node_type;
+            typedef HookType        hook_type;
+        };
+        //@endcond
+
+        /// Base hook
+        /**
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template < CDS_DECL_OPTIONS2 >
+        struct base_hook: public hook< opt::base_hook_tag, CDS_OPTIONS2 >
+        {};
+
+        /// Member hook
+        /**
+            \p MemberOffset defines offset in bytes of \ref node member into your structure.
+            Use \p offsetof macro to define \p MemberOffset
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template < size_t MemberOffset, CDS_DECL_OPTIONS2 >
+        struct member_hook: public hook< opt::member_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            static const size_t c_nMemberOffset = MemberOffset;
+            //@endcond
+        };
+
+        /// Traits hook
+        /**
+            \p NodeTraits defines type traits for node.
+            See \ref node_traits for \p NodeTraits interface description
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template <typename NodeTraits, CDS_DECL_OPTIONS2 >
+        struct traits_hook: public hook< opt::traits_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            typedef NodeTraits node_traits;
+            //@endcond
+        };
+
+        /// Check link
+        template <typename Node>
+        struct link_checker
+        {
+            //@cond
+            typedef Node node_type;
+            //@endcond
+
+            /// Checks if the link field of node \p pNode is \p NULL
+            /**
+                An asserting is generated if \p pNode link field is not \p NULL
+            */
+            static void is_empty( const node_type * pNode )
+            {
+                assert( pNode->m_pNext.load(CDS_ATOMIC::memory_order_relaxed) == null_ptr<node_type *>() );
+            }
+        };
+
+        //@cond
+        template <class GC, typename Node, opt::link_check_type LinkType >
+        struct link_checker_selector;
+
+        template <typename GC, typename Node>
+        struct link_checker_selector< GC, Node, opt::never_check_link >
+        {
+            typedef intrusive::opt::v::empty_link_checker<Node>  type;
+        };
+
+        template <typename GC, typename Node>
+        struct link_checker_selector< GC, Node, opt::debug_check_link >
+        {
+#       ifdef _DEBUG
+            typedef link_checker<Node>  type;
+#       else
+            typedef intrusive::opt::v::empty_link_checker<Node>  type;
+#       endif
+        };
+
+        template <typename GC, typename Node>
+        struct link_checker_selector< GC, Node, opt::always_check_link >
+        {
+            typedef link_checker<Node>  type;
+        };
+        //@endcond
+
+        /// Metafunction for selecting appropriate link checking policy
+        template < typename Node, opt::link_check_type LinkType >
+        struct get_link_checker
+        {
+            //@cond
+            typedef typename link_checker_selector< typename Node::gc, Node, LinkType>::type type;
+            //@endcond
+        };
+
+        /// Type traits for MichaelList class
+        struct type_traits
+        {
+            /// Hook used
+            /**
+                Possible values are: michael_list::base_hook, michael_list::member_hook, michael_list::traits_hook.
+            */
+            typedef base_hook<>       hook;
+
+            /// Key comparison functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+            */
+            typedef opt::none                       compare;
+
+            /// specifies binary predicate used for key compare.
+            /**
+                Default is \p std::less<T>.
+            */
+            typedef opt::none                       less;
+
+            /// back-off strategy used
+            /**
+                If the option is not specified, the cds::backoff::Default is used.
+            */
+            typedef cds::backoff::Default           back_off;
+
+            /// Disposer
+            /**
+                the functor used for dispose removed items. Default is opt::v::empty_disposer.
+            */
+            typedef opt::v::empty_disposer          disposer;
+
+            /// Item counter
+            /**
+                The type for item counting feature.
+                Default is no item counter (\ref atomicity::empty_item_counter)
+            */
+            typedef atomicity::empty_item_counter     item_counter;
+
+            /// Link fields checking feature
+            /**
+                Default is \ref opt::debug_check_link
+            */
+            static const opt::link_check_type link_checker = opt::debug_check_link;
+
+            /// C++ memory ordering model
+            /**
+                List of available memory ordering see opt::memory_model
+            */
+            typedef opt::v::relaxed_ordering        memory_model;
+
+            /// RCU deadlock checking policy (only for \ref cds_intrusive_MichaelList_rcu "RCU-based MichaelList")
+            /**
+                List of available options see opt::rcu_check_deadlock
+            */
+            typedef opt::v::rcu_throw_deadlock      rcu_check_deadlock;
+        };
+
+        /// Metafunction converting option list to traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options list see \ref MichaelList.
+        */
+        template <CDS_DECL_OPTIONS9>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS9 >::type
+                ,CDS_OPTIONS9
+            >::type   type;
+            //typedef typename cds::opt::make_options< type_traits, CDS_OPTIONS9>::type type  ;   ///< Result of metafunction
+#   endif
+        };
+
+    } // namespace michael_list
+
+    //@cond
+    // Forward declaration
+    template < class GC, typename T, class Traits = michael_list::type_traits >
+    class MichaelList;
+    //@endcond
+
+
+    /// Tag for selecting Michael list
+    //class michael_list_tag;
+
+}}   // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_MICHAEL_LIST_BASE_H
diff --git a/cds/intrusive/michael_list_hp.h b/cds/intrusive/michael_list_hp.h
new file mode 100644 (file)
index 0000000..f506581
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_LIST_HP_H
+#define __CDS_INTRUSIVE_MICHAEL_LIST_HP_H
+
+#include <cds/intrusive/michael_list_impl.h>
+#include <cds/gc/hp.h>
+
+#endif // #ifndef __CDS_INTRUSIVE_MICHAEL_LIST_HP_H
diff --git a/cds/intrusive/michael_list_hrc.h b/cds/intrusive/michael_list_hrc.h
new file mode 100644 (file)
index 0000000..bded07f
--- /dev/null
@@ -0,0 +1,76 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_LIST_HRC_H
+#define __CDS_INTRUSIVE_MICHAEL_LIST_HRC_H
+
+#include <cds/intrusive/michael_list_impl.h>
+#include <cds/gc/hrc.h>
+
+namespace cds { namespace intrusive { namespace michael_list {
+    //@cond
+    // Specialization for HRC GC
+    template <typename Tag>
+    struct node< gc::HRC, Tag>: public gc::HRC::container_node
+    {
+        typedef gc::HRC gc  ;   ///< Garbage collector
+        typedef Tag     tag ;   ///< tag
+
+        typedef cds::details::marked_ptr<node, 1>   marked_ptr         ;   ///< marked pointer
+        typedef typename gc::atomic_marked_ptr< marked_ptr>     atomic_marked_ptr   ;   ///< atomic marked pointer
+        atomic_marked_ptr m_pNext ; ///< pointer to the next node in the stack
+
+        node()
+            : m_pNext( null_ptr<node *>() )
+        {}
+
+    protected:
+        virtual void cleanUp( cds::gc::hrc::ThreadGC * pGC )
+        {
+            assert( pGC != NULL );
+            typename gc::GuardArray<2> aGuards( *pGC );
+
+            while ( true ) {
+                marked_ptr pNextMarked( aGuards.protect( 0, m_pNext ));
+                node * pNext = pNextMarked.ptr();
+                if ( pNext && pNext->m_bDeleted.load(CDS_ATOMIC::memory_order_acquire) ) {
+                    marked_ptr p = aGuards.protect( 1, pNext->m_pNext );
+                    m_pNext.compare_exchange_strong( pNextMarked, p, CDS_ATOMIC::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed );
+                    continue;
+                }
+                else {
+                    break;
+                }
+            }
+        }
+
+        virtual void terminate( cds::gc::hrc::ThreadGC * pGC, bool bConcurrent )
+        {
+            if ( bConcurrent ) {
+                marked_ptr pNext = m_pNext.load(CDS_ATOMIC::memory_order_acquire);
+                do {} while ( !m_pNext.compare_exchange_weak( pNext, marked_ptr(), CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) );
+            }
+            else {
+                m_pNext.store( marked_ptr(), CDS_ATOMIC::memory_order_relaxed );
+            }
+        }
+    };
+    //@endcond
+
+
+    //@cond
+    template <typename NODE>
+    struct link_checker_selector< gc::HRC, NODE, opt::never_check_link >
+    {
+        typedef link_checker<NODE>  type;
+    };
+
+    template <typename NODE>
+    struct link_checker_selector< gc::HRC, NODE, opt::debug_check_link >
+    {
+        typedef link_checker<NODE>  type;
+    };
+    //@endcond
+
+}}}   // namespace cds::intrusive::michael_list
+
+#endif // #ifndef __CDS_INTRUSIVE_MICHAEL_LIST_HP_H
diff --git a/cds/intrusive/michael_list_impl.h b/cds/intrusive/michael_list_impl.h
new file mode 100644 (file)
index 0000000..bf6a1b9
--- /dev/null
@@ -0,0 +1,1174 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_LIST_IMPL_H
+#define __CDS_INTRUSIVE_MICHAEL_LIST_IMPL_H
+
+#include <cds/intrusive/michael_list_base.h>
+#include <cds/gc/guarded_ptr.h>
+
+namespace cds { namespace intrusive {
+
+    /// Michael's lock-free ordered single-linked list
+    /** @ingroup cds_intrusive_list
+        \anchor cds_intrusive_MichaelList_hp
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Source:
+            - [2002] Maged Michael "High performance dynamic lock-free hash tables and list-based sets"
+
+        Template arguments:
+        - \p GC - Garbage collector used. Note the \p GC must be the same as the GC used for item type \p T (see michael_list::node).
+        - \p T - type to be stored in the list. The type must be based on michael_list::node (for michael_list::base_hook)
+            or it must have a member of type michael_list::node (for michael_list::member_hook).
+        - \p Traits - type traits. See michael_list::type_traits for explanation.
+
+        It is possible to declare option-based list with cds::intrusive::michael_list::make_traits metafunction istead of \p Traits template
+        argument.
+
+        Template argument list \p Options of cds::intrusive::michael_list::make_traits metafunction are:
+        - opt::hook - hook used. Possible values are: michael_list::base_hook, michael_list::member_hook, michael_list::traits_hook.
+            If the option is not specified, <tt>michael_list::base_hook<></tt> and gc::HP is used.
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer. Due the nature
+            of GC schema the disposer may be called asynchronously.
+        - opt::link_checker - the type of node's link fields checking. Default is \ref opt::debug_check_link
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        For example, the following traits-based declaration of gc::HP Michael's list
+        \code
+        #include <cds/intrusive/michael_list_hp.h>
+        // Declare item stored in your list
+        struct item: public cds::intrusive::michael_list::node< cds::gc::HP >
+        {
+            int nKey;
+            // .... other data
+        };
+
+        // Declare comparator for the item
+        struct my_compare {
+            int operator()( item const& i1, item const& i2 ) const
+            {
+                return i1.nKey - i2.nKey;
+            }
+        };
+
+        // Declare type_traits
+        struct my_traits: public cds::intrusive::michael_list::type_traits
+        {
+            typedef cds::intrusive::michael_list::base_hook< cds::opt::gc< cds::gc::HP > >   hook;
+            typedef my_compare compare;
+        };
+
+        // Declare traits-based list
+        typedef cds::intrusive::MichaelList< cds::gc::HP, item, my_traits >     traits_based_list;
+        \endcode
+
+        is equivalent for the following option-based list
+        \code
+        #include <cds/intrusive/michael_list_hp.h>
+
+        // item struct and my_compare are the same
+
+        // Declare option-based list
+        typedef cds::intrusive::MichaelList< cds::gc::HP, item,
+            typename cds::intrusive::michael_list::make_traits<
+                cds::intrusive::opt::hook< cds::intrusive::michael_list::base_hook< cds::opt::gc< cds::gc::HP > > >    // hook option
+                ,cds::intrusive::opt::compare< my_compare >     // item comparator option
+            >::type
+        >     option_based_list;
+        \endcode
+
+        \par Usage
+        There are different specializations of this template for each garbage collecting schema used.
+        You should select GC needed and include appropriate .h-file:
+        - for gc::HP: \code #include <cds/intrusive/michael_list_hp.h> \endcode
+        - for gc::PTB: \code #include <cds/intrusive/michael_list_ptb.h> \endcode
+        - for gc::HRC: \code #include <cds/intrusive/michael_list_hrc.h> \endcode
+        - for \ref cds_urcu_gc "RCU type" - see \ref cds_intrusive_MichaelList_rcu "RCU-based MichaelList"
+        - for gc::nogc: \code #include <cds/intrusive/michael_list_nogc.h> \endcode
+            See \ref cds_intrusive_MichaelList_nogc "non-GC MichaelList"
+
+        Then, you should incorporate michael_list::node into your struct \p T and provide
+        appropriate michael_list::type_traits::hook in your \p Traits template parameters. Usually, for \p Traits you
+        define a struct based on michael_list::type_traits.
+
+        Example for gc::PTB and base hook:
+        \code
+        // Include GC-related Michael's list specialization
+        #include <cds/intrusive/michael_list_ptb.h>
+
+        // Data stored in Michael's list
+        struct my_data: public cds::intrusive::michael_list::node< cds::gc::PTB >
+        {
+            // key field
+            std::string     strKey;
+
+            // other data
+            // ...
+        };
+
+        // my_data comparing functor
+        struct my_data_cmp {
+            int operator()( const my_data& d1, const my_data& d2 )
+            {
+                return d1.strKey.compare( d2.strKey );
+            }
+
+            int operator()( const my_data& d, const std::string& s )
+            {
+                return d.strKey.compare(s);
+            }
+
+            int operator()( const std::string& s, const my_data& d )
+            {
+                return s.compare( d.strKey );
+            }
+        };
+
+
+        // Declare type_traits
+        struct my_traits: public cds::intrusive::michael_list::type_traits
+        {
+            typedef cds::intrusive::michael_list::base_hook< cds::opt::gc< cds::gc::PTB > >   hook;
+            typedef my_data_cmp compare;
+        };
+
+        // Declare list type
+        typedef cds::intrusive::MichaelList< cds::gc::PTB, my_data, my_traits >     traits_based_list;
+        \endcode
+
+        Equivalent option-based code:
+        \code
+        // GC-related specialization
+        #include <cds/intrusive/michael_list_ptb.h>
+
+        struct my_data {
+            // see above
+        };
+        struct compare {
+            // see above
+        };
+
+        // Declare option-based list
+        typedef cds::intrusive::MichaelList< cds::gc::PTB
+            ,my_data
+            , typename cds::intrusive::michael_list::make_traits<
+                cds::intrusive::opt::hook< cds::intrusive::michael_list::base_hook< cds::opt::gc< cds::gc::PTB > > >
+                ,cds::intrusive::opt::compare< my_data_cmp >
+            >::type
+        > option_based_list;
+
+        \endcode
+    */
+    template <
+        class GC
+        ,typename T
+#ifdef CDS_DOXYGEN_INVOKED
+        ,class Traits = michael_list::type_traits
+#else
+        ,class Traits
+#endif
+    >
+    class MichaelList
+    {
+    public:
+        typedef T       value_type      ;   ///< type of value stored in the list
+        typedef Traits  options         ;   ///< Traits template parameter
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key comparison functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+#   endif
+
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+        typedef typename michael_list::get_link_checker< node_type, options::link_checker >::type link_checker   ;   ///< link checker
+
+        typedef GC  gc          ;   ///< Garbage collector
+        typedef typename options::back_off  back_off    ;   ///< back-off strategy
+        typedef typename options::item_counter item_counter ;   ///< Item counting policy used
+        typedef typename options::memory_model  memory_model;   ///< Memory ordering. See cds::opt::memory_model option
+
+        typedef cds::gc::guarded_ptr< gc, value_type > guarded_ptr; ///< Guarded pointer
+
+        //@cond
+        // Rebind options (split-list support)
+        template <CDS_DECL_OPTIONS7>
+        struct rebind_options {
+            typedef MichaelList<
+                gc
+                , value_type
+                , typename cds::opt::make_options< options, CDS_OPTIONS7>::type
+            >   type;
+        };
+        //@endcond
+
+    protected:
+        typedef typename node_type::atomic_marked_ptr   atomic_node_ptr ;   ///< Atomic node pointer
+        typedef typename node_type::marked_ptr          marked_node_ptr ;   ///< Node marked pointer
+
+        typedef atomic_node_ptr     auxiliary_head      ;   ///< Auxiliary head type (for split-list support)
+
+        atomic_node_ptr     m_pHead         ;   ///< Head pointer
+        item_counter        m_ItemCounter   ;   ///< Item counter
+
+        //@cond
+        /// Position pointer for item search
+        struct position {
+            atomic_node_ptr * pPrev ;   ///< Previous node
+            node_type * pCur        ;   ///< Current node
+            node_type * pNext       ;   ///< Next node
+
+            typename gc::template GuardArray<3> guards  ;   ///< Guards array
+
+            enum {
+                guard_prev_item,
+                guard_current_item,
+                guard_next_item
+            };
+        };
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_erase_functor {
+            void operator()( value_type const & item )
+            {}
+        };
+#   endif
+
+        struct clean_disposer {
+            void operator()( value_type * p )
+            {
+                michael_list::node_cleaner<gc, node_type, memory_model>()( node_traits::to_node_ptr( p ) );
+                disposer()( p );
+            }
+        };
+
+        //@endcond
+
+    protected:
+        //@cond
+        void retire_node( node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            gc::template retire<clean_disposer>( node_traits::to_value_ptr( *pNode ) );
+        }
+
+        bool link_node( node_type * pNode, position& pos )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            link_checker::is_empty( pNode );
+
+            marked_node_ptr cur(pos.pCur);
+            pNode->m_pNext.store( cur, memory_model::memory_order_relaxed );
+            return pos.pPrev->compare_exchange_strong( cur, marked_node_ptr(pNode), memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        bool unlink_node( position& pos )
+        {
+            assert( pos.pPrev != null_ptr<atomic_node_ptr *>() );
+            assert( pos.pCur != null_ptr<node_type *>() );
+
+            // Mark the node (logical deleting)
+            marked_node_ptr next(pos.pNext, 0);
+            if ( pos.pCur->m_pNext.compare_exchange_strong( next, marked_node_ptr(pos.pNext, 1), memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) {
+                // physical deletion may be performed by search function if it detects that a node is logically deleted (marked)
+                // CAS may be successful here or in other thread that searching something
+                marked_node_ptr cur(pos.pCur);
+                if ( pos.pPrev->compare_exchange_strong( cur, marked_node_ptr( pos.pNext ), memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                    retire_node( pos.pCur );
+                return true;
+            }
+            return false;
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type
+        {
+            friend class MichaelList;
+
+        protected:
+            value_type * m_pNode;
+            typename gc::Guard  m_Guard;
+
+            void next()
+            {
+                if ( m_pNode ) {
+                    typename gc::Guard g;
+                    node_type * pCur = node_traits::to_node_ptr( *m_pNode );
+
+                    marked_node_ptr pNext;
+                    do {
+                        pNext = pCur->m_pNext.load(memory_model::memory_order_relaxed);
+                        g.assign( node_traits::to_value_ptr( pNext.ptr() ));
+                    } while ( pNext != pCur->m_pNext.load(memory_model::memory_order_acquire) );
+
+                    if ( pNext.ptr() ) {
+                        m_pNode = m_Guard.assign( g.template get<value_type>() );
+                    }
+                    else {
+                        m_pNode = null_ptr<value_type *>();
+                        m_Guard.clear();
+                    }
+                }
+            }
+
+            iterator_type( atomic_node_ptr const& pNode )
+            {
+                for (;;) {
+                    marked_node_ptr p = pNode.load(memory_model::memory_order_relaxed);
+                    if ( p.ptr() ) {
+                        m_pNode = m_Guard.assign( node_traits::to_value_ptr( p.ptr() ) );
+                    }
+                    else {
+                        m_pNode = null_ptr<value_type *>();
+                        m_Guard.clear();
+                    }
+                    if ( p == pNode.load(memory_model::memory_order_acquire) )
+                        break;
+                }
+            }
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+            iterator_type()
+                : m_pNode( null_ptr<value_type *>() )
+            {}
+
+            iterator_type( iterator_type const& src )
+            {
+                if ( src.m_pNode ) {
+                    m_pNode = m_Guard.assign( src.m_pNode );
+                }
+                else
+                    m_pNode = null_ptr<value_type *>();
+            }
+
+            value_ptr operator ->() const
+            {
+                return m_pNode;
+            }
+
+            value_ref operator *() const
+            {
+                assert( m_pNode != null_ptr<value_type *>() );
+                return *m_pNode;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                next();
+                return *this;
+            }
+
+            iterator_type& operator = (iterator_type const& src)
+            {
+                m_pNode = src.m_pNode;
+                m_Guard.assign( m_pNode );
+                return *this;
+            }
+
+            /*
+            /// Post-increment
+            void operator ++(int)
+            {
+                next();
+            }
+            */
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return m_pNode == i.m_pNode;
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return m_pNode != i.m_pNode;
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for Michael's list has some features:
+            - it has no post-increment operator
+            - to protect the value, the iterator contains a GC-specific guard + another guard is required locally for increment operator.
+              For some GC (gc::HP, gc::HRC), a guard is limited resource per thread, so an exception (or assertion) "no free guard"
+              may be thrown if a limit of guard count per thread is exceeded.
+            - The iterator cannot be moved across thread boundary since it contains GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the list.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use the iterator on the concurrent container
+            for debug purpose only.
+
+            The iterator interface:
+            \code
+            class iterator {
+            public:
+                // Default constructor
+                iterator();
+
+                // Copy construtor
+                iterator( iterator const& src );
+
+                // Dereference operator
+                value_type * operator ->() const;
+
+                // Dereference operator
+                value_type& operator *() const;
+
+                // Preincrement operator
+                iterator& operator ++();
+
+                // Assignment operator
+                iterator& operator = (iterator const& src);
+
+                // Equality operators
+                bool operator ==(iterator const& i ) const;
+                bool operator !=(iterator const& i ) const;
+            };
+            \endcode
+        */
+        typedef iterator_type<false>    iterator;
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_pHead );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value equals to <tt>NULL</tt>.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list <tt>begin() == end()</tt>
+        */
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        const_iterator cbegin()
+        {
+            return const_iterator( m_pHead );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        const_iterator begin() const
+        {
+            return const_iterator( m_pHead );
+        }
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        const_iterator cend()
+        {
+            return const_iterator();
+        }
+
+    public:
+        /// Default constructor initializes empty list
+        MichaelList()
+            : m_pHead(null_ptr<node_type *>())
+        {
+            static_assert( (std::is_same< gc, typename node_type::gc >::value), "GC and node_type::gc must be the same type" );
+        }
+
+        /// Destroys the list object
+        ~MichaelList()
+        {
+            clear();
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the list if the list does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is linked into the list, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            return insert_at( m_pHead, val );
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split new item creating into two part:
+            - create item with key only
+            - insert new item into the list
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this list's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success and may be passed by reference
+            using <tt>boost::ref</tt>.
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            return insert_at( m_pHead, val, f );
+        }
+
+        /// Ensures that the \p item exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the list, then \p val is inserted into the list.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refers to the same thing.
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            return ensure_at( m_pHead, val, func );
+        }
+
+        /// Unlinks the item \p val from the list
+        /**
+            The function searches the item \p val in the list and unlink it from the list
+            if it is found and it is equal to \p val.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of that list, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+            return unlink_at( m_pHead, val );
+        }
+
+        /// Deletes the item from the list
+        /** \anchor cds_intrusive_MichaelList_hp_erase_val
+            The function searches an item with key equal to \p val in the list,
+            unlinks it from the list, and returns \p true.
+            If the item with the key equal to \p val is not found the function return \p false.
+        */
+        template <typename Q>
+        bool erase( Q const& val )
+        {
+            return erase_at( m_pHead, val, key_comparator() );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_hp_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& val, Less pred )
+        {
+            return erase_at( m_pHead, val, cds::opt::details::make_comparator_from_less<Less>());
+        }
+
+        /// Deletes the item from the list
+        /** \anchor cds_intrusive_MichaelList_hp_erase_func
+            The function searches an item with key equal to \p val in the list,
+            call \p func functor with item found, unlinks it from the list, and returns \p true.
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            If the item with the key equal to \p val is not found the function return \p false.
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& val, Func func )
+        {
+            return erase_at( m_pHead, val, key_comparator(), func );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_hp_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& val, Less pred, Func f )
+        {
+            return erase_at( m_pHead, val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Extracts the item from the list with specified \p key
+        /** \anchor cds_intrusive_MichaelList_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the list, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The \ref disposer specified in \p Traits class template parameter is called automatically
+            by garbage collector \p GC when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::MichaelList< cds::gc::HP, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                theList.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& dest, Q const& key )
+        {
+            return extract_at( m_pHead, dest.guard(), key, key_comparator() );
+        }
+
+        /// Extracts the item using compare functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_hp_extract "extract(guarded_ptr&, Q const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& dest, Q const& key, Less pred )
+        {
+            return extract_at( m_pHead, dest.guard(), key, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelList_hp_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the function is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_at( m_pHead, val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_hp_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_at( m_pHead, val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelList_hp_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You may pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the function is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The function does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_at( m_pHead, val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_hp_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_at( m_pHead, val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelList_hp_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise
+        */
+        template <typename Q>
+        bool find( Q const & val )
+        {
+            return find_at( m_pHead, val, key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_hp_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+            return find_at( m_pHead, val, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_intrusive_MichaelList_hp_get
+            The function searches the item with key equal to \p val
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p val is found, and \p false otherwise.
+            If \p val is not found the \p ptr parameter is not changed.
+
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC automatically when returned \ref guarded_ptr object
+            will be destroyed or released.
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::MichaelList< cds::gc::HP, foo, my_traits >  ord_list;
+            ord_list theList;
+            // ...
+            {
+                ord_list::guarded_ptr gp;
+                if ( theList.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& ptr, Q const& val )
+        {
+            return get_at( m_pHead, ptr.guard(), val, key_comparator() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_hp_get "get( guarded_ptr& ptr, Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& ptr, Q const& val, Less pred )
+        {
+            return get_at( m_pHead, ptr.guard(), val, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Clears the list
+        /**
+            The function unlink all items from the list.
+        */
+        void clear()
+        {
+            typename gc::Guard guard;
+            marked_node_ptr head;
+            while ( true ) {
+                head = m_pHead.load(memory_model::memory_order_relaxed);
+                if ( head.ptr() )
+                    guard.assign( node_traits::to_value_ptr( *head.ptr() ));
+                if ( m_pHead.load(memory_model::memory_order_acquire) == head ) {
+                    if ( head.ptr() == null_ptr<node_type *>() )
+                        break;
+                    value_type& val = *node_traits::to_value_ptr( *head.ptr() );
+                    unlink( val );
+                }
+            }
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return m_pHead.load(memory_model::memory_order_relaxed).all() == null_ptr<node_type *>();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+    protected:
+        //@cond
+        // split-list support
+        bool insert_aux_node( node_type * pNode )
+        {
+            return insert_aux_node( m_pHead, pNode );
+        }
+
+        // split-list support
+        bool insert_aux_node( atomic_node_ptr& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+
+            // Hack: convert node_type to value_type.
+            // In principle, auxiliary node can be non-reducible to value_type
+            // We assume that comparator can correctly distinguish aux and regular node.
+            return insert_at( refHead, *node_traits::to_value_ptr( pNode ) );
+        }
+
+        bool insert_at( atomic_node_ptr& refHead, value_type& val )
+        {
+            node_type * pNode = node_traits::to_node_ptr( val );
+            link_checker::is_empty( pNode );
+            position pos;
+
+            while ( true ) {
+                if ( search( refHead, val, pos, key_comparator() ) )
+                    return false;
+
+                if ( link_node( pNode, pos ) ) {
+                    ++m_ItemCounter;
+                    return true;
+                }
+
+                // clear next field
+                pNode->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+            }
+        }
+
+        template <typename Func>
+        bool insert_at( atomic_node_ptr& refHead, value_type& val, Func f )
+        {
+            node_type * pNode = node_traits::to_node_ptr( val );
+            link_checker::is_empty( pNode );
+            position pos;
+
+            while ( true ) {
+                if ( search( refHead, val, pos, key_comparator() ) )
+                    return false;
+
+                typename gc::Guard guard;
+                guard.assign( &val );
+                if ( link_node( pNode, pos ) ) {
+                    cds::unref(f)( val );
+                    ++m_ItemCounter;
+                    return true;
+                }
+
+                // clear next field
+                pNode->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+            }
+        }
+
+        template <typename Func>
+        std::pair<bool, bool> ensure_at( atomic_node_ptr& refHead, value_type& val, Func func )
+        {
+            position pos;
+
+            node_type * pNode = node_traits::to_node_ptr( val );
+            while ( true ) {
+                if ( search( refHead, val, pos, key_comparator() ) ) {
+                    if ( pos.pCur->m_pNext.load(memory_model::memory_order_acquire).bits() ) {
+                        back_off()();
+                        continue        ;   // the node found is marked as deleted
+                    }
+                    assert( key_comparator()( val, *node_traits::to_value_ptr( *pos.pCur ) ) == 0 );
+
+                    unref(func)( false, *node_traits::to_value_ptr( *pos.pCur ) , val );
+                    return std::make_pair( true, false );
+                }
+                else {
+                    typename gc::Guard guard;
+                    guard.assign( &val );
+                    if ( link_node( pNode, pos ) ) {
+                        ++m_ItemCounter;
+                        unref(func)( true, val, val );
+                        return std::make_pair( true, true );
+                    }
+                    // clear next field
+                    pNode->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+                }
+            }
+        }
+
+        bool unlink_at( atomic_node_ptr& refHead, value_type& val )
+        {
+            position pos;
+
+            back_off bkoff;
+            while ( search( refHead, val, pos, key_comparator() ) ) {
+                if ( node_traits::to_value_ptr( *pos.pCur ) == &val ) {
+                    if ( unlink_node( pos ) ) {
+                        --m_ItemCounter;
+                        return true;
+                    }
+                    else
+                        bkoff();
+                }
+                else
+                    break;
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( atomic_node_ptr& refHead, const Q& val, Compare cmp, Func f, position& pos )
+        {
+            back_off bkoff;
+            while ( search( refHead, val, pos, cmp )) {
+                if ( unlink_node( pos ) ) {
+                    cds::unref(f)( *node_traits::to_value_ptr( *pos.pCur ) );
+                    --m_ItemCounter;
+                    return true;
+                }
+                else
+                    bkoff();
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( atomic_node_ptr& refHead, const Q& val, Compare cmp, Func f )
+        {
+            position pos;
+            return erase_at( refHead, val, cmp, f, pos );
+        }
+
+        template <typename Q, typename Compare>
+        bool erase_at( atomic_node_ptr& refHead, Q const& val, Compare cmp )
+        {
+            position pos;
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( refHead, val, cmp, [](value_type const&){}, pos );
+#       else
+            return erase_at( refHead, val, cmp, empty_erase_functor(), pos );
+#       endif
+        }
+
+        template <typename Q, typename Compare>
+        bool extract_at( atomic_node_ptr& refHead, typename gc::Guard& dest, Q const& val, Compare cmp )
+        {
+            position pos;
+            back_off bkoff;
+            while ( search( refHead, val, pos, cmp )) {
+                if ( unlink_node( pos ) ) {
+                    dest.assign( pos.guards.template get<value_type>( position::guard_current_item ) );
+                    --m_ItemCounter;
+                    return true;
+                }
+                else
+                    bkoff();
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        bool find_at( atomic_node_ptr& refHead, Q const& val, Compare cmp )
+        {
+            position pos;
+            return search( refHead, val, pos, cmp );
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_at( atomic_node_ptr& refHead, Q& val, Compare cmp, Func f )
+        {
+            position pos;
+            if ( search( refHead, val, pos, cmp )) {
+                cds::unref(f)( *node_traits::to_value_ptr( *pos.pCur ), val );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        bool get_at( atomic_node_ptr& refHead, typename gc::Guard& guard, Q const& val, Compare cmp )
+        {
+            position pos;
+            if ( search( refHead, val, pos, cmp )) {
+                guard.assign( pos.guards.template get<value_type>( position::guard_current_item ));
+                return true;
+            }
+            return false;
+        }
+
+        //@endcond
+
+    protected:
+
+        //@cond
+        template <typename Q, typename Compare >
+        bool search( atomic_node_ptr& refHead, const Q& val, position& pos, Compare cmp )
+        {
+            atomic_node_ptr * pPrev;
+            marked_node_ptr pNext;
+            marked_node_ptr pCur;
+
+            back_off        bkoff;
+
+try_again:
+            pPrev = &refHead;
+            pNext = null_ptr<node_type *>();
+
+            pCur = pPrev->load(memory_model::memory_order_relaxed);
+            pos.guards.assign( position::guard_current_item, node_traits::to_value_ptr( pCur.ptr() ) );
+            if ( pPrev->load(memory_model::memory_order_acquire) != pCur.ptr() )
+                goto try_again;
+
+            while ( true ) {
+                if ( pCur.ptr() == null_ptr<node_type *>() ) {
+                    pos.pPrev = pPrev;
+                    pos.pCur = pCur.ptr();
+                    pos.pNext = pNext.ptr();
+                    return false;
+                }
+
+                pNext = pCur->m_pNext.load(memory_model::memory_order_relaxed);
+                pos.guards.assign( position::guard_next_item, node_traits::to_value_ptr( pNext.ptr() ));
+                if ( pCur->m_pNext.load(memory_model::memory_order_relaxed).all() != pNext.all() ) {
+                    bkoff();
+                    goto try_again;
+                }
+
+                if ( pPrev->load(memory_model::memory_order_relaxed).all() != pCur.ptr() ) {
+                    bkoff();
+                    goto try_again;
+                }
+
+                // pNext contains deletion mark for pCur
+                if ( pNext.bits() == 1 ) {
+                    // pCur marked i.e. logically deleted. Help the erase/unlink function to unlink pCur node
+                    marked_node_ptr cur( pCur.ptr());
+                    if ( pPrev->compare_exchange_strong( cur, marked_node_ptr( pNext.ptr() ), memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) {
+                        retire_node( pCur.ptr() );
+                    }
+                    else {
+                        bkoff();
+                        goto try_again;
+                    }
+                }
+                else {
+                    assert( pCur.ptr() != null_ptr<node_type *>() );
+                    int nCmp = cmp( *node_traits::to_value_ptr( pCur.ptr() ), val );
+                    if ( nCmp >= 0 ) {
+                        pos.pPrev = pPrev;
+                        pos.pCur = pCur.ptr();
+                        pos.pNext = pNext.ptr();
+                        return nCmp == 0;
+                    }
+                    pPrev = &( pCur->m_pNext );
+                    pos.guards.assign( position::guard_prev_item, node_traits::to_value_ptr( pCur.ptr() ) );
+                }
+                pCur = pNext;
+                pos.guards.assign( position::guard_current_item, node_traits::to_value_ptr( pCur.ptr() ));
+            }
+        }
+        //@endcond
+    };
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_MICHAEL_LIST_IMPL_H
diff --git a/cds/intrusive/michael_list_nogc.h b/cds/intrusive/michael_list_nogc.h
new file mode 100644 (file)
index 0000000..107c04b
--- /dev/null
@@ -0,0 +1,644 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_LIST_NOGC_H
+#define __CDS_INTRUSIVE_MICHAEL_LIST_NOGC_H
+
+#include <cds/intrusive/michael_list_base.h>
+#include <cds/gc/nogc.h>
+
+namespace cds { namespace intrusive {
+
+    namespace michael_list {
+        /// Michael list node
+        /**
+            Template parameters:
+            - Tag - a tag used to distinguish between different implementation
+        */
+        template <typename Tag>
+        struct node<gc::nogc, Tag>
+        {
+            typedef gc::nogc        gc  ;   ///< Garbage collector
+            typedef Tag             tag ;   ///< tag
+
+            typedef CDS_ATOMIC::atomic< node * >   atomic_ptr  ;    ///< atomic marked pointer
+
+            atomic_ptr m_pNext ; ///< pointer to the next node in the container
+
+            node()
+                : m_pNext( null_ptr<node *>())
+            {}
+        };
+
+    }   // namespace michael_list
+
+    /// Michael's lock-free ordered single-linked list (template specialization for gc::nogc)
+    /** @ingroup cds_intrusive_list
+        \anchor cds_intrusive_MichaelList_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of item.
+
+        See \ref cds_intrusive_MichaelList_hp "MichaelList" for description of template parameters.
+
+        The interface of the specialization is a slightly different.
+    */
+    template < typename T, class Traits >
+    class MichaelList<gc::nogc, T, Traits>
+    {
+    public:
+        typedef T       value_type      ;   ///< type of value stored in the queue
+        typedef Traits  options         ;   ///< Traits template parameter
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key comparison functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+#   endif
+
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+        typedef typename michael_list::get_link_checker< node_type, options::link_checker >::type link_checker   ;   ///< link checker
+
+        typedef gc::nogc gc                                 ;   ///< Garbage collector
+        typedef typename options::back_off  back_off        ;   ///< back-off strategy
+        typedef typename options::item_counter item_counter ;   ///< Item counting policy used
+        typedef typename options::memory_model  memory_model;   ///< Memory ordering. See cds::opt::memory_model option
+
+        //@cond
+        // Rebind options (split-list support)
+        template <CDS_DECL_OPTIONS7>
+        struct rebind_options {
+            typedef MichaelList<
+                gc
+                , value_type
+                , typename cds::opt::make_options< options, CDS_OPTIONS7>::type
+            >   type;
+        };
+        //@endcond
+
+    protected:
+        typedef typename node_type::atomic_ptr   atomic_node_ptr ;   ///< Atomic node pointer
+        typedef atomic_node_ptr     auxiliary_head      ;   ///< Auxiliary head type (for split-list support)
+
+        atomic_node_ptr     m_pHead         ;   ///< Head pointer
+        item_counter        m_ItemCounter   ;   ///< Item counter
+
+        //@cond
+        /// Position pointer for item search
+        struct position {
+            atomic_node_ptr * pPrev ;   ///< Previous node
+            node_type * pCur        ;   ///< Current node
+            node_type * pNext       ;   ///< Next node
+        };
+        //@endcond
+
+    protected:
+        //@cond
+        void clear_links( node_type * pNode )
+        {
+            pNode->m_pNext.store( null_ptr<node_type *>(), memory_model::memory_order_release );
+        }
+
+        template <class Disposer>
+        void dispose_node( node_type * pNode, Disposer disp )
+        {
+            clear_links( pNode );
+            cds::unref(disp)( node_traits::to_value_ptr( *pNode ));
+        }
+
+        template <class Disposer>
+        void dispose_value( value_type& val, Disposer disp )
+        {
+            dispose_node( node_traits::to_node_ptr( val ), disp );
+        }
+
+        bool link_node( node_type * pNode, position& pos )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            link_checker::is_empty( pNode );
+
+            pNode->m_pNext.store( pos.pCur, memory_model::memory_order_relaxed );
+            return pos.pPrev->compare_exchange_strong( pos.pCur, pNode, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IS_CONST>
+        class iterator_type
+        {
+            friend class MichaelList;
+            value_type * m_pNode;
+
+            void next()
+            {
+                if ( m_pNode ) {
+                    node_type * pNode = node_traits::to_node_ptr( *m_pNode )->m_pNext.load(memory_model::memory_order_acquire);
+                    if ( pNode )
+                        m_pNode = node_traits::to_value_ptr( *pNode );
+                    else
+                        m_pNode = null_ptr<value_type *>();
+                }
+            }
+
+        protected:
+            explicit iterator_type( node_type * pNode)
+            {
+                if ( pNode )
+                    m_pNode = node_traits::to_value_ptr( *pNode );
+                else
+                    m_pNode = null_ptr<value_type *>();
+            }
+            explicit iterator_type( atomic_node_ptr const& refNode)
+            {
+                node_type * pNode = refNode.load(memory_model::memory_order_relaxed);
+                if ( pNode )
+                    m_pNode = node_traits::to_value_ptr( *pNode );
+                else
+                    m_pNode = null_ptr<value_type *>();
+            }
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IS_CONST>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IS_CONST>::reference value_ref;
+
+            iterator_type()
+                : m_pNode(null_ptr<value_type *>())
+            {}
+
+            iterator_type( const iterator_type& src )
+                : m_pNode( src.m_pNode )
+            {}
+
+            value_ptr operator ->() const
+            {
+                return m_pNode;
+            }
+
+            value_ref operator *() const
+            {
+                assert( m_pNode != null_ptr<value_type *>() );
+                return *m_pNode;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                next();
+                return *this;
+            }
+
+            /// Post-increment
+            iterator_type operator ++(int)
+            {
+                iterator_type i(*this);
+                next();
+                return i;
+            }
+
+            iterator_type& operator = (const iterator_type& src)
+            {
+                m_pNode = src.m_pNode;
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return m_pNode == i.m_pNode;
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return m_pNode != i.m_pNode;
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        typedef iterator_type<false>    iterator;
+        /// Const forward iterator
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator(m_pHead.load(memory_model::memory_order_relaxed) );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value equals to <tt>NULL</tt>.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        const_iterator begin() const
+        {
+            return const_iterator(m_pHead.load(memory_model::memory_order_relaxed) );
+        }
+        /// Returns a forward const iterator addressing the first element in a list
+        const_iterator cbegin()
+        {
+            return const_iterator(m_pHead.load(memory_model::memory_order_relaxed) );
+        }
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        const_iterator cend() const
+        {
+            return const_iterator();
+        }
+
+    public:
+        /// Default constructor initializes empty list
+        MichaelList()
+            : m_pHead( null_ptr<node_type *>())
+        {
+            static_assert( (std::is_same< gc, typename node_type::gc >::value), "GC and node_type::gc must be the same type" );
+        }
+
+        /// Destroys the list objects
+        ~MichaelList()
+        {
+            clear();
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the list if the list does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is linked into the list, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            return insert_at( m_pHead, val );
+        }
+
+        /// Ensures that the \p item exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the list, then \p val is inserted into the list.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+            struct functor {
+                void operator()( bool bNew, value_type& item, value_type& val );
+            };
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refer to the same thing.
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns <tt> std::pair<bool, bool>  </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+        */
+
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            return ensure_at( m_pHead, val, func );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelList_nogc_find_func
+            The function searches the item with key equal to \p val
+            and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The function \p find does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_at( m_pHead, val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_nogc_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_at( m_pHead, val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelList_nogc_find_cfunc
+            The function searches the item with key equal to \p val
+            and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The function \p find does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_at( m_pHead, val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_nogc_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_at( m_pHead, val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelList_nogc_find_val
+            The function searches the item with key equal to \p val
+            and returns pointer to value found or \p NULL.
+        */
+        template <typename Q>
+        value_type * find( Q const & val )
+        {
+            return find_at( m_pHead, val, key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_nogc_find_val "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        value_type * find_with( Q const& val, Less pred )
+        {
+            return find_at( m_pHead, val, cds::opt::details::make_comparator_from_less<Less>());
+        }
+
+        /// Clears the list
+        /**
+            The function unlink all items from the list.
+
+            For each unlinked item the item disposer \p disp is called after unlinking.
+        */
+        template <typename Disposer>
+        void clear( Disposer disp )
+        {
+            node_type * pHead = m_pHead.load(memory_model::memory_order_relaxed);
+            do {} while ( !m_pHead.compare_exchange_weak( pHead, null_ptr<node_type *>(), memory_model::memory_order_relaxed ));
+
+            while ( pHead ) {
+                node_type * p = pHead->m_pNext.load(memory_model::memory_order_relaxed);
+                dispose_node( pHead, disp );
+                pHead = p;
+                --m_ItemCounter;
+            }
+        }
+
+        /// Clears the list using default disposer
+        /**
+            The function clears the list using default (provided in class template) disposer functor.
+        */
+        void clear()
+        {
+            clear( disposer() );
+        }
+
+        /// Checks if the list is empty
+        bool empty() const
+        {
+            return m_pHead.load(memory_model::memory_order_relaxed) == null_ptr<node_type *>();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomics::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+    protected:
+        //@cond
+        // split-list support
+        bool insert_aux_node( node_type * pNode )
+        {
+            return insert_aux_node( m_pHead, pNode );
+        }
+
+        // split-list support
+        bool insert_aux_node( atomic_node_ptr& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+
+            // Hack: convert node_type to value_type.
+            // In principle, auxiliary node can be non-reducible to value_type
+            // We assume that comparator can correctly distinguish aux and regular node.
+            return insert_at( refHead, *node_traits::to_value_ptr( pNode ) );
+        }
+
+        bool insert_at( atomic_node_ptr& refHead, value_type& val )
+        {
+            link_checker::is_empty( node_traits::to_node_ptr( val ) );
+            position pos;
+
+            while ( true ) {
+                if ( search( refHead, val, key_comparator(), pos ) )
+                    return false;
+
+                if ( link_node( node_traits::to_node_ptr( val ), pos ) ) {
+                    ++m_ItemCounter;
+                    return true;
+                }
+            }
+        }
+
+        iterator insert_at_( atomic_node_ptr& refHead, value_type& val )
+        {
+            if ( insert_at( refHead, val ))
+                return iterator( node_traits::to_node_ptr( val ));
+            return end();
+        }
+
+        template <typename Func>
+        std::pair<iterator, bool> ensure_at_( atomic_node_ptr& refHead, value_type& val, Func func )
+        {
+            position pos;
+
+            while ( true ) {
+                if ( search( refHead, val, key_comparator(), pos ) ) {
+                    assert( key_comparator()( val, *node_traits::to_value_ptr( *pos.pCur ) ) == 0 );
+
+                    unref(func)( false, *node_traits::to_value_ptr( *pos.pCur ) , val );
+                    return std::make_pair( iterator( pos.pCur ), false );
+                }
+                else {
+                    link_checker::is_empty( node_traits::to_node_ptr( val ) );
+
+                    if ( link_node( node_traits::to_node_ptr( val ), pos ) ) {
+                        ++m_ItemCounter;
+                        unref(func)( true, val , val );
+                        return std::make_pair( iterator( node_traits::to_node_ptr( val )), true );
+                    }
+                }
+            }
+        }
+
+        template <typename Func>
+        std::pair<bool, bool> ensure_at( atomic_node_ptr& refHead, value_type& val, Func func )
+        {
+            std::pair<iterator, bool> ret = ensure_at_( refHead, val, func );
+            return std::make_pair( ret.first != end(), ret.second );
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_at( atomic_node_ptr& refHead, Q& val, Compare cmp, Func f )
+        {
+            position pos;
+
+            if ( search( refHead, val, cmp, pos ) ) {
+                assert( pos.pCur != null_ptr<node_type *>() );
+                unref(f)( *node_traits::to_value_ptr( *pos.pCur ), val );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        value_type * find_at( atomic_node_ptr& refHead, Q const& val, Compare cmp )
+        {
+            iterator it = find_at_( refHead, val, cmp );
+            if ( it != end() )
+                return &*it;
+            return null_ptr<value_type *>();
+        }
+
+        template <typename Q, typename Compare>
+        iterator find_at_( atomic_node_ptr& refHead, Q const& val, Compare cmp )
+        {
+            position pos;
+
+            if ( search( refHead, val, cmp, pos ) ) {
+                assert( pos.pCur != null_ptr<node_type *>() );
+                return iterator( pos.pCur );
+            }
+            return end();
+        }
+
+        //@endcond
+
+    protected:
+
+        //@cond
+        template <typename Q, typename Compare >
+        bool search( atomic_node_ptr& refHead, const Q& val, Compare cmp, position& pos )
+        {
+            atomic_node_ptr * pPrev;
+            node_type * pNext;
+            node_type * pCur;
+
+            back_off        bkoff;
+
+        try_again:
+            pPrev = &refHead;
+            pCur = pPrev->load(memory_model::memory_order_acquire);
+            pNext = null_ptr<node_type *>();
+
+            while ( true ) {
+                if ( !pCur ) {
+                    pos.pPrev = pPrev;
+                    pos.pCur = pCur;
+                    pos.pNext = pNext;
+                    return false;
+                }
+
+                pNext = pCur->m_pNext.load(memory_model::memory_order_relaxed);
+                if ( pCur->m_pNext.load(memory_model::memory_order_acquire) != pNext ) {
+                    bkoff();
+                    goto try_again;
+                }
+
+                if ( pPrev->load(memory_model::memory_order_acquire) != pCur ) {
+                    bkoff();
+                    goto try_again;
+                }
+
+                assert( pCur != null_ptr<node_type *>() );
+                int nCmp = cmp( *node_traits::to_value_ptr( *pCur ), val );
+                if ( nCmp >= 0 ) {
+                    pos.pPrev = pPrev;
+                    pos.pCur = pCur;
+                    pos.pNext = pNext;
+                    return nCmp == 0;
+                }
+                pPrev = &( pCur->m_pNext );
+                pCur = pNext;
+            }
+        }
+        //@endcond
+    };
+
+}}  // namespace cds::intrusive
+
+#endif  // #ifndef __CDS_INTRUSIVE_MICHAEL_LIST_NOGC_H
diff --git a/cds/intrusive/michael_list_ptb.h b/cds/intrusive/michael_list_ptb.h
new file mode 100644 (file)
index 0000000..4fd613b
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_LIST_PTB_H
+#define __CDS_INTRUSIVE_MICHAEL_LIST_PTB_H
+
+#include <cds/intrusive/michael_list_impl.h>
+#include <cds/gc/ptb.h>
+
+#endif // #ifndef __CDS_INTRUSIVE_MICHAEL_LIST_PTB_H
diff --git a/cds/intrusive/michael_list_rcu.h b/cds/intrusive/michael_list_rcu.h
new file mode 100644 (file)
index 0000000..6125844
--- /dev/null
@@ -0,0 +1,1080 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_LIST_RCU_H
+#define __CDS_INTRUSIVE_MICHAEL_LIST_RCU_H
+
+#include <cds/intrusive/michael_list_base.h>
+#include <cds/urcu/details/check_deadlock.h>
+#include <cds/details/binary_functor_wrapper.h>
+#include <cds/urcu/exempt_ptr.h>
+
+namespace cds { namespace intrusive {
+
+    /// Michael's lock-free ordered single-linked list (template specialization for \ref cds_urcu_desc "RCU")
+    /** @ingroup cds_intrusive_list
+        \anchor cds_intrusive_MichaelList_rcu
+
+        Usually, ordered single-linked list is used as a building block for the hash table implementation.
+        The complexity of searching is <tt>O(N)</tt>.
+
+        Template arguments:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p T - type to be stored in the list; the type \p T should be based on (or has a member of type)
+            cds::intrusive::micheal_list::node
+        - \p Traits - type traits. See michael_list::type_traits for explanation.
+
+        It is possible to declare option-based list with \p %cds::intrusive::michael_list::make_traits metafunction istead of \p Traits template
+        argument. Template argument list \p Options of cds::intrusive::michael_list::make_traits metafunction are:
+        - opt::hook - hook used. Possible values are: michael_list::base_hook, michael_list::member_hook, michael_list::traits_hook.
+            If the option is not specified, <tt>michael_list::base_hook<></tt> is used.
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer
+        - opt::rcu_check_deadlock - a deadlock checking policy. Default is opt::v::rcu_throw_deadlock
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        \par Usage
+            Before including <tt><cds/intrusive/michael_list_rcu.h></tt> you should include appropriate RCU header file,
+            see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+            For example, for \ref cds_urcu_general_buffered_gc "general-purpose buffered RCU" you should include:
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/intrusive/michael_list_rcu.h>
+
+            // Now, you can declare Michael's list for type Foo and default traits:
+            typedef cds::intrusive::MichaelList<cds::urcu::gc< cds::urcu::general_buffered<> >, Foo > rcu_michael_list;
+            \endcode
+    */
+    template < typename RCU, typename T, class Traits >
+    class MichaelList<cds::urcu::gc<RCU>, T, Traits>
+    {
+    public:
+        typedef T       value_type      ;   ///< type of value stored in the queue
+        typedef Traits  options         ;   ///< Traits template parameter
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key comparison functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+#   endif
+
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+        typedef typename michael_list::get_link_checker< node_type, options::link_checker >::type link_checker   ;   ///< link checker
+
+        typedef cds::urcu::gc<RCU>                      gc          ;   ///< RCU schema
+        typedef typename options::back_off              back_off    ;   ///< back-off strategy
+        typedef typename options::item_counter          item_counter;   ///< Item counting policy used
+        typedef typename options::memory_model          memory_model;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::rcu_check_deadlock    rcu_check_deadlock ; ///< Deadlock checking policy
+
+        typedef typename gc::scoped_lock    rcu_lock ;  ///< RCU scoped lock
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = true; ///< Group of \p extract_xxx functions require external locking
+
+        //@cond
+        // Rebind options (split-list support)
+        template <CDS_DECL_OPTIONS7>
+        struct rebind_options {
+            typedef MichaelList<
+                gc
+                , value_type
+                , typename cds::opt::make_options< options, CDS_OPTIONS7>::type
+            >   type;
+        };
+        //@endcond
+
+    protected:
+        typedef typename node_type::marked_ptr         marked_node_ptr ; ///< Marked node pointer
+        typedef typename node_type::atomic_marked_ptr  atomic_node_ptr ; ///< Atomic node pointer
+        typedef atomic_node_ptr                 auxiliary_head      ;   ///< Auxiliary head type (for split-list support)
+
+        atomic_node_ptr     m_pHead         ;   ///< Head pointer
+        item_counter        m_ItemCounter   ;   ///< Item counter
+
+        //@cond
+        /// Position pointer for item search
+        struct position {
+            atomic_node_ptr * pPrev ;   ///< Previous node
+            node_type * pCur        ;   ///< Current node
+            node_type * pNext       ;   ///< Next node
+        };
+
+        typedef cds::urcu::details::check_deadlock_policy< gc, rcu_check_deadlock>   check_deadlock_policy;
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_erase_functor {
+            void operator()( value_type const & item )
+            {}
+        };
+
+        struct get_functor {
+            value_type *    pFound;
+
+            get_functor()
+                : pFound(null_ptr<value_type *>())
+            {}
+
+            template <typename Q>
+            void operator()( value_type& item, Q& val )
+            {
+                pFound = &item;
+            }
+        };
+
+#   endif
+
+        static void clear_links( node_type * pNode )
+        {
+            pNode->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+        }
+
+        struct clear_and_dispose {
+            void operator()( value_type * p )
+            {
+                assert( p != null_ptr<value_type *>() );
+                clear_links( node_traits::to_node_ptr(p));
+                disposer()( p );
+            }
+        };
+        //@endcond
+
+    public:
+        typedef cds::urcu::exempt_ptr< gc, value_type, value_type, clear_and_dispose, void > exempt_ptr ; ///< pointer to extracted node
+
+    protected:
+        //@cond
+
+        static void dispose_node( node_type * pNode )
+        {
+            assert( pNode );
+            assert( !gc::is_locked() );
+
+            gc::template retire_ptr<clear_and_dispose>( node_traits::to_value_ptr( *pNode ) );
+        }
+
+        bool link_node( node_type * pNode, position& pos )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            link_checker::is_empty( pNode );
+
+            marked_node_ptr p( pos.pCur );
+            pNode->m_pNext.store( p, memory_model::memory_order_relaxed );
+            return pos.pPrev->compare_exchange_strong( p, marked_node_ptr(pNode), memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        bool unlink_node( position& pos )
+        {
+            // Mark the node (logical deleting)
+            marked_node_ptr next(pos.pNext, 0);
+            if ( pos.pCur->m_pNext.compare_exchange_strong( next, marked_node_ptr(pos.pNext, 1), memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed )) {
+                marked_node_ptr cur(pos.pCur);
+                if ( pos.pPrev->compare_exchange_strong( cur, marked_node_ptr( pos.pNext ), memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                    return true;
+                next |= 1;
+                CDS_VERIFY( pos.pCur->m_pNext.compare_exchange_strong( next, next ^ 1, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+            }
+            return false;
+        }
+        //@endcond
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type
+        {
+            friend class MichaelList;
+            value_type * m_pNode;
+
+            void next()
+            {
+                if ( m_pNode ) {
+                    node_type * p = node_traits::to_node_ptr( *m_pNode )->m_pNext.load(memory_model::memory_order_relaxed).ptr();
+                    m_pNode = p ? node_traits::to_value_ptr(p) : null_ptr<value_type *>();
+                }
+            }
+
+        protected:
+            explicit iterator_type( node_type * pNode)
+            {
+                if ( pNode )
+                    m_pNode = node_traits::to_value_ptr( *pNode );
+                else
+                    m_pNode = null_ptr<value_type *>();
+            }
+            explicit iterator_type( atomic_node_ptr const& refNode)
+            {
+                node_type * pNode = refNode.load(memory_model::memory_order_relaxed).ptr();
+                m_pNode = pNode ? node_traits::to_value_ptr( *pNode ) : null_ptr<value_type *>();
+            }
+
+        public:
+            typedef typename cds::details::make_const_type<value_type, IsConst>::pointer   value_ptr;
+            typedef typename cds::details::make_const_type<value_type, IsConst>::reference value_ref;
+
+            iterator_type()
+                : m_pNode(null_ptr<value_type *>())
+            {}
+
+            iterator_type( const iterator_type& src )
+                : m_pNode( src.m_pNode )
+            {}
+
+            value_ptr operator ->() const
+            {
+                return m_pNode;
+            }
+
+            value_ref operator *() const
+            {
+                assert( m_pNode != null_ptr<value_type *>() );
+                return *m_pNode;
+            }
+
+            /// Pre-increment
+            iterator_type& operator ++()
+            {
+                next();
+                return *this;
+            }
+
+            /// Post-increment
+            iterator_type operator ++(int)
+            {
+                iterator_type i(*this);
+                next();
+                return i;
+            }
+
+            iterator_type& operator = (const iterator_type& src)
+            {
+                m_pNode = src.m_pNode;
+                return *this;
+            }
+
+            template <bool C>
+            bool operator ==(iterator_type<C> const& i ) const
+            {
+                return m_pNode == i.m_pNode;
+            }
+            template <bool C>
+            bool operator !=(iterator_type<C> const& i ) const
+            {
+                return m_pNode != i.m_pNode;
+            }
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        typedef iterator_type<false>    iterator;
+        /// Const forward iterator
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_pHead );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            Internally, <tt>end</tt> returning value equals to \p NULL.
+
+            The returned value can be used only to control reaching the end of the list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator addressing the first element in a list
+        const_iterator begin() const
+        {
+            return const_iterator(m_pHead );
+        }
+        /// Returns a forward const iterator addressing the first element in a list
+        const_iterator cbegin()
+        {
+            return const_iterator(m_pHead );
+        }
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+        /// Returns an const iterator that addresses the location succeeding the last element in a list
+        const_iterator cend()
+        {
+            return const_iterator();
+        }
+
+    public:
+        /// Default constructor initializes empty list
+        MichaelList()
+            : m_pHead( null_ptr<node_type *>())
+        {
+            static_assert( (std::is_same< gc, typename node_type::gc >::value), "GC and node_type::gc must be the same type" );
+        }
+
+        /// Destroy list
+        ~MichaelList()
+        {
+            clear();
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the list if the list does not contain
+            an item with key equal to \p val.
+
+            The function makes RCU lock internally.
+
+            Returns \p true if \p val is linked into the list, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            return insert_at( m_pHead, val );
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split new item creating into two part:
+            - create item with key only
+            - insert new item into the list
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this list's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success and may be passed by reference
+            using <tt>boost::ref</tt>.
+
+            The function makes RCU lock internally.
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            return insert_at( m_pHead, val, f );
+        }
+
+        /// Ensures that the \p item exists in the list
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the list, then \p val is inserted into the list.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+            struct functor {
+                void operator()( bool bNew, value_type& item, value_type& val );
+            };
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the list
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refer to the same thing.
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns <tt> std::pair<bool, bool>  </tt> where \p first is true if operation is successfull,
+            \p second is true if new item has been added or \p false if the item with \p key
+            already is in the list.
+
+            The function makes RCU lock internally.
+        */
+
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            return ensure_at( m_pHead, val, func );
+        }
+
+        /// Unlinks the item \p val from the list
+        /**
+            The function searches the item \p val in the list and unlink it from the list
+            if it is found and it is equal to \p val.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of that list, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            The function returns \p true if success and \p false otherwise.
+
+            RCU \p synchronize method can be called.
+            Note that depending on RCU type used the \ref disposer call can be deferred.
+
+            The function can throw cds::urcu::rcu_deadlock exception if deadlock is encountered and
+            deadlock checking policy is opt::v::rcu_throw_deadlock.
+        */
+        bool unlink( value_type& val )
+        {
+            return unlink_at( m_pHead, val );
+        }
+
+        /// Deletes the item from the list
+        /** \anchor cds_intrusive_MichaelList_rcu_erase_val
+            The function searches an item with key equal to \p val in the list,
+            unlinks it from the list, and returns \p true.
+            If the item with the key equal to \p val is not found the function return \p false.
+
+            RCU \p synchronize method can be called.
+            Note that depending on RCU type used the \ref disposer call can be deferred.
+
+            The function can throw \ref cds_urcu_rcu_deadlock "cds::urcu::rcu_deadlock" exception if a deadlock is detected and
+            the deadlock checking policy is opt::v::rcu_throw_deadlock.
+        */
+        template <typename Q>
+        bool erase( Q const& val )
+        {
+            return erase_at( m_pHead, val, key_comparator() );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_rcu_erase_val "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& val, Less pred )
+        {
+            return erase_at( m_pHead, val, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Deletes the item from the list
+        /** \anchor cds_intrusive_MichaelList_rcu_erase_func
+            The function searches an item with key equal to \p val in the list,
+            call \p func functor with item found, unlinks it from the list, and returns \p true.
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor may be passed by reference using <tt>boost:ref</tt>
+
+            If the item with the key equal to \p val is not found the function return \p false.
+
+            RCU \p synchronize method can be called.
+            Note that depending on RCU type used the \ref disposer call can be deferred.
+
+            The function can throw \ref cds_urcu_rcu_deadlock "cds::urcu::rcu_deadlock" exception if a deadlock is detected and
+            the deadlock checking policy is opt::v::rcu_throw_deadlock.
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& val, Func func )
+        {
+            return erase_at( m_pHead, val, key_comparator(), func );
+        }
+
+        /// Deletes the item from the list using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_rcu_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& val, Less pred, Func func )
+        {
+            return erase_at( m_pHead, val, cds::opt::details::make_comparator_from_less<Less>(), func );
+        }
+
+        /// Extracts an item from the list
+        /**
+        @anchor cds_intrusive_MichaelList_rcu_extract
+            The function searches an item with key equal to \p val in the list,
+            unlinks it from the list, and returns pointer to an item found in \p dest parameter.
+            If the item with the key equal to \p val is not found the function returns \p false,
+            \p dest is empty.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the list
+            and returns a pointer to item found.
+            You should lock RCU before calling this function, and you should manually release
+            \p dest exempt pointer outside the RCU lock before reusing the pointer.
+
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/intrusive/michael_list_rcu.h>
+
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::intrusive::MichaelList< rcu, Foo > rcu_michael_list;
+
+            rcu_michael_list theList;
+            // ...
+
+            rcu_michael_list::exempt_ptr p1;
+            {
+                // first, we should lock RCU
+                rcu::scoped_lock sl;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theList.extract( p1, 10 )) {
+                    // do something with p1
+                    ...
+                }
+            }
+
+            // We may safely release p1 here
+            // release() passes the pointer to RCU reclamation cycle:
+            // it invokes RCU retire_ptr function with the disposer you provided for the list.
+            p1.release();
+            \endcode
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& dest, Q const& val )
+        {
+            dest = extract_at( m_pHead, val, key_comparator() );
+            return !dest.empty();
+        }
+
+        /// Extracts an item from the list using \p pred predicate for searching
+        /**
+            This function is the analog for \ref cds_intrusive_MichaelList_rcu_extract "extract(exempt_ptr&, Q const&)".
+
+            The \p pred is a predicate used for key comparing.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as \ref key_comparator.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& dest, Q const& val, Less pred )
+        {
+            dest = extract_at( m_pHead, val, cds::opt::details::make_comparator_from_less<Less>() );
+            return !dest.empty();
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_MichaelList_rcu_find_func
+            The function searches the item with key equal to \p val
+            and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The function \p find does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function makes RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f ) const
+        {
+            return find_at( const_cast<atomic_node_ptr&>(m_pHead), val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_rcu_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f ) const
+        {
+            return find_at( const_cast<atomic_node_ptr&>( m_pHead ), val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_MichaelList_rcu_find_cfunc
+            The function searches the item with key equal to \p val
+            and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The function \p find does not serialize simultaneous access to the list \p item. If such access is
+            possible you must provide your own synchronization schema to exclude unsafe item modifications.
+
+            The function makes RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f ) const
+        {
+            return find_at( const_cast<atomic_node_ptr&>( m_pHead ), val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_rcu_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f ) const
+        {
+            return find_at( const_cast<atomic_node_ptr&>( m_pHead ), val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_MichaelList_rcu_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if \p val found or \p false otherwise.
+        */
+        template <typename Q>
+        bool find( Q const& val ) const
+        {
+            return find_at( const_cast<atomic_node_ptr&>( m_pHead ), val, key_comparator() );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_rcu_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred ) const
+        {
+            return find_at( const_cast<atomic_node_ptr&>( m_pHead ), val, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_intrusive_MichaelList_rcu_get
+            The function searches the item with key equal to \p val and returns the pointer to item found.
+            If \p val is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::intrusive::MichaelList< cds::urcu::gc< cds::urcu::general_buffered<> >, foo, my_traits > ord_list;
+            ord_list theList;
+            // ...
+            {
+                // Lock RCU
+                ord_list::rcu_lock lock;
+
+                foo * pVal = theList.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be retired by disposer at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename Q>
+        value_type * get( Q const& val ) const
+        {
+            return get_at( const_cast<atomic_node_ptr&>( m_pHead ), val, key_comparator());
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelList_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& val, Less pred ) const
+        {
+            return get_at( const_cast<atomic_node_ptr&>( m_pHead ), val, cds::opt::details::make_comparator_from_less<Less>());
+        }
+
+        /// Clears the list using default disposer
+        /**
+            The function clears the list using default (provided in class template) disposer functor.
+
+            RCU \p synchronize method can be called.
+            Note that depending on RCU type used the \ref disposer invocation can be deferred.
+
+            The function can throw cds::urcu::rcu_deadlock exception if an deadlock is encountered and
+            deadlock checking policy is opt::v::rcu_throw_deadlock.
+        */
+        void clear()
+        {
+            if( !empty() ) {
+                check_deadlock_policy::check();
+
+                marked_node_ptr pHead;
+                for (;;) {
+                    {
+                        rcu_lock l;
+                        pHead = m_pHead.load(memory_model::memory_order_consume);
+                        if ( !pHead.ptr() )
+                            break;
+                        marked_node_ptr pNext( pHead->m_pNext.load(memory_model::memory_order_relaxed) );
+                        if ( !pHead->m_pNext.compare_exchange_weak( pNext, pNext | 1, memory_model::memory_order_acquire, memory_model::memory_order_relaxed ))
+                            continue;
+                        if ( !m_pHead.compare_exchange_weak( pHead, marked_node_ptr(pNext.ptr()), memory_model::memory_order_release, memory_model::memory_order_relaxed ))
+                            continue;
+                    }
+
+                    --m_ItemCounter;
+                    dispose_node( pHead.ptr() );
+                }
+            }
+        }
+
+        /// Check if the list is empty
+        bool empty() const
+        {
+            return m_pHead.load(memory_model::memory_order_relaxed).all() == null_ptr<node_type *>();
+        }
+
+        /// Returns list's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomics::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the list
+            is empty. To check list emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+    protected:
+        //@cond
+        // split-list support
+        bool insert_aux_node( node_type * pNode )
+        {
+            return insert_aux_node( m_pHead, pNode );
+        }
+
+        // split-list support
+        bool insert_aux_node( atomic_node_ptr& refHead, node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+
+            // Hack: convert node_type to value_type.
+            // In principle, auxiliary node can be non-reducible to value_type
+            // We assume that comparator can correctly distinguish between aux and regular node.
+            return insert_at( refHead, *node_traits::to_value_ptr( pNode ) );
+        }
+
+        bool insert_at( atomic_node_ptr& refHead, value_type& val, bool bLock = true )
+        {
+            link_checker::is_empty( node_traits::to_node_ptr( val ) );
+            position pos;
+
+            rcu_lock l( bLock );
+            while ( true ) {
+                if ( search( refHead, val, pos, key_comparator() ) )
+                    return false;
+
+                if ( link_node( node_traits::to_node_ptr( val ), pos ) ) {
+                    ++m_ItemCounter;
+                    return true;
+                }
+
+                // clear next field
+                node_traits::to_node_ptr( val )->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+            }
+        }
+
+        template <typename Func>
+        bool insert_at( atomic_node_ptr& refHead, value_type& val, Func f )
+        {
+            link_checker::is_empty( node_traits::to_node_ptr( val ) );
+            position pos;
+
+            rcu_lock l;
+            while ( true ) {
+                if ( search( refHead, val, pos, key_comparator() ) )
+                    return false;
+
+                if ( link_node( node_traits::to_node_ptr( val ), pos ) ) {
+                    cds::unref(f)( val );
+                    ++m_ItemCounter;
+                    return true;
+                }
+
+                // clear next field
+                node_traits::to_node_ptr( val )->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+            }
+        }
+
+        iterator insert_at_( atomic_node_ptr& refHead, value_type& val, bool bLock = true )
+        {
+            rcu_lock l( bLock );
+            if ( insert_at( refHead, val, false ))
+                return iterator( node_traits::to_node_ptr( val ));
+            return end();
+        }
+
+        template <typename Func>
+        std::pair<iterator, bool> ensure_at_( atomic_node_ptr& refHead, value_type& val, Func func, bool bLock = true )
+        {
+            position pos;
+
+            rcu_lock l( bLock );
+            while ( true ) {
+                if ( search( refHead, val, pos, key_comparator() ) ) {
+                    assert( key_comparator()( val, *node_traits::to_value_ptr( *pos.pCur ) ) == 0 );
+
+                    unref(func)( false, *node_traits::to_value_ptr( *pos.pCur ), val );
+                    return std::make_pair( iterator( pos.pCur ), false );
+                }
+                else {
+                    link_checker::is_empty( node_traits::to_node_ptr( val ) );
+
+                    if ( link_node( node_traits::to_node_ptr( val ), pos ) ) {
+                        ++m_ItemCounter;
+                        unref(func)( true, val , val );
+                        return std::make_pair( iterator( node_traits::to_node_ptr( val )), true );
+                    }
+
+                    // clear the next field
+                    node_traits::to_node_ptr( val )->m_pNext.store( marked_node_ptr(), memory_model::memory_order_relaxed );
+                }
+            }
+        }
+
+        template <typename Func>
+        std::pair<bool, bool> ensure_at( atomic_node_ptr& refHead, value_type& val, Func func, bool bLock = true )
+        {
+            rcu_lock l( bLock );
+            std::pair<iterator, bool> ret = ensure_at_( refHead, val, func, false );
+            return std::make_pair( ret.first != end(), ret.second );
+        }
+
+        bool unlink_at( atomic_node_ptr& refHead, value_type& val )
+        {
+            position pos;
+            back_off bkoff;
+            check_deadlock_policy::check();
+
+            for (;;) {
+                {
+                    rcu_lock l;
+                    if ( !search( refHead, val, pos, key_comparator() ) || node_traits::to_value_ptr( *pos.pCur ) != &val )
+                        return false;
+                    if ( !unlink_node( pos )) {
+                        bkoff();
+                        continue;
+                    }
+                }
+
+                --m_ItemCounter;
+                dispose_node( pos.pCur );
+                return true;
+            }
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( atomic_node_ptr& refHead, Q const& val, Compare cmp, Func f, position& pos )
+        {
+            back_off bkoff;
+            check_deadlock_policy::check();
+
+            for (;;) {
+                {
+                    rcu_lock l;
+                    if ( !search( refHead, val, pos, cmp ) )
+                        return false;
+                    if ( !unlink_node( pos )) {
+                        bkoff();
+                        continue;
+                    }
+                }
+
+                cds::unref(f)( *node_traits::to_value_ptr( *pos.pCur ) );
+                --m_ItemCounter;
+                dispose_node( pos.pCur );
+                return true;
+            }
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_at( atomic_node_ptr& refHead, Q const& val, Compare cmp, Func f )
+        {
+            position pos;
+            return erase_at( refHead, val, cmp, f, pos );
+        }
+
+        template <typename Q, typename Compare>
+        bool erase_at( atomic_node_ptr& refHead, const Q& val, Compare cmp )
+        {
+            position pos;
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_at( refHead, val, cmp, [](value_type const&){}, pos );
+#       else
+            return erase_at( refHead, val, cmp, empty_erase_functor(), pos );
+#       endif
+        }
+
+        template <typename Q, typename Compare >
+        value_type * extract_at( atomic_node_ptr& refHead, Q const& val, Compare cmp )
+        {
+            position pos;
+            back_off bkoff;
+            assert( gc::is_locked() )  ;   // RCU must be locked!!!
+
+            for (;;) {
+                if ( !search( refHead, val, pos, cmp ) )
+                    return null_ptr<value_type *>();
+                if ( !unlink_node( pos )) {
+                    bkoff();
+                    continue;
+                }
+
+                --m_ItemCounter;
+                return node_traits::to_value_ptr( pos.pCur );
+            }
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_at( atomic_node_ptr& refHead, Q& val, Compare cmp, Func f, bool bLock = true ) const
+        {
+            position pos;
+
+            rcu_lock l( bLock );
+            if ( search( refHead, val, pos, cmp ) ) {
+                assert( pos.pCur != null_ptr<node_type *>() );
+                unref(f)( *node_traits::to_value_ptr( *pos.pCur ), val );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        bool find_at( atomic_node_ptr& refHead, Q const& val, Compare cmp ) const
+        {
+            rcu_lock l;
+            return find_at_( refHead, val, cmp ) != end();
+        }
+
+        template <typename Q, typename Compare>
+        value_type * get_at( atomic_node_ptr& refHead, Q const& val, Compare cmp ) const
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            value_type * pFound = null_ptr<value_type *>();
+            return find_at( refHead, val, cmp,
+                [&pFound](value_type& found, Q const& ) { pFound = &found; } )
+                ? pFound : null_ptr<value_type *>();
+#       else
+            get_functor gf;
+            return find_at( refHead, val, cmp, cds::ref(gf) )
+                ? gf.pFound : null_ptr<value_type *>();
+#       endif
+        }
+
+        template <typename Q, typename Compare>
+        const_iterator find_at_( atomic_node_ptr& refHead, Q const& val, Compare cmp ) const
+        {
+            assert( gc::is_locked() );
+            position pos;
+
+            if ( search( refHead, val, pos, cmp ) ) {
+                assert( pos.pCur != null_ptr<node_type *>() );
+                return const_iterator( pos.pCur );
+            }
+            return end();
+        }
+
+        //@endcond
+
+    protected:
+
+        //@cond
+        template <typename Q, typename Compare>
+        bool search( atomic_node_ptr& refHead, const Q& val, position& pos, Compare cmp ) const
+        {
+            // RCU lock should be locked!!!
+            assert( gc::is_locked() );
+
+            atomic_node_ptr * pPrev;
+            marked_node_ptr pNext;
+            marked_node_ptr pCur;
+
+            back_off        bkoff;
+
+        try_again:
+            pPrev = &refHead;
+            pCur = pPrev->load(memory_model::memory_order_acquire);
+            pNext = null_ptr<node_type *>();
+
+            while ( true ) {
+                if ( !pCur.ptr() ) {
+                    pos.pPrev = pPrev;
+                    pos.pCur = pCur.ptr();
+                    pos.pNext = pNext.ptr();
+                    return false;
+                }
+
+                pNext = pCur->m_pNext.load(memory_model::memory_order_relaxed);
+
+                if ( pPrev->load(memory_model::memory_order_acquire) != pCur
+                    || pNext != pCur->m_pNext.load(memory_model::memory_order_acquire)
+                    || pNext.bits() != 0 )  // pNext contains deletion mark for pCur
+                {
+                    // if pCur is marked as deleted (pNext.bits() != 0)
+                    // we wait for physical removal.
+                    // Helping technique is not suitable for RCU since it requires
+                    // that the RCU should be in unlocking state.
+                    bkoff();
+                    goto try_again;
+                }
+
+                assert( pCur.ptr() != null_ptr<node_type *>() );
+                int nCmp = cmp( *node_traits::to_value_ptr( pCur.ptr() ), val );
+                if ( nCmp >= 0 ) {
+                    pos.pPrev = pPrev;
+                    pos.pCur = pCur.ptr();
+                    pos.pNext = pNext.ptr();
+                    return nCmp == 0;
+                }
+                pPrev = &( pCur->m_pNext );
+                pCur = pNext;
+            }
+        }
+        //@endcond
+    };
+
+}}  // namespace cds::intrusive
+
+#endif  // #ifndef __CDS_INTRUSIVE_MICHAEL_LIST_NOGC_H
diff --git a/cds/intrusive/michael_set.h b/cds/intrusive/michael_set.h
new file mode 100644 (file)
index 0000000..27f5435
--- /dev/null
@@ -0,0 +1,811 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_SET_H
+#define __CDS_INTRUSIVE_MICHAEL_SET_H
+
+#include <cds/intrusive/michael_set_base.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace intrusive {
+
+    /// Michael's hash set
+    /** @ingroup cds_intrusive_map
+        \anchor cds_intrusive_MichaelHashSet_hp
+
+        Source:
+            - [2002] Maged Michael "High performance dynamic lock-free hash tables and list-based sets"
+
+        Michael's hash table algorithm is based on lock-free ordered list and it is very simple.
+        The main structure is an array \p T of size \p M. Each element in \p T is basically a pointer
+        to a hash bucket, implemented as a singly linked list. The array of buckets cannot be dynamically expanded.
+        However, each bucket may contain unbounded number of items.
+
+        Template parameters are:
+        - \p GC - Garbage collector used. Note the \p GC must be the same as the GC used for \p OrderedList
+        - \p OrderedList - ordered list implementation used as bucket for hash set, for example, MichaelList, LazyList.
+            The intrusive ordered list implementation specifies the type \p T stored in the hash-set, the reclamation
+            schema \p GC used by hash-set, the comparison functor for the type \p T and other features specific for
+            the ordered list.
+        - \p Traits - type traits. See michael_set::type_traits for explanation.
+            Instead of defining \p Traits struct you can use option-based syntax with michael_set::make_traits metafunction.
+
+        There are several specializations of \p %MichaelHashSet for each GC. You should include:
+        - <tt><cds/intrusive/michael_set_rcu.h></tt> for \ref cds_intrusive_MichaelHashSet_rcu "RCU type"
+        - <tt><cds/intrusive/michael_set_nogc.h></tt> for \ref cds_intrusive_MichaelHashSet_nogc for persistent set
+        - <tt><cds/intrusive/michael_set.h></tt> for other GC (gc::HP, gc::HRC, gc::PTB)
+
+        <b>Hash functor</b>
+
+        Some member functions of Michael's hash set accept the key parameter of type \p Q which differs from \p value_type.
+        It is expected that type \p Q contains full key of \p value_type, and for equal keys of type \p Q and \p value_type
+        the hash values of these keys must be equal too.
+        The hash functor <tt>Traits::hash</tt> should accept parameters of both type:
+        \code
+        // Our node type
+        struct Foo {
+            std::string     key_    ;   // key field
+            // ... other fields
+        };
+
+        // Hash functor
+        struct fooHash {
+            size_t operator()( const std::string& s ) const
+            {
+                return std::hash( s );
+            }
+
+            size_t operator()( const Foo& f ) const
+            {
+                return (*this)( f.key_ );
+            }
+        };
+        \endcode
+
+
+        <b>How to use</b>
+
+        First, you should define ordered list type to use in your hash set:
+        \code
+        // For gc::HP-based MichaelList implementation
+        #include <cds/intrusive/michael_list_hp.h>
+
+        // cds::intrusive::MichaelHashSet declaration
+        #include <cds/intrusive/michael_set.h>
+
+        // Type of hash-set items
+        struct Foo: public cds::intrusive::michael_list::node< cds::gc::HP >
+        {
+            std::string     key_    ;   // key field
+            unsigned        val_    ;   // value field
+            // ...  other value fields
+        };
+
+        // Declare comparator for the item
+        struct FooCmp
+        {
+            int operator()( const Foo& f1, const Foo& f2 ) const
+            {
+                return f1.key_.compare( f2.key_ );
+            }
+        };
+
+        // Declare bucket type for Michael's hash set
+        // The bucket type is any ordered list type like MichaelList, LazyList
+        typedef cds::intrusive::MichaelList< cds::gc::HP, Foo,
+            typename cds::intrusive::michael_list::make_traits<
+                // hook option
+                cds::intrusive::opt::hook< cds::intrusive::michael_list::base_hook< cds::opt::gc< cds::gc::HP > > >
+                // item comparator option
+                ,cds::opt::compare< FooCmp >
+            >::type
+        >  Foo_bucket;
+        \endcode
+
+        Second, you should declare Michael's hash set container:
+        \code
+
+        // Declare hash functor
+        // Note, the hash functor accepts parameter type Foo and std::string
+        struct FooHash {
+            size_t operator()( const Foo& f ) const
+            {
+                return cds::opt::v::hash<std::string>()( f.key_ );
+            }
+            size_t operator()( const std::string& f ) const
+            {
+                return cds::opt::v::hash<std::string>()( f );
+            }
+        };
+
+        // Michael's set typedef
+        typedef cds::intrusive::MichaelHashSet<
+            cds::gc::HP
+            ,Foo_bucket
+            ,typename cds::intrusive::michael_set::make_traits<
+                cds::opt::hash< FooHash >
+            >::type
+        > Foo_set;
+        \endcode
+
+        Now, you can use \p Foo_set in your application.
+
+        Like other intrusive containers, you may build several containers on single item structure:
+        \code
+        #include <cds/intrusive/michael_list_hp.h>
+        #include <cds/intrusive/michael_list_ptb.h>
+        #include <cds/intrusive/michael_set.h>
+
+        struct tag_key1_idx;
+        struct tag_key2_idx;
+
+        // Your two-key data
+        // The first key is maintained by gc::HP, second key is maintained by gc::PTB garbage collectors
+        struct Foo
+            : public cds::intrusive::michael_list::node< cds::gc::HP, tag_key1_idx >
+            , public cds::intrusive::michael_list::node< cds::gc::PTB, tag_key2_idx >
+        {
+            std::string     key1_   ;   // first key field
+            unsigned int    key2_   ;   // second key field
+
+            // ... value fields and fields for controlling item's lifetime
+        };
+
+        // Declare comparators for the item
+        struct Key1Cmp
+        {
+            int operator()( const Foo& f1, const Foo& f2 ) const { return f1.key1_.compare( f2.key1_ ) ; }
+        };
+        struct Key2Less
+        {
+            bool operator()( const Foo& f1, const Foo& f2 ) const { return f1.key2_ < f2.key1_ ; }
+        };
+
+        // Declare bucket type for Michael's hash set indexed by key1_ field and maintained by gc::HP
+        typedef cds::intrusive::MichaelList< cds::gc::HP, Foo,
+            typename cds::intrusive::michael_list::make_traits<
+                // hook option
+                cds::intrusive::opt::hook< cds::intrusive::michael_list::base_hook< cds::opt::gc< cds::gc::HP >, tag_key1_idx > >
+                // item comparator option
+                ,cds::opt::compare< Key1Cmp >
+            >::type
+        >  Key1_bucket;
+
+        // Declare bucket type for Michael's hash set indexed by key2_ field and maintained by gc::PTB
+        typedef cds::intrusive::MichaelList< cds::gc::PTB, Foo,
+            typename cds::intrusive::michael_list::make_traits<
+                // hook option
+                cds::intrusive::opt::hook< cds::intrusive::michael_list::base_hook< cds::opt::gc< cds::gc::PTB >, tag_key2_idx > >
+                // item comparator option
+                ,cds::opt::less< Key2Less >
+            >::type
+        >  Key2_bucket;
+
+        // Declare hash functor
+        struct Key1Hash {
+            size_t operator()( const Foo& f ) const { return cds::opt::v::hash<std::string>()( f.key1_ ) ; }
+            size_t operator()( const std::string& s ) const { return cds::opt::v::hash<std::string>()( s ) ; }
+        };
+        inline size_t Key2Hash( const Foo& f ) { return (size_t) f.key2_  ; }
+
+        // Michael's set indexed by key1_ field
+        typedef cds::intrusive::MichaelHashSet<
+            cds::gc::HP
+            ,Key1_bucket
+            ,typename cds::intrusive::michael_set::make_traits<
+                cds::opt::hash< Key1Hash >
+            >::type
+        > key1_set;
+
+        // Michael's set indexed by key2_ field
+        typedef cds::intrusive::MichaelHashSet<
+            cds::gc::PTB
+            ,Key2_bucket
+            ,typename cds::intrusive::michael_set::make_traits<
+                cds::opt::hash< Key2Hash >
+            >::type
+        > key2_set;
+        \endcode
+    */
+    template <
+        class GC,
+        class OrderedList,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = michael_set::type_traits
+#else
+        class Traits
+#endif
+    >
+    class MichaelHashSet
+    {
+    public:
+        typedef OrderedList     ordered_list    ;   ///< type of ordered list used as a bucket implementation
+        typedef ordered_list    bucket_type     ;   ///< bucket type
+        typedef Traits          options         ;   ///< Traits template parameters
+
+        typedef typename ordered_list::value_type       value_type      ;   ///< type of value stored in the list
+        typedef GC                                      gc              ;   ///< Garbage collector
+        typedef typename ordered_list::key_comparator   key_comparator  ;   ///< key comparison functor
+        typedef typename ordered_list::disposer         disposer        ;   ///< Node disposer functor
+
+        /// Hash functor for \ref value_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+
+        typedef typename ordered_list::guarded_ptr      guarded_ptr; ///< Guarded pointer
+
+        /// Bucket table allocator
+        typedef cds::details::Allocator< bucket_type, typename options::allocator >  bucket_table_allocator;
+
+    protected:
+        item_counter    m_ItemCounter   ;   ///< Item counter
+        hash            m_HashFunctor   ;   ///< Hash functor
+
+        bucket_type *   m_Buckets       ;   ///< bucket table
+
+    private:
+        //@cond
+        const size_t    m_nHashBitmask;
+        //@endcond
+
+    protected:
+        /// Calculates hash value of \p key
+        template <typename Q>
+        size_t hash_value( const Q& key ) const
+        {
+            return m_HashFunctor( key ) & m_nHashBitmask;
+        }
+
+        /// Returns the bucket (ordered list) for \p key
+        template <typename Q>
+        bucket_type&    bucket( const Q& key )
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for Michael's set is based on \p OrderedList forward iterator and has some features:
+            - it has no post-increment operator
+            - it iterates items in unordered fashion
+            - The iterator cannot be moved across thread boundary since it may contain GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the set.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use the iterator for the concurrent container
+            for debug purpose only.
+        */
+        typedef michael_set::details::iterator< bucket_type, false >    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef michael_set::details::iterator< bucket_type, true >     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a set
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        //@{
+        const_iterator begin() const
+        {
+            return get_const_begin();
+        }
+        const_iterator cbegin()
+        {
+            return get_const_begin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a set
+        //@{
+        const_iterator end() const
+        {
+            return get_const_end();
+        }
+        const_iterator cend()
+        {
+            return get_const_end();
+        }
+        //@}
+
+    private:
+        //@{
+        const_iterator get_const_begin() const
+        {
+            return const_iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+        const_iterator get_const_end() const
+        {
+            return const_iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+        //@}
+
+    public:
+        /// Initializes hash set
+        /**
+            The Michael's hash set is an unbounded container, but its hash table is non-expandable.
+            At construction time you should pass estimated maximum item count and a load factor.
+            The load factor is average size of one bucket - a small number between 1 and 10.
+            The bucket is an ordered single-linked list, searching in the bucket has linear complexity <tt>O(nLoadFactor)</tt>.
+            The constructor defines hash table size as rounding <tt>nMaxItemCount / nLoadFactor</tt> up to nearest power of two.
+        */
+        MichaelHashSet(
+            size_t nMaxItemCount,   ///< estimation of max item count in the hash set
+            size_t nLoadFactor      ///< load factor: estimation of max number of items in the bucket. Small integer up to 10, default is 1.
+        ) : m_nHashBitmask( michael_set::details::init_hash_bitmask( nMaxItemCount, nLoadFactor ))
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename bucket_type::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ), "atomicity::empty_item_counter is not allowed as a item counter");
+
+            m_Buckets = bucket_table_allocator().NewArray( bucket_count() );
+        }
+
+        /// Clears hash set object and destroys it
+        ~MichaelHashSet()
+        {
+            clear();
+            bucket_table_allocator().Delete( m_Buckets, bucket_count() );
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            bool bRet = bucket( val ).insert( val );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success and can be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            bool bRet = bucket( val ).insert( val, f );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Ensures that the \p val exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the set, then \p val is inserted into the set.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refers to the same thing.
+
+            The functor may change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            std::pair<bool, bool> bRet = bucket( val ).ensure( val, func );
+            if ( bRet.first && bRet.second )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Unlinks the item \p val from the set
+        /**
+            The function searches the item \p val in the set and unlink it from the set
+            if it is found and is equal to \p val.
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+            bool bRet = bucket( val ).unlink( val );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_MichaelHashSet_hp_erase
+            The function searches an item with key equal to \p val in the set,
+            unlinks it from the set, and returns \p true.
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool erase( Q const& val )
+        {
+            if ( bucket( val ).erase( val )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_hp_erase "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& val, Less pred )
+        {
+            if ( bucket( val ).erase_with( val, pred )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_MichaelHashSet_hp_erase_func
+            The function searches an item with key equal to \p val in the set,
+            call \p f functor with item found, and unlinks it from the set.
+            The \ref disposer specified in \p OrderedList class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q, typename Func>
+        bool erase( const Q& val, Func f )
+        {
+            if ( bucket( val ).erase( val, f )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_hp_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( const Q& val, Less pred, Func f )
+        {
+            if ( bucket( val ).erase_with( val, pred, f )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Extracts the item with specified \p key
+        /** \anchor cds_intrusive_MichaelHashSet_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the set, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The \ref disposer specified in \p OrderedList class' template parameter is called automatically
+            by garbage collector \p GC when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::MichaelHashSet< your_template_args > michael_set;
+            michael_set theSet;
+            // ...
+            {
+                michael_set::guarded_ptr gp;
+                theSet.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& dest, Q const& key )
+        {
+            if ( bucket( key ).extract( dest, key )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Extracts the item using compare functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_hp_extract "extract(guarded_ptr&, Q const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the list.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& dest, Q const& key, Less pred )
+        {
+            if ( bucket( key ).extract_with( dest, key, pred )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelHashSet_hp_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return bucket( val ).find( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_hp_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return bucket( val ).find_with( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelHashSet_hp_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return bucket( val ).find( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_hp_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return bucket( val ).find_with( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelHashSet_hp_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool find( Q const & val )
+        {
+            return bucket( val ).find( val );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_hp_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const & val, Less pred )
+        {
+            return bucket( val ).find_with( val, pred );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_intrusive_MichaelHashSet_hp_get
+            The function searches the item with key equal to \p val
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p val is found, and \p false otherwise.
+            If \p val is not found the \p ptr parameter is not changed.
+
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::MichaeHashSet< your_template_params >  michael_set;
+            michael_set theSet;
+            // ...
+            {
+                michael_set::guarded_ptr gp;
+                if ( theSet.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for \p OrderedList template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& ptr, Q const& val )
+        {
+            return bucket( val ).get( ptr, val );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_hp_get "get( guarded_ptr& ptr, Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& ptr, Q const& val, Less pred )
+        {
+            return bucket( val ).get_with( ptr, val, pred );
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function unlink all items from the set.
+            The function is not atomic. It cleans up each bucket and then resets the item counter to zero.
+            If there are a thread that performs insertion while \p clear is working the result is undefined in general case:
+            <tt> empty() </tt> may return \p true but the set may contain item(s).
+            Therefore, \p clear may be used only for debugging purposes.
+
+            For each item the \p disposer is called after unlinking.
+        */
+        void clear()
+        {
+            for ( size_t i = 0; i < bucket_count(); ++i )
+                m_Buckets[i].clear();
+            m_ItemCounter.reset();
+        }
+
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+            Thus, the correct item counting feature is an important part of Michael's set implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns the size of hash table
+        /**
+            Since MichaelHashSet cannot dynamically extend the hash table size,
+            the value returned is an constant depending on object initialization parameters;
+            see MichaelHashSet::MichaelHashSet for explanation.
+        */
+        size_t bucket_count() const
+        {
+            return m_nHashBitmask + 1;
+        }
+    };
+
+}}  // namespace cds::intrusive
+
+#endif // ifndef __CDS_INTRUSIVE_MICHAEL_SET_H
diff --git a/cds/intrusive/michael_set_base.h b/cds/intrusive/michael_set_base.h
new file mode 100644 (file)
index 0000000..61f9e78
--- /dev/null
@@ -0,0 +1,207 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_SET_BASE_H
+#define __CDS_INTRUSIVE_MICHAEL_SET_BASE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/opt/compare.h>
+#include <cds/opt/hash.h>
+#include <cds/bitop.h>
+#include <cds/cxx11_atomic.h>
+#include <cds/ref.h>
+
+namespace cds { namespace intrusive {
+
+    /// MichaelHashSet related definitions
+    /** @ingroup cds_intrusive_helper
+    */
+    namespace michael_set {
+
+        /// Type traits for MichaelHashSet class
+        struct type_traits {
+            /// Hash function
+            /**
+                Hash function converts the key fields of struct \p T stored in the hash-set
+                into value of type \p size_t called hash value that is an index of hash table.
+
+                This is mandatory type and has no predefined one.
+            */
+            typedef opt::none       hash;
+
+            /// Item counter
+            /**
+                The item counting is an important part of MichaelHashSet algorithm:
+                the <tt>empty()</tt> member function depends on correct item counting.
+                Therefore, atomicity::empty_item_counter is not allowed as a type of the option.
+
+                Default is atomicity::item_counter.
+            */
+            typedef atomicity::item_counter     item_counter;
+
+            /// Bucket table allocator
+            /**
+                Allocator for bucket table. Default is \ref CDS_DEFAULT_ALLOCATOR
+                The allocator uses only in ctor (for allocating bucket table)
+                and in dtor (for destroying bucket table)
+            */
+            typedef CDS_DEFAULT_ALLOCATOR   allocator;
+        };
+
+        /// Metafunction converting option list to traits struct
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+
+            Available \p Options:
+            - opt::hash - mandatory option, specifies hash functor.
+            - opt::item_counter - optional, specifies item counting policy. See type_traits::item_counter
+                for default type.
+            - opt::allocator - optional, bucket table allocator. Default is \ref CDS_DEFAULT_ALLOCATOR.
+
+            See \ref MichaelHashSet, \ref type_traits.
+        */
+        template <CDS_DECL_OPTIONS3>
+        struct make_traits {
+            typedef typename cds::opt::make_options< type_traits, CDS_OPTIONS3>::type type  ;   ///< Result of metafunction
+        };
+
+        //@cond
+        namespace details {
+            static inline size_t init_hash_bitmask( size_t nMaxItemCount, size_t nLoadFactor )
+            {
+                if ( nLoadFactor == 0 )
+                    nLoadFactor = 1;
+                if ( nMaxItemCount == 0 )
+                    nMaxItemCount = 4;
+                const size_t nBucketCount = (size_t)( nMaxItemCount / nLoadFactor );
+                const size_t nLog2 = cds::bitop::MSB( nBucketCount );
+
+                return (( size_t( 1 << nLog2 ) < nBucketCount ? size_t( 1 << (nLog2 + 1) ) : size_t( 1 << nLog2 ))) - 1;
+            }
+
+            template <typename OrderedList, bool IsConst>
+            struct list_iterator_selector;
+
+            template <typename OrderedList>
+            struct list_iterator_selector< OrderedList, false>
+            {
+                typedef OrderedList * bucket_ptr;
+                typedef typename OrderedList::iterator  type;
+            };
+
+            template <typename OrderedList>
+            struct list_iterator_selector< OrderedList, true>
+            {
+                typedef OrderedList const * bucket_ptr;
+                typedef typename OrderedList::const_iterator  type;
+            };
+
+            template <typename OrderedList, bool IsConst>
+            class iterator
+            {
+            protected:
+                typedef OrderedList bucket_type;
+                typedef typename list_iterator_selector< bucket_type, IsConst>::bucket_ptr bucket_ptr;
+                typedef typename list_iterator_selector< bucket_type, IsConst>::type list_iterator;
+
+                bucket_ptr      m_pCurBucket;
+                list_iterator   m_itList;
+                bucket_ptr      m_pEndBucket;
+
+                void next()
+                {
+                    if ( m_pCurBucket < m_pEndBucket ) {
+                        if ( ++m_itList != m_pCurBucket->end() )
+                            return;
+                        while ( ++m_pCurBucket < m_pEndBucket ) {
+                            m_itList = m_pCurBucket->begin();
+                            if ( m_itList != m_pCurBucket->end() )
+                                return;
+                        }
+                    }
+                    m_pCurBucket = m_pEndBucket - 1;
+                    m_itList = m_pCurBucket->end();
+                }
+
+            public:
+                typedef typename list_iterator::value_ptr   value_ptr;
+                typedef typename list_iterator::value_ref   value_ref;
+
+            public:
+                iterator()
+                    : m_pCurBucket( null_ptr<bucket_ptr>() )
+                    , m_itList()
+                    , m_pEndBucket( null_ptr<bucket_ptr>() )
+                {}
+
+                iterator( list_iterator const& it, bucket_ptr pFirst, bucket_ptr pLast )
+                    : m_pCurBucket( pFirst )
+                    , m_itList( it )
+                    , m_pEndBucket( pLast )
+                {
+                    if ( it == pFirst->end() )
+                        next();
+                }
+
+                iterator( iterator const& src )
+                    : m_pCurBucket( src.m_pCurBucket )
+                    , m_itList( src.m_itList )
+                    , m_pEndBucket( src.m_pEndBucket )
+                {}
+
+                value_ptr operator ->() const
+                {
+                    assert( m_pCurBucket != null_ptr<bucket_ptr>() );
+                    return m_itList.operator ->();
+                }
+
+                value_ref operator *() const
+                {
+                    assert( m_pCurBucket != null_ptr<bucket_ptr>() );
+                    return m_itList.operator *();
+                }
+
+                /// Pre-increment
+                iterator& operator ++()
+                {
+                    next();
+                    return *this;
+                }
+
+                iterator& operator = (const iterator& src)
+                {
+                    m_pCurBucket = src.m_pCurBucket;
+                    m_pEndBucket = src.m_pEndBucket;
+                    m_itList = src.m_itList;
+                    return *this;
+                }
+
+                bucket_ptr bucket() const
+                {
+                    return m_pCurBucket != m_pEndBucket ? m_pCurBucket : null_ptr<bucket_ptr>();
+                }
+
+                template <bool C>
+                bool operator ==(iterator<OrderedList, C> const& i ) const
+                {
+                    return m_pCurBucket == i.m_pCurBucket && m_itList == i.m_itList;
+                }
+                template <bool C>
+                bool operator !=(iterator<OrderedList, C> const& i ) const
+                {
+                    return !( *this == i );
+                }
+
+            };
+        }
+        //@endcond
+    }
+
+    //@cond
+    // Forward declarations
+    template <class GC, class OrderedList, class Traits = michael_set::type_traits>
+    class MichaelHashSet;
+    //@endcond
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_MICHAEL_SET_BASE_H
diff --git a/cds/intrusive/michael_set_nogc.h b/cds/intrusive/michael_set_nogc.h
new file mode 100644 (file)
index 0000000..51efe38
--- /dev/null
@@ -0,0 +1,386 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_SET_NOGC_H
+#define __CDS_INTRUSIVE_MICHAEL_SET_NOGC_H
+
+#include <cds/intrusive/michael_set_base.h>
+#include <cds/gc/nogc.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace intrusive {
+
+    /// Michael's hash set (template specialization for gc::nogc)
+    /** @ingroup cds_intrusive_map
+        \anchor cds_intrusive_MichaelHashSet_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+
+        See \ref cds_intrusive_MichaelHashSet_hp "MichaelHashSet" for description of template parameters.
+        The template parameter \p OrderedList should be any gc::nogc-derived ordered list, for example,
+        \ref cds_intrusive_MichaelList_nogc "persistent MichaelList".
+
+        The interface of the specialization is a slightly different.
+    */
+    template <
+        class OrderedList,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = michael_set::type_traits
+#else
+        class Traits
+#endif
+    >
+    class MichaelHashSet< gc::nogc, OrderedList, Traits >
+    {
+    public:
+        typedef OrderedList bucket_type     ;   ///< type of ordered list used as a bucket implementation
+        typedef Traits      options         ;   ///< Traits template parameters
+
+        typedef typename bucket_type::value_type        value_type      ;   ///< type of value stored in the list
+        typedef gc::nogc                                gc              ;   ///< Garbage collector
+        typedef typename bucket_type::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename bucket_type::disposer          disposer        ;   ///< Node disposer functor
+
+        /// Hash functor for \ref value_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+
+        /// Bucket table allocator
+        typedef cds::details::Allocator< bucket_type, typename options::allocator >  bucket_table_allocator;
+
+    protected:
+        item_counter    m_ItemCounter   ;   ///< Item counter
+        hash            m_HashFunctor   ;   ///< Hash functor
+
+        bucket_type *   m_Buckets       ;   ///< bucket table
+
+    private:
+        //@cond
+        const size_t    m_nHashBitmask;
+        //@endcond
+
+    protected:
+        /// Calculates hash value of \p key
+        template <typename Q>
+        size_t hash_value( Q const & key ) const
+        {
+            return m_HashFunctor( key ) & m_nHashBitmask;
+        }
+
+        /// Returns the bucket (ordered list) for \p key
+        template <typename Q>
+        bucket_type&    bucket( Q const & key )
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for Michael's set is based on \p OrderedList forward iterator and has some features:
+            - it has no post-increment operator
+            - it iterates items in unordered fashion
+        */
+        typedef michael_set::details::iterator< bucket_type, false >    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef michael_set::details::iterator< bucket_type, true >     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a set
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        //@{
+        const_iterator begin() const
+        {
+            return get_const_begin();
+        }
+        const_iterator cbegin()
+        {
+            return get_const_begin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a set
+        //@{
+        const_iterator end() const
+        {
+            return get_const_end();
+        }
+        const_iterator cend()
+        {
+            return get_const_end();
+        }
+        //@}
+
+    private:
+        //@cond
+        const_iterator get_const_begin() const
+        {
+            return const_iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+        const_iterator get_const_end() const
+        {
+            return const_iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+        //@endcond
+
+    public:
+        /// Initializes hash set
+        /**
+            See \ref cds_intrusive_MichaelHashSet_hp "MichaelHashSet" ctor for explanation
+        */
+        MichaelHashSet(
+            size_t nMaxItemCount,   ///< estimation of max item count in the hash set
+            size_t nLoadFactor      ///< load factor: estimation of max number of items in the bucket
+        ) : m_nHashBitmask( michael_set::details::init_hash_bitmask( nMaxItemCount, nLoadFactor ))
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename bucket_type::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ), "atomicity::empty_item_counter is not allowed as a item counter");
+
+            m_Buckets = bucket_table_allocator().NewArray( bucket_count() );
+        }
+
+        /// Clears hash set object and destroys it
+        ~MichaelHashSet()
+        {
+            clear();
+            bucket_table_allocator().Delete( m_Buckets, bucket_count() );
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            bool bRet = bucket( val ).insert( val );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Ensures that the \p item exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the set, then \p val is inserted into the set.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refers to the same thing.
+
+            The functor can change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            std::pair<bool, bool> bRet = bucket( val ).ensure( val, func );
+            if ( bRet.first && bRet.second )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelHashSet_nogc_find_val
+            The function searches the item with key equal to \p val
+            and returns pointer to item found, otherwise \p NULL.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        value_type * find( Q const& val )
+        {
+            return bucket( val ).find( val );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_nogc_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        value_type * find_with( Q const& val, Less pred )
+        {
+            return bucket( val ).find_with( val, pred );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelHashSet_nogc_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return bucket( val ).find( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_nogc_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find( Q& val, Less pred, Func f )
+        {
+            return bucket( val ).find_with( val, pred, f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelHashSet_nogc_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return bucket( val ).find( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_nogc_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return bucket( val ).find_with( val, pred, f );
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function unlink all items from the set.
+            The function is not atomic. It cleans up each bucket and then resets the item counter to zero.
+            If there are a thread that performs insertion while \p clear is working the result is undefined in general case:
+            <tt> empty() </tt> may return \p true but the set may contain item(s).
+            Therefore, \p clear may be used only for debugging purposes.
+
+            For each item the \p disposer is called after unlinking.
+        */
+        void clear()
+        {
+            for ( size_t i = 0; i < bucket_count(); ++i )
+                m_Buckets[i].clear();
+            m_ItemCounter.reset();
+        }
+
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+            Thus, the correct item counting feature is an important part of Michael's set implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns the size of hash table
+        /**
+            Since MichaelHashSet cannot dynamically extend the hash table size,
+            the value returned is an constant depending on object initialization parameters;
+            see MichaelHashSet::MichaelHashSet for explanation.
+        */
+        size_t bucket_count() const
+        {
+            return m_nHashBitmask + 1;
+        }
+
+    };
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_MICHAEL_SET_NOGC_H
+
diff --git a/cds/intrusive/michael_set_rcu.h b/cds/intrusive/michael_set_rcu.h
new file mode 100644 (file)
index 0000000..8e13002
--- /dev/null
@@ -0,0 +1,681 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MICHAEL_SET_RCU_H
+#define __CDS_INTRUSIVE_MICHAEL_SET_RCU_H
+
+#include <cds/intrusive/michael_set_base.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace intrusive {
+
+    /// Michael's hash set, \ref cds_urcu_desc "RCU" specialization
+    /** @ingroup cds_intrusive_map
+        \anchor cds_intrusive_MichaelHashSet_rcu
+
+        Source:
+            - [2002] Maged Michael "High performance dynamic lock-free hash tables and list-based sets"
+
+        Michael's hash table algorithm is based on lock-free ordered list and it is very simple.
+        The main structure is an array \p T of size \p M. Each element in \p T is basically a pointer
+        to a hash bucket, implemented as a singly linked list. The array of buckets cannot be dynamically expanded.
+        However, each bucket may contain unbounded number of items.
+
+        Template parameters are:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p OrderedList - ordered list implementation used as bucket for hash set, for example, MichaelList, LazyList.
+            The intrusive ordered list implementation specifies the type \p T stored in the hash-set, the reclamation
+            schema \p GC used by hash-set, the comparison functor for the type \p T and other features specific for
+            the ordered list.
+        - \p Traits - type traits. See michael_set::type_traits for explanation.
+            Instead of defining \p Traits struct you can use option-based syntax with michael_set::make_traits metafunction.
+
+        \par Usage
+            Before including <tt><cds/intrusive/michael_set_rcu.h></tt> you should include appropriate RCU header file,
+            see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+            For example, for \ref cds_urcu_general_buffered_gc "general-purpose buffered RCU" you should include:
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/intrusive/michael_list_rcu.h>
+            #include <cds/intrusive/michael_set_rcu.h>
+
+            struct Foo { ... };
+            // Hash functor for struct Foo
+            struct foo_hash {
+                size_t operator()( Foo const& foo ) const { return ... }
+            };
+
+            // Now, you can declare Michael's list for type Foo and default traits:
+            typedef cds::intrusive::MichaelList<cds::urcu::gc< general_buffered<> >, Foo > rcu_michael_list;
+
+            // Declare Michael's set with MichaelList as bucket type
+            typedef cds::intrusive::MichaelSet<
+                cds::urcu::gc< general_buffered<> >,
+                rcu_michael_list,
+                cds::intrusive::michael_set::make_traits<
+                    cds::opt::::hash< foo_hash >
+                >::type
+            > rcu_michael_set;
+
+            // Declares hash set for 1000000 items with load factor 2
+            rcu_michael_set theSet( 1000000, 2 );
+
+            // Now you can use theSet object in many threads without any synchronization.
+            \endcode
+    */
+    template <
+        class RCU,
+        class OrderedList,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = michael_set::type_traits
+#else
+        class Traits
+#endif
+    >
+    class MichaelHashSet< cds::urcu::gc< RCU >, OrderedList, Traits >
+    {
+    public:
+        typedef OrderedList bucket_type     ;   ///< type of ordered list used as a bucket implementation
+        typedef Traits      options         ;   ///< Traits template parameters
+
+        typedef typename bucket_type::value_type        value_type      ;   ///< type of value stored in the list
+        typedef cds::urcu::gc< RCU >                    gc              ;   ///< RCU schema
+        typedef typename bucket_type::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename bucket_type::disposer          disposer        ;   ///< Node disposer functor
+
+        /// Hash functor for \ref value_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+
+        /// Bucket table allocator
+        typedef cds::details::Allocator< bucket_type, typename options::allocator >  bucket_table_allocator;
+
+        typedef typename bucket_type::rcu_lock         rcu_lock        ;   ///< RCU scoped lock
+        typedef typename bucket_type::exempt_ptr       exempt_ptr      ;   ///< pointer to extracted node
+        /// Group of \p extract_xxx functions require external locking if underlying ordered list requires that
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = bucket_type::c_bExtractLockExternal;
+
+    protected:
+        item_counter    m_ItemCounter   ;   ///< Item counter
+        hash            m_HashFunctor   ;   ///< Hash functor
+
+        bucket_type *   m_Buckets       ;   ///< bucket table
+
+    private:
+        //@cond
+        const size_t    m_nHashBitmask;
+        //@endcond
+
+    protected:
+        //@cond
+        /// Calculates hash value of \p key
+        template <typename Q>
+        size_t hash_value( Q const& key ) const
+        {
+            return m_HashFunctor( key ) & m_nHashBitmask;
+        }
+
+        /// Returns the bucket (ordered list) for \p key
+        template <typename Q>
+        bucket_type& bucket( Q const& key )
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+        template <typename Q>
+        bucket_type const& bucket( Q const& key ) const
+        {
+            return m_Buckets[ hash_value( key ) ];
+        }
+        //@endcond
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for Michael's set is based on \p OrderedList forward iterator and has some features:
+            - it has no post-increment operator
+            - it iterates items in unordered fashion
+        */
+        typedef michael_set::details::iterator< bucket_type, false >    iterator;
+
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef michael_set::details::iterator< bucket_type, true >     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        /**
+            For empty set \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a set
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+            The returned value can be used only to control reaching the end of the set.
+            For empty set \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        //@{
+        const_iterator begin() const
+        {
+            return get_const_begin();
+        }
+        const_iterator cbegin()
+        {
+            return get_const_begin();
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a set
+        //@{
+        const_iterator end() const
+        {
+            return get_const_end();
+        }
+        const_iterator cend()
+        {
+            return get_const_end();
+        }
+        //@}
+
+    private:
+        //@cond
+        const_iterator get_const_begin() const
+        {
+            return const_iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() );
+        }
+        const_iterator get_const_end() const
+        {
+            return const_iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+        }
+        //@endcond
+
+    public:
+        /// Initialize hash set
+        /**
+            The Michael's hash set is an unbounded container, but its hash table is non-expandable.
+            At construction time you should pass estimated maximum item count and a load factor.
+            The load factor is average size of one bucket - a small number between 1 and 10.
+            The bucket is an ordered single-linked list, the complexity of searching in the bucket is linear <tt>O(nLoadFactor)</tt>.
+            The constructor defines hash table size as rounding <tt>nMaxItemCount / nLoadFactor</tt> up to nearest power of two.
+        */
+        MichaelHashSet(
+            size_t nMaxItemCount,   ///< estimation of max item count in the hash set
+            size_t nLoadFactor      ///< load factor: average size of the bucket
+        ) : m_nHashBitmask( michael_set::details::init_hash_bitmask( nMaxItemCount, nLoadFactor ))
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename bucket_type::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ), "atomicity::empty_item_counter is not allowed as a item counter");
+
+            m_Buckets = bucket_table_allocator().NewArray( bucket_count() );
+        }
+
+        /// Clear hash set and destroy it
+        ~MichaelHashSet()
+        {
+            clear();
+            bucket_table_allocator().Delete( m_Buckets, bucket_count() );
+        }
+
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            bool bRet = bucket( val ).insert( val );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success and can be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            bool bRet = bucket( val ).insert( val, f );
+            if ( bRet )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Ensures that the \p item exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the set, then \p val is inserted into the set.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refers to the same thing.
+
+            The functor can change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            std::pair<bool, bool> bRet = bucket( val ).ensure( val, func );
+            if ( bRet.first && bRet.second )
+                ++m_ItemCounter;
+            return bRet;
+        }
+
+        /// Unlinks the item \p val from the set
+        /**
+            The function searches the item \p val in the set and unlink it from the set
+            if it is found and is equal to \p val.
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+            bool bRet = bucket( val ).unlink( val );
+            if ( bRet )
+                --m_ItemCounter;
+            return bRet;
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_MichaelHashSet_rcu_erase
+            The function searches an item with key equal to \p val in the set,
+            unlinks it from the set, and returns \p true.
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that may be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool erase( Q const& val )
+        {
+            if ( bucket( val ).erase( val )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_rcu_erase "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& val, Less pred )
+        {
+            if ( bucket( val ).erase_with( val, pred )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_MichaelHashSet_rcu_erase_func
+            The function searches an item with key equal to \p val in the set,
+            call \p f functor with item found, and unlinks it from the set.
+            The \ref disposer specified in \p OrderedList class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q, typename Func>
+        bool erase( const Q& val, Func f )
+        {
+            if ( bucket( val ).erase( val, f )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_rcu_erase_func "erase(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( const Q& val, Less pred, Func f )
+        {
+            if ( bucket( val ).erase_with( val, pred, f )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Extracts an item from the set
+        /** \anchor cds_intrusive_MichaelHashSet_rcu_extract
+            The function searches an item with key equal to \p val in the set,
+            unlinks it from the set, places item pointer into \p dest argument, and returns \p true.
+            If the item with the key equal to \p val is not found the function return \p false.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the set
+            and returns a pointer to item found.
+            You should lock RCU before calling of the function, and you should synchronize RCU
+            outside the RCU lock before reusing returned pointer.
+
+            \code
+            #include <cds/urcu/general_buffered.h>
+            #include <cds/intrusive/michael_list_rcu.h>
+            #include <cds/intrusive/michael_set_rcu.h>
+
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::intrusive::MichaelList< rcu, Foo > rcu_michael_list;
+            typedef cds::intrusive::MichaelHashSet< rcu, rcu_michael_list, foo_traits > rcu_michael_set;
+
+            rcu_michael_set theSet;
+            // ...
+
+            rcu_michael_set::exempt_ptr p;
+            {
+                // first, we should lock RCU
+                rcu_michael_set::rcu_lock lock;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theSet.extract( p, 10 )) {
+                    // do something with p
+                    ...
+                }
+            }
+
+            // We may safely release p here
+            // release() passes the pointer to RCU reclamation cycle:
+            // it invokes RCU retire_ptr function with the disposer you provided for rcu_michael_list.
+            p.release();
+            \endcode
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& dest, Q const& val )
+        {
+            if ( bucket( val ).extract( dest, val )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Extracts an item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_rcu_extract "extract(exempt_ptr&, Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& dest, Q const& val, Less pred )
+        {
+            if ( bucket( val ).extract_with( dest, val, pred )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_MichaelHashSet_rcu_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if \p val found or \p false otherwise.
+        */
+        template <typename Q>
+        bool find( Q const& val ) const
+        {
+            return bucket( val ).find( val );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_rcu_find_val "find(Q const&)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred ) const
+        {
+            return bucket( val ).find_with( val, pred );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_MichaelHashSet_rcu_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f ) const
+        {
+            return bucket( val ).find( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_rcu_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f ) const
+        {
+            return bucket( val ).find_with( val, pred, f );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_MichaelHashSet_rcu_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f ) const
+        {
+            return bucket( val ).find( val, f );
+        }
+
+        /// Finds the key \p val using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_rcu_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f ) const
+        {
+            return bucket( val ).find_with( val, pred, f );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_intrusive_MichaelHashSet_rcu_get
+            The function searches the item with key equal to \p val and returns the pointer to item found.
+            If \p val is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::intrusive::MichaelHashSet< your_template_parameters > hash_set;
+            hash_set theSet;
+            // ...
+            {
+                // Lock RCU
+                hash_set::rcu_lock lock;
+
+                foo * pVal = theSet.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be retired by disposer at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename Q>
+        value_type * get( Q const& val ) const
+        {
+            return bucket( val ).get( val );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_MichaelHashSet_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& val, Less pred ) const
+        {
+            return bucket( val ).get_with( val, pred );
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function unlink all items from the set.
+            The function is not atomic. It cleans up each bucket and then resets the item counter to zero.
+            If there are a thread that performs insertion while \p clear is working the result is undefined in general case:
+            <tt> empty() </tt> may return \p true but the set may contain item(s).
+            Therefore, \p clear may be used only for debugging purposes.
+
+            For each item the \p disposer is called after unlinking.
+        */
+        void clear()
+        {
+            for ( size_t i = 0; i < bucket_count(); ++i )
+                m_Buckets[i].clear();
+            m_ItemCounter.reset();
+        }
+
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+            Thus, the correct item counting feature is an important part of Michael's set implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns the size of hash table
+        /**
+            Since %MichaelHashSet cannot dynamically extend the hash table size,
+            the value returned is an constant depending on object initialization parameters;
+            see \ref cds_intrusive_MichaelHashSet_hp "MichaelHashSet" for explanation.
+        */
+        size_t bucket_count() const
+        {
+            return m_nHashBitmask + 1;
+        }
+
+    };
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_MICHAEL_SET_NOGC_H
+
diff --git a/cds/intrusive/moir_queue.h b/cds/intrusive/moir_queue.h
new file mode 100644 (file)
index 0000000..29e0812
--- /dev/null
@@ -0,0 +1,173 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MOIR_QUEUE_H
+#define __CDS_INTRUSIVE_MOIR_QUEUE_H
+
+#include <cds/intrusive/msqueue.h>
+
+namespace cds { namespace intrusive {
+
+    /// A variation of Michael & Scott's lock-free queue (intrusive variant)
+    /** @ingroup cds_intrusive_queue
+        This is slightly optimized Michael & Scott's queue algorithm that overloads \ref dequeue function.
+
+        Source:
+            \li [2000] Simon Doherty, Lindsay Groves, Victor Luchangco, Mark Moir
+                "Formal Verification of a practical lock-free queue algorithm"
+
+        Cite from this work about difference from Michael & Scott algo:
+        "Our algorithm differs from Michael and Scott\92s [MS98] in that we test whether \p Tail points to the header
+        node only <b>after</b> \p Head has been updated, so a dequeuing process reads \p Tail only once. The dequeue in
+        [MS98] performs this test before checking whether the next pointer in the dummy node is null, which
+        means that it reads \p Tail every time a dequeuing process loops. Under high load, when operations retry
+        frequently, our modification will reduce the number of accesses to global memory. This modification, however,
+        introduces the possibility of \p Head and \p Tail \93crossing\94."
+
+        Type of node: \ref single_link::node
+
+        Explanation of template arguments see intrusive::MSQueue.
+
+        \par Examples
+        \code
+        #include <cds/intrusive/moir_queue.h>
+        #include <cds/gc/hp.h>
+
+        namespace ci = cds::inrtusive;
+        typedef cds::gc::HP hp_gc;
+
+        // MoirQueue with Hazard Pointer garbage collector, base hook + item disposer:
+        struct Foo: public ci::single_link::node< hp_gc >
+        {
+            // Your data
+            ...
+        };
+
+        // Disposer for Foo struct just deletes the object passed in
+        struct fooDisposer {
+            void operator()( Foo * p )
+            {
+                delete p;
+            }
+        };
+
+        typedef ci::MoirQueue<
+            hp_gc
+            ,Foo
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<hp_gc> >
+            >
+            ,ci::opt::disposer< fooDisposer >
+        > fooQueue;
+
+        // MoirQueue with Hazard Pointer garbage collector,
+        // member hook + item disposer + item counter,
+        // without alignment of internal queue data:
+        struct Bar
+        {
+            // Your data
+            ...
+            ci::single_link::node< hp_gc > hMember;
+        };
+
+        typedef ci::MoirQueue<
+            hp_gc
+            ,Foo
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(Bar, hMember)
+                    ,ci::opt::gc<hp_gc>
+                >
+            >
+            ,ci::opt::disposer< fooDisposer >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+            ,cds::opt::alignment< cds::opt::no_special_alignment >
+        > barQueue;
+
+        \endcode
+    */
+    template <typename GC, typename T, CDS_DECL_OPTIONS9>
+    class MoirQueue: public MSQueue< GC, T, CDS_OPTIONS9 >
+    {
+        //@cond
+        typedef MSQueue< GC, T, CDS_OPTIONS9 > base_class;
+        typedef typename base_class::node_type node_type;
+        //@endcond
+
+    public:
+        //@cond
+        typedef typename base_class::value_type value_type;
+        typedef typename base_class::back_off   back_off;
+        typedef typename base_class::gc         gc;
+        typedef typename base_class::node_traits node_traits;
+        typedef typename base_class::memory_model   memory_model;
+        //@endcond
+
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS9>
+        struct rebind {
+            typedef MoirQueue< GC2, T2, CDS_OTHER_OPTIONS9> other   ;   ///< Rebinding result
+        };
+
+    protected:
+        //@cond
+        typedef typename base_class::dequeue_result dequeue_result;
+        typedef typename base_class::node_to_value node_to_value;
+
+        bool do_dequeue( dequeue_result& res )
+        {
+            back_off bkoff;
+
+            node_type * pNext;
+            node_type * h;
+            while ( true ) {
+                h = res.guards.protect( 0, base_class::m_pHead, node_to_value() );
+                pNext = res.guards.protect( 1, h->m_pNext, node_to_value() );
+
+                if ( pNext == null_ptr<node_type *>() )
+                    return false    ;    // queue is empty
+
+                if ( base_class::m_pHead.compare_exchange_strong( h, pNext, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) {
+                    node_type * t = base_class::m_pTail.load(memory_model::memory_order_acquire);
+                    if ( h == t )
+                        base_class::m_pTail.compare_exchange_strong( t, pNext, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+                    break;
+                }
+
+                base_class::m_Stat.onDequeueRace();
+                bkoff();
+            }
+
+            --base_class::m_ItemCounter;
+            base_class::m_Stat.onDequeue();
+
+            res.pHead = h;
+            res.pNext = pNext;
+            return true;
+        }
+        //@endcond
+
+    public:
+        /// Dequeues a value from the queue
+        /** @anchor cds_intrusive_MoirQueue_dequeue
+            See warning about item disposing in \ref MSQueue::dequeue.
+        */
+        value_type * dequeue()
+        {
+            dequeue_result res;
+            if ( do_dequeue( res )) {
+                base_class::dispose_result( res );
+                return node_traits::to_value_ptr( *res.pNext );
+            }
+            return null_ptr<value_type *>();
+        }
+
+        /// Synonym for \ref cds_intrusive_MoirQueue_dequeue "dequeue" function
+        value_type * pop()
+        {
+            return dequeue();
+        }
+    };
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_MOIR_QUEUE_H
diff --git a/cds/intrusive/mspriority_queue.h b/cds/intrusive/mspriority_queue.h
new file mode 100644 (file)
index 0000000..fa651cc
--- /dev/null
@@ -0,0 +1,515 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MSPRIORITY_QUEUE_H
+#define __CDS_INTRUSIVE_MSPRIORITY_QUEUE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/lock/spinlock.h>
+#include <cds/os/thread.h>
+#include <cds/details/bit_reverse_counter.h>
+#include <cds/intrusive/options.h>
+#include <cds/opt/buffer.h>
+#include <cds/opt/compare.h>
+#include <cds/details/bounded_container.h>
+#include <cds/ref.h>
+
+namespace cds { namespace intrusive {
+
+    /// MSPriorityQueue related definitions
+    /** @ingroup cds_intrusive_helper
+    */
+    namespace mspriority_queue {
+
+        /// MSPriorityQueue statistics
+        template <typename Counter = cds::atomicity::event_counter>
+        struct stat {
+            typedef Counter   event_counter ; ///< Event counter type
+
+            event_counter   m_nPushCount            ;   ///< Count of success push operation
+            event_counter   m_nPopCount             ;   ///< Count of success pop operation
+            event_counter   m_nPushFailCount        ;   ///< Count of failed ("the queue is full") push operation
+            event_counter   m_nPopFailCount         ;   ///< Count of failed ("the queue is empty") pop operation
+            event_counter   m_nPushHeapifySwapCount ;   ///< Count of item swapping when heapifying in push
+            event_counter   m_nPopHeapifySwapCount  ;   ///< Count of item swapping when heapifying in pop
+
+            //@cond
+            void onPushSuccess()            { ++m_nPushCount            ;}
+            void onPopSuccess()             { ++m_nPopCount             ;}
+            void onPushFailed()             { ++m_nPushFailCount        ;}
+            void onPopFailed()              { ++m_nPopFailCount         ;}
+            void onPushHeapifySwap()        { ++m_nPushHeapifySwapCount ;}
+            void onPopHeapifySwap()         { ++m_nPopHeapifySwapCount  ;}
+            //@endcond
+        };
+
+        /// MSPriorityQueue empty statistics
+        struct empty_stat {
+            //@cond
+            void onPushSuccess()            {}
+            void onPopSuccess()             {}
+            void onPushFailed()             {}
+            void onPopFailed()              {}
+            void onPushHeapifySwap()        {}
+            void onPopHeapifySwap()         {}
+            //@endcond
+        };
+
+        /// Type traits for MSPriorityQueue
+        struct type_traits {
+            /// Storage type
+            /**
+                The storage type for the heap array. Default is cds::opt::v::dynamic_buffer.
+
+                You may specify any type of buffer's value since at instantiation time 
+                the \p buffer::rebind member metafunction is called to change type 
+                of values stored in the buffer.
+            */
+            typedef opt::v::dynamic_buffer<void *>  buffer;
+
+            /// Priority compare functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+            */
+            typedef opt::none           compare;
+
+            /// specifies binary predicate used for priority comparing.
+            /**
+                Default is \p std::less<T>.
+            */
+            typedef opt::none           less;
+
+            /// Type of mutual-exclusion lock
+            typedef lock::Spin          lock_type;
+
+            /// Back-off strategy
+            typedef backoff::yield      back_off;
+
+            /// Internal statistics
+            /**
+                Possible types: mspriority_queue::empty_stat (the default), mspriority_queue::stat
+                or any other with interface like \p %mspriority_queue::stat
+            */
+            typedef empty_stat      stat;
+        };
+
+        /// Metafunction converting option list to traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+
+            See \ref MSPriorityQueue, \ref type_traits, \ref cds::opt::make_options.
+        */
+        template <CDS_DECL_OPTIONS7>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS7 >::type
+                ,CDS_OPTIONS7
+            >::type   type;
+#   endif
+        };
+
+    }   // namespace mspriority_queue
+
+    /// Michael & Scott array-based lock-based concurrent priority queue heap
+    /** @ingroup cds_intrusive_priority_queue
+        Source:
+            - [1996] G.Hunt, M.Michael, S. Parthasarathy, M.Scott
+                "An efficient algorithm for concurrent priority queue heaps"
+
+        \p %MSPriorityQueue augments the standard array-based heap data structure with
+        a mutual-exclusion lock on the heap's size and locks on each node in the heap.
+        Each node also has a tag that indicates whether
+        it is empty, valid, or in a transient state due to an update to the heap
+        by an inserting thread.
+        The algorithm allows concurrent insertions and deletions in opposite directions,
+        without risking deadlock and without the need for special server threads.
+        It also uses a "bit-reversal" technique to scatter accesses across the fringe
+        of the tree to reduce contention.
+        On large heaps the algorithm achieves significant performance improvements
+        over serialized single-lock algorithm, for various insertion/deletion
+        workloads. For small heaps it still performs well, but not as well as
+        single-lock algorithm.
+
+        Template parameters:
+        - \p T - type to be stored in the list. The priority is a part of \p T type.
+        - \p Traits - type traits. See mspriority_queue::type_traits for explanation.
+
+        It is possible to declare option-based queue with cds::container::mspriority_queue::make_traits
+        metafunction instead of \p Traits template argument.
+        Template argument list \p Options of \p %cds::container::mspriority_queue::make_traits metafunction are:
+        - opt::buffer - the buffer type for heap array. Possible type are: opt::v::static_buffer, opt::v::dynamic_buffer.
+            Default is \p %opt::v::dynamic_buffer.
+            You may specify any type of values for the buffer since at instantiation time
+            the \p buffer::rebind member metafunction is called to change the type of values stored in the buffer.
+        - opt::compare - priority compare functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for priority compare. Default is \p std::less<T>.
+        - opt::lock_type - lock type. Default is cds::lock::Spin.
+        - opt::back_off - back-off strategy. Default is cds::backoff::yield
+        - opt::stat - internal statistics. Available types: mspriority_queue::stat, mspriority_queue::empty_stat (the default)
+    */
+    template <typename T, class Traits>
+    class MSPriorityQueue: public cds::bounded_container
+    {
+    public:
+        typedef T           value_type  ;   ///< Value type stored in the queue
+        typedef Traits      traits      ;   ///< Traits template parameter
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< priority comparing functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename opt::details::make_comparator< value_type, traits >::type key_comparator;
+#   endif
+
+        typedef typename traits::lock_type lock_type       ;   ///< heap's size lock type
+        typedef typename traits::back_off  back_off        ;   ///< Back-off strategy
+        typedef typename traits::stat          stat        ;   ///< internal statistics type
+
+    protected:
+        //@cond
+        typedef cds::OS::ThreadId   tag_type;
+
+        enum tag_value {
+            Available   = -1,
+            Empty       = 0
+        };
+        //@endcond
+
+        //@cond
+        /// Heap item type
+        struct node {
+            value_type *        m_pVal  ;   ///< A value pointer
+            tag_type volatile   m_nTag  ;   ///< A tag
+            mutable lock_type   m_Lock  ;   ///< Node-level lock
+
+            /// Creates empty node
+            node()
+                : m_pVal( null_ptr<value_type *>() )
+                , m_nTag( tag_type(Empty) )
+            {}
+
+            /// Lock the node
+            void lock()
+            {
+                m_Lock.lock();
+            }
+
+            /// Unlock the node
+            void unlock()
+            {
+                m_Lock.unlock();
+            }
+        };
+        //@endcond
+
+    protected:
+        //@cond
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_cleaner
+        {
+            void operator()( value_type const& ) const
+            {}
+        };
+#   endif
+        //@endcond
+
+    public:
+        typedef typename traits::buffer::template rebind<node>::other   buffer_type ;   ///< Heap array buffer type
+
+        //@cond
+        typedef cds::bitop::bit_reverse_counter<>           item_counter_type;
+        typedef typename item_counter_type::counter_type    counter_type;
+        //@endcond
+
+    protected:
+        item_counter_type   m_ItemCounter   ;   ///< Item counter
+        mutable lock_type   m_Lock          ;   ///< Heap's size lock
+        buffer_type         m_Heap          ;   ///< Heap array
+        stat                m_Stat          ;   ///< internal statistics accumulator
+
+    public:
+        /// Constructs empty priority queue
+        /**
+            For cds::opt::v::static_buffer the \p nCapacity parameter is ignored.
+        */
+        MSPriorityQueue( size_t nCapacity )
+            : m_Heap( nCapacity )
+        {}
+
+        /// Clears priority queue and destructs the object
+        ~MSPriorityQueue()
+        {
+            clear();
+        }
+
+        /// Inserts a item into priority queue
+        /**
+            If the priority queue is full, the function returns \p false,
+            no item has been added.
+            Otherwise, the function inserts the copy of \p val into the heap
+            and returns \p true.
+
+            The function use copy constructor to create new heap item from \p val.
+        */
+        bool push( value_type& val )
+        {
+            tag_type const curId = cds::OS::getCurrentThreadId();
+
+            // Insert new item at bottom of the heap
+            m_Lock.lock();
+            if ( m_ItemCounter.value() >= capacity() ) {
+                // the heap is full
+                m_Lock.unlock();
+                m_Stat.onPushFailed();
+                return false;
+            }
+
+            counter_type i = m_ItemCounter.inc();
+            assert( i < m_Heap.capacity() );
+
+            node& refNode = m_Heap[i];
+            refNode.lock();
+            m_Lock.unlock();
+            refNode.m_pVal = &val;
+            refNode.m_nTag = curId;
+            refNode.unlock();
+
+            // Move item towards top of the heap while it has higher priority than parent
+            heapify_after_push( i, curId );
+
+            m_Stat.onPushSuccess();
+            return true;
+        }
+
+        /// Extracts item with high priority
+        /**
+            If the priority queue is empty, the function returns \p nullptr.
+            Otherwise, it returns the item extracted.
+
+            The item returned may be disposed immediately.
+        */
+        value_type * pop()
+        {
+            m_Lock.lock();
+            if ( m_ItemCounter.value() == 0 ) {
+                // the heap is empty
+                m_Lock.unlock();
+                m_Stat.onPopFailed();
+                return false;
+            }
+            counter_type nBottom = m_ItemCounter.reversed_value();
+            m_ItemCounter.dec();
+            // Since m_Heap[0] is not used, capacity() returns m_Heap.capacity() - 1
+            // Consequently, "<=" is here
+            assert( nBottom <= capacity() );
+            assert( nBottom > 0 );
+
+            node& refBottom = m_Heap[ nBottom ];
+            refBottom.lock();
+            m_Lock.unlock();
+            refBottom.m_nTag = tag_type(Empty);
+            value_type * pVal = refBottom.m_pVal;
+            refBottom.m_pVal = null_ptr<value_type *>();
+            refBottom.unlock();
+
+            node& refTop = m_Heap[ 1 ];
+            refTop.lock();
+            if ( refTop.m_nTag == tag_type(Empty) ) {
+                // nBottom == nTop
+                refTop.unlock();
+                m_Stat.onPopSuccess();
+                return pVal;
+            }
+
+            std::swap( refTop.m_pVal, pVal );
+            refTop.m_nTag = tag_type( Available );
+
+            assert( nBottom > 1 );
+
+            // refTop will be unlocked inside heapify_after_pop
+            heapify_after_pop( 1, &refTop );
+
+            m_Stat.onPopSuccess();
+            return pVal;
+        }
+
+        /// Clears the queue (not atomic)
+        /**
+            This function is no atomic, but thread-safe
+        */
+        void clear()
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            clear_with( []( value_type const& src ) {} );
+#       else
+            clear_with( empty_cleaner() );
+#       endif
+        }
+
+        /// Clears the queue (not atomic)
+        /**
+            This function is no atomic, but thread-safe.
+
+            For each item removed the functor \p f is called.
+            \p Func interface is:
+            \code
+                struct clear_functor
+                {
+                    void operator()( value_type& item );
+                };
+            \endcode
+            A lambda function or a function pointer can be used as \p f.
+        */
+        template <typename Func>
+        void clear_with( Func f )
+        {
+            while ( !empty() ) {
+                value_type * pVal = pop();
+                if ( pVal )
+                    cds::unref(f)( *pVal );
+            }
+        }
+
+        /// Checks is the priority queue is empty
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Checks if the priority queue is full
+        bool full() const
+        {
+            return size() == capacity();
+        }
+
+        /// Returns current size of priority queue
+        size_t size() const
+        {
+            m_Lock.lock();
+            size_t nSize = (size_t) m_ItemCounter.value();
+            m_Lock.unlock();
+            return nSize;
+        }
+
+        /// Return capacity of the priority queue
+        size_t capacity() const
+        {
+            // m_Heap[0] is not used
+            return m_Heap.capacity() - 1;
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return m_Stat;
+        }
+
+    protected:
+        //@cond
+
+        void heapify_after_push( counter_type i, tag_type curId )
+        {
+            key_comparator  cmp;
+            back_off        bkoff;
+
+            // Move item towards top of the heap while it has higher priority than parent
+            while ( i > 1 ) {
+                bool bProgress = true;
+                counter_type nParent = i / 2;
+                node& refParent = m_Heap[nParent];
+                refParent.lock();
+                node& refItem = m_Heap[i];
+                refItem.lock();
+
+                if ( refParent.m_nTag == tag_type(Available) && refItem.m_nTag == curId ) {
+                    if ( cmp( *refItem.m_pVal, *refParent.m_pVal ) > 0 ) {
+                        std::swap( refItem.m_nTag, refParent.m_nTag );
+                        std::swap( refItem.m_pVal, refParent.m_pVal );
+                        m_Stat.onPushHeapifySwap();
+                        i = nParent;
+                    }
+                    else {
+                        refItem.m_nTag = tag_type(Available);
+                        i = 0;
+                    }
+                }
+                else if ( refParent.m_nTag == tag_type(Empty) )
+                    i = 0;
+                else if ( refItem.m_nTag != curId )
+                    i = nParent;
+                else
+                    bProgress = false;
+
+                refItem.unlock();
+                refParent.unlock();
+
+                if ( !bProgress )
+                    bkoff();
+                else
+                    bkoff.reset();
+            }
+
+            if ( i == 1 ) {
+                node& refItem = m_Heap[i];
+                refItem.lock();
+                if ( refItem.m_nTag == curId )
+                    refItem.m_nTag = tag_type(Available);
+                refItem.unlock();
+            }
+        }
+
+        void heapify_after_pop( counter_type nParent, node * pParent )
+        {
+            key_comparator cmp;
+
+            while ( nParent < m_Heap.capacity() / 2 ) {
+                counter_type nLeft = nParent * 2;
+                counter_type nRight = nLeft + 1;
+                node& refLeft = m_Heap[nLeft];
+                node& refRight = m_Heap[nRight];
+                refLeft.lock();
+                refRight.lock();
+
+                counter_type nChild;
+                node * pChild;
+                if ( refLeft.m_nTag == tag_type(Empty) ) {
+                    refRight.unlock();
+                    refLeft.unlock();
+                    break;
+                }
+                else if ( refRight.m_nTag == tag_type(Empty) || cmp( *refLeft.m_pVal, *refRight.m_pVal ) > 0 ) {
+                    refRight.unlock();
+                    nChild = nLeft;
+                    pChild = &refLeft;
+                }
+                else {
+                    refLeft.unlock();
+                    nChild = nRight;
+                    pChild = &refRight;
+                }
+
+                // If child has higher priority that parent then swap
+                // Otherwise stop
+                if ( cmp( *pChild->m_pVal, *pParent->m_pVal ) > 0 ) {
+                    std::swap( pParent->m_nTag, pChild->m_nTag );
+                    std::swap( pParent->m_pVal, pChild->m_pVal );
+                    pParent->unlock();
+                    m_Stat.onPopHeapifySwap();
+                    nParent = nChild;
+                    pParent = pChild;
+                }
+                else {
+                    pChild->unlock();
+                    break;
+                }
+            }
+            pParent->unlock();
+        }
+        //@endcond
+    };
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_MSPRIORITY_QUEUE_H
diff --git a/cds/intrusive/msqueue.h b/cds/intrusive/msqueue.h
new file mode 100644 (file)
index 0000000..aa37ba5
--- /dev/null
@@ -0,0 +1,427 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_MSQUEUE_H
+#define __CDS_INTRUSIVE_MSQUEUE_H
+
+#include <cds/intrusive/single_link_struct.h>
+#include <cds/intrusive/queue_stat.h>
+#include <cds/intrusive/details/dummy_node_holder.h>
+
+#include <cds/details/std/type_traits.h>
+
+namespace cds { namespace intrusive {
+
+    /// Michael & Scott's lock-free queue (intrusive variant)
+    /** @ingroup cds_intrusive_queue
+        Implementation of well-known Michael & Scott's queue algorithm.
+
+        \par Source:
+            [1998] Maged Michael, Michael Scott "Simple, fast, and practical non-blocking and blocking
+                   concurrent queue algorithms"
+
+        Template arguments:
+        - \p GC - garbage collector type: gc::HP, gc::HRC, gc::PTB
+        - \p T - type to be stored in the queue, should be convertible to \ref single_link::node
+        - \p Options - options
+
+        Type of node: \ref single_link::node
+
+        \p Options are:
+        - opt::hook - hook used. Possible values are: single_link::base_hook, single_link::member_hook, single_link::traits_hook.
+            If the option is not specified, <tt>single_link::base_hook<></tt> is used.
+            For Gidenstam's gc::HRC, only single_link::base_hook is supported.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer. This option is used
+            in \ref dequeue function.
+        - opt::link_checker - the type of node's link fields checking. Default is \ref opt::debug_check_link
+            Note: for gc::HRC garbage collector, link checking policy is always selected as \ref opt::always_check_link.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter (no item counting feature)
+        - opt::stat - the type to gather internal statistics.
+            Possible option value are: \ref queue_stat, \ref queue_dummy_stat, user-provided class that supports queue_stat interface.
+            Default is \ref queue_dummy_stat.
+        - opt::alignment - the alignment for internal queue data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        Garbage collecting schema \p GC must be consistent with the single_link::node GC.
+
+        \par About item disposing
+        The Michael & Scott's queue algo has a key feature: even if the queue is empty it contains one item that is "dummy" one from
+        the standpoint of the algo. See \ref dequeue function doc for explanation.
+
+        \par Examples
+        \code
+        #include <cds/intrusive/msqueue.h>
+        #include <cds/gc/hp.h>
+
+        namespace ci = cds::inrtusive;
+        typedef cds::gc::HP hp_gc;
+
+        // MSQueue with Hazard Pointer garbage collector, base hook + item disposer:
+        struct Foo: public ci::single_link::node< hp_gc >
+        {
+            // Your data
+            ...
+        };
+
+        // Disposer for Foo struct just deletes the object passed in
+        struct fooDisposer {
+            void operator()( Foo * p )
+            {
+                delete p;
+            }
+        };
+
+        typedef ci::MSQueue< hp_gc,
+            Foo
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<hp_gc> >
+            >
+            ,ci::opt::disposer< fooDisposer >
+        > fooQueue;
+
+        // MSQueue with Hazard Pointer garbage collector,
+        // member hook + item disposer + item counter,
+        // without alignment of internal queue data:
+        struct Bar
+        {
+            // Your data
+            ...
+            ci::single_link::node< hp_gc > hMember;
+        };
+
+        typedef ci::MSQueue< hp_gc,
+            Foo
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(Bar, hMember)
+                    ,ci::opt::gc<hp_gc>
+                >
+            >
+            ,ci::opt::disposer< fooDisposer >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+            ,cds::opt::alignment< cds::opt::no_special_alignment >
+        > barQueue;
+        \endcode
+    */
+    template <typename GC, typename T, CDS_DECL_OPTIONS9>
+    class MSQueue
+    {
+        //@cond
+        struct default_options
+        {
+            typedef cds::backoff::empty             back_off;
+            typedef single_link::base_hook<>        hook;
+            typedef opt::v::empty_disposer          disposer;
+            typedef atomicity::empty_item_counter   item_counter;
+            typedef queue_dummy_stat                stat;
+            typedef opt::v::relaxed_ordering        memory_model;
+            static const opt::link_check_type link_checker = opt::debug_check_link;
+            enum { alignment = opt::cache_line_alignment };
+        };
+        //@endcond
+
+    public:
+        //@cond
+        typedef typename opt::make_options<
+            typename cds::opt::find_type_traits< default_options, CDS_OPTIONS9 >::type
+            ,CDS_OPTIONS9
+        >::type   options;
+        //@endcond
+
+    public:
+        typedef T  value_type   ;   ///< type of value stored in the queue
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+        typedef typename single_link::get_link_checker< node_type, options::link_checker >::type link_checker   ;   ///< link checker
+
+        typedef GC gc          ;   ///< Garbage collector
+        typedef typename options::back_off  back_off    ;   ///< back-off strategy
+        typedef typename options::item_counter item_counter ;   ///< Item counting policy used
+        typedef typename options::stat      stat        ;   ///< Internal statistics policy used
+        typedef typename options::memory_model  memory_model ;   ///< Memory ordering. See cds::opt::memory_model option
+
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS9>
+        struct rebind {
+            typedef MSQueue< GC2, T2, CDS_OTHER_OPTIONS9> other   ;   ///< Rebinding result
+        };
+
+    protected:
+        //@cond
+        struct internal_disposer
+        {
+            void operator()( value_type * p )
+            {
+                assert( p != null_ptr<value_type *>());
+
+                MSQueue::clear_links( node_traits::to_node_ptr(p) );
+                disposer()( p );
+            }
+        };
+
+        typedef intrusive::node_to_value<MSQueue> node_to_value;
+        typedef typename opt::details::alignment_setter< typename node_type::atomic_node_ptr, options::alignment >::type aligned_node_ptr;
+
+        typedef typename opt::details::alignment_setter<
+            cds::intrusive::details::dummy_node< gc, node_type>,
+            options::alignment
+        >::type    dummy_node_type;
+
+        aligned_node_ptr    m_pHead ;           ///< Queue's head pointer (cache-line aligned)
+        aligned_node_ptr    m_pTail ;           ///< Queue's tail pointer (cache-line aligned)
+        dummy_node_type     m_Dummy ;           ///< dummy node
+        item_counter        m_ItemCounter   ;   ///< Item counter
+        stat                m_Stat  ;           ///< Internal statistics
+        //@endcond
+
+        //@cond
+        struct dequeue_result {
+            typename gc::template GuardArray<2>  guards;
+
+            node_type * pHead;
+            node_type * pNext;
+        };
+
+        bool do_dequeue( dequeue_result& res )
+        {
+            node_type * pNext;
+            back_off bkoff;
+
+            node_type * h;
+            while ( true ) {
+                h = res.guards.protect( 0, m_pHead, node_to_value() );
+                pNext = h->m_pNext.load( memory_model::memory_order_relaxed );
+                res.guards.assign( 1, node_to_value()( pNext ));
+                //pNext = res.guards.protect( 1, h->m_pNext, node_to_value() );
+                if ( m_pHead.load(memory_model::memory_order_acquire) != h )
+                    continue;
+
+                if ( pNext == null_ptr<node_type *>() )
+                    return false ;    // empty queue
+
+                node_type * t = m_pTail.load(memory_model::memory_order_acquire);
+                if ( h == t ) {
+                    // It is needed to help enqueue
+                    m_pTail.compare_exchange_strong( t, pNext, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+                    m_Stat.onBadTail();
+                    continue;
+                }
+
+                if ( m_pHead.compare_exchange_strong( h, pNext, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                    break;
+
+                m_Stat.onDequeueRace();
+                bkoff();
+            }
+
+            --m_ItemCounter;
+            m_Stat.onDequeue();
+
+            res.pHead = h;
+            res.pNext = pNext;
+            return true;
+        }
+
+        static void clear_links( node_type * pNode )
+        {
+            pNode->m_pNext.store( null_ptr<node_type *>(), memory_model::memory_order_release );
+        }
+
+        void dispose_result( dequeue_result& res )
+        {
+            dispose_node( res.pHead );
+        }
+
+        void dispose_node( node_type * p )
+        {
+            if ( p != m_Dummy.get() ) {
+                gc::template retire<internal_disposer>( node_traits::to_value_ptr(p) );
+            }
+            else {
+                // We cannot clear m_Dummy here since it leads to ABA.
+                // On the other hand, we cannot use deferred clear_links( &m_Dummy ) call via
+                // HP retiring cycle since m_Dummy is member of MSQueue and may be destroyed
+                // before HP retiring cycle invocation.
+                // So, we will never clear m_Dummy for gc::HP and gc::PTB
+                // However, gc::HRC nodes are managed by reference counting, so, we must
+                // call HP retire cycle.
+                m_Dummy.retire();
+            }
+        }
+        //@endcond
+
+    public:
+        /// Initializes empty queue
+        MSQueue()
+            : m_pHead( null_ptr<node_type *>() )
+            , m_pTail( null_ptr<node_type *>() )
+        {
+            // GC and node_type::gc must be the same
+            static_assert(( std::is_same<gc, typename node_type::gc>::value ), "GC and node_type::gc must be the same");
+
+            // For cds::gc::HRC, only base_hook is allowed
+            static_assert((
+                std::conditional<
+                    std::is_same<gc, cds::gc::HRC>::value,
+                    std::is_same< typename hook::hook_type, opt::base_hook_tag >,
+                    boost::true_type
+                >::type::value
+            ), "For cds::gc::HRC, only base_hook is allowed");
+
+            // Head/tail initialization should be made via store call
+            // since gc::HRC manages reference counting
+            m_pHead.store( m_Dummy.get(), memory_model::memory_order_relaxed );
+            m_pTail.store( m_Dummy.get(), memory_model::memory_order_relaxed );
+        }
+
+        /// Destructor clears the queue
+        /**
+            Since the Michael & Scott queue contains at least one item even
+            if the queue is empty, the destructor may call item disposer.
+        */
+        ~MSQueue()
+        {
+            clear();
+
+            node_type * pHead = m_pHead.load(memory_model::memory_order_relaxed);
+
+            assert( pHead != null_ptr<node_type *>() );
+            assert( pHead == m_pTail.load(memory_model::memory_order_relaxed) );
+
+            m_pHead.store( null_ptr<node_type *>(), memory_model::memory_order_relaxed );
+            m_pTail.store( null_ptr<node_type *>(), memory_model::memory_order_relaxed );
+
+            dispose_node( pHead );
+        }
+
+        /// Returns queue's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the queue
+            is empty. To check queue emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+        /// Returns reference to internal statistics
+        const stat& statistics() const
+        {
+            return m_Stat;
+        }
+
+        /// Enqueues \p val value into the queue.
+        /** @anchor cds_intrusive_MSQueue_enqueue
+            The function always returns \p true.
+        */
+        bool enqueue( value_type& val )
+        {
+            node_type * pNew = node_traits::to_node_ptr( val );
+            link_checker::is_empty( pNew );
+
+            typename gc::Guard guard;
+            back_off bkoff;
+
+            node_type * t;
+            while ( true ) {
+                t = guard.protect( m_pTail, node_to_value() );
+
+                node_type * pNext = t->m_pNext.load(memory_model::memory_order_acquire);
+                if ( pNext != null_ptr<node_type *>() ) {
+                    // Tail is misplaced, advance it
+                    m_pTail.compare_exchange_weak( t, pNext, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+                    m_Stat.onBadTail();
+                    continue;
+                }
+
+                node_type * tmp = null_ptr<node_type *>();
+                if ( t->m_pNext.compare_exchange_strong( tmp, pNew, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                    break;
+
+                m_Stat.onEnqueueRace();
+                bkoff();
+            }
+            ++m_ItemCounter;
+            m_Stat.onEnqueue();
+
+            if ( !m_pTail.compare_exchange_strong( t, pNew, memory_model::memory_order_acq_rel, CDS_ATOMIC::memory_order_relaxed ))
+                m_Stat.onAdvanceTailFailed();
+            return true;
+        }
+
+        /// Dequeues a value from the queue
+        /** @anchor cds_intrusive_MSQueue_dequeue
+            If the queue is empty the function returns \p NULL.
+
+            \par Warning
+            The queue algorithm has following feature: when \p dequeue is called,
+            the item returning is still queue's top, and previous top is disposed:
+
+            \code
+            before dequeuing         Dequeue               after dequeuing
+            +------------------+                           +------------------+
+      Top ->|      Item 1      |  -> Dispose Item 1        |      Item 2      | <- Top
+            +------------------+                           +------------------+
+            |      Item 2      |  -> Return Item 2         |       ...        |
+            +------------------+
+            |       ...        |
+            \endcode
+
+            \p dequeue function returns Item 2, that becomes new top of queue, and calls
+            the disposer for Item 1, that was queue's top on function entry.
+            Thus, you cannot manually delete item returned because it is still included in
+            item sequence and it has valuable link field that must not be zeroed.
+            The item may be deleted only in disposer call.
+        */
+        value_type * dequeue()
+        {
+            dequeue_result res;
+
+            if ( do_dequeue( res )) {
+                dispose_result( res );
+
+                return node_traits::to_value_ptr( *res.pNext );
+            }
+            return null_ptr<value_type *>();
+        }
+
+        /// Synonym for \ref cds_intrusive_MSQueue_enqueue "enqueue" function
+        bool push( value_type& val )
+        {
+            return enqueue( val );
+        }
+
+        /// Synonym for \ref cds_intrusive_MSQueue_dequeue "dequeue" function
+        value_type * pop()
+        {
+            return dequeue();
+        }
+
+        /// Checks if the queue is empty
+        bool empty() const
+        {
+            typename gc::Guard guard;
+            return guard.protect( m_pHead, node_to_value() )->m_pNext.load(memory_model::memory_order_relaxed) == null_ptr<node_type *>();
+        }
+
+        /// Clear the queue
+        /**
+            The function repeatedly calls \ref dequeue until it returns \p NULL.
+            The disposer defined in template \p Options is called for each item
+            that can be safely disposed.
+        */
+        void clear()
+        {
+            while ( dequeue() );
+        }
+    };
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_MSQUEUE_H
diff --git a/cds/intrusive/node_traits.h b/cds/intrusive/node_traits.h
new file mode 100644 (file)
index 0000000..6dda1f3
--- /dev/null
@@ -0,0 +1,166 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_NODE_TRAITS_H
+#define __CDS_INTRUSIVE_NODE_TRAITS_H
+
+#include <cds/intrusive/options.h>
+
+namespace cds { namespace intrusive {
+
+#ifdef CDS_DOXYGEN_INVOKED
+    /// Container's node traits
+    /** @ingroup cds_intrusive_helper
+        This traits is intended for converting between type \p T of value stored in the intrusive container
+        and container's node type \p NodeType.
+
+        There are separate specializations for each \p Hook type.
+    */
+    template <typename T, typename NodeType, typename Hook>
+    struct node_traits
+    {
+        typedef T        value_type ;  ///< Value type
+        typedef NodeType node_type  ;  ///< Node type
+
+        /// Convert value reference to node pointer
+        static node_type * to_node_ptr( value_type& v );
+
+        /// Convert value pointer to node pointer
+        static node_type * to_node_ptr( value_type * v );
+
+        /// Convert value reference to node pointer (const version)
+        static const node_type * to_node_ptr( value_type const& v );
+
+        /// Convert value pointer to node pointer (const version)
+        static const node_type * to_node_ptr( value_type const * v );
+
+        /// Convert node refernce to value pointer
+        static value_type * to_value_ptr( node_type&  n );
+
+        /// Convert node pointer to value pointer
+        static value_type * to_value_ptr( node_type *  n );
+
+        /// Convert node reference to value pointer (const version)
+        static const value_type * to_value_ptr( node_type const & n );
+
+        /// Convert node pointer to value pointer (const version)
+        static const value_type * to_value_ptr( node_type const * n );
+    };
+
+#else
+    template <typename T, typename NodeType, class Hook, typename HookType>
+    struct node_traits;
+#endif
+
+    //@cond
+    template <typename T, typename NodeType, class Hook>
+    struct node_traits<T, NodeType, Hook, opt::base_hook_tag>
+    {
+        typedef T        value_type;
+        typedef NodeType node_type;
+
+        static node_type * to_node_ptr( value_type& v )
+        {
+            return static_cast<node_type *>( &v );
+        }
+        static node_type * to_node_ptr( value_type * v )
+        {
+            return v ? static_cast<node_type *>( v ) : reinterpret_cast<node_type *>( NULL );
+        }
+        static const node_type * to_node_ptr( const value_type& v )
+        {
+            return static_cast<const node_type *>( &v );
+        }
+        static const node_type * to_node_ptr( const value_type * v )
+        {
+            return v ? static_cast<const node_type *>( v ) : reinterpret_cast<const node_type *>( NULL );
+        }
+        static value_type * to_value_ptr( node_type&  n )
+        {
+            return static_cast<value_type *>( &n );
+        }
+        static value_type * to_value_ptr( node_type *  n )
+        {
+            return n ? static_cast<value_type *>( n ) : reinterpret_cast<value_type *>( NULL );
+        }
+        static const value_type * to_value_ptr( const node_type& n )
+        {
+            return static_cast<const value_type *>( &n );
+        }
+        static const value_type * to_value_ptr( const node_type * n )
+        {
+            return n ? static_cast<const value_type *>( n ) : reinterpret_cast<const value_type *>( NULL );
+        }
+    };
+
+    template <typename T, typename NodeType, class Hook>
+    struct node_traits<T, NodeType, Hook, opt::member_hook_tag>
+    {
+        typedef T        value_type;
+        typedef NodeType node_type;
+
+        static node_type * to_node_ptr( value_type& v )
+        {
+            return reinterpret_cast<node_type *>( reinterpret_cast<char *>(&v) + Hook::c_nMemberOffset );
+        }
+        static node_type * to_node_ptr( value_type * v )
+        {
+            return v ? to_node_ptr(*v) : reinterpret_cast<node_type *>( NULL );
+        }
+        static const node_type * to_node_ptr( const value_type& v )
+        {
+            return reinterpret_cast<const node_type *>( reinterpret_cast<const char *>(&v) + Hook::c_nMemberOffset );
+        }
+        static const node_type * to_node_ptr( const value_type * v )
+        {
+            return v ? to_node_ptr(*v) : reinterpret_cast<const node_type *>( NULL );
+        }
+        static value_type * to_value_ptr( node_type& n )
+        {
+            return reinterpret_cast<value_type *>( reinterpret_cast<char *>(&n) - Hook::c_nMemberOffset );
+        }
+        static value_type * to_value_ptr( node_type * n )
+        {
+            return n ? to_value_ptr(*n) : reinterpret_cast<value_type *>( NULL );
+        }
+        static const value_type * to_value_ptr( const node_type& n )
+        {
+            return reinterpret_cast<const value_type *>( reinterpret_cast<const char *>(&n) - Hook::c_nMemberOffset );
+        }
+        static const value_type * to_value_ptr( const node_type * n )
+        {
+            return n ? to_value_ptr(*n) : reinterpret_cast<const value_type *>( NULL );
+        }
+    };
+
+    template <typename T, typename NodeType, class Hook>
+    struct node_traits<T, NodeType, Hook, opt::traits_hook_tag>: public Hook::node_traits
+    {};
+    //@endcond
+
+    /// Node traits selector metafunction
+    /** @ingroup cds_intrusive_helper
+        The metafunction selects appropriate \ref node_traits specialization based on value type \p T, node type \p NodeType, and hook type \p Hook.
+    */
+    template <typename T, typename NodeType, class Hook>
+    struct get_node_traits
+    {
+        //@cond
+        typedef node_traits<T, NodeType, Hook, typename Hook::hook_type> type;
+        //@endcond
+    };
+
+    //@cond
+    /// Functor converting container's node type to value type
+    template <class Container>
+    struct node_to_value {
+        typename Container::value_type * operator()( typename Container::node_type * p )
+        {
+            typedef typename Container::node_traits node_traits;
+            return node_traits::to_value_ptr( p );
+        }
+    };
+    //@endcond
+
+}} // namespace cds::intrusuve
+
+#endif  // #ifndef __CDS_INTRUSIVE_NODE_TRAITS_H
diff --git a/cds/intrusive/optimistic_queue.h b/cds/intrusive/optimistic_queue.h
new file mode 100644 (file)
index 0000000..eed476b
--- /dev/null
@@ -0,0 +1,617 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_OPTIMISTIC_QUEUE_H
+#define __CDS_INTRUSIVE_OPTIMISTIC_QUEUE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/cxx11_atomic.h>
+#include <cds/gc/default_gc.h>
+#include <cds/gc/hrc/gc_fwd.h>
+#include <cds/intrusive/queue_stat.h>
+#include <cds/ref.h>
+
+#include <cds/details/std/type_traits.h>
+
+namespace cds { namespace intrusive {
+
+    /// Optimistic queue related definitions
+    /** @ingroup cds_intrusive_helper
+    */
+    namespace optimistic_queue {
+
+        /// Optimistic queue node
+        /**
+            Template parameters:
+            - GC - garbage collector used. gc::HRC is not supported.
+            - Tag - a tag used to distinguish between different implementation
+        */
+        template <class GC, typename Tag = opt::none>
+        struct node: public GC::container_node
+        {
+            typedef GC  gc  ;   ///< Garbage collector
+            typedef Tag tag ;   ///< tag
+
+            typedef typename gc::template atomic_ref<node>    atomic_node_ptr    ;    ///< atomic pointer
+
+            atomic_node_ptr m_pPrev ;   ///< Pointer to previous node
+            atomic_node_ptr m_pNext ;   ///< Pointer to next node
+
+            CDS_CONSTEXPR node() CDS_NOEXCEPT
+                : m_pPrev( null_ptr<node *>() )
+                , m_pNext( null_ptr<node *>() )
+            {}
+        };
+
+        //@cond
+        struct default_hook {
+            typedef cds::gc::default_gc gc;
+            typedef opt::none           tag;
+        };
+        //@endcond
+
+        //@cond
+        template < typename HookType, CDS_DECL_OPTIONS2>
+        struct hook
+        {
+            typedef typename opt::make_options< default_hook, CDS_OPTIONS2>::type  options;
+            typedef typename options::gc    gc;
+            typedef typename options::tag   tag;
+            typedef node<gc, tag> node_type;
+            typedef HookType     hook_type;
+        };
+        //@endcond
+
+        /// Base hook
+        /**
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template < CDS_DECL_OPTIONS2 >
+        struct base_hook: public hook< opt::base_hook_tag, CDS_OPTIONS2 >
+        {};
+
+        /// Member hook
+        /**
+            \p MemberOffset defines offset in bytes of \ref node member into your structure.
+            Use \p offsetof macro to define \p MemberOffset
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template < size_t MemberOffset, CDS_DECL_OPTIONS2 >
+        struct member_hook: public hook< opt::member_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            static const size_t c_nMemberOffset = MemberOffset;
+            //@endcond
+        };
+
+        /// Traits hook
+        /**
+            \p NodeTraits defines type traits for node.
+            See \ref node_traits for \p NodeTraits interface description
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template <typename NodeTraits, CDS_DECL_OPTIONS2 >
+        struct traits_hook: public hook< opt::traits_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            typedef NodeTraits node_traits;
+            //@endcond
+        };
+
+        /// Check link
+        template <typename Node>
+        struct link_checker {
+            //@cond
+            typedef Node node_type;
+            //@endcond
+
+            /// Checks if the link fields of node \p pNode is NULL
+            /**
+                An asserting is generated if \p pNode link fields is not NULL
+            */
+            static void is_empty( const node_type * pNode )
+            {
+                assert( pNode->m_pNext.load(CDS_ATOMIC::memory_order_relaxed) == null_ptr<node_type *>() );
+                assert( pNode->m_pPrev.load(CDS_ATOMIC::memory_order_relaxed) == null_ptr<node_type *>() );
+            }
+        };
+
+        /// Metafunction for selecting appropriate link checking policy
+        template < typename Node, opt::link_check_type LinkType >
+        struct get_link_checker
+        {
+            //@cond
+            typedef intrusive::opt::v::empty_link_checker<Node>  type;
+            //@endcond
+        };
+
+        //@cond
+        template < typename Node >
+        struct get_link_checker< Node, opt::always_check_link >
+        {
+            typedef link_checker<Node>  type;
+        };
+        template < typename Node >
+        struct get_link_checker< Node, opt::debug_check_link >
+        {
+#       ifdef _DEBUG
+            typedef link_checker<Node>  type;
+#       else
+            typedef intrusive::opt::v::empty_link_checker<Node>  type;
+#       endif
+        };
+        //@endcond
+
+        /// OptimisticQueue internal statistics. May be used for debugging or profiling
+        /**
+            Template argument \p Counter defines type of counter.
+            Default is cds::atomicity::event_counter, that is weak, i.e. it is not guaranteed
+            strict event counting.
+            You may use stronger type of counter like as cds::atomicity::item_counter,
+            or even integral type, for example, \p int.
+
+            The class extends intrusive::queue_stat interface for OptimisticQueue.
+        */
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat: public cds::intrusive::queue_stat<Counter>
+        {
+            //@cond
+            typedef cds::intrusive::queue_stat<Counter> base_class;
+            typedef typename base_class::counter_type    counter_type;
+            //@endcond
+
+            counter_type    m_FixListCount  ;   ///< Count of fix list event
+
+            /// Register fix list event
+            void onFixList()    { ++m_FixListCount; }
+
+            //@cond
+            void reset()
+            {
+                base_class::reset();
+                m_FixListCount.reset();
+            }
+
+            stat& operator +=( stat const& s )
+            {
+                base_class::operator +=( s );
+                m_FixListCount += s.m_FixListCount.get();
+                return *this;
+            }
+            //@endcond
+        };
+
+        /// Dummy OptimisticQueue statistics - no counting is performed. Support interface like \ref optimistic_queue::stat
+        struct dummy_stat: public cds::intrusive::queue_dummy_stat
+        {
+            //@cond
+            void onFixList() {}
+
+            void reset() {}
+            dummy_stat& operator +=( dummy_stat const& )
+            {
+                return *this;
+            }
+            //@endcond
+        };
+
+    }   // namespace optimistic_queue
+
+    /// Optimistic queue
+    /** @ingroup cds_intrusive_queue
+        Implementation of Ladan-Mozes & Shavit optimistic queue algorithm.
+
+        \par Source:
+            [2008] Edya Ladan-Mozes, Nir Shavit "An Optimistic Approach to Lock-Free FIFO Queues"
+
+        Template arguments:
+        - \p GC - garbage collector type: gc::HP, gc::PTB. Note that gc::HRC is <b>not</b> supported
+        - \p T - type to be stored in the queue
+        - \p Options - options
+
+        Type of node: \ref optimistic_queue::node.
+
+        \p Options are:
+        - opt::hook - hook used. Possible values are: optimistic_queue::base_hook, optimistic_queue::member_hook, optimistic_queue::traits_hook.
+            If the option is not specified, <tt>optimistic_queue::base_hook<></tt> is used.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer. This option is used
+            in \ref dequeue function.
+        - opt::link_checker - the type of node's link fields checking. Default is \ref opt::debug_check_link
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::stat - the type to gather internal statistics.
+            Possible option value are: optimistic_queue::stat, optimistic_queue::dummy_stat,
+            user-provided class that supports optimistic_queue::stat interface.
+            Generic option intrusive::queue_stat and intrusive::queue_dummy_stat are acceptable too, however,
+            they will be automatically converted to optimistic_queue::stat and optimistic_queue::dummy_stat
+            respectively.
+            Default is \ref optimistic_queue::dummy_stat.
+        - opt::alignment - the alignment for internal queue data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        Garbage collecting schema \p GC must be consistent with the optimistic_queue::node GC.
+
+        \par About item disposing
+        The optimistic queue algo has a key feature: even if the queue is empty it contains one item that is "dummy" one from
+        the standpoint of the algo. See \ref dequeue function for explanation.
+
+        \par Examples
+        \code
+        #include <cds/intrusive/optimistic_queue.h>
+        #include <cds/gc/hp.h>
+
+        namespace ci = cds::inrtusive;
+        typedef cds::gc::HP hp_gc;
+
+        // Optimistic queue with Hazard Pointer garbage collector, base hook + item counter:
+        struct Foo: public ci::optimistic_queue::node< hp_gc >
+        {
+            // Your data
+            ...
+        };
+
+        typedef ci::OptimisticQueue< hp_gc,
+            Foo
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc< hp_gc > >
+            >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        > FooQueue;
+
+        // Optimistic queue with Hazard Pointer garbage collector, member hook, no item counter:
+        struct Bar
+        {
+            // Your data
+            ...
+            ci::optimistic_queue::node< hp_gc > hMember;
+        };
+
+        typedef ci::OptimisticQueue< hp_gc,
+            Bar
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(Bar, hMember)
+                    ,ci::opt::gc< hp_gc >
+                >
+            >
+        > BarQueue;
+
+        \endcode
+    */
+    template <typename GC, typename T, CDS_DECL_OPTIONS9>
+    class OptimisticQueue
+    {
+        //@cond
+        struct default_options
+        {
+            typedef cds::backoff::empty             back_off;
+            typedef optimistic_queue::base_hook<>   hook;
+            typedef opt::v::empty_disposer          disposer;
+            typedef atomicity::empty_item_counter   item_counter;
+            typedef opt::v::relaxed_ordering        memory_model;
+            typedef optimistic_queue::dummy_stat    stat;
+            static const opt::link_check_type link_checker = opt::debug_check_link;
+            enum { alignment = opt::cache_line_alignment };
+        };
+        //@endcond
+
+    public:
+        //@cond
+        typedef typename opt::make_options<
+            typename cds::opt::find_type_traits< default_options, CDS_OPTIONS9 >::type
+            ,CDS_OPTIONS9
+        >::type   options;
+
+        typedef typename std::conditional<
+            std::is_same<typename options::stat, cds::intrusive::queue_stat<> >::value
+            ,optimistic_queue::stat<>
+            ,typename std::conditional<
+                std::is_same<typename options::stat, cds::intrusive::queue_dummy_stat>::value
+                ,optimistic_queue::dummy_stat
+                ,typename options::stat
+            >::type
+        >::type stat_type_;
+
+        //@endcond
+
+    public:
+        typedef T  value_type   ;   ///< type of value stored in the queue
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+        typedef typename optimistic_queue::get_link_checker< node_type, options::link_checker >::type link_checker   ;   ///< link checker
+
+        typedef GC gc          ;   ///< Garbage collector
+        typedef typename options::back_off  back_off    ;   ///< back-off strategy
+        typedef typename options::item_counter item_counter ;   ///< Item counting policy used
+        typedef typename options::memory_model  memory_model      ;   ///< Memory ordering. See cds::opt::memory_model option
+#ifdef CDS_DOXYGEN_INVOKED
+        typedef typename options::stat      stat        ;   ///< Internal statistics policy used
+#else
+        typedef stat_type_  stat;
+#endif
+
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS9>
+        struct rebind {
+            typedef OptimisticQueue< GC2, T2, CDS_OTHER_OPTIONS9> other   ;   ///< Rebinding result
+        };
+
+    protected:
+        //@cond
+
+        struct internal_disposer
+        {
+            void operator ()( value_type * p )
+            {
+                assert( p != null_ptr<value_type *>());
+
+                OptimisticQueue::clear_links( node_traits::to_node_ptr(*p) );
+                disposer()( p );
+            }
+        };
+
+        typedef intrusive::node_to_value<OptimisticQueue> node_to_value;
+        typedef typename opt::details::alignment_setter< typename node_type::atomic_node_ptr, options::alignment >::type aligned_node_ptr;
+        //@endcond
+
+        aligned_node_ptr m_pTail ;   ///< Pointer to tail node
+        aligned_node_ptr m_pHead ;   ///< Pointer to head node
+        node_type        m_Dummy ;           ///< dummy node
+
+        item_counter        m_ItemCounter   ;   ///< Item counter
+        stat                m_Stat          ;   ///< Internal statistics
+
+        static CDS_CONSTEXPR_CONST size_t c_nHazardPtrCount = 5 ; ///< Count of hazard pointer required for the algorithm
+
+    protected:
+        //@cond
+        static void clear_links( node_type * pNode )
+        {
+            pNode->m_pNext.store( null_ptr<node_type *>(), memory_model::memory_order_release );
+            pNode->m_pPrev.store( null_ptr<node_type *>(), memory_model::memory_order_release );
+        }
+
+        struct dequeue_result {
+            typename gc::template GuardArray<3>  guards;
+
+            node_type * pHead;
+            node_type * pNext;
+        };
+
+        bool do_dequeue( dequeue_result& res )
+        {
+            node_type * pTail;
+            node_type * pHead;
+            node_type * pFirstNodePrev;
+            back_off bkoff;
+
+            while ( true ) { // Try till success or empty
+                pHead = res.guards.protect( 0, m_pHead, node_to_value() );
+                pTail = res.guards.protect( 1, m_pTail, node_to_value() );
+                assert( pHead != null_ptr<node_type *>() );
+                pFirstNodePrev = res.guards.protect( 2, pHead->m_pPrev, node_to_value() );
+
+                if ( pHead == m_pHead.load(memory_model::memory_order_relaxed)) {
+                    if ( pTail != pHead ) {
+                        if ( pFirstNodePrev == null_ptr<node_type *>()
+                          || pFirstNodePrev->m_pNext.load(memory_model::memory_order_relaxed) != pHead )
+                        {
+                            fix_list( pTail, pHead );
+                            continue;
+                        }
+                        if ( m_pHead.compare_exchange_weak( pHead, pFirstNodePrev, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) {
+                            // dequeue success
+                            break;
+                        }
+                    }
+                    else {
+                        // the queue is empty
+                        return false;
+                    }
+                }
+
+                m_Stat.onDequeueRace();
+                bkoff();
+            }
+
+            --m_ItemCounter;
+            m_Stat.onDequeue();
+
+            res.pHead = pHead;
+            res.pNext = pFirstNodePrev;
+            return true;
+        }
+
+
+        /// Helper function for optimistic queue. Corrects \p prev pointer of queue's nodes if it is needed
+        void fix_list( node_type * pTail, node_type * pHead )
+        {
+            // pTail and pHead are already guarded
+
+            node_type * pCurNode;
+            node_type * pCurNodeNext;
+
+            typename gc::template GuardArray<2> guards;
+
+            pCurNode = pTail;
+            while ( pCurNode != pHead ) { // While not at head
+                pCurNodeNext = guards.protect(0, pCurNode->m_pNext, node_to_value() );
+                if ( pHead != m_pHead.load(memory_model::memory_order_relaxed) )
+                    break;
+                pCurNodeNext->m_pPrev.store( pCurNode, memory_model::memory_order_release );
+                guards.assign( 1, node_traits::to_value_ptr( pCurNode = pCurNodeNext ));
+            }
+
+            m_Stat.onFixList();
+        }
+
+        void dispose_result( dequeue_result& res )
+        {
+            dispose_node( res.pHead );
+        }
+
+        void dispose_node( node_type * p )
+        {
+            assert( p != null_ptr<node_type *>());
+
+            if ( p != &m_Dummy ) {
+                gc::template retire<internal_disposer>( node_traits::to_value_ptr(p) );
+            }
+        }
+
+        //@endcond
+
+    public:
+        /// Constructor creates empty queue
+        OptimisticQueue()
+            : m_pTail( null_ptr<node_type *>() )
+            , m_pHead( null_ptr<node_type *>() )
+        {
+            // GC and node_type::gc must be the same
+            static_assert(( std::is_same<gc, typename node_type::gc>::value ), "GC and node_type::gc must be the same");
+
+            // cds::gc::HRC is not allowed
+            static_assert(( !std::is_same<gc, cds::gc::HRC>::value ), "cds::gc::HRC is not allowed here");
+
+            m_pTail.store( &m_Dummy, memory_model::memory_order_relaxed );
+            m_pHead.store( &m_Dummy, memory_model::memory_order_relaxed );
+        }
+
+        ~OptimisticQueue()
+        {
+            clear();
+            node_type * pHead = m_pHead.load(memory_model::memory_order_relaxed);
+            CDS_DEBUG_DO( node_type * pTail = m_pTail.load(memory_model::memory_order_relaxed); )
+            CDS_DEBUG_DO( assert( pHead == pTail ); )
+            assert( pHead != null_ptr<node_type *>() );
+
+            m_pHead.store( null_ptr<node_type *>(), memory_model::memory_order_relaxed );
+            m_pTail.store( null_ptr<node_type *>(), memory_model::memory_order_relaxed );
+
+            dispose_node( pHead );
+        }
+
+        /// @anchor cds_intrusive_OptimisticQueue_enqueue Enqueues \p data in lock-free manner. Always return \a true
+        bool enqueue( value_type& val )
+        {
+            node_type * pNew = node_traits::to_node_ptr( val );
+            link_checker::is_empty( pNew );
+
+            typename gc::template GuardArray<2> guards;
+            back_off bkoff;
+
+            guards.assign( 1, &val );
+            node_type * pTail = guards.protect( 0, m_pTail, node_to_value() )  ;   // Read the tail
+            while( true ) {
+                pNew->m_pNext.store( pTail, memory_model::memory_order_release );
+                if ( m_pTail.compare_exchange_strong( pTail, pNew, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) ) {     // Try to CAS the tail
+                    pTail->m_pPrev.store( pNew, memory_model::memory_order_release )     ;           // Success, write prev
+                    ++m_ItemCounter;
+                    m_Stat.onEnqueue();
+                    break ;                             // Enqueue done!
+                }
+                guards.assign( 0, node_traits::to_value_ptr( pTail ) )   ;  // pTail has been changed by CAS above
+                m_Stat.onEnqueueRace();
+                bkoff();
+            }
+            return true;
+        }
+
+        /// Dequeues a value from the queue
+        /** @anchor cds_intrusive_OptimisticQueue_dequeue
+            If the queue is empty the function returns \a NULL
+
+            \par Warning
+            The queue algorithm has following feature: when \p dequeue is called,
+            the item returning is still queue's top, and previous top is disposed:
+
+            \code
+            before dequeuing         Dequeue               after dequeuing
+            +------------------+                           +------------------+
+      Top ->|      Item 1      |  -> Dispose Item 1        |      Item 2      | <- Top
+            +------------------+                           +------------------+
+            |      Item 2      |  -> Return Item 2         |       ...        |
+            +------------------+
+            |       ...        |
+            \endcode
+
+            \p dequeue function returns Item 2, that becomes new top of queue, and calls
+            the disposer for Item 1, that was queue's top on function entry.
+            Thus, you cannot manually delete item returned because it is still included in
+            item sequence and it has valuable link field that must not be zeroed.
+            The item may be deleted only in disposer call.
+        */
+        value_type * dequeue()
+        {
+            dequeue_result res;
+            if ( do_dequeue( res )) {
+                dispose_result( res );
+
+                return node_traits::to_value_ptr( *res.pNext );
+            }
+            return null_ptr<value_type *>();
+        }
+
+        /// Synonym for @ref cds_intrusive_OptimisticQueue_enqueue "enqueue"
+        bool push( value_type& val )
+        {
+            return enqueue( val );
+        }
+
+        /// Synonym for \ref cds_intrusive_OptimisticQueue_dequeue "dequeue"
+        value_type * pop()
+        {
+            return dequeue();
+        }
+
+        /// Checks if queue is empty
+        bool empty() const
+        {
+            return m_pTail.load(memory_model::memory_order_relaxed) == m_pHead.load(memory_model::memory_order_relaxed);
+        }
+
+        /// Clear the stack
+        /**
+            The function repeatedly calls \ref dequeue until it returns NULL.
+            The disposer defined in template \p Options is called for each item
+            that can be safely disposed.
+        */
+        void clear()
+        {
+            value_type * pv;
+            while ( (pv = dequeue()) != null_ptr<value_type *>() );
+        }
+
+        /// Returns queue's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the queue
+            is empty. To check queue emptyness use \ref empty() method.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+        /// Returns refernce to internal statistics
+        const stat& statistics() const
+        {
+            return m_Stat;
+        }
+    };
+
+}}  // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_OPTIMISTIC_QUEUE_H
diff --git a/cds/intrusive/options.h b/cds/intrusive/options.h
new file mode 100644 (file)
index 0000000..5478b79
--- /dev/null
@@ -0,0 +1,161 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_OPTIONS_H
+#define __CDS_INTRUSIVE_OPTIONS_H
+
+#include <cds/opt/options.h>
+#include <cds/details/allocator.h>
+
+namespace cds { namespace intrusive {
+
+    /// Common options for intrusive containers
+    /** @ingroup cds_intrusive_helper
+        This namespace contains options for intrusive containers.
+        It imports all definitions from cds::opt namespace and introduces a lot
+        of options specific for intrusive approach.
+    */
+    namespace opt {
+        using namespace cds::opt;
+
+        //@cond
+        struct base_hook_tag;
+        struct member_hook_tag;
+        struct traits_hook_tag;
+        //@endcond
+
+        /// Hook option
+        /**
+            Hook is a class that a user must add as a base class or as a member to make the user class compatible with intrusive containers.
+            \p Hook template parameter strongly depends on the type of intrusive container you use.
+        */
+        template <typename Hook>
+        struct hook {
+            //@cond
+            template <typename Base> struct pack: public Base
+            {
+                typedef Hook hook;
+            };
+            //@endcond
+        };
+
+        /// Item disposer option setter
+        /**
+            The option specifies a functor that is used for dispose removed items.
+            The interface of \p Type functor is:
+            \code
+            struct myDisposer {
+                void operator ()( T * val );
+            };
+            \endcode
+
+            Predefined types for \p Type:
+            - opt::v::empty_disposer - the disposer that does nothing
+            - opt::v::delete_disposer - the disposer that calls operator \p delete
+
+            Usually, the disposer should be stateless default-constructible functor.
+            It is called by garbage collector in deferred mode.
+        */
+        template <typename Type>
+        struct disposer {
+            //@cond
+            template <typename Base> struct pack: public Base
+            {
+                typedef Type disposer;
+            };
+            //@endcond
+        };
+
+        /// Values of \ref cds::intrusive::opt::link_checker option
+        enum link_check_type {
+            never_check_link,    ///< no link checking performed
+            debug_check_link,    ///< check only in debug build
+            always_check_link    ///< check in debug and release build
+        };
+
+        /// Link checking
+        /**
+            The option specifies a type of link checking.
+            Possible values for \p Value are is one of \ref link_check_type enum:
+            - \ref never_check_link - no link checking performed
+            - \ref debug_check_link - check only in debug build
+            - \ref always_check_link - check in debug and release build (not yet implemented for release mode).
+
+            When link checking is on, the container tests that the node's link fields
+            must be NULL before inserting the item. If the link is not NULL an assertion is generated
+        */
+        template <link_check_type Value>
+        struct link_checker {
+            //@cond
+            template <typename Base> struct pack: public Base
+            {
+                static const link_check_type link_checker = Value;
+            };
+            //@endcond
+        };
+
+        /// Predefined option values
+        namespace v {
+            using namespace cds::opt::v;
+
+            //@cond
+            /// No link checking
+            template <typename Node>
+            struct empty_link_checker
+            {
+                //@cond
+                typedef Node node_type;
+
+                static void is_empty( const node_type * pNode )
+                {}
+                //@endcond
+            };
+            //@endcond
+
+            /// Empty item disposer
+            /**
+                The disposer does nothing.
+                This is one of possible values of opt::disposer option.
+            */
+            struct empty_disposer
+            {
+                /// Empty dispose functor
+                template <typename T>
+                void operator ()( T * )
+                {}
+            };
+
+            /// Deletion item disposer
+            /**
+                Analogue of operator \p delete call.
+                The disposer that calls \p T destructor and deallocates the item via \p Alloc allocator.
+            */
+            template <typename Alloc = CDS_DEFAULT_ALLOCATOR >
+            struct delete_disposer
+            {
+                /// Dispose functor
+                template <typename T>
+                void operator ()( T * p )
+                {
+                    cds::details::Allocator<T, Alloc> alloc;
+                    alloc.Delete( p );
+                }
+            };
+        }   // namespace v
+
+        //@cond
+        // Lazy-list specific option (for split-list support)
+        template <typename Type>
+        struct boundary_node_type {
+            //@cond
+            template <typename Base> struct pack: public Base
+            {
+                typedef Type boundary_node_type;
+            };
+            //@endcond
+        };
+        //@endcond
+    } // namespace opt
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_OPTIONS_H
diff --git a/cds/intrusive/queue_stat.h b/cds/intrusive/queue_stat.h
new file mode 100644 (file)
index 0000000..cd71314
--- /dev/null
@@ -0,0 +1,93 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_QUEUE_STAT_H
+#define __CDS_INTRUSIVE_QUEUE_STAT_H
+
+#include <cds/cxx11_atomic.h>
+
+namespace cds { namespace intrusive {
+
+    /// Queue internal statistics. May be used for debugging or profiling
+    /** @ingroup cds_intrusive_helper
+        Template argument \p Counter defines type of counter.
+        Default is cds::atomicity::event_counter, that is weak, i.e. it is not guaranteed
+        strict event counting.
+        You may use stronger type of counter like as cds::atomicity::item_counter,
+        or even integral type, for example, \p int.
+    */
+    template <typename Counter = cds::atomicity::event_counter >
+    struct queue_stat
+    {
+        typedef Counter     counter_type    ;   ///< Counter type
+
+        counter_type m_EnqueueCount      ;  ///< Enqueue call count
+        counter_type m_DequeueCount      ;  ///< Dequeue call count
+        counter_type m_EnqueueRace       ;  ///< Count of enqueue race conditions encountered
+        counter_type m_DequeueRace       ;  ///< Count of dequeue race conditions encountered
+        counter_type m_AdvanceTailError  ;  ///< Count of "advance tail failed" events
+        counter_type m_BadTail           ;  ///< Count of events "Tail is not pointed to the last item in the queue"
+
+        /// Register enqueue call
+        void onEnqueue()                { ++m_EnqueueCount; }
+        /// Register dequeue call
+        void onDequeue()                { ++m_DequeueCount; }
+        /// Register enqueue race event
+        void onEnqueueRace()            { ++m_EnqueueRace; }
+        /// Register dequeue race event
+        void onDequeueRace()            { ++m_DequeueRace; }
+        /// Register "advance tail failed" event
+        void onAdvanceTailFailed()      { ++m_AdvanceTailError; }
+        /// Register event "Tail is not pointed to last item in the queue"
+        void onBadTail()                { ++m_BadTail; }
+
+        //@cond
+        void reset()
+        {
+            m_EnqueueCount.reset();
+            m_DequeueCount.reset();
+            m_EnqueueRace.reset();
+            m_DequeueRace.reset();
+            m_AdvanceTailError.reset();
+            m_BadTail.reset();
+        }
+
+        queue_stat& operator +=( queue_stat const& s )
+        {
+            m_EnqueueCount += s.m_EnqueueCount.get();
+            m_DequeueCount += s.m_DequeueCount.get();
+            m_EnqueueRace += s.m_EnqueueRace.get();
+            m_DequeueRace += s.m_DequeueRace.get();
+            m_AdvanceTailError += s.m_AdvanceTailError.get();
+            m_BadTail += s.m_BadTail.get();
+
+            return *this;
+        }
+        //@endcond
+    };
+
+    /// Dummy queue statistics - no counting is performed. Support interface like \ref queue_stat
+    /** @ingroup cds_intrusive_helper
+    */
+    struct queue_dummy_stat
+    {
+        //@cond
+        void onEnqueue()                {}
+        void onDequeue()                {}
+        void onEnqueueRace()            {}
+        void onDequeueRace()            {}
+        void onAdvanceTailFailed()      {}
+        void onBadTail()                {}
+
+        void reset() {}
+        queue_dummy_stat& operator +=( queue_dummy_stat const& s )
+        {
+            return *this;
+        }
+        //@endcond
+    };
+
+
+}}  // namespace cds::intrusive
+
+
+#endif  // #ifndef __CDS_INTRUSIVE_QUEUE_STAT_H
diff --git a/cds/intrusive/segmented_queue.h b/cds/intrusive/segmented_queue.h
new file mode 100644 (file)
index 0000000..0900d9f
--- /dev/null
@@ -0,0 +1,681 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SEGMENTED_QUEUE_H
+#define __CDS_INTRUSIVE_SEGMENTED_QUEUE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/details/marked_ptr.h>
+#include <cds/int_algo.h>
+#include <cds/details/std/mutex.h>
+#include <cds/lock/spinlock.h>
+#include <cds/opt/permutation.h>
+
+#include <boost/intrusive/slist.hpp>
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   pragma warning( push )
+#   pragma warning( disable: 4355 ) // warning C4355: 'this' : used in base member initializer list
+#endif
+
+namespace cds { namespace intrusive {
+
+    /// SegmentedQueue -related declarations
+    namespace segmented_queue {
+
+        /// SegmentedQueue internal statistics. May be used for debugging or profiling
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat {
+            typedef Counter  counter_type;  ///< Counter type
+
+            counter_type    m_nPush;            ///< Push count
+            counter_type    m_nPushPopulated;   ///< Number of attempts to push to populated (non-empty) cell
+            counter_type    m_nPushContended;   ///< Number of failed CAS when pushing
+            counter_type    m_nPop;             ///< Pop count
+            counter_type    m_nPopEmpty;        ///< Number of dequeuing from empty queue
+            counter_type    m_nPopContended;    ///< Number of failed CAS when popping
+
+            counter_type    m_nCreateSegmentReq;    ///< Number of request to create new segment
+            counter_type    m_nDeleteSegmentReq;    ///< Number to request to delete segment
+            counter_type    m_nSegmentCreated;  ///< Number of created segments
+            counter_type    m_nSegmentDeleted;  ///< Number of deleted segments
+
+            //@cond
+            void onPush()               { ++m_nPush; }
+            void onPushPopulated()      { ++m_nPushPopulated; }
+            void onPushContended()      { ++m_nPushContended; }
+            void onPop()                { ++m_nPop;  }
+            void onPopEmpty()           { ++m_nPopEmpty; }
+            void onPopContended()       { ++m_nPopContended; }
+            void onCreateSegmentReq()   { ++m_nCreateSegmentReq; }
+            void onDeleteSegmentReq()   { ++m_nDeleteSegmentReq; }
+            void onSegmentCreated()     { ++m_nSegmentCreated; }
+            void onSegmentDeleted()     { ++m_nSegmentDeleted; }
+            //@endcond
+        };
+
+        /// Dummy SegmentedQueue statistics, no overhead
+        struct empty_stat {
+            //@cond
+            void onPush() const             {}
+            void onPushPopulated() const    {}
+            void onPushContended() const    {}
+            void onPop() const              {}
+            void onPopEmpty() const         {}
+            void onPopContended() const     {}
+            void onCreateSegmentReq() const {}
+            void onDeleteSegmentReq() const {}
+            void onSegmentCreated() const   {}
+            void onSegmentDeleted() const   {}
+            //@endcond
+        };
+
+        /// SegmentedQueue default type traits
+        struct type_traits {
+            /// Element disposer that is called when the item to be dequeued. Default is opt::v::empty_disposer (no disposer)
+            typedef opt::v::empty_disposer disposer;
+
+            /// Item counter, default is atomicity::item_counter
+            /**
+                The item counting is an essential part of segmented queue algorithm.
+                The \p empty() member function is based on checking <tt>size() == 0</tt>.
+                Therefore, dummy item counter like atomicity::empty_item_counter is not the proper counter.
+            */
+            typedef atomicity::item_counter item_counter;
+
+            /// Internal statistics, possible predefined types are \ref stat, \ref empty_stat (the default)
+            typedef segmented_queue::empty_stat        stat;
+
+            /// Memory model, default is opt::v::relaxed_ordering. See cds::opt::memory_model for the full list of possible types
+            typedef opt::v::relaxed_ordering  memory_model;
+
+            /// Alignment of critical data, default is cache line alignment. See cds::opt::alignment option specification
+            enum { alignment = opt::cache_line_alignment };
+
+            /// Segment allocator. Default is \ref CDS_DEFAULT_ALLOCATOR
+            typedef CDS_DEFAULT_ALLOCATOR allocator;
+
+            /// Lock type used to maintain an internal list of allocated segments
+            typedef cds::lock::Spin lock_type;
+
+            /// Random \ref cds::opt::permutation_generator "permutation generator" for sequence [0, quasi_factor)
+            typedef cds::opt::v::random2_permutation<int>    permutation_generator;
+        };
+
+        /// Metafunction converting option list to traits for SegmentedQueue
+        /**
+            The metafunction can be useful if a few fields in \ref type_traits should be changed.
+            For example:
+            \code
+            typedef cds::intrusive::segmented_queue::make_traits<
+                cds::opt::item_counter< cds::atomicity::item_counter >
+            >::type my_segmented_queue_traits;
+            \endcode
+            This code creates \p %SegmentedQueue type traits with item counting feature,
+            all other \p type_traits members left unchanged.
+
+            \p Options are:
+            - \p opt::disposer - the functor used for dispose removed items.
+            - \p opt::stat - internal statistics, possible type: \ref stat, \ref empty_stat (the default)
+            - \p opt::item_counter - item counting feature. Note that atomicity::empty_item_counetr is not suitable
+                for segmented queue.
+            - \p opt::memory_model - memory model, default is \p opt::v::relaxed_ordering.
+                See option description for the full list of possible models
+            - \p opt::alignment - the alignment for critical data, see option description for explanation
+            - \p opt::allocator - the allocator used t maintain segments.
+            - \p opt::lock_type - a mutual exclusion lock type used to maintain internal list of allocated
+                segments. Default is \p cds::opt::Spin, \p std::mutex is also suitable.
+            - \p opt::permutation_generator - a random permutation generator for sequence [0, quasi_factor),
+                default is cds::opt::v::random2_permutation<int>
+        */
+        template <CDS_DECL_OPTIONS9>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS9 >::type
+                ,CDS_OPTIONS9
+            >::type   type;
+#   endif
+        };
+    } // namespace segmented_queue
+
+    /// Segmented queue
+    /** @ingroup cds_intrusive_queue
+
+        The queue is based on work
+        - [2010] Afek, Korland, Yanovsky "Quasi-Linearizability: relaxed consistency for improved concurrency"
+
+        In this paper the authors offer a relaxed version of linearizability, so-called quasi-linearizability,
+        that preserves some of the intuition, provides a flexible way to control the level of relaxation
+        and supports th implementation of more concurrent and scalable data structure.
+        Intuitively, the linearizability requires each run to be equivalent in some sense to a serial run
+        of the algorithm. This equivalence to some serial run imposes strong synchronization requirements
+        that in many cases results in limited scalability and synchronization bottleneck.
+
+        The general idea is that the queue maintains a linked list of segments, each segment is an array of
+        nodes in the size of the quasi factor, and each node has a deleted boolean marker, which states
+        if it has been dequeued. Each producer iterates over last segment in the linked list in some random
+        permutation order. Whet it finds an empty cell it performs a CAS operation attempting to enqueue its
+        new element. In case the entire segment has been scanned and no available cell is found (implying
+        that the segment is full), then it attempts to add a new segment to the list.
+
+        The dequeue operation is similar: the consumer iterates over the first segment in the linked list
+        in some random permutation order. When it finds an item which has not yet been dequeued, it performs
+        CAS on its deleted marker in order to "delete" it, if succeeded this item is considered dequeued.
+        In case the entire segment was scanned and all the nodes have already been dequeued (implying that
+        the segment is empty), then it attempts to remove this segment from the linked list and starts
+        the same process on the next segment. If there is no next segment, the queue is considered empty.
+
+        Based on the fact that most of the time threads do not add or remove segments, most of the work
+        is done in parallel on different cells in the segments. This ensures a controlled contention
+        depending on the segment size, which is quasi factor.
+
+        The segmented queue is an <i>unfair</i> queue since it violates the strong FIFO order but no more than
+        quasi factor. This means that the consumer dequeues <i>any</i> item from the current first segment.
+
+        Template parameters:
+        - \p GC - a garbage collector, possible types are cds::gc::HP, cds::gc::PTB
+        - \p T - the type of values stored in the queue
+        - \p Traits - queue type traits, default is segmented_queue::type_traits.
+            segmented_queue::make_traits metafunction can be used to construct the
+            type traits.
+
+        The queue stores the pointers to enqueued items so no special node hooks are needed.
+    */
+    template <class GC, typename T, typename Traits = segmented_queue::type_traits >
+    class SegmentedQueue
+    {
+    public:
+        typedef GC  gc          ;   ///< Garbage collector
+        typedef T   value_type  ;   ///< type of the value stored in the queue
+        typedef Traits options  ;   ///< Queue's traits
+
+        typedef typename options::disposer      disposer    ;   ///< value disposer, called only in \p clear() when the element to be dequeued
+        typedef typename options::allocator     allocator   ;   ///< Allocator maintaining the segments
+        typedef typename options::memory_model  memory_model;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::item_counter  item_counter;   ///< Item counting policy, see cds::opt::item_counter option setter
+        typedef typename options::stat          stat        ;   ///< Internal statistics policy
+        typedef typename options::lock_type     lock_type   ;   ///< Type of mutex for maintaining an internal list of allocated segments.
+        typedef typename options::permutation_generator permutation_generator; ///< Random permutation generator for sequence [0, quasi-factor)
+
+        static const size_t m_nHazardPtrCount = 2 ; ///< Count of hazard pointer required for the algorithm
+
+    protected:
+        //@cond
+        // Segment cell. LSB is used as deleted mark
+        typedef cds::details::marked_ptr< value_type, 1 >   cell;
+
+        // Segment
+        struct segment: public boost::intrusive::slist_base_hook<>
+        {
+            CDS_ATOMIC::atomic< cell > *    cells;  // Cell array of size \ref m_nQuasiFactor
+            size_t   version;   // version tag (ABA prevention tag)
+            // cell array is placed here in one continuous memory block
+
+            // Initializes the segment
+            segment( size_t nCellCount )
+                // MSVC warning C4355: 'this': used in base member initializer list
+                : cells( reinterpret_cast< CDS_ATOMIC::atomic< cell > * >( this + 1 ))
+                , version( 0 )
+            {
+                init( nCellCount );
+            }
+
+            void init( size_t nCellCount )
+            {
+                CDS_ATOMIC::atomic< cell > * pLastCell = cells + nCellCount;
+                for ( CDS_ATOMIC::atomic< cell > * pCell = cells; pCell < pLastCell; ++pCell )
+                    pCell->store( cell(), CDS_ATOMIC::memory_order_relaxed );
+                CDS_ATOMIC::atomic_thread_fence( memory_model::memory_order_release );
+            }
+
+        private:
+            segment(); //=delete
+        };
+
+        typedef typename opt::details::alignment_setter< CDS_ATOMIC::atomic<segment *>, options::alignment >::type aligned_segment_ptr;
+        //@endcond
+
+    protected:
+        //@cond
+        class segment_list
+        {
+            typedef boost::intrusive::slist< segment, boost::intrusive::cache_last< true > > list_impl;
+            typedef cds_std::unique_lock< lock_type > scoped_lock;
+
+            aligned_segment_ptr m_pHead;
+            aligned_segment_ptr m_pTail;
+
+            list_impl           m_List;
+            mutable lock_type   m_Lock;
+            size_t const        m_nQuasiFactor;
+            stat&               m_Stat;
+
+        private:
+            struct segment_disposer
+            {
+                void operator()( segment * pSegment )
+                {
+                    assert( pSegment != null_ptr<segment *>());
+                    free_segment( pSegment );
+                }
+            };
+
+            struct gc_segment_disposer
+            {
+                void operator()( segment * pSegment )
+                {
+                    assert( pSegment != null_ptr<segment *>());
+                    retire_segment( pSegment );
+                }
+            };
+
+        public:
+            segment_list( size_t nQuasiFactor, stat& st )
+                : m_pHead( null_ptr<segment *>() )
+                , m_pTail( null_ptr<segment *>() )
+                , m_nQuasiFactor( nQuasiFactor )
+                , m_Stat( st )
+            {
+                assert( cds::beans::is_power2( nQuasiFactor ));
+            }
+
+            ~segment_list()
+            {
+                m_List.clear_and_dispose( gc_segment_disposer() );
+            }
+
+            segment * head( typename gc::Guard& guard )
+            {
+                return guard.protect( m_pHead );
+            }
+
+            segment * tail( typename gc::Guard& guard )
+            {
+                return guard.protect( m_pTail );
+            }
+
+#       ifdef _DEBUG
+            bool populated( segment const& s ) const
+            {
+                // The lock should be held
+                CDS_ATOMIC::atomic< cell > const * pLastCell = s.cells + quasi_factor();
+                for ( CDS_ATOMIC::atomic< cell > const * pCell = s.cells; pCell < pLastCell; ++pCell ) {
+                    if ( !pCell->load( memory_model::memory_order_relaxed ).all() )
+                        return false;
+                }
+                return true;
+            }
+            bool exhausted( segment const& s ) const
+            {
+                // The lock should be held
+                CDS_ATOMIC::atomic< cell > const * pLastCell = s.cells + quasi_factor();
+                for ( CDS_ATOMIC::atomic< cell > const * pCell = s.cells; pCell < pLastCell; ++pCell ) {
+                    if ( !pCell->load( memory_model::memory_order_relaxed ).bits() )
+                        return false;
+                }
+                return true;
+            }
+#       endif
+
+            segment * create_tail( segment * pTail, typename gc::Guard& guard )
+            {
+                // pTail is guarded by GC
+
+                m_Stat.onCreateSegmentReq();
+
+                scoped_lock l( m_Lock );
+
+                if ( !m_List.empty() && ( pTail != &m_List.back() || get_version(pTail) != m_List.back().version )) {
+                    m_pTail.store( &m_List.back(), memory_model::memory_order_relaxed );
+
+                    return guard.assign( &m_List.back() );
+                }
+
+                assert( m_List.empty() || populated( m_List.back() ));
+
+                segment * pNew = allocate_segment();
+                m_Stat.onSegmentCreated();
+
+                if ( m_List.empty() )
+                    m_pHead.store( pNew, memory_model::memory_order_relaxed );
+                m_List.push_back( *pNew );
+                m_pTail.store( pNew, memory_model::memory_order_release );
+                return guard.assign( pNew );
+            }
+
+            segment * remove_head( segment * pHead, typename gc::Guard& guard )
+            {
+                // pHead is guarded by GC
+                m_Stat.onDeleteSegmentReq();
+
+                segment * pRet;
+                {
+                    scoped_lock l( m_Lock );
+
+                    if ( m_List.empty() ) {
+                        m_pTail.store( null_ptr<segment *>(), memory_model::memory_order_relaxed );
+                        m_pHead.store( null_ptr<segment *>(), memory_model::memory_order_relaxed );
+                        return guard.assign( null_ptr<segment *>() );
+                    }
+
+                    if ( pHead != &m_List.front() || get_version(pHead) != m_List.front().version ) {
+                        m_pHead.store( &m_List.front(), memory_model::memory_order_relaxed );
+                        return guard.assign( &m_List.front() );
+                    }
+
+                    assert( exhausted(m_List.front()) );
+
+                    m_List.pop_front();
+                    if ( m_List.empty() ) {
+                        pRet = guard.assign( null_ptr<segment *>() );
+                        m_pTail.store( null_ptr<segment *>(), memory_model::memory_order_relaxed );
+                    }
+                    else
+                        pRet = guard.assign( &m_List.front() );
+                    m_pHead.store( pRet, memory_model::memory_order_release );
+                }
+
+                retire_segment( pHead );
+                m_Stat.onSegmentDeleted();
+
+                return pRet;
+            }
+
+            size_t quasi_factor() const
+            {
+                return m_nQuasiFactor;
+            }
+
+        private:
+            typedef cds::details::Allocator< segment, allocator >   segment_allocator;
+
+            static size_t get_version( segment * pSegment )
+            {
+                return pSegment ? pSegment->version : 0;
+            }
+
+            segment * allocate_segment()
+            {
+                return segment_allocator().NewBlock( sizeof(segment) + sizeof(cell) * m_nQuasiFactor,
+                    quasi_factor() );
+            }
+
+            static void free_segment( segment * pSegment )
+            {
+                segment_allocator().Delete( pSegment );
+            }
+
+            static void retire_segment( segment * pSegment )
+            {
+                gc::template retire<segment_disposer>( pSegment );
+            }
+        };
+        //@endcond
+
+    protected:
+        segment_list              m_SegmentList;  ///< List of segments
+
+        item_counter              m_ItemCounter;  ///< Item counter
+        stat                      m_Stat;         ///< Internal statistics
+
+    public:
+        /// Initializes the empty queue
+        SegmentedQueue(
+            size_t nQuasiFactor     ///< Quasi factor. If it is not a power of 2 it is rounded up to nearest power of 2. Minimum is 2.
+            )
+            : m_SegmentList( cds::beans::ceil2(nQuasiFactor), m_Stat )
+        {
+            static_assert( (!std::is_same< item_counter, cds::atomicity::empty_item_counter >::value),
+                "cds::atomicity::empty_item_counter is not supported for SegmentedQueue"
+                );
+            assert( m_SegmentList.quasi_factor() > 1 );
+        }
+
+        /// Clears the queue and deletes all internal data
+        ~SegmentedQueue()
+        {
+            clear();
+        }
+
+        /// Inserts a new element at last segment of the queue
+        bool enqueue( value_type& val )
+        {
+            // LSB is used as a flag in marked pointer
+            assert( (reinterpret_cast<uintptr_t>( &val ) & 1) == 0 );
+
+            typename gc::Guard segmentGuard;
+            segment * pTailSegment = m_SegmentList.tail( segmentGuard );
+            if ( !pTailSegment ) {
+                // no segments, create the new one
+                pTailSegment = m_SegmentList.create_tail( pTailSegment, segmentGuard );
+                assert( pTailSegment );
+            }
+
+            permutation_generator gen( quasi_factor() );
+
+            // First, increment item counter.
+            // We sure that the item will be enqueued
+            // but if we increment the counter after inserting we can get a negative counter value
+            // if dequeuing occurs before incrementing (enqueue/dequeue race)
+            ++m_ItemCounter;
+
+            while ( true ) {
+                CDS_DEBUG_DO( size_t nLoopCount = 0);
+                do {
+                    typename permutation_generator::integer_type i = gen;
+                    CDS_DEBUG_DO( ++nLoopCount );
+                    if ( pTailSegment->cells[i].load(memory_model::memory_order_relaxed).all() ) {
+                        // Cell is not empty, go next
+                        m_Stat.onPushPopulated();
+                    }
+                    else {
+                        // Empty cell found, try to enqueue here
+                        cell nullCell;
+                        if ( pTailSegment->cells[i].compare_exchange_strong( nullCell, cell( &val ),
+                            memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                        {
+                            // Ok to push item
+                            m_Stat.onPush();
+                            return true;
+                        }
+                        assert( nullCell.ptr() );
+                        m_Stat.onPushContended();
+                    }
+                } while ( gen.next() );
+
+                assert( nLoopCount == quasi_factor());
+
+                // No available position, create a new segment
+                pTailSegment = m_SegmentList.create_tail( pTailSegment, segmentGuard );
+
+                // Get new permutation
+                gen.reset();
+            }
+        }
+
+        /// Removes an element from first segment of the queue and returns it
+        /**
+            If the queue is empty the function returns \p nullptr.
+
+            The disposer specified in \p Traits template argument is <b>not</b> called for returned item.
+            You should manually dispose the item:
+            <code>
+            struct my_disposer {
+                void operator()( foo * p )
+                {
+                    delete p;
+                }
+            };
+            cds::intrusive::SegmentedQueue< cds::gc::HP, foo > theQueue;
+            // ...
+
+            // Dequeue an item
+            foo * pItem = theQueue.dequeue();
+            // deal with pItem
+            //...
+
+            // pItem is not longer needed and can be deleted
+            // Do it via gc::HP::retire
+            cds::gc::HP::template retire< my_disposer >( pItem );
+            </code>
+        */
+        value_type * dequeue()
+        {
+            typename gc::Guard itemGuard;
+            if ( do_dequeue( itemGuard )) {
+                value_type * pVal = itemGuard.template get<value_type>();
+                assert( pVal );
+                return pVal;
+            }
+            return null_ptr<value_type *>();
+
+        }
+
+        /// Synonym for \p enqueue(value_type&) member function
+        bool push( value_type& val )
+        {
+            return enqueue( val );
+        }
+
+        /// Synonym for \p dequeue() member function
+        value_type * pop()
+        {
+            return dequeue();
+        }
+
+        /// Checks if the queue is empty
+        /**
+            The original segmented queue algorithm does not allow to check emptiness accurately
+            because \p empty() is unlinearizable.
+            This function tests queue's emptiness checking <tt>size() == 0</tt>,
+            so, the item counting feature is an essential part of queue's algorithm.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Clear the queue
+        /**
+            The function repeatedly calls \ref dequeue until it returns \p nullptr.
+            The disposer specified in \p Traits template argument is called for each removed item.
+        */
+        void clear()
+        {
+            clear_with( disposer() );
+        }
+
+        /// Clear the queue
+        /**
+            The function repeatedly calls \p dequeue() until it returns \p nullptr.
+            \p Disposer is called for each removed item.
+        */
+        template <class Disposer>
+        void clear_with( Disposer )
+        {
+            typename gc::Guard itemGuard;
+            while ( do_dequeue( itemGuard ) ) {
+                assert( itemGuard.template get<value_type>() );
+                gc::template retire<Disposer>( itemGuard.template get<value_type>() );
+                itemGuard.clear();
+            }
+        }
+
+        /// Returns queue's item count
+        size_t size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+        /// Returns reference to internal statistics
+        /**
+            The type of internal statistics is specified by \p Traits template argument.
+        */
+        const stat& statistics() const
+        {
+            return m_Stat;
+        }
+
+        /// Returns quasi factor, a power-of-two number
+        size_t quasi_factor() const
+        {
+            return m_SegmentList.quasi_factor();
+        }
+
+    protected:
+        //@cond
+        bool do_dequeue( typename gc::Guard& itemGuard )
+        {
+            typename gc::Guard segmentGuard;
+            segment * pHeadSegment = m_SegmentList.head( segmentGuard );
+
+            permutation_generator gen( quasi_factor() );
+            while ( true ) {
+                if ( !pHeadSegment ) {
+                    // Queue is empty
+                    m_Stat.onPopEmpty();
+                    return false;
+                }
+
+                bool bHadNullValue = false;
+                cell item;
+                CDS_DEBUG_DO( size_t nLoopCount = 0 );
+                do {
+                    typename permutation_generator::integer_type i = gen;
+                    CDS_DEBUG_DO( ++nLoopCount );
+
+                    // Guard the item
+                    // In segmented queue the cell cannot be reused
+                    // So no loop is needed here to protect the cell
+                    item = pHeadSegment->cells[i].load( memory_model::memory_order_relaxed );
+                    itemGuard.assign( item.ptr() );
+
+                    // Check if this cell is empty, which means an element
+                    // can be enqueued to this cell in the future
+                    if ( !item.ptr() )
+                        bHadNullValue = true;
+                    else {
+                        // If the item is not deleted yet
+                        if ( !item.bits() ) {
+                            // Try to mark the cell as deleted
+                            if ( pHeadSegment->cells[i].compare_exchange_strong( item, item | 1,
+                                memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                            {
+                                --m_ItemCounter;
+                                m_Stat.onPop();
+
+                                return true;
+                            }
+                            assert( item.bits() );
+                            m_Stat.onPopContended();
+                        }
+                    }
+                } while ( gen.next() );
+
+                assert( nLoopCount == quasi_factor() );
+
+                // scanning the entire segment without finding a candidate to dequeue
+                // If there was an empty cell, the queue is considered empty
+                if ( bHadNullValue ) {
+                    m_Stat.onPopEmpty();
+                    return false;
+                }
+
+                // All nodes have been dequeued, we can safely remove the first segment
+                pHeadSegment = m_SegmentList.remove_head( pHeadSegment, segmentGuard );
+
+                // Get new permutation
+                gen.reset();
+            }
+        }
+        //@endcond
+    };
+}} // namespace cds::intrusive
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   pragma warning( pop )
+#endif
+
+#endif // #ifndef __CDS_INTRUSIVE_SEGMENTED_QUEUE_H
diff --git a/cds/intrusive/single_link_struct.h b/cds/intrusive/single_link_struct.h
new file mode 100644 (file)
index 0000000..c17f342
--- /dev/null
@@ -0,0 +1,227 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SINGLE_LINK_STRUCT_H
+#define __CDS_INTRUSIVE_SINGLE_LINK_STRUCT_H
+
+#include <cds/intrusive/base.h>
+#include <cds/gc/default_gc.h>
+#include <cds/cxx11_atomic.h>
+#include <cds/gc/hrc.h>
+
+namespace cds { namespace intrusive {
+
+    /// Definitions common for single-linked data structures
+    /** @ingroup cds_intrusive_helper
+    */
+    namespace single_link {
+
+        /// Container's node
+        /**
+            Template parameters:
+            - GC - garbage collector used
+            - Tag - a tag used to distinguish between different implementation
+        */
+        template <class GC, typename Tag = opt::none>
+        struct node: public GC::container_node
+        {
+            typedef GC              gc  ;   ///< Garbage collector
+            typedef Tag             tag ;   ///< tag
+
+            typedef typename gc::template atomic_ref<node>    atomic_node_ptr    ;    ///< atomic pointer
+
+            /// Rebind node for other template parameters
+            template <class GC2, typename Tag2 = tag>
+            struct rebind {
+                typedef node<GC2, Tag2>  other ;    ///< Rebinding result
+            };
+
+            atomic_node_ptr m_pNext ; ///< pointer to the next node in the container
+
+            node()
+                : m_pNext( null_ptr<node *>() )
+            {}
+        };
+
+        //@cond
+        // Specialization for HRC GC
+        template <typename Tag>
+        struct node< gc::HRC, Tag>: public gc::HRC::container_node
+        {
+            typedef gc::HRC     gc  ;   ///< Garbage collector
+            typedef Tag         tag ;   ///< tag
+
+            typedef gc::atomic_ref<node>    atomic_node_ptr    ;    ///< atomic pointer
+            atomic_node_ptr m_pNext ; ///< pointer to the next node in the container
+
+            node()
+                : m_pNext(null_ptr<node *>())
+            {}
+
+        protected:
+            virtual void cleanUp( cds::gc::hrc::ThreadGC * pGC )
+            {
+                assert( pGC != null_ptr<cds::gc::hrc::ThreadGC *>() );
+                typename gc::GuardArray<2> aGuards( *pGC );
+
+                while ( true ) {
+                    node * pNext = aGuards.protect( 0, m_pNext );
+                    if ( pNext && pNext->m_bDeleted.load(CDS_ATOMIC::memory_order_acquire) ) {
+                        node * p = aGuards.protect( 1, pNext->m_pNext );
+                        m_pNext.compare_exchange_strong( pNext, p, CDS_ATOMIC::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed );
+                        continue;
+                    }
+                    else {
+                        break;
+                    }
+                }
+            }
+
+            virtual void terminate( cds::gc::hrc::ThreadGC * pGC, bool bConcurrent )
+            {
+                if ( bConcurrent ) {
+                    node * pNext = m_pNext.load(CDS_ATOMIC::memory_order_relaxed);
+                    do {} while ( !m_pNext.compare_exchange_weak( pNext, null_ptr<node *>(), CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) );
+                }
+                else {
+                    m_pNext.store( null_ptr<node *>(), CDS_ATOMIC::memory_order_relaxed );
+                }
+            }
+        };
+        //@endcond
+
+        //@cond
+        struct default_hook {
+            typedef cds::gc::default_gc gc;
+            typedef opt::none           tag;
+        };
+        //@endcond
+
+        //@cond
+        template < typename HookType, CDS_DECL_OPTIONS2>
+        struct hook
+        {
+            typedef typename opt::make_options< default_hook, CDS_OPTIONS2>::type  options;
+            typedef typename options::gc    gc;
+            typedef typename options::tag   tag;
+            typedef node<gc, tag> node_type;
+            typedef HookType     hook_type;
+        };
+        //@endcond
+
+
+        /// Base hook
+        /**
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template < CDS_DECL_OPTIONS2 >
+        struct base_hook: public hook< opt::base_hook_tag, CDS_OPTIONS2 >
+        {};
+
+        /// Member hook
+        /**
+            \p MemberOffset defines offset in bytes of \ref node member into your structure.
+            Use \p offsetof macro to define \p MemberOffset
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template < size_t MemberOffset, CDS_DECL_OPTIONS2 >
+        struct member_hook: public hook< opt::member_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            static const size_t c_nMemberOffset = MemberOffset;
+            //@endcond
+        };
+
+        /// Traits hook
+        /**
+            \p NodeTraits defines type traits for node.
+            See \ref node_traits for \p NodeTraits interface description
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - tag
+        */
+        template <typename NodeTraits, CDS_DECL_OPTIONS2 >
+        struct traits_hook: public hook< opt::traits_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            typedef NodeTraits node_traits;
+            //@endcond
+        };
+
+        /// Check link
+        template <typename Node>
+        struct link_checker {
+            //@cond
+            typedef Node node_type;
+            //@endcond
+
+            /// Checks if the link field of node \p pNode is NULL
+            /**
+                An asserting is generated if \p pNode link field is not NULL
+            */
+            static void is_empty( const node_type * pNode )
+            {
+                assert( pNode->m_pNext.load(CDS_ATOMIC::memory_order_relaxed) == null_ptr<node_type *>() );
+            }
+        };
+
+        //@cond
+        template <class GC, typename Node, opt::link_check_type LinkType >
+        struct link_checker_selector;
+
+        template <typename Node>
+        struct link_checker_selector< gc::HRC, Node, opt::never_check_link >
+        {
+            typedef link_checker<Node>  type;
+        };
+
+        template <typename Node>
+        struct link_checker_selector< gc::HRC, Node, opt::debug_check_link >
+        {
+            typedef link_checker<Node>  type;
+        };
+
+        template <typename GC, typename Node>
+        struct link_checker_selector< GC, Node, opt::never_check_link >
+        {
+            typedef intrusive::opt::v::empty_link_checker<Node>  type;
+        };
+
+        template <typename GC, typename Node>
+        struct link_checker_selector< GC, Node, opt::debug_check_link >
+        {
+#       ifdef _DEBUG
+            typedef link_checker<Node>  type;
+#       else
+            typedef intrusive::opt::v::empty_link_checker<Node>  type;
+#       endif
+        };
+
+        template <typename GC, typename Node>
+        struct link_checker_selector< GC, Node, opt::always_check_link >
+        {
+            typedef link_checker<Node>  type;
+        };
+        //@endcond
+
+        /// Metafunction for selecting appropriate link checking policy
+        template < typename Node, opt::link_check_type LinkType >
+        struct get_link_checker
+        {
+            //@cond
+            typedef typename link_checker_selector< typename Node::gc, Node, LinkType>::type type;
+            //@endcond
+        };
+
+    }   // namespace single_link
+
+}}  // namespace cds::intrusive
+
+
+
+#endif // #ifndef __CDS_INTRUSIVE_SINGLE_LINK_STRUCT_H
diff --git a/cds/intrusive/skip_list_base.h b/cds/intrusive/skip_list_base.h
new file mode 100644 (file)
index 0000000..b715e61
--- /dev/null
@@ -0,0 +1,654 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SKIP_LIST_BASE_H
+#define __CDS_INTRUSIVE_SKIP_LIST_BASE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/details/marked_ptr.h>
+#include <cds/bitop.h>
+#include <cds/os/timer.h>
+#include <cds/urcu/options.h>
+
+
+namespace cds { namespace intrusive {
+    /// SkipListSet related definitions
+    /** @ingroup cds_intrusive_helper
+    */
+    namespace skip_list {
+
+        /// The maximum possible height of any skip-list
+        static unsigned int const c_nHeightLimit = 32;
+
+        /// Skip list node
+        /**
+            Template parameters:
+            - GC - garbage collector
+            - Tag - a tag used to distinguish between different implementation. An incomplete type may be used as a tag.
+        */
+        template <class GC, typename Tag = opt::none>
+        class node {
+        public:
+            typedef GC      gc          ;   ///< Garbage collector
+            typedef Tag     tag         ;   ///< tag
+
+            typedef cds::details::marked_ptr<node, 1>                       marked_ptr          ;   ///< marked pointer
+            typedef typename gc::template atomic_marked_ptr< marked_ptr>    atomic_marked_ptr   ;   ///< atomic marked pointer specific for GC
+            //@cond
+            typedef atomic_marked_ptr tower_item_type;
+            //@endcond
+
+        protected:
+            atomic_marked_ptr       m_pNext     ;   ///< Next item in bottom-list (list at level 0)
+            unsigned int            m_nHeight   ;   ///< Node height (size of m_arrNext array). For node at level 0 the height is 1.
+            atomic_marked_ptr *     m_arrNext   ;   ///< Array of next items for levels 1 .. m_nHeight - 1. For node at level 0 \p m_arrNext is \p NULL
+
+        public:
+            /// Constructs a node of height 1 (a bottom-list node)
+            node()
+                : m_pNext( null_ptr<node *>())
+                , m_nHeight(1)
+                , m_arrNext( null_ptr<atomic_marked_ptr *>())
+            {}
+
+            /// Constructs a node of height \p nHeight
+            void make_tower( unsigned int nHeight, atomic_marked_ptr * nextTower )
+            {
+                assert( nHeight > 0 );
+                assert( ( nHeight == 1 && nextTower == null_ptr<atomic_marked_ptr *>() )  // bottom-list node
+                     || ( nHeight > 1  && nextTower != null_ptr<atomic_marked_ptr *>() )   // node at level of more than 0
+                );
+
+                m_arrNext = nextTower;
+                m_nHeight = nHeight;
+            }
+
+            //@cond
+            atomic_marked_ptr * release_tower()
+            {
+                atomic_marked_ptr * pTower = m_arrNext;
+                m_arrNext = null_ptr<atomic_marked_ptr *>();
+                m_nHeight = 1;
+                return pTower;
+            }
+
+            atomic_marked_ptr * get_tower() const
+            {
+                return m_arrNext;
+            }
+            //@endcond
+
+            /// Access to element of next pointer array
+            atomic_marked_ptr& next( unsigned int nLevel )
+            {
+                assert( nLevel < height() );
+                assert( nLevel == 0 || (nLevel > 0 && m_arrNext != null_ptr<atomic_marked_ptr *>() ));
+
+                return nLevel ? m_arrNext[ nLevel - 1] : m_pNext;
+            }
+
+            /// Access to element of next pointer array (const version)
+            atomic_marked_ptr const& next( unsigned int nLevel ) const
+            {
+                assert( nLevel < height() );
+                assert( nLevel == 0 || nLevel > 0 && m_arrNext != null_ptr<atomic_marked_ptr *>() );
+
+                return nLevel ? m_arrNext[ nLevel - 1] : m_pNext;
+            }
+
+            /// Access to element of next pointer array (same as \ref next function)
+            atomic_marked_ptr& operator[]( unsigned int nLevel )
+            {
+                return next( nLevel );
+            }
+
+            /// Access to element of next pointer array (same as \ref next function)
+            atomic_marked_ptr const& operator[]( unsigned int nLevel ) const
+            {
+                return next( nLevel );
+            }
+
+            /// Height of the node
+            unsigned int height() const
+            {
+                return m_nHeight;
+            }
+
+            /// Clears internal links
+            void clear()
+            {
+                assert( m_arrNext == null_ptr<atomic_marked_ptr *>());
+                m_pNext.store( marked_ptr(), CDS_ATOMIC::memory_order_release );
+            }
+
+            //@cond
+            bool is_cleared() const
+            {
+                return m_pNext == atomic_marked_ptr()
+                    && m_arrNext == null_ptr<atomic_marked_ptr *>()
+                    && m_nHeight <= 1
+;
+            }
+            //@endcond
+        };
+
+        //@cond
+        struct undefined_gc;
+        struct default_hook {
+            typedef undefined_gc    gc;
+            typedef opt::none       tag;
+        };
+        //@endcond
+
+        //@cond
+        template < typename HookType, CDS_DECL_OPTIONS2>
+        struct hook
+        {
+            typedef typename opt::make_options< default_hook, CDS_OPTIONS2>::type  options;
+            typedef typename options::gc    gc;
+            typedef typename options::tag   tag;
+            typedef node<gc, tag>           node_type;
+            typedef HookType                hook_type;
+        };
+        //@endcond
+
+        /// Base hook
+        /**
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - a tag
+        */
+        template < CDS_DECL_OPTIONS2 >
+        struct base_hook: public hook< opt::base_hook_tag, CDS_OPTIONS2 >
+        {};
+
+        /// Member hook
+        /**
+            \p MemberOffset defines offset in bytes of \ref node member into your structure.
+            Use \p offsetof macro to define \p MemberOffset
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - a tag
+        */
+        template < size_t MemberOffset, CDS_DECL_OPTIONS2 >
+        struct member_hook: public hook< opt::member_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            static const size_t c_nMemberOffset = MemberOffset;
+            //@endcond
+        };
+
+        /// Traits hook
+        /**
+            \p NodeTraits defines type traits for node.
+            See \ref node_traits for \p NodeTraits interface description
+
+            \p Options are:
+            - opt::gc - garbage collector used.
+            - opt::tag - a tag
+        */
+        template <typename NodeTraits, CDS_DECL_OPTIONS2 >
+        struct traits_hook: public hook< opt::traits_hook_tag, CDS_OPTIONS2 >
+        {
+            //@cond
+            typedef NodeTraits node_traits;
+            //@endcond
+        };
+
+        /// Option specifying random level generator
+        /**
+            The random level generator is an important part of skip-list algorithm.
+            The node height in the skip-list have a probabilistic distribution
+            where half of the nodes that have level \p i pointers also have level <tt>i+1</tt> pointers
+            (i = 0..30).
+            The random level generator should provide such distribution.
+
+            The \p Type functor interface is:
+            \code
+            struct random_generator {
+                static unsigned int const c_nUpperBound = 32;
+                random_generator();
+                unsigned int operator()();
+            };
+            \endcode
+
+            where
+            - \p c_nUpperBound - constant that specifies the upper bound of random number generated.
+                The generator produces a number from range <tt>[0 .. c_nUpperBound)</tt> (upper bound excluded).
+                \p c_nUpperBound must be no more than 32.
+            - <tt>random_generator()</tt> - the constructor of generator object initialises the generator instance (its internal state).
+            - <tt>unsigned int operator()()</tt> - the main generating function. Returns random level from range 0..31.
+
+            Stateful generators are supported.
+
+            Available \p Type implementations:
+            - \ref xorshift
+            - \ref turbo_pascal
+        */
+        template <typename Type>
+        struct random_level_generator {
+            //@cond
+            template <typename Base>
+            struct pack: public Base
+            {
+                typedef Type random_level_generator;
+            };
+            //@endcond
+        };
+
+        /// Xor-shift random level generator
+        /**
+            The simplest of the generators described in George
+            Marsaglia's "Xorshift RNGs" paper.  This is not a high-quality
+            generator but is acceptable for skip-list.
+
+            The random generator should return numbers from range [0..31].
+
+            From Doug Lea's ConcurrentSkipListMap.java.
+        */
+        class xorshift {
+            //@cond
+            CDS_ATOMIC::atomic<unsigned int>    m_nSeed;
+            //@endcond
+        public:
+            /// The upper bound of generator's return value. The generator produces random number in range <tt>[0..c_nUpperBound)</tt>
+            static unsigned int const c_nUpperBound = c_nHeightLimit;
+
+            /// Initializes the generator instance
+            xorshift()
+            {
+                m_nSeed.store( (unsigned int) cds::OS::Timer::random_seed(), CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Main generator function
+            unsigned int operator()()
+            {
+                /* ConcurrentSkipListMap.java
+                private int randomLevel() {
+                    int x = randomSeed;
+                    x ^= x << 13;
+                    x ^= x >>> 17;
+                    randomSeed = x ^= x << 5;
+                    if ((x & 0x80000001) != 0) // test highest and lowest bits
+                        return 0;
+                    int level = 1;
+                    while (((x >>>= 1) & 1) != 0) ++level;
+                    return level;
+                }
+                */
+                unsigned int x = m_nSeed.load( CDS_ATOMIC::memory_order_relaxed );
+                x ^= x << 13;
+                x ^= x >> 17;
+                x ^= x << 5;
+                m_nSeed.store( x, CDS_ATOMIC::memory_order_relaxed );
+                unsigned int nLevel = ((x & 0x00000001) != 0) ? 0 : cds::bitop::LSB( (~(x >> 1)) & 0x7FFFFFFF );
+                assert( nLevel < c_nUpperBound );
+                return nLevel;
+            }
+        };
+
+        /// Turbo-pascal random level generator
+        /**
+            This uses a cheap pseudo-random function that was used in Turbo Pascal.
+
+            The random generator should return numbers from range [0..31].
+
+            From Doug Lea's ConcurrentSkipListMap.java.
+        */
+        class turbo_pascal
+        {
+            //@cond
+            CDS_ATOMIC::atomic<unsigned int>    m_nSeed;
+            //@endcond
+        public:
+            /// The upper bound of generator's return value. The generator produces random number in range <tt>[0..c_nUpperBound)</tt>
+            static unsigned int const c_nUpperBound = c_nHeightLimit;
+
+            /// Initializes the generator instance
+            turbo_pascal()
+            {
+                m_nSeed.store( (unsigned int) cds::OS::Timer::random_seed(), CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Main generator function
+            unsigned int operator()()
+            {
+                /*
+                private int randomLevel() {
+                    int level = 0;
+                    int r = randomSeed;
+                    randomSeed = r * 134775813 + 1;
+                    if (r < 0) {
+                        while ((r <<= 1) > 0)
+                            ++level;
+                    }
+                return level;
+                }
+                */
+                /*
+                    The low bits are apparently not very random (the original used only
+                    upper 16 bits) so we traverse from highest bit down (i.e., test
+                    sign), thus hardly ever use lower bits.
+                */
+                unsigned int x = m_nSeed.load( CDS_ATOMIC::memory_order_relaxed ) * 134775813 + 1;
+                m_nSeed.store( x, CDS_ATOMIC::memory_order_relaxed );
+                unsigned int nLevel = ( x & 0x80000000 ) ? (31 - cds::bitop::MSBnz( (x & 0x7FFFFFFF) | 1 )) : 0;
+                assert( nLevel < c_nUpperBound );
+                return nLevel;
+            }
+        };
+
+        /// SkipListSet internal statistics
+        template <typename EventCounter = cds::atomicity::event_counter>
+        struct stat {
+            typedef EventCounter event_counter ; ///< Event counter type
+
+            event_counter   m_nNodeHeightAdd[c_nHeightLimit] ; ///< Count of added node of each height
+            event_counter   m_nNodeHeightDel[c_nHeightLimit] ; ///< Count of deleted node of each height
+            event_counter   m_nInsertSuccess        ; ///< Count of success insertion
+            event_counter   m_nInsertFailed         ; ///< Count of failed insertion
+            event_counter   m_nInsertRetries        ; ///< Count of unsuccessful retries of insertion
+            event_counter   m_nEnsureExist          ; ///< Count of \p ensure call for existed node
+            event_counter   m_nEnsureNew            ; ///< Count of \p ensure call for new node
+            event_counter   m_nUnlinkSuccess        ; ///< Count of successful call of \p unlink
+            event_counter   m_nUnlinkFailed         ; ///< Count of failed call of \p unlink
+            event_counter   m_nEraseSuccess         ; ///< Count of successful call of \p erase
+            event_counter   m_nEraseFailed          ; ///< Count of failed call of \p erase
+            event_counter   m_nFindFastSuccess      ; ///< Count of successful call of \p find and all derivatives (via fast-path)
+            event_counter   m_nFindFastFailed       ; ///< Count of failed call of \p find and all derivatives (via fast-path)
+            event_counter   m_nFindSlowSuccess      ; ///< Count of successful call of \p find and all derivatives (via slow-path)
+            event_counter   m_nFindSlowFailed       ; ///< Count of failed call of \p find and all derivatives (via slow-path)
+            event_counter   m_nRenewInsertPosition  ; ///< Count of renewing position events while inserting
+            event_counter   m_nLogicDeleteWhileInsert   ;   ///< Count of events "The node has been logically deleted while inserting"
+            event_counter   m_nNotFoundWhileInsert  ; ///< Count of events "Inserting node is not found"
+            event_counter   m_nFastErase            ; ///< Fast erase event counter
+            event_counter   m_nFastExtract          ; ///< Fast extract event counter
+            event_counter   m_nSlowErase            ; ///< Slow erase event counter
+            event_counter   m_nSlowExtract          ; ///< Slow extract event counter
+            event_counter   m_nExtractSuccess       ; ///< Count of successful call of \p extract
+            event_counter   m_nExtractFailed        ; ///< Count of failed call of \p extract
+            event_counter   m_nExtractRetries       ; ///< Count of retries of \p extract call
+            event_counter   m_nExtractMinSuccess    ; ///< Count of successful call of \p extract_min
+            event_counter   m_nExtractMinFailed     ; ///< Count of failed call of \p extract_min
+            event_counter   m_nExtractMinRetries    ; ///< Count of retries of \p extract_min call
+            event_counter   m_nExtractMaxSuccess    ; ///< Count of successful call of \p extract_max
+            event_counter   m_nExtractMaxFailed     ; ///< Count of failed call of \p extract_max
+            event_counter   m_nExtractMaxRetries    ; ///< Count of retries of \p extract_max call
+            event_counter   m_nEraseWhileFind       ; ///< Count of erased item while searching
+            event_counter   m_nExtractWhileFind     ; ///< Count of extracted item while searching (RCU only)
+
+            //@cond
+            void onAddNode( unsigned int nHeight )
+            {
+                assert( nHeight > 0 && nHeight <= sizeof(m_nNodeHeightAdd) / sizeof(m_nNodeHeightAdd[0]));
+                ++m_nNodeHeightAdd[nHeight - 1];
+            }
+            void onRemoveNode( unsigned int nHeight )
+            {
+                assert( nHeight > 0 && nHeight <= sizeof(m_nNodeHeightDel) / sizeof(m_nNodeHeightDel[0]));
+                ++m_nNodeHeightDel[nHeight - 1];
+            }
+
+            void onInsertSuccess()          { ++m_nInsertSuccess    ; }
+            void onInsertFailed()           { ++m_nInsertFailed     ; }
+            void onInsertRetry()            { ++m_nInsertRetries    ; }
+            void onEnsureExist()            { ++m_nEnsureExist      ; }
+            void onEnsureNew()              { ++m_nEnsureNew        ; }
+            void onUnlinkSuccess()          { ++m_nUnlinkSuccess    ; }
+            void onUnlinkFailed()           { ++m_nUnlinkFailed     ; }
+            void onEraseSuccess()           { ++m_nEraseSuccess     ; }
+            void onEraseFailed()            { ++m_nEraseFailed      ; }
+            void onFindFastSuccess()        { ++m_nFindFastSuccess  ; }
+            void onFindFastFailed()         { ++m_nFindFastFailed   ; }
+            void onFindSlowSuccess()        { ++m_nFindSlowSuccess  ; }
+            void onFindSlowFailed()         { ++m_nFindSlowFailed   ; }
+            void onEraseWhileFind()         { ++m_nEraseWhileFind   ; }
+            void onExtractWhileFind()       { ++m_nExtractWhileFind ; }
+            void onRenewInsertPosition()    { ++m_nRenewInsertPosition; }
+            void onLogicDeleteWhileInsert() { ++m_nLogicDeleteWhileInsert; }
+            void onNotFoundWhileInsert()    { ++m_nNotFoundWhileInsert; }
+            void onFastErase()              { ++m_nFastErase;         }
+            void onFastExtract()            { ++m_nFastExtract;       }
+            void onSlowErase()              { ++m_nSlowErase;         }
+            void onSlowExtract()            { ++m_nSlowExtract;       }
+            void onExtractSuccess()         { ++m_nExtractSuccess;    }
+            void onExtractFailed()          { ++m_nExtractFailed;     }
+            void onExtractRetry()           { ++m_nExtractRetries;    }
+            void onExtractMinSuccess()      { ++m_nExtractMinSuccess; }
+            void onExtractMinFailed()       { ++m_nExtractMinFailed;  }
+            void onExtractMinRetry()        { ++m_nExtractMinRetries; }
+            void onExtractMaxSuccess()      { ++m_nExtractMaxSuccess; }
+            void onExtractMaxFailed()       { ++m_nExtractMaxFailed;  }
+            void onExtractMaxRetry()        { ++m_nExtractMaxRetries; }
+
+            //@endcond
+        };
+
+        /// SkipListSet empty internal statistics
+        struct empty_stat {
+            //@cond
+            void onAddNode( unsigned int nHeight ) const {}
+            void onRemoveNode( unsigned int nHeight ) const {}
+            void onInsertSuccess()          const {}
+            void onInsertFailed()           const {}
+            void onInsertRetry()            const {}
+            void onEnsureExist()            const {}
+            void onEnsureNew()              const {}
+            void onUnlinkSuccess()          const {}
+            void onUnlinkFailed()           const {}
+            void onEraseSuccess()           const {}
+            void onEraseFailed()            const {}
+            void onFindFastSuccess()        const {}
+            void onFindFastFailed()         const {}
+            void onFindSlowSuccess()        const {}
+            void onFindSlowFailed()         const {}
+            void onEraseWhileFind()         const {}
+            void onExtractWhileFind()       const {}
+            void onRenewInsertPosition()    const {}
+            void onLogicDeleteWhileInsert() const {}
+            void onNotFoundWhileInsert()    const {}
+            void onFastErase()              const {}
+            void onFastExtract()            const {}
+            void onSlowErase()              const {}
+            void onSlowExtract()            const {}
+            void onExtractSuccess()         const {}
+            void onExtractFailed()          const {}
+            void onExtractRetry()           const {}
+            void onExtractMinSuccess()      const {}
+            void onExtractMinFailed()       const {}
+            void onExtractMinRetry()        const {}
+            void onExtractMaxSuccess()      const {}
+            void onExtractMaxFailed()       const {}
+            void onExtractMaxRetry()        const {}
+
+            //@endcond
+        };
+
+        //@cond
+        // For internal use only!!!
+        template <typename Type>
+        struct internal_node_builder {
+            template <typename Base>
+            struct pack: public Base
+            {
+                typedef Type internal_node_builder;
+            };
+        };
+        //@endcond
+
+        /// Type traits for SkipListSet class
+        struct type_traits
+        {
+            /// Hook used
+            /**
+                Possible values are: skip_list::base_hook, skip_list::member_hook, skip_list::traits_hook.
+            */
+            typedef base_hook<>       hook;
+
+            /// Key comparison functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+            */
+            typedef opt::none                       compare;
+
+            /// specifies binary predicate used for key compare.
+            /**
+                Default is \p std::less<T>.
+            */
+            typedef opt::none                       less;
+
+            /// Disposer
+            /**
+                The functor used for dispose removed items. Default is opt::v::empty_disposer.
+            */
+            typedef opt::v::empty_disposer          disposer;
+
+            /// Item counter
+            /**
+                The type for item counting feature.
+                Default is no item counter (\ref atomicity::empty_item_counter)
+            */
+            typedef atomicity::empty_item_counter     item_counter;
+
+            /// C++ memory ordering model
+            /**
+                List of available memory ordering see opt::memory_model
+            */
+            typedef opt::v::relaxed_ordering        memory_model;
+
+            /// Random level generator
+            /**
+                The random level generator is an important part of skip-list algorithm.
+                The node height in the skip-list have a probabilistic distribution
+                where half of the nodes that have level \p i pointers also have level <tt>i+1</tt> pointers
+                (i = 0..30). So, the height of a node is in range [0..31].
+
+                See skip_list::random_level_generator option setter.
+            */
+            typedef turbo_pascal                    random_level_generator;
+
+            /// Allocator
+            /**
+                Although the skip-list is an intrusive container,
+                an allocator should be provided to maintain variable randomly-calculated height of the node
+                since the node can contain up to 32 next pointers.
+                The allocator specified is used to allocate an array of next pointers
+                for nodes which height is more than 1.
+            */
+            typedef CDS_DEFAULT_ALLOCATOR           allocator;
+
+            /// back-off strategy used
+            /**
+                If the option is not specified, the cds::backoff::Default is used.
+            */
+            typedef cds::backoff::Default           back_off;
+
+            /// Internal statistics
+            typedef empty_stat                      stat;
+
+            /// RCU deadlock checking policy (only for \ref cds_intrusive_SkipListSet_rcu "RCU-based SkipListSet")
+            /**
+                List of available options see opt::rcu_check_deadlock
+            */
+            typedef opt::v::rcu_throw_deadlock      rcu_check_deadlock;
+
+            //@cond
+            // For internal use only!!!
+            typedef opt::none                       internal_node_builder;
+            //@endcond
+        };
+
+        /// Metafunction converting option list to SkipListSet traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options list see \ref SkipListSet.
+        */
+        template <CDS_DECL_OPTIONS13>
+        struct make_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, CDS_OPTIONS13 >::type
+                ,CDS_OPTIONS13
+            >::type   type;
+#   endif
+        };
+
+        //@cond
+        namespace details {
+            template <typename Node>
+            class head_node: public Node
+            {
+                typedef Node node_type;
+
+                typename node_type::atomic_marked_ptr   m_Tower[skip_list::c_nHeightLimit];
+
+            public:
+                head_node( unsigned int nHeight )
+                {
+                    for ( size_t i = 0; i < sizeof(m_Tower) / sizeof(m_Tower[0]); ++i )
+                        m_Tower[i].store( typename node_type::marked_ptr(), CDS_ATOMIC::memory_order_relaxed );
+
+                    node_type::make_tower( nHeight, m_Tower );
+                }
+
+                node_type * head() const
+                {
+                    return const_cast<node_type *>( static_cast<node_type const *>(this));
+                }
+            };
+
+            template <typename NodeType, typename AtomicNodePtr, typename Alloc>
+            struct intrusive_node_builder
+            {
+                typedef NodeType        node_type;
+                typedef AtomicNodePtr   atomic_node_ptr;
+                typedef Alloc           allocator_type;
+
+                typedef cds::details::Allocator< atomic_node_ptr, allocator_type >  tower_allocator;
+
+                template <typename RandomGen>
+                static node_type * make_tower( node_type * pNode, RandomGen& gen )
+                {
+                    return make_tower( pNode, gen() + 1 );
+                }
+
+                static node_type * make_tower( node_type * pNode, unsigned int nHeight )
+                {
+                    if ( nHeight > 1 )
+                        pNode->make_tower( nHeight, tower_allocator().NewArray( nHeight - 1, null_ptr<node_type *>() ));
+                    return pNode;
+                }
+
+                static void dispose_tower( node_type * pNode )
+                {
+                    unsigned int nHeight = pNode->height();
+                    if ( nHeight > 1 )
+                        tower_allocator().Delete( pNode->release_tower(), nHeight );
+                }
+
+                struct node_disposer {
+                    void operator()( node_type * pNode )
+                    {
+                        dispose_tower( pNode );
+                    }
+                };
+            };
+
+            // Forward declaration
+            template <class GC, typename NodeTraits, typename BackOff, bool IsConst>
+            class iterator;
+
+        } // namespace details
+        //@endcond
+
+    }   // namespace skip_list
+
+    // Forward declaration
+    template <class GC, typename T, typename Traits = skip_list::type_traits >
+    class SkipListSet;
+
+}}   // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_SKIP_LIST_BASE_H
diff --git a/cds/intrusive/skip_list_hp.h b/cds/intrusive/skip_list_hp.h
new file mode 100644 (file)
index 0000000..2df5fd3
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SKIP_LIST_HP_H
+#define __CDS_INTRUSIVE_SKIP_LIST_HP_H
+
+#include <cds/gc/hp.h>
+#include <cds/intrusive/skip_list_impl.h>
+
+#endif
diff --git a/cds/intrusive/skip_list_hrc.h b/cds/intrusive/skip_list_hrc.h
new file mode 100644 (file)
index 0000000..afd4df4
--- /dev/null
@@ -0,0 +1,201 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SKIP_LIST_HRC_H
+#define __CDS_INTRUSIVE_SKIP_LIST_HRC_H
+
+#include <cds/intrusive/skip_list_impl.h>
+#include <cds/gc/hrc.h>
+
+//@cond
+namespace cds { namespace intrusive { namespace skip_list {
+    // Specialization for HRC GC
+    template <typename Tag>
+    class node< cds::gc::HRC, Tag>: public cds::gc::HRC::container_node
+    {
+    public:
+        typedef gc::HRC gc          ;   ///< Garbage collector
+        typedef Tag     tag         ;   ///< tag
+
+        typedef cds::details::marked_ptr<node, 1>                       marked_ptr          ;   ///< marked pointer
+        typedef typename gc::template atomic_marked_ptr< marked_ptr>    atomic_marked_ptr   ;   ///< atomic marked pointer specific for GC
+        typedef atomic_marked_ptr   tower_item_type;
+
+    protected:
+        atomic_marked_ptr       m_pNext     ;   ///< Next item in bottom-list (list at level 0)
+        unsigned int            m_nHeight   ;   ///< Node height (size of m_arrNext array). For node at level 0 the height is 1.
+        atomic_marked_ptr *     m_arrNext   ;   ///< Array of next items for levels 1 .. m_nHeight - 1. For node at level 0 \p m_arrNext is \p NULL
+
+    public:
+        bool                    m_bDel;
+
+    public:
+        /// Constructs a node of height 1 (a bottom-list node)
+        node()
+            : m_pNext( null_ptr<node *>())
+            , m_nHeight(1)
+            , m_arrNext( null_ptr<atomic_marked_ptr *>())
+            , m_bDel( false )
+        {}
+
+        ~node()
+        {
+            release_tower();
+            m_pNext.store( marked_ptr(), CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Constructs a node of height \p nHeight
+        void make_tower( unsigned int nHeight, atomic_marked_ptr * nextTower )
+        {
+            assert( nHeight > 0 );
+            assert( ( nHeight == 1 && nextTower == null_ptr<atomic_marked_ptr *>() )  // bottom-list node
+                || ( nHeight > 1  && nextTower != null_ptr<atomic_marked_ptr *>() )   // node at level of more than 0
+                );
+
+            m_arrNext = nextTower;
+            m_nHeight = nHeight;
+        }
+
+        atomic_marked_ptr * release_tower()
+        {
+            unsigned int nHeight = m_nHeight - 1;
+            atomic_marked_ptr * pTower = m_arrNext;
+            if ( pTower ) {
+                m_arrNext = null_ptr<atomic_marked_ptr *>();
+                m_nHeight = 1;
+                for ( unsigned int i = 0; i < nHeight; ++i )
+                    pTower[i].store( marked_ptr(), CDS_ATOMIC::memory_order_release );
+            }
+            return pTower;
+        }
+
+        atomic_marked_ptr * get_tower() const
+        {
+            return m_arrNext;
+        }
+
+        /// Access to element of next pointer array
+        atomic_marked_ptr& next( unsigned int nLevel )
+        {
+            assert( nLevel < height() );
+            assert( nLevel == 0 || (nLevel > 0 && m_arrNext != null_ptr<atomic_marked_ptr *>() ));
+
+            return nLevel ? m_arrNext[ nLevel - 1] : m_pNext;
+        }
+
+        /// Access to element of next pointer array (const version)
+        atomic_marked_ptr const& next( unsigned int nLevel ) const
+        {
+            assert( nLevel < height() );
+            assert( nLevel == 0 || (nLevel > 0 && m_arrNext != null_ptr<atomic_marked_ptr *>()) );
+
+            return nLevel ? m_arrNext[ nLevel - 1] : m_pNext;
+        }
+
+        /// Access to element of next pointer array (same as \ref next function)
+        atomic_marked_ptr& operator[]( unsigned int nLevel )
+        {
+            return next( nLevel );
+        }
+
+        /// Access to element of next pointer array (same as \ref next function)
+        atomic_marked_ptr const& operator[]( unsigned int nLevel ) const
+        {
+            return next( nLevel );
+        }
+
+        /// Height of the node
+        unsigned int height() const
+        {
+            return m_nHeight;
+        }
+
+    protected:
+        virtual void cleanUp( cds::gc::hrc::ThreadGC * pGC )
+        {
+            assert( pGC != NULL );
+            typename gc::GuardArray<2> aGuards( *pGC );
+
+            unsigned int const nHeight = height();
+            for (unsigned int i = 0; i < nHeight; ++i ) {
+                while ( true ) {
+                    marked_ptr pNextMarked( aGuards.protect( 0, next(i) ));
+                    node * pNext = pNextMarked.ptr();
+                    if ( pNext && pNext->m_bDeleted.load(CDS_ATOMIC::memory_order_acquire) ) {
+                        marked_ptr p = aGuards.protect( 1, pNext->next(i) );
+                        next(i).compare_exchange_strong( pNextMarked, p, CDS_ATOMIC::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed );
+                        continue;
+                    }
+                    else {
+                        break;
+                    }
+                }
+            }
+        }
+
+        virtual void terminate( cds::gc::hrc::ThreadGC * pGC, bool bConcurrent )
+        {
+            unsigned int const nHeight = height();
+            if ( bConcurrent ) {
+                for (unsigned int i = 0; i < nHeight; ++i ) {
+                    marked_ptr pNext = next(i).load(CDS_ATOMIC::memory_order_relaxed);
+                    while ( !next(i).compare_exchange_weak( pNext, marked_ptr(), CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) );
+                }
+            }
+            else {
+                for (unsigned int i = 0; i < nHeight; ++i )
+                    next(i).store( marked_ptr(), CDS_ATOMIC::memory_order_relaxed );
+            }
+        }
+    };
+
+    namespace details {
+
+        template <typename Tag>
+        class head_node< node< cds::gc::HRC, Tag > >
+        {
+            typedef node< cds::gc::HRC, Tag > node_type;
+
+            struct head_tower: public node_type
+            {
+                typename node_type::atomic_marked_ptr   m_Tower[skip_list::c_nHeightLimit];
+            };
+
+            head_tower * m_pHead;
+
+            struct head_disposer {
+                void operator()( head_tower * p )
+                {
+                    delete p;
+                }
+            };
+        public:
+            head_node( unsigned int nHeight )
+                : m_pHead( new head_tower() )
+            {
+                for ( size_t i = 0; i < sizeof(m_pHead->m_Tower) / sizeof(m_pHead->m_Tower[0]); ++i )
+                    m_pHead->m_Tower[i].store( typename node_type::marked_ptr(), CDS_ATOMIC::memory_order_relaxed );
+
+                m_pHead->make_tower( nHeight, m_pHead->m_Tower );
+            }
+
+            ~head_node()
+            {
+                cds::gc::HRC::template retire<head_disposer>( m_pHead );
+            }
+
+            node_type * head()
+            {
+                return static_cast<node_type *>( m_pHead );
+            }
+            node_type const * head() const
+            {
+                return static_cast<node_type const *>( m_pHead );
+            }
+
+        };
+    } // namespace details
+
+}}} // namespace cds::intrusive::skip_list
+//@endcond
+
+#endif
diff --git a/cds/intrusive/skip_list_impl.h b/cds/intrusive/skip_list_impl.h
new file mode 100644 (file)
index 0000000..bda9e0f
--- /dev/null
@@ -0,0 +1,1749 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SKIP_LIST_IMPL_H
+#define __CDS_INTRUSIVE_SKIP_LIST_IMPL_H
+
+#include <cds/intrusive/skip_list_base.h>
+#include <cds/details/std/type_traits.h>
+#include <cds/details/std/memory.h>
+#include <cds/opt/compare.h>
+#include <cds/ref.h>
+#include <cds/details/binary_functor_wrapper.h>
+#include <cds/gc/guarded_ptr.h>
+
+namespace cds { namespace intrusive {
+
+    //@cond
+    namespace skip_list { namespace details {
+
+        template <class GC, typename NodeTraits, typename BackOff, bool IsConst>
+        class iterator {
+        public:
+            typedef GC                                  gc;
+            typedef NodeTraits                          node_traits;
+            typedef BackOff                             back_off;
+            typedef typename node_traits::node_type     node_type;
+            typedef typename node_traits::value_type    value_type;
+            static bool const c_isConst = IsConst;
+
+            typedef typename std::conditional< c_isConst, value_type const &, value_type &>::type   value_ref;
+
+        protected:
+            typedef typename node_type::marked_ptr          marked_ptr;
+            typedef typename node_type::atomic_marked_ptr   atomic_marked_ptr;
+
+            typename gc::Guard      m_guard;
+            node_type *             m_pNode;
+
+        protected:
+            static value_type * gc_protect( marked_ptr p )
+            {
+                return node_traits::to_value_ptr( p.ptr() );
+            }
+
+            void next()
+            {
+                typename gc::Guard g;
+                g.copy( m_guard );
+                back_off bkoff;
+
+                for (;;) {
+                    if ( m_pNode->next( m_pNode->height() - 1 ).load( CDS_ATOMIC::memory_order_acquire ).bits() ) {
+                        // Current node is marked as deleted. So, its next pointer can point to anything
+                        // In this case we interrupt our iteration and returns end() iterator.
+                        *this = iterator();
+                        return;
+                    }
+
+                    marked_ptr p = m_guard.protect( (*m_pNode)[0], gc_protect );
+                    node_type * pp = p.ptr();
+                    if ( p.bits() ) {
+                        // p is marked as deleted. Spin waiting for physical removal
+                        bkoff();
+                        continue;
+                    }
+                    else if ( pp && pp->next( pp->height() - 1 ).load( CDS_ATOMIC::memory_order_relaxed ).bits() ) {
+                        // p is marked as deleted. Spin waiting for physical removal
+                        bkoff();
+                        continue;
+                    }
+
+                    m_pNode = pp;
+                    break;
+                }
+            }
+
+        public: // for internal use only!!!
+            iterator( node_type& refHead )
+                : m_pNode( null_ptr<node_type *>() )
+            {
+                back_off bkoff;
+
+                for (;;) {
+                    marked_ptr p = m_guard.protect( refHead[0], gc_protect );
+                    if ( !p.ptr() ) {
+                        // empty skip-list
+                        m_guard.clear();
+                        break;
+                    }
+
+                    node_type * pp = p.ptr();
+                    // Logically deleted node is marked from highest level
+                    if ( !pp->next( pp->height() - 1 ).load( CDS_ATOMIC::memory_order_acquire ).bits() ) {
+                        m_pNode = pp;
+                        break;
+                    }
+
+                    bkoff();
+                }
+            }
+
+        public:
+            iterator()
+                : m_pNode( null_ptr<node_type *>())
+            {}
+
+            iterator( iterator const& s)
+                : m_pNode( s.m_pNode )
+            {
+                m_guard.assign( node_traits::to_value_ptr(m_pNode) );
+            }
+
+            value_type * operator ->() const
+            {
+                assert( m_pNode != null_ptr< node_type *>() );
+                assert( node_traits::to_value_ptr( m_pNode ) != null_ptr<value_type *>() );
+
+                return node_traits::to_value_ptr( m_pNode );
+            }
+
+            value_ref operator *() const
+            {
+                assert( m_pNode != null_ptr< node_type *>() );
+                assert( node_traits::to_value_ptr( m_pNode ) != null_ptr<value_type *>() );
+
+                return *node_traits::to_value_ptr( m_pNode );
+            }
+
+            /// Pre-increment
+            iterator& operator ++()
+            {
+                next();
+                return *this;
+            }
+
+            iterator& operator = (const iterator& src)
+            {
+                m_pNode = src.m_pNode;
+                m_guard.copy( src.m_guard );
+                return *this;
+            }
+
+            template <typename Bkoff, bool C>
+            bool operator ==(iterator<gc, node_traits, Bkoff, C> const& i ) const
+            {
+                return m_pNode == i.m_pNode;
+            }
+            template <typename Bkoff, bool C>
+            bool operator !=(iterator<gc, node_traits, Bkoff, C> const& i ) const
+            {
+                return !( *this == i );
+            }
+        };
+    }}  // namespace skip_list::details
+    //@endcond
+
+    /// Lock-free skip-list set
+    /** @ingroup cds_intrusive_map
+        @anchor cds_intrusive_SkipListSet_hp
+
+        The implementation of well-known probabilistic data structure called skip-list
+        invented by W.Pugh in his papers:
+            - [1989] W.Pugh Skip Lists: A Probabilistic Alternative to Balanced Trees
+            - [1990] W.Pugh A Skip List Cookbook
+
+        A skip-list is a probabilistic data structure that provides expected logarithmic
+        time search without the need of rebalance. The skip-list is a collection of sorted
+        linked list. Nodes are ordered by key. Each node is linked into a subset of the lists.
+        Each list has a level, ranging from 0 to 32. The bottom-level list contains
+        all the nodes, and each higher-level list is a sublist of the lower-level lists.
+        Each node is created with a random top level (with a random height), and belongs
+        to all lists up to that level. The probability that a node has the height 1 is 1/2.
+        The probability that a node has the height N is 1/2 ** N (more precisely,
+        the distribution depends on an random generator provided, but our generators
+        have this property).
+
+        The lock-free variant of skip-list is implemented according to book
+            - [2008] M.Herlihy, N.Shavit "The Art of Multiprocessor Programming",
+                chapter 14.4 "A Lock-Free Concurrent Skiplist".
+        \note The algorithm described in this book cannot be directly adapted for C++ (roughly speaking,
+        the algo contains a lot of bugs). The \b libcds implementation applies the approach discovered
+        by M.Michael in his \ref cds_intrusive_MichaelList_hp "lock-free linked list".
+
+        <b>Template arguments</b>:
+            - \p GC - Garbage collector used. Note the \p GC must be the same as the GC used for item type \p T (see skip_list::node).
+            - \p T - type to be stored in the list. The type must be based on skip_list::node (for skip_list::base_hook)
+                or it must have a member of type skip_list::node (for skip_list::member_hook).
+            - \p Traits - type traits. See skip_list::type_traits for explanation.
+
+        It is possible to declare option-based list with cds::intrusive::skip_list::make_traits metafunction istead of \p Traits template
+        argument.
+        Template argument list \p Options of cds::intrusive::skip_list::make_traits metafunction are:
+        - opt::hook - hook used. Possible values are: skip_list::base_hook, skip_list::member_hook, skip_list::traits_hook.
+            If the option is not specified, <tt>skip_list::base_hook<></tt> and gc::HP is used.
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer. Due the nature
+            of GC schema the disposer may be called asynchronously.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - skip_list::random_level_generator - random level generator. Can be skip_list::xorshift, skip_list::turbo_pascal or
+            user-provided one. See skip_list::random_level_generator option description for explanation.
+            Default is \p %skip_list::turbo_pascal.
+        - opt::allocator - although the skip-list is an intrusive container,
+            an allocator should be provided to maintain variable randomly-calculated height of the node
+            since the node can contain up to 32 next pointers. The allocator option is used to allocate an array of next pointers
+            for nodes which height is more than 1. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used.
+        - opt::stat - internal statistics. Available types: skip_list::stat, skip_list::empty_stat (the default)
+
+        \warning The skip-list requires up to 67 hazard pointers that may be critical for some GCs for which
+            the guard count is limited (like as gc::HP, gc::HRC). Those GCs should be explicitly initialized with
+            hazard pointer enough: \code cds::gc::HP myhp( 67 ) \endcode. Otherwise an run-time exception may be raised
+            when you try to create skip-list object.
+
+        \note There are several specializations of \p %SkipListSet for each \p GC. You should include:
+        - <tt><cds/intrusive/skip_list_hp.h></tt> for gc::HP garbage collector
+        - <tt><cds/intrusive/skip_list_hrc.h></tt> for gc::HRC garbage collector
+        - <tt><cds/intrusive/skip_list_ptb.h></tt> for gc::PTB garbage collector
+        - <tt><cds/intrusive/skip_list_nogc.h></tt> for \ref cds_intrusive_SkipListSet_nogc for persistent set
+        - <tt><cds/intrusive/skip_list_rcu.h></tt> for \ref cds_intrusive_SkipListSet_rcu "RCU type"
+
+        <b>Iterators</b>
+
+        The class supports a forward iterator (\ref iterator and \ref const_iterator).
+        The iteration is ordered.
+        The iterator object is thread-safe: the element pointed by the iterator object is guarded,
+        so, the element cannot be reclaimed while the iterator object is alive.
+        However, passing an iterator object between threads is dangerous.
+
+        \warning Due to concurrent nature of skip-list set it is not guarantee that you can iterate
+        all elements in the set: any concurrent deletion can exclude the element
+        pointed by the iterator from the set, and your iteration can be terminated
+        before end of the set. Therefore, such iteration is more suitable for debugging purpose only
+
+        Remember, each iterator object requires 2 additional hazard pointers, that may be
+        a limited resource for \p GC like as gc::HP and gc::HRC (for gc::PTB the count of
+        guards is unlimited).
+
+        The iterator class supports the following minimalistic interface:
+        \code
+        struct iterator {
+            // Default ctor
+            iterator();
+
+            // Copy ctor
+            iterator( iterator const& s);
+
+            value_type * operator ->() const;
+            value_type& operator *() const;
+
+            // Pre-increment
+            iterator& operator ++();
+
+            // Copy assignment
+            iterator& operator = (const iterator& src);
+
+            bool operator ==(iterator const& i ) const;
+            bool operator !=(iterator const& i ) const;
+        };
+        \endcode
+        Note, the iterator object returned by \ref end, \p cend member functions points to \p NULL and should not be dereferenced.
+
+        <b>How to use</b>
+
+        You should incorporate skip_list::node into your struct \p T and provide
+        appropriate skip_list::type_traits::hook in your \p Traits template parameters. Usually, for \p Traits you
+        define a struct based on skip_list::type_traits.
+
+        Example for gc::HP and base hook:
+        \code
+        // Include GC-related skip-list specialization
+        #include <cds/intrusive/skip_list_hp.h>
+
+        // Data stored in skip list
+        struct my_data: public cds::intrusive::skip_list::node< cds::gc::HP >
+        {
+            // key field
+            std::string     strKey;
+
+            // other data
+            // ...
+        };
+
+        // my_data compare functor
+        struct my_data_cmp {
+            int operator()( const my_data& d1, const my_data& d2 )
+            {
+                return d1.strKey.compare( d2.strKey );
+            }
+
+            int operator()( const my_data& d, const std::string& s )
+            {
+                return d.strKey.compare(s);
+            }
+
+            int operator()( const std::string& s, const my_data& d )
+            {
+                return s.compare( d.strKey );
+            }
+        };
+
+
+        // Declare type_traits
+        struct my_traits: public cds::intrusive::skip_list::type_traits
+        {
+            typedef cds::intrusive::skip_list::base_hook< cds::opt::gc< cds::gc::HP > >   hook;
+            typedef my_data_cmp compare;
+        };
+
+        // Declare skip-list set type
+        typedef cds::intrusive::SkipListSet< cds::gc::HP, my_data, my_traits >     traits_based_set;
+        \endcode
+
+        Equivalent option-based code:
+        \code
+        // GC-related specialization
+        #include <cds/intrusive/skip_list_hp.h>
+
+        struct my_data {
+            // see above
+        };
+        struct compare {
+            // see above
+        };
+
+        // Declare option-based skip-list set
+        typedef cds::intrusive::SkipListSet< cds::gc::HP
+            ,my_data
+            , typename cds::intrusive::skip_list::make_traits<
+                cds::intrusive::opt::hook< cds::intrusive::skip_list::base_hook< cds::opt::gc< cds::gc::HP > > >
+                ,cds::intrusive::opt::compare< my_data_cmp >
+            >::type
+        > option_based_set;
+
+        \endcode
+    */
+    template <
+        class GC
+       ,typename T
+#ifdef CDS_DOXYGEN_INVOKED
+       ,typename Traits = skip_list::type_traits
+#else
+       ,typename Traits
+#endif
+    >
+    class SkipListSet
+    {
+    public:
+        typedef T       value_type      ;   ///< type of value stored in the skip-list
+        typedef Traits  options         ;   ///< Traits template parameter
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key comparison functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+#   endif
+
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+
+        typedef GC  gc          ;   ///< Garbage collector
+        typedef typename options::item_counter  item_counter ;   ///< Item counting policy used
+        typedef typename options::memory_model  memory_model ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::random_level_generator    random_level_generator  ;   ///< random level generator
+        typedef typename options::allocator     allocator_type  ;   ///< allocator for maintaining array of next pointers of the node
+        typedef typename options::back_off      back_off    ;   ///< Back-off strategy
+        typedef typename options::stat          stat        ;   ///< internal statistics type
+
+    public:
+        typedef cds::gc::guarded_ptr< gc, value_type > guarded_ptr; ///< Guarded pointer
+
+        /// Max node height. The actual node height should be in range <tt>[0 .. c_nMaxHeight)</tt>
+        /**
+            The max height is specified by \ref skip_list::random_level_generator "random level generator" constant \p m_nUpperBound
+            but it should be no more than 32 (\ref skip_list::c_nHeightLimit).
+        */
+        static unsigned int const c_nMaxHeight = std::conditional<
+            (random_level_generator::c_nUpperBound <= skip_list::c_nHeightLimit),
+            std::integral_constant< unsigned int, random_level_generator::c_nUpperBound >,
+            std::integral_constant< unsigned int, skip_list::c_nHeightLimit >
+        >::type::value;
+
+        //@cond
+        static unsigned int const c_nMinHeight = 5;
+        //@endcond
+
+    protected:
+        typedef typename node_type::atomic_marked_ptr   atomic_node_ptr ;   ///< Atomic marked node pointer
+        typedef typename node_type::marked_ptr          marked_node_ptr ;   ///< Node marked pointer
+
+    protected:
+        //@cond
+        typedef skip_list::details::intrusive_node_builder< node_type, atomic_node_ptr, allocator_type > intrusive_node_builder;
+
+        typedef typename std::conditional<
+            std::is_same< typename options::internal_node_builder, cds::opt::none >::value
+            ,intrusive_node_builder
+            ,typename options::internal_node_builder
+        >::type node_builder;
+
+        typedef std::unique_ptr< node_type, typename node_builder::node_disposer >    scoped_node_ptr;
+
+        // c_nMaxHeight * 2 - pPred/pSucc guards
+        // + 1 - for erase, unlink
+        // + 1 - for clear
+        static size_t const c_nHazardPtrCount = c_nMaxHeight * 2 + 2;
+        struct position {
+            node_type *   pPrev[ c_nMaxHeight ];
+            node_type *   pSucc[ c_nMaxHeight ];
+
+            typename gc::template GuardArray< c_nMaxHeight * 2 > guards  ;   ///< Guards array for pPrev/pSucc
+
+            node_type *   pCur  ;   // guarded by guards; needed only for *ensure* function
+        };
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor {
+            void operator()( value_type& )
+            {}
+        };
+
+        struct empty_erase_functor  {
+            void operator()( value_type const& )
+            {}
+        };
+
+        struct empty_find_functor {
+            template <typename Q>
+            void operator()( value_type& item, Q& val )
+            {}
+        };
+
+        struct get_functor {
+            typename gc::Guard& m_guard;
+
+            get_functor( typename gc::Guard& gp )
+                : m_guard(gp)
+            {}
+
+            template <typename Q>
+            void operator()( value_type& item, Q& val )
+            {
+                m_guard.assign( &item );
+            }
+        };
+
+        template <typename Func>
+        struct insert_at_ensure_functor {
+            Func m_func;
+            insert_at_ensure_functor( Func f ) : m_func(f) {}
+
+            void operator()( value_type& item )
+            {
+                cds::unref( m_func)( true, item, item );
+            }
+        };
+
+        struct copy_value_functor {
+            template <typename Q>
+            void operator()( Q& dest, value_type const& src ) const
+            {
+                dest = src;
+            }
+        };
+
+        struct dummy_copy_functor {
+            template <typename Q>
+            void operator()( Q&, value_type const&) const {}
+        };
+#   endif // ifndef CDS_CXX11_LAMBDA_SUPPORT
+
+        //@endcond
+
+    protected:
+        skip_list::details::head_node< node_type >      m_Head  ;   ///< head tower (max height)
+
+        item_counter                m_ItemCounter       ;   ///< item counter
+        random_level_generator      m_RandomLevelGen    ;   ///< random level generator instance
+        CDS_ATOMIC::atomic<unsigned int>    m_nHeight   ;   ///< estimated high level
+        mutable stat                m_Stat              ;   ///< internal statistics
+
+    protected:
+        //@cond
+        unsigned int random_level()
+        {
+            // Random generator produces a number from range [0..31]
+            // We need a number from range [1..32]
+            return m_RandomLevelGen() + 1;
+        }
+
+        template <typename Q>
+        node_type * build_node( Q v )
+        {
+            return node_builder::make_tower( v, m_RandomLevelGen );
+        }
+
+        static value_type * gc_protect( marked_node_ptr p )
+        {
+            return node_traits::to_value_ptr( p.ptr() );
+        }
+
+        static void dispose_node( value_type * pVal )
+        {
+            assert( pVal != null_ptr<value_type *>() );
+            typename node_builder::node_disposer()( node_traits::to_node_ptr(pVal) );
+            disposer()( pVal );
+        }
+
+        template <typename Q, typename Compare >
+        bool find_position( Q const& val, position& pos, Compare cmp, bool bStopIfFound )
+        {
+            node_type * pPred;
+            marked_node_ptr pSucc;
+            marked_node_ptr pCur;
+
+            // Hazard pointer array:
+            //  pPred: [nLevel * 2]
+            //  pSucc: [nLevel * 2 + 1]
+
+        retry:
+            pPred = m_Head.head();
+            int nCmp = 1;
+
+            for ( int nLevel = static_cast<int>( c_nMaxHeight - 1 ); nLevel >= 0; --nLevel ) {
+                pos.guards.assign( nLevel * 2, node_traits::to_value_ptr( pPred ));
+                while ( true ) {
+                    pCur = pos.guards.protect( nLevel * 2 + 1, pPred->next( nLevel ), gc_protect );
+                    if ( pCur.bits() ) {
+                        // pCur.bits() means that pPred is logically deleted
+                        goto retry;
+                    }
+
+                    if ( pCur.ptr() == null_ptr<node_type *>()) {
+                        // end of the list at level nLevel - goto next level
+                        break;
+                    }
+
+                    // pSucc contains deletion mark for pCur
+                    pSucc = pCur->next( nLevel ).load( memory_model::memory_order_relaxed );
+
+                    if ( pPred->next( nLevel ).load( memory_model::memory_order_relaxed ).all() != pCur.ptr() )
+                        goto retry;
+
+                    if ( pSucc.bits() ) {
+                        // pCur is marked, i.e. logically deleted.
+                        marked_node_ptr p( pCur.ptr() );
+                        if ( pPred->next( nLevel ).compare_exchange_strong( p, marked_node_ptr( pSucc.ptr() ),
+                            memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                        {
+                            if ( nLevel == 0 ) {
+                                gc::retire( node_traits::to_value_ptr( pCur.ptr() ), dispose_node );
+                                m_Stat.onEraseWhileFind();
+                            }
+                        }
+                        goto retry;
+                    }
+                    else {
+                        nCmp = cmp( *node_traits::to_value_ptr( pCur.ptr()), val );
+                        if ( nCmp < 0 ) {
+                            pPred = pCur.ptr();
+                            pos.guards.copy( nLevel * 2, nLevel * 2 + 1 ) ;   // pPrev guard := cur guard
+                        }
+                        else if ( nCmp == 0 && bStopIfFound )
+                            goto found;
+                        else
+                            break;
+                    }
+                }
+
+                // Next level
+                pos.pPrev[ nLevel ] = pPred;
+                pos.pSucc[ nLevel ] = pCur.ptr();
+            }
+
+            if ( nCmp != 0 )
+                return false;
+
+        found:
+            pos.pCur = pCur.ptr();
+            return pCur.ptr() && nCmp == 0;
+        }
+
+        bool find_min_position( position& pos )
+        {
+            node_type * pPred;
+            marked_node_ptr pSucc;
+            marked_node_ptr pCur;
+
+            // Hazard pointer array:
+            //  pPred: [nLevel * 2]
+            //  pSucc: [nLevel * 2 + 1]
+
+        retry:
+            pPred = m_Head.head();
+
+            for ( int nLevel = static_cast<int>( c_nMaxHeight - 1 ); nLevel >= 0; --nLevel ) {
+                pos.guards.assign( nLevel * 2, node_traits::to_value_ptr( pPred ));
+                pCur = pos.guards.protect( nLevel * 2 + 1, pPred->next( nLevel ), gc_protect );
+
+                // pCur.bits() means that pPred is logically deleted
+                // head cannot be deleted
+                assert( pCur.bits() == 0 );
+
+                if ( pCur.ptr() ) {
+
+                    // pSucc contains deletion mark for pCur
+                    pSucc = pCur->next( nLevel ).load( memory_model::memory_order_relaxed );
+
+                    if ( pPred->next( nLevel ).load( memory_model::memory_order_relaxed ).all() != pCur.ptr() )
+                        goto retry;
+
+                    if ( pSucc.bits() ) {
+                        // pCur is marked, i.e. logically deleted.
+                        marked_node_ptr p( pCur.ptr() );
+                        if ( pPred->next( nLevel ).compare_exchange_strong( p, marked_node_ptr( pSucc.ptr() ),
+                            memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                        {
+                            if ( nLevel == 0 )
+                                gc::retire( node_traits::to_value_ptr( pCur.ptr() ), dispose_node );
+                        }
+                        goto retry;
+                    }
+                }
+
+                // Next level
+                pos.pPrev[ nLevel ] = pPred;
+                pos.pSucc[ nLevel ] = pCur.ptr();
+            }
+
+            return (pos.pCur = pCur.ptr()) != null_ptr<node_type *>();
+        }
+
+        bool find_max_position( position& pos )
+        {
+            node_type * pPred;
+            marked_node_ptr pSucc;
+            marked_node_ptr pCur;
+
+            // Hazard pointer array:
+            //  pPred: [nLevel * 2]
+            //  pSucc: [nLevel * 2 + 1]
+
+        retry:
+            pPred = m_Head.head();
+
+            for ( int nLevel = static_cast<int>( c_nMaxHeight - 1 ); nLevel >= 0; --nLevel ) {
+                pos.guards.assign( nLevel * 2, node_traits::to_value_ptr( pPred ));
+                while ( true ) {
+                    pCur = pos.guards.protect( nLevel * 2 + 1, pPred->next( nLevel ), gc_protect );
+                    if ( pCur.bits() ) {
+                        // pCur.bits() means that pPred is logically deleted
+                        goto retry;
+                    }
+
+                    if ( pCur.ptr() == null_ptr<node_type *>()) {
+                        // end of the list at level nLevel - goto next level
+                        break;
+                    }
+
+                    // pSucc contains deletion mark for pCur
+                    pSucc = pCur->next( nLevel ).load( memory_model::memory_order_relaxed );
+
+                    if ( pPred->next( nLevel ).load( memory_model::memory_order_relaxed ).all() != pCur.ptr() )
+                        goto retry;
+
+                    if ( pSucc.bits() ) {
+                        // pCur is marked, i.e. logically deleted.
+                        marked_node_ptr p( pCur.ptr() );
+                        if ( pPred->next( nLevel ).compare_exchange_strong( p, marked_node_ptr( pSucc.ptr() ),
+                            memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                        {
+                            if ( nLevel == 0 )
+                                gc::retire( node_traits::to_value_ptr( pCur.ptr() ), dispose_node );
+                        }
+                        goto retry;
+                    }
+                    else {
+                        if ( !pSucc.ptr() )
+                            break;
+
+                        pPred = pCur.ptr();
+                        pos.guards.copy( nLevel * 2, nLevel * 2 + 1 ); // pPrev guard := cur guard
+                        //pos.guards.copy( nLevel * 2, gCur ) ;   // pPrev guard := gCur
+                    }
+                }
+
+                // Next level
+                pos.pPrev[ nLevel ] = pPred;
+                pos.pSucc[ nLevel ] = pCur.ptr();
+            }
+
+            return (pos.pCur = pCur.ptr()) != null_ptr<node_type *>();
+        }
+
+        template <typename Func>
+        bool insert_at_position( value_type& val, node_type * pNode, position& pos, Func f )
+        {
+            unsigned int nHeight = pNode->height();
+
+            for ( unsigned int nLevel = 1; nLevel < nHeight; ++nLevel )
+                pNode->next(nLevel).store( marked_node_ptr(), memory_model::memory_order_relaxed );
+
+            {
+                marked_node_ptr p( pos.pSucc[0] );
+                pNode->next( 0 ).store( p, memory_model::memory_order_release );
+                if ( !pos.pPrev[0]->next(0).compare_exchange_strong( p, marked_node_ptr(pNode), memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) ) {
+                    return false;
+                }
+                cds::unref( f )( val );
+            }
+
+            for ( unsigned int nLevel = 1; nLevel < nHeight; ++nLevel ) {
+                marked_node_ptr p;
+                while ( true ) {
+                    marked_node_ptr q( pos.pSucc[ nLevel ]);
+                    if ( !pNode->next( nLevel ).compare_exchange_strong( p, q, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) {
+                        // pNode has been marked as removed while we are inserting it
+                        // Stop inserting
+                        assert( p.bits() );
+                        m_Stat.onLogicDeleteWhileInsert();
+                        return true;
+                    }
+                    p = q;
+                    if ( pos.pPrev[nLevel]->next(nLevel).compare_exchange_strong( q, marked_node_ptr( pNode ), memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) )
+                        break;
+
+                    // Renew insert position
+                    m_Stat.onRenewInsertPosition();
+                    if ( !find_position( val, pos, key_comparator(), false )) {
+                        // The node has been deleted while we are inserting it
+                        m_Stat.onNotFoundWhileInsert();
+                        return true;
+                    }
+                }
+            }
+            return true;
+        }
+
+        template <typename Func>
+        bool try_remove_at( node_type * pDel, position& pos, Func f )
+        {
+            assert( pDel != null_ptr<node_type *>());
+
+            marked_node_ptr pSucc;
+            typename gc::Guard gSucc;
+
+            // logical deletion (marking)
+            for ( unsigned int nLevel = pDel->height() - 1; nLevel > 0; --nLevel ) {
+                while ( true ) {
+                    pSucc = gSucc.protect( pDel->next(nLevel), gc_protect );
+                    if ( pSucc.bits() || pDel->next(nLevel).compare_exchange_weak( pSucc, pSucc | 1,
+                         memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                    {
+                        break;
+                    }
+                }
+            }
+
+            while ( true ) {
+                pSucc = gSucc.protect( pDel->next(0), gc_protect );
+                marked_node_ptr p( pSucc.ptr() );
+                if ( pDel->next(0).compare_exchange_strong( p, marked_node_ptr(p.ptr(), 1),
+                     memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                {
+                    cds::unref(f)( *node_traits::to_value_ptr( pDel ));
+
+                    // Physical deletion
+                    // try fast erase
+                    p = pDel;
+                    for ( int nLevel = static_cast<int>( pDel->height() - 1 ); nLevel >= 0; --nLevel ) {
+                        pSucc = gSucc.protect( pDel->next(nLevel), gc_protect );
+                        if ( !pos.pPrev[nLevel]->next(nLevel).compare_exchange_strong( p, marked_node_ptr(pSucc.ptr()),
+                            memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed) )
+                        {
+                            // Make slow erase
+                            find_position( *node_traits::to_value_ptr( pDel ), pos, key_comparator(), false );
+                            m_Stat.onSlowErase();
+                            return true;
+                        }
+                    }
+
+                    // Fast erasing success
+                    gc::retire( node_traits::to_value_ptr( pDel ), dispose_node );
+                    m_Stat.onFastErase();
+                    return true;
+                }
+                else {
+                    if ( p.bits() ) {
+                        return false;
+                    }
+                }
+            }
+        }
+
+        enum finsd_fastpath_result {
+            find_fastpath_found,
+            find_fastpath_not_found,
+            find_fastpath_abort
+        };
+        template <typename Q, typename Compare, typename Func>
+        finsd_fastpath_result find_fastpath( Q& val, Compare cmp, Func f )
+        {
+            node_type * pPred;
+            typename gc::template GuardArray<2>  guards;
+            marked_node_ptr pCur;
+            marked_node_ptr pNull;
+
+            back_off bkoff;
+
+            pPred = m_Head.head();
+            for ( int nLevel = static_cast<int>( m_nHeight.load(memory_model::memory_order_relaxed) - 1 ); nLevel >= 0; --nLevel ) {
+                pCur = guards.protect( 1, pPred->next(nLevel), gc_protect );
+                if ( pCur == pNull )
+                    continue;
+
+                while ( pCur != pNull ) {
+                    if ( pCur.bits() ) {
+                        unsigned int nAttempt = 0;
+                        while ( pCur.bits() && nAttempt++ < 16 ) {
+                            bkoff();
+                            pCur = guards.protect( 1, pPred->next(nLevel), gc_protect );
+                        }
+                        bkoff.reset();
+
+                        if ( pCur.bits() ) {
+                            // Maybe, we are on deleted node sequence
+                            // Abort searching, try slow-path
+                            return find_fastpath_abort;
+                        }
+                    }
+
+                    if ( pCur.ptr() ) {
+                        int nCmp = cmp( *node_traits::to_value_ptr( pCur.ptr() ), val );
+                        if ( nCmp < 0 ) {
+                            guards.copy( 0, 1 );
+                            pPred = pCur.ptr();
+                            pCur = guards.protect( 1, pCur->next(nLevel), gc_protect );
+                        }
+                        else if ( nCmp == 0 ) {
+                            // found
+                            cds::unref(f)( *node_traits::to_value_ptr( pCur.ptr() ), val );
+                            return find_fastpath_found;
+                        }
+                        else // pCur > val - go down
+                            break;
+                    }
+                }
+            }
+
+            return find_fastpath_not_found;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_slowpath( Q& val, Compare cmp, Func f )
+        {
+            position pos;
+            if ( find_position( val, pos, cmp, true )) {
+                assert( cmp( *node_traits::to_value_ptr( pos.pCur ), val ) == 0 );
+
+                cds::unref(f)( *node_traits::to_value_ptr( pos.pCur ), val );
+                return true;
+            }
+            else
+                return false;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_with_( Q& val, Compare cmp, Func f )
+        {
+            switch ( find_fastpath( val, cmp, f )) {
+            case find_fastpath_found:
+                m_Stat.onFindFastSuccess();
+                return true;
+            case find_fastpath_not_found:
+                m_Stat.onFindFastFailed();
+                return false;
+            default:
+                break;
+            }
+
+            if ( find_slowpath( val, cmp, f )) {
+                m_Stat.onFindSlowSuccess();
+                return true;
+            }
+
+            m_Stat.onFindSlowFailed();
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        bool get_with_( typename gc::Guard& guard, Q const& val, Compare cmp )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return find_with_( val, cmp, [&guard](value_type& found, Q const& ) { guard.assign(&found); } );
+#       else
+            get_functor gf(guard);
+            return find_with_( val, cmp, cds::ref(gf) );
+#       endif
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_( Q const& val, Compare cmp, Func f )
+        {
+            position pos;
+
+            if ( !find_position( val, pos, cmp, false ) ) {
+                m_Stat.onEraseFailed();
+                return false;
+            }
+
+            node_type * pDel = pos.pCur;
+            typename gc::Guard gDel;
+            gDel.assign( node_traits::to_value_ptr(pDel) );
+            assert( cmp( *node_traits::to_value_ptr( pDel ), val ) == 0 );
+
+            unsigned int nHeight = pDel->height();
+            if ( try_remove_at( pDel, pos, f )) {
+                --m_ItemCounter;
+                m_Stat.onRemoveNode( nHeight );
+                m_Stat.onEraseSuccess();
+                return true;
+            }
+
+            m_Stat.onEraseFailed();
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        bool extract_( typename gc::Guard& guard, Q const& val, Compare cmp )
+        {
+            position pos;
+
+            for (;;) {
+                if ( !find_position( val, pos, cmp, false ) ) {
+                    m_Stat.onExtractFailed();
+                    return false;
+                }
+
+                node_type * pDel = pos.pCur;
+                guard.assign( node_traits::to_value_ptr(pDel));
+                assert( cmp( *node_traits::to_value_ptr( pDel ), val ) == 0 );
+
+                unsigned int nHeight = pDel->height();
+                if ( try_remove_at( pDel, pos,
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                    [](value_type const&) {}
+#       else
+                    empty_erase_functor()
+#       endif
+                    ))
+                {
+                    --m_ItemCounter;
+                    m_Stat.onRemoveNode( nHeight );
+                    m_Stat.onExtractSuccess();
+                    return true;
+                }
+
+                m_Stat.onExtractRetry();
+            }
+        }
+
+        bool extract_min_( typename gc::Guard& gDel )
+        {
+            position pos;
+
+            for (;;) {
+                if ( !find_min_position( pos ) ) {
+                    // The list is empty
+                    m_Stat.onExtractMinFailed();
+                    return false;
+                }
+
+                node_type * pDel = pos.pCur;
+
+                unsigned int nHeight = pDel->height();
+                gDel.assign( node_traits::to_value_ptr(pDel) );
+
+                if ( try_remove_at( pDel, pos,
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                    [](value_type const&) {}
+#       else
+                    empty_erase_functor()
+#       endif
+                    ))
+                {
+                    --m_ItemCounter;
+                    m_Stat.onRemoveNode( nHeight );
+                    m_Stat.onExtractMinSuccess();
+                    return true;
+                }
+
+                m_Stat.onExtractMinRetry();
+            }
+        }
+
+        bool extract_max_( typename gc::Guard& gDel )
+        {
+            position pos;
+
+            for (;;) {
+                if ( !find_max_position( pos ) ) {
+                    // The list is empty
+                    m_Stat.onExtractMaxFailed();
+                    return false;
+                }
+
+                node_type * pDel = pos.pCur;
+
+                unsigned int nHeight = pDel->height();
+                gDel.assign( node_traits::to_value_ptr(pDel) );
+
+                if ( try_remove_at( pDel, pos,
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                    [](value_type const&) {}
+#       else
+                    empty_erase_functor()
+#       endif
+                    ))
+                {
+                    --m_ItemCounter;
+                    m_Stat.onRemoveNode( nHeight );
+                    m_Stat.onExtractMaxSuccess();
+                    return true;
+                }
+
+                m_Stat.onExtractMaxRetry();
+            }
+        }
+
+        void increase_height( unsigned int nHeight )
+        {
+            unsigned int nCur = m_nHeight.load( memory_model::memory_order_relaxed );
+            if ( nCur < nHeight )
+                m_nHeight.compare_exchange_strong( nCur, nHeight, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+        }
+        //@endcond
+
+    public:
+        /// Default constructor
+        /**
+            The constructor checks whether the count of guards is enough
+            for skip-list and may raise an exception if not.
+        */
+        SkipListSet()
+            : m_Head( c_nMaxHeight )
+            , m_nHeight( c_nMinHeight )
+        {
+            static_assert( (std::is_same< gc, typename node_type::gc >::value), "GC and node_type::gc must be the same type" );
+
+            gc::check_available_guards( c_nHazardPtrCount );
+
+            // Barrier for head node
+            CDS_ATOMIC::atomic_thread_fence( memory_model::memory_order_release );
+        }
+
+        /// Clears and destructs the skip-list
+        ~SkipListSet()
+        {
+            clear();
+        }
+
+    public:
+        /// Iterator type
+        typedef skip_list::details::iterator< gc, node_traits, back_off, false >  iterator;
+
+        /// Const iterator type
+        typedef skip_list::details::iterator< gc, node_traits, back_off, true >   const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        iterator begin()
+        {
+            return iterator( *m_Head.head() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        //@{
+        const_iterator begin() const
+        {
+            return const_iterator( *m_Head.head() );
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( *m_Head.head() );
+        }
+        //@}
+
+        /// Returns a forward iterator that addresses the location succeeding the last element in a set.
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator that addresses the location succeeding the last element in a set.
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+        const_iterator cend()
+        {
+            return const_iterator();
+        }
+        //@}
+
+    public:
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert( val, []( value_type& ) {} );
+#       else
+            return insert( val, empty_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success and may be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            typename gc::Guard gNew;
+            gNew.assign( &val );
+
+            node_type * pNode = node_traits::to_node_ptr( val );
+            scoped_node_ptr scp( pNode );
+            unsigned int nHeight = pNode->height();
+            bool bTowerOk = nHeight > 1 && pNode->get_tower() != null_ptr<atomic_node_ptr *>();
+            bool bTowerMade = false;
+
+            position pos;
+            while ( true )
+            {
+                bool bFound = find_position( val, pos, key_comparator(), true );
+                if ( bFound ) {
+                    // scoped_node_ptr deletes the node tower if we create it
+                    if ( !bTowerMade )
+                        scp.release();
+
+                    m_Stat.onInsertFailed();
+                    return false;
+                }
+
+                if ( !bTowerOk ) {
+                    build_node( pNode );
+                    nHeight = pNode->height();
+                    bTowerMade =
+                        bTowerOk = true;
+                }
+
+                if ( !insert_at_position( val, pNode, pos, f )) {
+                    m_Stat.onInsertRetry();
+                    continue;
+                }
+
+                increase_height( nHeight );
+                ++m_ItemCounter;
+                m_Stat.onAddNode( nHeight );
+                m_Stat.onInsertSuccess();
+                scp.release();
+                return true;
+            }
+        }
+
+        /// Ensures that the \p val exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val is not found in the set, then \p val is inserted into the set.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refer to the same thing.
+
+            The functor can change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            typename gc::Guard gNew;
+            gNew.assign( &val );
+
+            node_type * pNode = node_traits::to_node_ptr( val );
+            scoped_node_ptr scp( pNode );
+            unsigned int nHeight = pNode->height();
+            bool bTowerOk = nHeight > 1 && pNode->get_tower() != null_ptr<atomic_node_ptr *>();
+            bool bTowerMade = false;
+
+#       ifndef CDS_CXX11_LAMBDA_SUPPORT
+            insert_at_ensure_functor<Func> wrapper( func );
+#       endif
+
+            position pos;
+            while ( true )
+            {
+                bool bFound = find_position( val, pos, key_comparator(), true );
+                if ( bFound ) {
+                    // scoped_node_ptr deletes the node tower if we create it before
+                    if ( !bTowerMade )
+                        scp.release();
+
+                    cds::unref(func)( false, *node_traits::to_value_ptr(pos.pCur), val );
+                    m_Stat.onEnsureExist();
+                    return std::make_pair( true, false );
+                }
+
+                if ( !bTowerOk ) {
+                    build_node( pNode );
+                    nHeight = pNode->height();
+                    bTowerMade =
+                        bTowerOk = true;
+                }
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                if ( !insert_at_position( val, pNode, pos, [&func]( value_type& item ) { cds::unref(func)( true, item, item ); }))
+#       else
+                if ( !insert_at_position( val, pNode, pos, cds::ref(wrapper) ))
+#       endif
+                {
+                    m_Stat.onInsertRetry();
+                    continue;
+                }
+
+                increase_height( nHeight );
+                ++m_ItemCounter;
+                scp.release();
+                m_Stat.onAddNode( nHeight );
+                m_Stat.onEnsureNew();
+                return std::make_pair( true, true );
+            }
+        }
+
+        /// Unlinks the item \p val from the set
+        /**
+            The function searches the item \p val in the set and unlink it from the set
+            if it is found and is equal to \p val.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of that set, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+            position pos;
+
+            if ( !find_position( val, pos, key_comparator(), false ) ) {
+                m_Stat.onUnlinkFailed();
+                return false;
+            }
+
+            node_type * pDel = pos.pCur;
+            assert( key_comparator()( *node_traits::to_value_ptr( pDel ), val ) == 0 );
+
+            unsigned int nHeight = pDel->height();
+            typename gc::Guard gDel;
+            gDel.assign( node_traits::to_value_ptr(pDel) );
+
+            if ( node_traits::to_value_ptr( pDel ) == &val && try_remove_at( pDel, pos,
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                [](value_type const&) {}
+#       else
+                empty_erase_functor()
+#       endif
+            ))
+            {
+                --m_ItemCounter;
+                m_Stat.onRemoveNode( nHeight );
+                m_Stat.onUnlinkSuccess();
+                return true;
+            }
+
+            m_Stat.onUnlinkFailed();
+            return false;
+        }
+
+        /// Extracts the item from the set with specified \p key
+        /** \anchor cds_intrusive_SkipListSet_hp_extract
+            The function searches an item with key equal to \p key in the set,
+            unlinks it from the set, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The \ref disposer specified in \p Traits class template parameter is called automatically
+            by garbage collector \p GC specified in class' template parameters when returned \ref guarded_ptr object
+            will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::SkipListSet< cds::gc::HP, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                theList.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& dest, Q const& key )
+        {
+            return extract_( dest.guard(), key, key_comparator() );
+        }
+
+        /// Extracts the item from the set with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_hp_extract "extract(Q const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& dest, Q const& key, Less pred )
+        {
+            return extract_( dest.guard(), key, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Extracts an item with minimal key from the list
+        /**
+            The function searches an item with minimal key, unlinks it, and returns the item found in \p dest parameter.
+            If the skip-list is empty the function returns \p false.
+
+            @note Due the concurrent nature of the list, the function extracts <i>nearly</i> minimum key.
+            It means that the function gets leftmost item and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key less than leftmost item's key.
+            So, the function returns the item with minimum key at the moment of list traversing.
+
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC automatically when returned \ref guarded_ptr object
+            will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::SkipListSet< cds::gc::HP, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                if ( theList.extract_min( gp )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        bool extract_min( guarded_ptr& dest)
+        {
+            return extract_min_( dest.guard() );
+        }
+
+        /// Extracts an item with maximal key from the list
+        /**
+            The function searches an item with maximal key, unlinks it, and returns the pointer to item found in \p dest parameter.
+            If the skip-list is empty the function returns empty \p guarded_ptr.
+
+            @note Due the concurrent nature of the list, the function extracts <i>nearly</i> maximal key.
+            It means that the function gets rightmost item and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key greater than rightmost item's key.
+            So, the function returns the item with maximum key at the moment of list traversing.
+
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC asynchronously when returned \ref guarded_ptr object
+            will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::SkipListSet< cds::gc::HP, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                if ( theList.extract_max( gp )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        bool extract_max( guarded_ptr& dest )
+        {
+            return extract_max_( dest.guard() );
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_SkipListSet_hp_erase
+            The function searches an item with key equal to \p val in the set,
+            unlinks it from the set, and returns \p true.
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool erase( Q const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( val, key_comparator(), [](value_type const&) {} );
+#       else
+            return erase_( val, key_comparator(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the set with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_hp_erase "erase(Q const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& val, Less pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_( val, cds::opt::details::make_comparator_from_less<Less>(), [](value_type const&) {} );
+#       else
+            return erase_( val, cds::opt::details::make_comparator_from_less<Less>(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_SkipListSet_hp_erase_func
+            The function searches an item with key equal to \p val in the set,
+            call \p f functor with item found, unlinks it from the set, and returns \p true.
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor can be passed by reference with <tt>boost:ref</tt>
+
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& val, Func f )
+        {
+            return erase_( val, key_comparator(), f );
+        }
+
+        /// Deletes the item from the set with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_hp_erase_func "erase(Q const&, Func)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& val, Less pred, Func f )
+        {
+            return erase_( val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SkipListSet_hp_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the compare functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_with_( val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val with \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_hp_find_func "find(Q&, Func)"
+            but \p pred is used for key compare.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_with_( val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SkipListSet_hp_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the compare functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_with_( val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val with \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_hp_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key compare.
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_with_( val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SkipListSet_hp_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the compare functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool find( Q const & val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return find_with_( val, key_comparator(), [](value_type& , Q const& ) {} );
+#       else
+            return find_with_( val, key_comparator(), empty_find_functor() );
+#       endif
+        }
+
+        /// Finds the key \p val with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_hp_find_val "find(Q const&)"
+            but \p pred is used for comparing the keys.
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return find_with_( val, cds::opt::details::make_comparator_from_less<Less>(), [](value_type& , Q const& ) {} );
+#       else
+            return find_with_( val, cds::opt::details::make_comparator_from_less<Less>(), empty_find_functor() );
+#       endif
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_intrusive_SkipListSet_hp_get
+            The function searches the item with key equal to \p val
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p val is found, and \p false otherwise.
+            If \p val is not found the \p ptr parameter is not changed.
+
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC asynchronously when returned \ref guarded_ptr object
+            will be destroyed or released.
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::SkipListSet< cds::gc::HP, foo, my_traits >  skip_list;
+            skip_list theList;
+            // ...
+            {
+                skip_list::guarded_ptr gp;
+                if ( theList.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& ptr, Q const& val )
+        {
+            return get_with_( ptr.guard(), val, key_comparator() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_hp_get "get( guarded_ptr& ptr, Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& ptr, Q const& val, Less pred )
+        {
+            return get_with_( ptr.guard(), val, cds::opt::details::make_comparator_from_less<Less>() );
+        }
+
+        /// Returns item count in the set
+        /**
+            The value returned depends on item counter type provided by \p Traits template parameter.
+            If it is atomicity::empty_item_counter this function always returns 0.
+            Therefore, the function is not suitable for checking the set emptiness, use \ref empty
+            member function for this purpose.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Checks if the set is empty
+        bool empty() const
+        {
+            return m_Head.head()->next(0).load( memory_model::memory_order_relaxed ) == null_ptr<node_type *>();
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function unlink all items from the set.
+            The function is not atomic, i.e., in multi-threaded environment with parallel insertions
+            this sequence
+            \code
+            set.clear();
+            assert( set.empty() );
+            \endcode
+            the assertion could be raised.
+
+            For each item the \ref disposer will be called after unlinking.
+        */
+        void clear()
+        {
+            guarded_ptr gp;
+            while ( extract_min( gp ));
+        }
+
+        /// Returns maximum height of skip-list. The max height is a constant for each object and does not exceed 32.
+        static CDS_CONSTEXPR unsigned int max_height() CDS_NOEXCEPT
+        {
+            return c_nMaxHeight;
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return m_Stat;
+        }
+
+    };
+
+}} // namespace cds::intrusive
+
+
+#endif // #ifndef __CDS_INTRUSIVE_SKIP_LIST_IMPL_H
diff --git a/cds/intrusive/skip_list_nogc.h b/cds/intrusive/skip_list_nogc.h
new file mode 100644 (file)
index 0000000..b3d2ed4
--- /dev/null
@@ -0,0 +1,1034 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SKIP_LIST_NOGC_H
+#define __CDS_INTRUSIVE_SKIP_LIST_NOGC_H
+
+#include <cds/gc/nogc.h>
+#include <cds/intrusive/skip_list_base.h>
+#include <cds/details/std/type_traits.h>
+#include <cds/details/std/memory.h>
+#include <cds/opt/compare.h>
+#include <cds/ref.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+namespace cds { namespace intrusive {
+
+    //@cond
+    namespace skip_list {
+        template <typename Tag>
+        class node< cds::gc::nogc, Tag >
+        {
+        public:
+            typedef cds::gc::nogc   gc          ;   ///< Garbage collector
+            typedef Tag             tag         ;   ///< tag
+
+            typedef CDS_ATOMIC::atomic<node * > atomic_ptr;
+            typedef atomic_ptr                  tower_item_type;
+
+        protected:
+            atomic_ptr      m_pNext     ;   ///< Next item in bottom-list (list at level 0)
+            unsigned int    m_nHeight   ;   ///< Node height (size of m_arrNext array). For node at level 0 the height is 1.
+            atomic_ptr *    m_arrNext   ;   ///< Array of next items for levels 1 .. m_nHeight - 1. For node at level 0 \p m_arrNext is \p NULL
+
+        public:
+            /// Constructs a node of height 1 (a bottom-list node)
+            node()
+                : m_pNext( null_ptr<node *>())
+                , m_nHeight(1)
+                , m_arrNext( null_ptr<atomic_ptr *>())
+            {}
+
+            /// Constructs a node of height \p nHeight
+            void make_tower( unsigned int nHeight, atomic_ptr * nextTower )
+            {
+                assert( nHeight > 0 );
+                assert( ( nHeight == 1 && nextTower == null_ptr<atomic_ptr *>() )  // bottom-list node
+                    || ( nHeight > 1  && nextTower != null_ptr<atomic_ptr *>() )   // node at level of more than 0
+                    );
+
+                m_arrNext = nextTower;
+                m_nHeight = nHeight;
+            }
+
+            atomic_ptr * release_tower()
+            {
+                atomic_ptr * pTower = m_arrNext;
+                m_arrNext = null_ptr<atomic_ptr *>();
+                m_nHeight = 1;
+                return pTower;
+            }
+
+            atomic_ptr * get_tower() const
+            {
+                return m_arrNext;
+            }
+
+            /// Access to element of next pointer array
+            atomic_ptr& next( unsigned int nLevel )
+            {
+                assert( nLevel < height() );
+                assert( nLevel == 0 || (nLevel > 0 && m_arrNext != null_ptr<atomic_ptr *>() ));
+
+                return nLevel ? m_arrNext[ nLevel - 1] : m_pNext;
+            }
+
+            /// Access to element of next pointer array (const version)
+            atomic_ptr const& next( unsigned int nLevel ) const
+            {
+                assert( nLevel < height() );
+                assert( nLevel == 0 || nLevel > 0 && m_arrNext != null_ptr<atomic_ptr *>() );
+
+                return nLevel ? m_arrNext[ nLevel - 1] : m_pNext;
+            }
+
+            /// Access to element of next pointer array (same as \ref next function)
+            atomic_ptr& operator[]( unsigned int nLevel )
+            {
+                return next( nLevel );
+            }
+
+            /// Access to element of next pointer array (same as \ref next function)
+            atomic_ptr const& operator[]( unsigned int nLevel ) const
+            {
+                return next( nLevel );
+            }
+
+            /// Height of the node
+            unsigned int height() const
+            {
+                return m_nHeight;
+            }
+
+            /// Clears internal links
+            void clear()
+            {
+                assert( m_arrNext == null_ptr<atomic_ptr *>());
+                m_pNext.store( null_ptr<node *>(), CDS_ATOMIC::memory_order_release );
+            }
+
+            bool is_cleared() const
+            {
+                return m_pNext.load( CDS_ATOMIC::memory_order_relaxed ) == null_ptr<atomic_ptr *>()
+                    && m_arrNext == null_ptr<atomic_ptr *>()
+                    && m_nHeight <= 1
+;
+            }
+        };
+    } // namespace skip_list
+
+    namespace skip_list { namespace details {
+
+        template <typename NodeTraits, typename BackOff, bool IsConst>
+        class iterator< cds::gc::nogc, NodeTraits, BackOff, IsConst>
+        {
+        public:
+            typedef cds::gc::nogc                       gc;
+            typedef NodeTraits                          node_traits;
+            typedef BackOff                             back_off;
+            typedef typename node_traits::node_type     node_type;
+            typedef typename node_traits::value_type    value_type;
+            static bool const c_isConst = IsConst;
+
+            typedef typename std::conditional< c_isConst, value_type const &, value_type &>::type   value_ref;
+
+        protected:
+            typedef typename node_type::atomic_ptr   atomic_ptr;
+            node_type *             m_pNode;
+
+        public: // for internal use only!!!
+            iterator( node_type& refHead )
+                : m_pNode( refHead[0].load( CDS_ATOMIC::memory_order_relaxed ) )
+            {}
+
+            static iterator from_node( node_type * pNode )
+            {
+                iterator it;
+                it.m_pNode = pNode;
+                return it;
+            }
+
+        public:
+            iterator()
+                : m_pNode( null_ptr<node_type *>())
+            {}
+
+            iterator( iterator const& s)
+                : m_pNode( s.m_pNode )
+            {}
+
+            value_type * operator ->() const
+            {
+                assert( m_pNode != null_ptr< node_type *>() );
+                assert( node_traits::to_value_ptr( m_pNode ) != null_ptr<value_type *>() );
+
+                return node_traits::to_value_ptr( m_pNode );
+            }
+
+            value_ref operator *() const
+            {
+                assert( m_pNode != null_ptr< node_type *>() );
+                assert( node_traits::to_value_ptr( m_pNode ) != null_ptr<value_type *>() );
+
+                return *node_traits::to_value_ptr( m_pNode );
+            }
+
+            /// Pre-increment
+            iterator& operator ++()
+            {
+                if ( m_pNode )
+                    m_pNode = m_pNode->next(0).load( CDS_ATOMIC::memory_order_relaxed );
+                return *this;
+            }
+
+            iterator& operator = (const iterator& src)
+            {
+                m_pNode = src.m_pNode;
+                return *this;
+            }
+
+            template <typename Bkoff, bool C>
+            bool operator ==(iterator<gc, node_traits, Bkoff, C> const& i ) const
+            {
+                return m_pNode == i.m_pNode;
+            }
+            template <typename Bkoff, bool C>
+            bool operator !=(iterator<gc, node_traits, Bkoff, C> const& i ) const
+            {
+                return !( *this == i );
+            }
+        };
+    }}  // namespace skip_list::details
+    //@endcond
+
+    /// Lock-free skip-list set (template specialization for gc::nogc)
+    /** @ingroup cds_intrusive_map
+        @anchor cds_intrusive_SkipListSet_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+
+        See \ref cds_intrusive_SkipListSet_hp "SkipListSet" for description of skip-list.
+
+        <b>Template arguments</b> :
+        - \p T - type to be stored in the set. The type must be based on skip_list::node (for skip_list::base_hook)
+            or it must have a member of type skip_list::node (for skip_list::member_hook).
+        - \p Traits - type traits. See skip_list::type_traits for explanation.
+
+        It is possible to declare option-based list with cds::intrusive::skip_list::make_traits metafunction istead of \p Traits template
+        argument.
+        Template argument list \p Options of cds::intrusive::skip_list::make_traits metafunction are:
+        - opt::hook - hook used. Possible values are: skip_list::base_hook, skip_list::member_hook, skip_list::traits_hook.
+            If the option is not specified, <tt>skip_list::base_hook<></tt> and gc::HP is used.
+        - opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter that is no item counting.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - skip_list::random_level_generator - random level generator. Can be skip_list::xorshift, skip_list::turbo_pascal or
+            user-provided one. See skip_list::random_level_generator option description for explanation.
+            Default is \p %skip_list::turbo_pascal.
+        - opt::allocator - although the skip-list is an intrusive container,
+            an allocator should be provided to maintain variable randomly-calculated height of the node
+            since the node can contain up to 32 next pointers. The allocator option is used to allocate an array of next pointers
+            for nodes which height is more than 1. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used.
+        - opt::stat - internal statistics. Available types: skip_list::stat, skip_list::empty_stat (the default)
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer.
+            The disposer is used only in object destructor and in \ref clear function.
+
+        <b>Iterators</b>
+
+        The class supports a forward iterator (\ref iterator and \ref const_iterator).
+        The iteration is ordered.
+
+        The iterator class supports the following minimalistic interface:
+        \code
+        struct iterator {
+            // Default ctor
+            iterator();
+
+            // Copy ctor
+            iterator( iterator const& s);
+
+            value_type * operator ->() const;
+            value_type& operator *() const;
+
+            // Pre-increment
+            iterator& operator ++();
+
+            // Copy assignment
+            iterator& operator = (const iterator& src);
+
+            bool operator ==(iterator const& i ) const;
+            bool operator !=(iterator const& i ) const;
+        };
+        \endcode
+        Note, the iterator object returned by \ref end, \p cend member functions points to \p NULL and should not be dereferenced.
+
+        <b>How to use</b>
+
+        You should incorporate skip_list::node into your struct \p T and provide
+        appropriate skip_list::type_traits::hook in your \p Traits template parameters. Usually, for \p Traits you
+        define a struct based on skip_list::type_traits.
+
+        Example for base hook:
+        \code
+        #include <cds/intrusive/skip_list_nogc.h>
+
+        // Data stored in skip list
+        struct my_data: public cds::intrusive::skip_list::node< cds::gc::nogc >
+        {
+            // key field
+            std::string     strKey;
+
+            // other data
+            // ...
+        };
+
+        // my_data compare functor
+        struct my_data_cmp {
+            int operator()( const my_data& d1, const my_data& d2 )
+            {
+                return d1.strKey.compare( d2.strKey );
+            }
+
+            int operator()( const my_data& d, const std::string& s )
+            {
+                return d.strKey.compare(s);
+            }
+
+            int operator()( const std::string& s, const my_data& d )
+            {
+                return s.compare( d.strKey );
+            }
+        };
+
+
+        // Declare type_traits
+        struct my_traits: public cds::intrusive::skip_list::type_traits
+        {
+            typedef cds::intrusive::skip_list::base_hook< cds::opt::gc< cds::gc::nogc > >   hook;
+            typedef my_data_cmp compare;
+        };
+
+        // Declare skip-list set type
+        typedef cds::intrusive::SkipListSet< cds::gc::nogc, my_data, my_traits >     traits_based_set;
+        \endcode
+
+        Equivalent option-based code:
+        \code
+        // GC-related specialization
+        #include <cds/intrusive/skip_list_nogc.h>
+
+        struct my_data {
+            // see above
+        };
+        struct compare {
+            // see above
+        };
+
+        // Declare option-based skip-list set
+        typedef cds::intrusive::SkipListSet< cds::gc::nogc
+            ,my_data
+            , typename cds::intrusive::skip_list::make_traits<
+                cds::intrusive::opt::hook< cds::intrusive::skip_list::base_hook< cds::opt::gc< cds::gc::nogc > > >
+                ,cds::intrusive::opt::compare< my_data_cmp >
+            >::type
+        > option_based_set;
+
+        \endcode
+
+    */
+    template <
+       typename T
+#ifdef CDS_DOXYGEN_INVOKED
+       ,typename Traits = skip_list::type_traits
+#else
+       ,typename Traits
+#endif
+    >
+    class SkipListSet< cds::gc::nogc, T, Traits >
+    {
+    public:
+        typedef T       value_type      ;   ///< type of value stored in the skip-list
+        typedef Traits  options         ;   ///< Traits template parameter
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key comparison functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+#   endif
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+
+        typedef cds::gc::nogc  gc          ;   ///< No garbage collector is used
+        typedef typename options::item_counter  item_counter ;   ///< Item counting policy used
+        typedef typename options::memory_model  memory_model;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::random_level_generator    random_level_generator  ;   ///< random level generator
+        typedef typename options::allocator     allocator_type  ;   ///< allocator for maintaining array of next pointers of the node
+        typedef typename options::back_off      back_off    ;   ///< Back-off trategy
+        typedef typename options::stat          stat        ;   ///< internal statistics type
+        typedef typename options::disposer      disposer    ;   ///< disposer used
+
+        /// Max node height. The actual node height should be in range <tt>[0 .. c_nMaxHeight)</tt>
+        /**
+            The max height is specified by \ref skip_list::random_level_generator "random level generator" constant \p m_nUpperBound
+            but it should be no more than 32 (\ref skip_list::c_nHeightLimit).
+        */
+        static unsigned int const c_nMaxHeight = std::conditional<
+            (random_level_generator::c_nUpperBound <= skip_list::c_nHeightLimit),
+            std::integral_constant< unsigned int, random_level_generator::c_nUpperBound >,
+            std::integral_constant< unsigned int, skip_list::c_nHeightLimit >
+        >::type::value;
+
+        //@cond
+        static unsigned int const c_nMinHeight = 3;
+        //@endcond
+
+    protected:
+        typedef typename node_type::atomic_ptr   atomic_node_ptr ;   ///< Atomic node pointer
+
+    protected:
+        //@cond
+        typedef skip_list::details::intrusive_node_builder< node_type, atomic_node_ptr, allocator_type > intrusive_node_builder;
+
+        typedef typename std::conditional<
+            std::is_same< typename options::internal_node_builder, cds::opt::none >::value
+            ,intrusive_node_builder
+            ,typename options::internal_node_builder
+        >::type node_builder;
+
+        typedef std::unique_ptr< node_type, typename node_builder::node_disposer >    scoped_node_ptr;
+
+        struct position {
+            node_type *   pPrev[ c_nMaxHeight ];
+            node_type *   pSucc[ c_nMaxHeight ];
+
+            node_type *   pCur;
+        };
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor {
+            void operator()( value_type& )
+            {}
+        };
+
+        struct empty_find_functor {
+            template <typename Q>
+            void operator()( value_type& item, Q& val )
+            {}
+        };
+
+        template <typename Func>
+        struct insert_at_ensure_functor {
+            Func m_func;
+            insert_at_ensure_functor( Func f ) : m_func(f) {}
+
+            void operator()( value_type& item )
+            {
+                cds::unref( m_func)( true, item, item );
+            }
+        };
+
+#   endif // ifndef CDS_CXX11_LAMBDA_SUPPORT
+
+        class head_node: public node_type
+        {
+            typename node_type::atomic_ptr   m_Tower[c_nMaxHeight];
+
+        public:
+            head_node( unsigned int nHeight )
+            {
+                for ( size_t i = 0; i < sizeof(m_Tower) / sizeof(m_Tower[0]); ++i )
+                    m_Tower[i].store( null_ptr<node_type *>(), CDS_ATOMIC::memory_order_relaxed );
+
+                node_type::make_tower( nHeight, m_Tower );
+            }
+
+            node_type * head() const
+            {
+                return const_cast<node_type *>( static_cast<node_type const *>(this));
+            }
+
+            void clear()
+            {
+                for (unsigned int i = 0; i < sizeof(m_Tower) / sizeof(m_Tower[0]); ++i )
+                    m_Tower[i].store( null_ptr<node_type *>(), CDS_ATOMIC::memory_order_relaxed );
+                node_type::m_pNext.store( null_ptr<node_type *>(), CDS_ATOMIC::memory_order_relaxed );
+            }
+        };
+        //@endcond
+
+    protected:
+        head_node                   m_Head  ;   ///< head tower (max height)
+
+        item_counter                m_ItemCounter       ;   ///< item counter
+        random_level_generator      m_RandomLevelGen    ;   ///< random level generator instance
+        CDS_ATOMIC::atomic<unsigned int>    m_nHeight   ;   ///< estimated high level
+        mutable stat                m_Stat              ;   ///< internal statistics
+
+    protected:
+        //@cond
+        unsigned int random_level()
+        {
+            // Random generator produces a number from range [0..31]
+            // We need a number from range [1..32]
+            return m_RandomLevelGen() + 1;
+        }
+
+        template <typename Q>
+        node_type * build_node( Q v )
+        {
+            return node_builder::make_tower( v, m_RandomLevelGen );
+        }
+
+        static void dispose_node( node_type * pNode )
+        {
+            assert( pNode != null_ptr<node_type *>() );
+            typename node_builder::node_disposer()( pNode );
+            disposer()( node_traits::to_value_ptr( pNode ));
+        }
+
+        template <typename Q, typename Compare >
+        bool find_position( Q const& val, position& pos, Compare cmp, bool bStopIfFound, bool bStrictSearch ) const
+        {
+            node_type * pPred;
+            node_type * pSucc;
+            node_type * pCur = null_ptr<node_type *>();
+
+            int nCmp = 1;
+
+            unsigned int nHeight = c_nMaxHeight;
+        retry:
+            if ( !bStrictSearch )
+                nHeight = m_nHeight.load( memory_model::memory_order_relaxed );
+            pPred = m_Head.head();
+
+            for ( int nLevel = (int) nHeight - 1; nLevel >= 0; --nLevel ) {
+                while ( true ) {
+                    pCur = pPred->next( nLevel ).load( memory_model::memory_order_relaxed );
+
+                    if ( !pCur ) {
+                        // end of the list at level nLevel - goto next level
+                        break;
+                    }
+
+                    pSucc = pCur->next( nLevel ).load( memory_model::memory_order_relaxed );
+
+                    if ( pPred->next( nLevel ).load( memory_model::memory_order_acquire ) != pCur
+                        || pCur->next( nLevel ).load( memory_model::memory_order_acquire ) != pSucc )
+                    {
+                        goto retry;
+                    }
+
+                    nCmp = cmp( *node_traits::to_value_ptr( pCur ), val );
+                    if ( nCmp < 0 )
+                        pPred = pCur;
+                    else if ( nCmp == 0 && bStopIfFound )
+                        goto found;
+                    else
+                        break;
+                }
+
+                pos.pPrev[ nLevel ] = pPred;
+                pos.pSucc[ nLevel ] = pCur;
+            }
+
+            if ( nCmp != 0 )
+                return false;
+
+        found:
+            pos.pCur = pCur;
+            return pCur && nCmp == 0;
+        }
+
+        template <typename Func>
+        bool insert_at_position( value_type& val, node_type * pNode, position& pos, Func f )
+        {
+            unsigned int nHeight = pNode->height();
+
+            for ( unsigned int nLevel = 1; nLevel < nHeight; ++nLevel )
+                pNode->next(nLevel).store( null_ptr<node_type *>(), memory_model::memory_order_relaxed );
+
+            {
+                node_type * p = pos.pSucc[0];
+                pNode->next( 0 ).store( pos.pSucc[ 0 ], memory_model::memory_order_release );
+                if ( !pos.pPrev[0]->next(0).compare_exchange_strong( p, pNode, memory_model::memory_order_release, memory_model::memory_order_relaxed ) ) {
+                    return false;
+                }
+                cds::unref( f )( val );
+            }
+
+            for ( unsigned int nLevel = 1; nLevel < nHeight; ++nLevel ) {
+                node_type * p = null_ptr<node_type *>();
+                while ( true ) {
+                    node_type * q = pos.pSucc[ nLevel ];
+
+                    if ( pNode->next( nLevel ).compare_exchange_strong( p, q, memory_model::memory_order_release, memory_model::memory_order_relaxed )) {
+                        p = q;
+                        if ( pos.pPrev[nLevel]->next(nLevel).compare_exchange_strong( q, pNode, memory_model::memory_order_release, memory_model::memory_order_relaxed ) )
+                            break;
+                    }
+
+                    // Renew insert position
+                    find_position( val, pos, key_comparator(), false, true );
+                }
+            }
+            return true;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        node_type * find_with_( Q& val, Compare cmp, Func f ) const
+        {
+            position pos;
+            if ( find_position( val, pos, cmp, true, false )) {
+                assert( cmp( *node_traits::to_value_ptr( pos.pCur ), val ) == 0 );
+
+                cds::unref(f)( *node_traits::to_value_ptr( pos.pCur ), val );
+
+                m_Stat.onFindFastSuccess();
+                return pos.pCur;
+            }
+            else {
+                m_Stat.onFindFastFailed();
+                return null_ptr<node_type *>();
+            }
+        }
+
+        void increase_height( unsigned int nHeight )
+        {
+            unsigned int nCur = m_nHeight.load( memory_model::memory_order_relaxed );
+            while ( nCur < nHeight && !m_nHeight.compare_exchange_weak( nCur, nHeight, memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ) );
+        }
+        //@endcond
+
+    public:
+        /// Default constructor
+        /**
+            The constructor checks whether the count of guards is enough
+            for skip-list and may raise an exception if not.
+        */
+        SkipListSet()
+            : m_Head( c_nMaxHeight )
+            , m_nHeight( c_nMinHeight )
+        {
+            static_assert( (std::is_same< gc, typename node_type::gc >::value), "GC and node_type::gc must be the same type" );
+
+            // Barrier for head node
+            CDS_ATOMIC::atomic_thread_fence( memory_model::memory_order_release );
+        }
+
+        /// Clears and destructs the skip-list
+        ~SkipListSet()
+        {
+            clear();
+        }
+
+    public:
+        /// Iterator type
+        typedef skip_list::details::iterator< gc, node_traits, back_off, false >  iterator;
+
+        /// Const iterator type
+        typedef skip_list::details::iterator< gc, node_traits, back_off, true >   const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        iterator begin()
+        {
+            return iterator( *m_Head.head() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        //@{
+        const_iterator begin() const
+        {
+            return const_iterator( *m_Head.head() );
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( *m_Head.head() );
+        }
+        //@}
+
+        /// Returns a forward iterator that addresses the location succeeding the last element in a set.
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator that addresses the location succeeding the last element in a set.
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+        const_iterator cend()
+        {
+            return const_iterator();
+        }
+        //@}
+
+    protected:
+        //@cond
+        iterator nonconst_end() const
+        {
+            return iterator();
+        }
+        //@endcond
+
+    public:
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            node_type * pNode = node_traits::to_node_ptr( val );
+            scoped_node_ptr scp( pNode );
+            unsigned int nHeight = pNode->height();
+            bool bTowerOk = nHeight > 1 && pNode->get_tower() != null_ptr<atomic_node_ptr *>();
+            bool bTowerMade = false;
+
+            position pos;
+            while ( true )
+            {
+                bool bFound = find_position( val, pos, key_comparator(), true, true );
+                if ( bFound ) {
+                    // scoped_node_ptr deletes the node tower if we create it
+                    if ( !bTowerMade )
+                        scp.release();
+
+                    m_Stat.onInsertFailed();
+                    return false;
+                }
+
+                if ( !bTowerOk ) {
+                    build_node( pNode );
+                    nHeight = pNode->height();
+                    bTowerMade =
+                        bTowerOk = true;
+                }
+
+#       ifndef CDS_CXX11_LAMBDA_SUPPORT
+                if ( !insert_at_position( val, pNode, pos, empty_insert_functor() ))
+#       else
+                if ( !insert_at_position( val, pNode, pos, []( value_type& ) {} ))
+#       endif
+                {
+                    m_Stat.onInsertRetry();
+                    continue;
+                }
+
+                increase_height( nHeight );
+                ++m_ItemCounter;
+                m_Stat.onAddNode( nHeight );
+                m_Stat.onInsertSuccess();
+                scp.release();
+                return true;
+            }
+        }
+
+        /// Ensures that the \p val exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val is not found in the set, then \p val is inserted into the set.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refer to the same thing.
+
+            The functor can change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            node_type * pNode = node_traits::to_node_ptr( val );
+            scoped_node_ptr scp( pNode );
+            unsigned int nHeight = pNode->height();
+            bool bTowerOk = nHeight > 1 && pNode->get_tower() != null_ptr<atomic_node_ptr *>();
+            bool bTowerMade = false;
+
+#       ifndef CDS_CXX11_LAMBDA_SUPPORT
+            insert_at_ensure_functor<Func> wrapper( func );
+#       endif
+
+            position pos;
+            while ( true )
+            {
+                bool bFound = find_position( val, pos, key_comparator(), true, true );
+                if ( bFound ) {
+                    // scoped_node_ptr deletes the node tower if we create it before
+                    if ( !bTowerMade )
+                        scp.release();
+
+                    cds::unref(func)( false, *node_traits::to_value_ptr(pos.pCur), val );
+                    m_Stat.onEnsureExist();
+                    return std::make_pair( true, false );
+                }
+
+                if ( !bTowerOk ) {
+                    build_node( pNode );
+                    nHeight = pNode->height();
+                    bTowerMade =
+                        bTowerOk = true;
+                }
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                if ( !insert_at_position( val, pNode, pos, [&func]( value_type& item ) { cds::unref(func)( true, item, item ); }))
+#       else
+                if ( !insert_at_position( val, pNode, pos, cds::ref(wrapper) ))
+#       endif
+                {
+                    m_Stat.onInsertRetry();
+                    continue;
+                }
+
+                increase_height( nHeight );
+                ++m_ItemCounter;
+                scp.release();
+                m_Stat.onAddNode( nHeight );
+                m_Stat.onEnsureNew();
+                return std::make_pair( true, true );
+            }
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SkipListSet_nogc_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f ) const
+        {
+            return find_with_( val, key_comparator(), f ) != null_ptr<node_type *>();
+        }
+
+        /// Finds the key \p val using \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_nogc_find_func "find(Q&, Func)"
+            but \p pred predicate is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f ) const
+        {
+            return find_with_( val, cds::opt::details::make_comparator_from_less<Less>(), f ) != null_ptr<node_type *>();
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SkipListSet_nogc_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f ) const
+        {
+            return find_with_( val, key_comparator(), f ) != null_ptr<node_type *>();
+        }
+
+        /// Finds the key \p val using \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_nogc_find_cfunc "find(Q const&, Func)"
+            but \p pred predicate is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f ) const
+        {
+            return find_with_( val, cds::opt::details::make_comparator_from_less<Less>(), f ) != null_ptr<node_type *>();
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SkipListSet_nogc_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        value_type * find( Q const& val ) const
+        {
+            node_type * pNode =
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                find_with_( val, key_comparator(), [](value_type& , Q const& ) {} );
+#       else
+                find_with_( val, key_comparator(), empty_find_functor() );
+#       endif
+            if ( pNode )
+                return node_traits::to_value_ptr( pNode );
+            return null_ptr<value_type *>();
+        }
+
+        /// Finds the key \p val using \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_nogc_find_val "find(Q const&)"
+            but \p pred predicate is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        value_type * find_with( Q const& val, Less pred ) const
+        {
+            node_type * pNode =
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                find_with_( val, cds::opt::details::make_comparator_from_less<Less>(), [](value_type& , Q const& ) {} );
+#       else
+                find_with_( val, cds::opt::details::make_comparator_from_less<Less>(), empty_find_functor() );
+#       endif
+            if ( pNode )
+                return node_traits::to_value_ptr( pNode );
+            return null_ptr<value_type *>();
+        }
+
+        /// Gets minimum key from the set
+        /**
+            If the set is empty the function returns \p NULL
+        */
+        value_type * get_min() const
+        {
+            return node_traits::to_value_ptr( m_Head.head()->next( 0 ));
+        }
+
+        /// Gets maximum key from the set
+        /**
+            The function returns \p NULL if the set is empty
+        */
+        value_type * get_max() const
+        {
+            node_type * pPred;
+
+            unsigned int nHeight = m_nHeight.load( memory_model::memory_order_relaxed );
+            pPred = m_Head.head();
+
+            for ( int nLevel = (int) nHeight - 1; nLevel >= 0; --nLevel ) {
+                while ( true ) {
+                    node_type * pCur = pPred->next( nLevel ).load( memory_model::memory_order_relaxed );
+
+                    if ( !pCur ) {
+                        // end of the list at level nLevel - goto next level
+                        break;
+                    }
+                    pPred = pCur;
+                }
+            }
+            return pPred && pPred != m_Head.head() ? node_traits::to_value_ptr( pPred ) : null_ptr<value_type *>();
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function is not atomic.
+            Finding and/or inserting is prohibited while clearing.
+            Otherwise an unpredictable result may be encountered.
+            Thus, \p clear() may be used only for debugging purposes.
+        */
+        void clear()
+        {
+            node_type * pNode = m_Head.head()->next(0).load( memory_model::memory_order_relaxed );
+            m_Head.clear();
+            m_ItemCounter.reset();
+            m_nHeight.store( c_nMinHeight, memory_model::memory_order_release );
+
+            while ( pNode ) {
+                node_type * pNext = pNode->next(0).load( memory_model::memory_order_relaxed );
+                dispose_node( pNode );
+                pNode = pNext;
+            }
+        }
+
+        /// Returns item count in the set
+        /**
+            The value returned depends on item counter type provided by \p Traits template parameter.
+            If it is atomicity::empty_item_counter this function always returns 0.
+            The function is not suitable for checking the set emptiness, use \ref empty
+            member function for this purpose.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Checks if the set is empty
+        bool empty() const
+        {
+            return m_Head.head()->next(0).load( memory_model::memory_order_relaxed ) == null_ptr<node_type *>();
+        }
+
+        /// Returns maximum height of skip-list. The max height is a constant for each object and does not exceed 32.
+        static CDS_CONSTEXPR unsigned int max_height() CDS_NOEXCEPT
+        {
+            return c_nMaxHeight;
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return m_Stat;
+        }
+    };
+
+}} // namespace cds::intrusive
+
+
+#endif // #ifndef __CDS_INTRUSIVE_SKIP_LIST_IMPL_H
diff --git a/cds/intrusive/skip_list_ptb.h b/cds/intrusive/skip_list_ptb.h
new file mode 100644 (file)
index 0000000..09acb13
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SKIP_LIST_PTB_H
+#define __CDS_INTRUSIVE_SKIP_LIST_PTB_H
+
+#include <cds/gc/ptb.h>
+#include <cds/intrusive/skip_list_impl.h>
+
+#endif
diff --git a/cds/intrusive/skip_list_rcu.h b/cds/intrusive/skip_list_rcu.h
new file mode 100644 (file)
index 0000000..e03162c
--- /dev/null
@@ -0,0 +1,2227 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SKIP_LIST_RCU_H
+#define __CDS_INTRUSIVE_SKIP_LIST_RCU_H
+
+#include <cds/intrusive/skip_list_base.h>
+#include <cds/details/std/type_traits.h>
+#include <cds/details/std/memory.h>
+#include <cds/opt/compare.h>
+#include <cds/ref.h>
+#include <cds/urcu/details/check_deadlock.h>
+#include <cds/details/binary_functor_wrapper.h>
+#include <cds/urcu/exempt_ptr.h>
+
+
+namespace cds { namespace intrusive {
+
+    //@cond
+    namespace skip_list {
+
+        template <class RCU, typename Tag>
+        class node< cds::urcu::gc< RCU >, Tag >
+        {
+        public:
+            typedef cds::urcu::gc< RCU >    gc; ///< Garbage collector
+            typedef Tag     tag               ; ///< tag
+
+            // Mark bits:
+            //  bit 0 - the item is logically deleted
+            //  bit 1 - the item is extracted (only for level 0)
+            typedef cds::details::marked_ptr<node, 3>   marked_ptr          ;   ///< marked pointer
+            typedef CDS_ATOMIC::atomic< marked_ptr >    atomic_marked_ptr   ;   ///< atomic marked pointer
+            typedef atomic_marked_ptr                   tower_item_type;
+
+        protected:
+            atomic_marked_ptr       m_pNext     ;   ///< Next item in bottom-list (list at level 0)
+        public:
+            node *                  m_pDelChain ;   ///< Deleted node chain (local for a thread)
+#       ifdef _DEBUG
+            bool volatile           m_bLinked;
+            bool volatile           m_bUnlinked;
+#       endif
+        protected:
+            unsigned int            m_nHeight   ;   ///< Node height (size of m_arrNext array). For node at level 0 the height is 1.
+            atomic_marked_ptr *     m_arrNext   ;   ///< Array of next items for levels 1 .. m_nHeight - 1. For node at level 0 \p m_arrNext is \p NULL
+
+        public:
+            /// Constructs a node of height 1 (a bottom-list node)
+            node()
+                : m_pNext( null_ptr<node *>())
+                , m_pDelChain( null_ptr<node *>())
+#       ifdef _DEBUG
+                , m_bLinked( false )
+                , m_bUnlinked( false )
+#       endif
+                , m_nHeight(1)
+                , m_arrNext( null_ptr<atomic_marked_ptr *>())
+            {}
+
+#       ifdef _DEBUG
+            ~node()
+            {
+                assert( !m_bLinked || m_bUnlinked );
+            }
+#       endif
+
+            /// Constructs a node of height \p nHeight
+            void make_tower( unsigned int nHeight, atomic_marked_ptr * nextTower )
+            {
+                assert( nHeight > 0 );
+                assert( ( nHeight == 1 && nextTower == null_ptr<atomic_marked_ptr *>() )  // bottom-list node
+                    || ( nHeight > 1  && nextTower != null_ptr<atomic_marked_ptr *>() )   // node at level of more than 0
+                    );
+
+                m_arrNext = nextTower;
+                m_nHeight = nHeight;
+            }
+
+            atomic_marked_ptr * release_tower()
+            {
+                atomic_marked_ptr * pTower = m_arrNext;
+                m_arrNext = null_ptr<atomic_marked_ptr *>();
+                m_nHeight = 1;
+                return pTower;
+            }
+
+            atomic_marked_ptr * get_tower() const
+            {
+                return m_arrNext;
+            }
+
+            void clear_tower()
+            {
+                for ( unsigned int nLevel = 1; nLevel < m_nHeight; ++nLevel )
+                    next(nLevel).store( marked_ptr(), CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Access to element of next pointer array
+            atomic_marked_ptr& next( unsigned int nLevel )
+            {
+                assert( nLevel < height() );
+                assert( nLevel == 0 || (nLevel > 0 && m_arrNext != null_ptr<atomic_marked_ptr *>() ));
+
+                return nLevel ? m_arrNext[ nLevel - 1] : m_pNext;
+            }
+
+            /// Access to element of next pointer array (const version)
+            atomic_marked_ptr const& next( unsigned int nLevel ) const
+            {
+                assert( nLevel < height() );
+                assert( nLevel == 0 || nLevel > 0 && m_arrNext != null_ptr<atomic_marked_ptr *>() );
+
+                return nLevel ? m_arrNext[ nLevel - 1] : m_pNext;
+            }
+
+            /// Access to element of next pointer array (same as \ref next function)
+            atomic_marked_ptr& operator[]( unsigned int nLevel )
+            {
+                return next( nLevel );
+            }
+
+            /// Access to element of next pointer array (same as \ref next function)
+            atomic_marked_ptr const& operator[]( unsigned int nLevel ) const
+            {
+                return next( nLevel );
+            }
+
+            /// Height of the node
+            unsigned int height() const
+            {
+                return m_nHeight;
+            }
+
+            /// Clears internal links
+            void clear()
+            {
+                assert( m_arrNext == null_ptr<atomic_marked_ptr *>());
+                m_pNext.store( marked_ptr(), CDS_ATOMIC::memory_order_release );
+                m_pDelChain = null_ptr<node *>();
+            }
+
+            bool is_cleared() const
+            {
+                return m_pNext == atomic_marked_ptr()
+                    && m_arrNext == null_ptr<atomic_marked_ptr *>()
+                    && m_nHeight <= 1;
+            }
+        };
+    } // namespace skip_list
+    //@endcond
+
+    //@cond
+    namespace skip_list { namespace details {
+
+        template <class RCU, typename NodeTraits, typename BackOff, bool IsConst>
+        class iterator< cds::urcu::gc< RCU >, NodeTraits, BackOff, IsConst >
+        {
+        public:
+            typedef cds::urcu::gc< RCU >                gc;
+            typedef NodeTraits                          node_traits;
+            typedef BackOff                             back_off;
+            typedef typename node_traits::node_type     node_type;
+            typedef typename node_traits::value_type    value_type;
+            static bool const c_isConst = IsConst;
+
+            typedef typename std::conditional< c_isConst, value_type const &, value_type &>::type   value_ref;
+
+        protected:
+            typedef typename node_type::marked_ptr          marked_ptr;
+            typedef typename node_type::atomic_marked_ptr   atomic_marked_ptr;
+
+            node_type *             m_pNode;
+
+        protected:
+            void next()
+            {
+                // RCU should be locked before iterating!!!
+                assert( gc::is_locked() );
+
+                back_off bkoff;
+
+                for (;;) {
+                    if ( m_pNode->next( m_pNode->height() - 1 ).load( CDS_ATOMIC::memory_order_acquire ).bits() ) {
+                        // Current node is marked as deleted. So, its next pointer can point to anything
+                        // In this case we interrupt our iteration and returns end() iterator.
+                        *this = iterator();
+                        return;
+                    }
+
+                    marked_ptr p = m_pNode->next(0).load( CDS_ATOMIC::memory_order_relaxed );
+                    node_type * pp = p.ptr();
+                    if ( p.bits() ) {
+                        // p is marked as deleted. Spin waiting for physical removal
+                        bkoff();
+                        continue;
+                    }
+                    else if ( pp && pp->next( pp->height() - 1 ).load( CDS_ATOMIC::memory_order_relaxed ).bits() ) {
+                        // p is marked as deleted. Spin waiting for physical removal
+                        bkoff();
+                        continue;
+                    }
+
+                    m_pNode = pp;
+                    break;
+                }
+            }
+
+        public: // for internal use only!!!
+            iterator( node_type& refHead )
+                : m_pNode( null_ptr<node_type *>() )
+            {
+                // RCU should be locked before iterating!!!
+                assert( gc::is_locked() );
+
+                back_off bkoff;
+
+                for (;;) {
+                    marked_ptr p = refHead.next(0).load( CDS_ATOMIC::memory_order_relaxed );
+                    if ( !p.ptr() ) {
+                        // empty skip-list
+                        break;
+                    }
+
+                    node_type * pp = p.ptr();
+                    // Logically deleted node is marked from highest level
+                    if ( !pp->next( pp->height() - 1 ).load( CDS_ATOMIC::memory_order_acquire ).bits() ) {
+                        m_pNode = pp;
+                        break;
+                    }
+
+                    bkoff();
+                }
+            }
+
+        public:
+            iterator()
+                : m_pNode( null_ptr<node_type *>())
+            {
+                // RCU should be locked before iterating!!!
+                assert( gc::is_locked() );
+            }
+
+            iterator( iterator const& s)
+                : m_pNode( s.m_pNode )
+            {
+                // RCU should be locked before iterating!!!
+                assert( gc::is_locked() );
+            }
+
+            value_type * operator ->() const
+            {
+                assert( m_pNode != null_ptr< node_type *>() );
+                assert( node_traits::to_value_ptr( m_pNode ) != null_ptr<value_type *>() );
+
+                return node_traits::to_value_ptr( m_pNode );
+            }
+
+            value_ref operator *() const
+            {
+                assert( m_pNode != null_ptr< node_type *>() );
+                assert( node_traits::to_value_ptr( m_pNode ) != null_ptr<value_type *>() );
+
+                return *node_traits::to_value_ptr( m_pNode );
+            }
+
+            /// Pre-increment
+            iterator& operator ++()
+            {
+                next();
+                return *this;
+            }
+
+            iterator& operator = (const iterator& src)
+            {
+                m_pNode = src.m_pNode;
+                return *this;
+            }
+
+            template <typename Bkoff, bool C>
+            bool operator ==(iterator<gc, node_traits, Bkoff, C> const& i ) const
+            {
+                return m_pNode == i.m_pNode;
+            }
+            template <typename Bkoff, bool C>
+            bool operator !=(iterator<gc, node_traits, Bkoff, C> const& i ) const
+            {
+                return !( *this == i );
+            }
+        };
+    }}  // namespace skip_list::details
+    //@endcond
+
+    /// Lock-free skip-list set (template specialization for \ref cds_urcu_desc "RCU")
+    /** @ingroup cds_intrusive_map
+        @anchor cds_intrusive_SkipListSet_rcu
+
+        The implementation of well-known probabilistic data structure called skip-list
+        invented by W.Pugh in his papers:
+            - [1989] W.Pugh Skip Lists: A Probabilistic Alternative to Balanced Trees
+            - [1990] W.Pugh A Skip List Cookbook
+
+        A skip-list is a probabilistic data structure that provides expected logarithmic
+        time search without the need of rebalance. The skip-list is a collection of sorted
+        linked list. Nodes are ordered by key. Each node is linked into a subset of the lists.
+        Each list has a level, ranging from 0 to 32. The bottom-level list contains
+        all the nodes, and each higher-level list is a sublist of the lower-level lists.
+        Each node is created with a random top level (with a random height), and belongs
+        to all lists up to that level. The probability that a node has the height 1 is 1/2.
+        The probability that a node has the height N is 1/2 ** N (more precisely,
+        the distribution depends on an random generator provided, but our generators
+        have this property).
+
+        The lock-free variant of skip-list is implemented according to book
+            - [2008] M.Herlihy, N.Shavit "The Art of Multiprocessor Programming",
+                chapter 14.4 "A Lock-Free Concurrent Skiplist".
+        \note The algorithm described in this book cannot be directly adapted for C++ (roughly speaking,
+        the algo contains a lot of bugs). The \b libcds implementation applies the approach discovered
+        by M.Michael in his \ref cds_intrusive_MichaelList_hp "lock-free linked list".
+
+        <b>Template arguments</b>:
+            - \p RCU - one of \ref cds_urcu_gc "RCU type"
+            - \p T - type to be stored in the list. The type must be based on \p skip_list::node (for \p skip_list::base_hook)
+                or it must have a member of type \p skip_list::node (for \p skip_list::member_hook).
+            - \p Traits - type traits. See \p skip_list::type_traits (the default) for explanation.
+
+        It is possible to declare option-based list with \p cds::intrusive::skip_list::make_traits metafunction instead of \p Traits template
+        argument.
+        Template argument list \p Options of \p %cds::intrusive::skip_list::make_traits metafunction is:
+        - \p opt::hook - hook used. Possible values are: \p skip_list::base_hook, \p skip_list::member_hook, \p skip_list::traits_hook.
+            If the option is not specified, <tt>skip_list::base_hook<></tt> is used.
+        - \p opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the \p opt::less is used.
+        - \p opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - \p opt::disposer - the functor used for dispose removed items. Default is \p opt::v::empty_disposer. Due the nature
+            of GC schema the disposer may be called asynchronously.
+        - \p opt::item_counter - the type of item counting feature. Default is \p atomicity::empty_item_counter that is no item counting.
+        - \p opt::memory_model - C++ memory ordering model. Can be \p opt::v::relaxed_ordering (relaxed memory model, the default)
+            or \p opt::v::sequential_consistent (sequentially consisnent memory model).
+        - \p skip_list::random_level_generator - random level generator. Can be \p skip_list::xorshift, \p skip_list::turbo_pascal or
+            user-provided one. See \p skip_list::random_level_generator option description for explanation.
+            Default is \p %skip_list::turbo_pascal.
+        - \p opt::allocator - although the skip-list is an intrusive container,
+            an allocator should be provided to maintain variable randomly-calculated height of the node
+            since the node can contain up to 32 next pointers. The allocator option is used to allocate an array of next pointers
+            for nodes which height is more than 1. Default is \ref CDS_DEFAULT_ALLOCATOR.
+        - \p opt::back_off - back-off strategy used. If the option is not specified, the \p cds::backoff::Default is used.
+        - \p opt::stat - internal statistics. Available types: \p skip_list::stat, \p skip_list::empty_stat (the default)
+        - \p opt::rcu_check_deadlock - a deadlock checking policy. Default is \p opt::v::rcu_throw_deadlock
+
+        @note Before including <tt><cds/intrusive/skip_list_rcu.h></tt> you should include appropriate RCU header file,
+        see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+
+        <b>Iterators</b>
+
+        The class supports a forward iterator (\ref iterator and \ref const_iterator).
+        The iteration is ordered.
+
+        You may iterate over skip-list set items only under RCU lock.
+        Only in this case the iterator is thread-safe since
+        while RCU is locked any set's item cannot be reclaimed.
+
+        @note The requirement of RCU lock during iterating means that any type of modification of the skip list
+        (i.e. inserting, erasing and so on) is not possible.
+
+        @warning The iterator object cannot be passed between threads.
+
+        Example how to use skip-list set iterators:
+        \code
+        // First, you should include the header for RCU type you have chosen
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/intrusive/skip_list_rcu.h>
+
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        struct Foo {
+            // ...
+        };
+
+        // Traits for your skip-list.
+        // At least, you should define cds::opt::less or cds::opt::compare for Foo struct
+        struct my_traits: public cds::intrusive::skip_list::type_traits
+        {
+            // ...
+        };
+        typedef cds::intrusive::SkipListSet< rcu_type, Foo, my_traits > my_skiplist_set;
+
+        my_skiplist_set theSet;
+
+        // ...
+
+        // Begin iteration
+        {
+            // Apply RCU locking manually
+            typename rcu_type::scoped_lock sl;
+
+            for ( auto it = theList.begin(); it != theList.end(); ++it ) {
+                // ...
+            }
+
+            // rcu_type::scoped_lock destructor releases RCU lock implicitly
+        }
+        \endcode
+
+        The iterator class supports the following minimalistic interface:
+        \code
+        struct iterator {
+            // Default ctor
+            iterator();
+
+            // Copy ctor
+            iterator( iterator const& s);
+
+            value_type * operator ->() const;
+            value_type& operator *() const;
+
+            // Pre-increment
+            iterator& operator ++();
+
+            // Copy assignment
+            iterator& operator = (const iterator& src);
+
+            bool operator ==(iterator const& i ) const;
+            bool operator !=(iterator const& i ) const;
+        };
+        \endcode
+        Note, the iterator object returned by \ref end, \p cend member functions points to \p NULL and should not be dereferenced.
+
+        <b>How to use</b>
+
+        You should incorporate skip_list::node into your struct \p T and provide
+        appropriate skip_list::type_traits::hook in your \p Traits template parameters. Usually, for \p Traits you
+        define a struct based on \p skip_list::type_traits.
+
+        Example for <tt>cds::urcu::general_buffered<></tt> RCU and base hook:
+        \code
+        // First, you should include the header for RCU type you have chosen
+        #include <cds/urcu/general_buffered.h>
+
+        // Include RCU skip-list specialization
+        #include <cds/intrusive/skip_list_rcu.h>
+
+        // RCU type typedef
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        // Data stored in skip list
+        struct my_data: public cds::intrusive::skip_list::node< rcu_type >
+        {
+            // key field
+            std::string     strKey;
+
+            // other data
+            // ...
+        };
+
+        // my_data compare functor
+        struct my_data_cmp {
+            int operator()( const my_data& d1, const my_data& d2 )
+            {
+                return d1.strKey.compare( d2.strKey );
+            }
+
+            int operator()( const my_data& d, const std::string& s )
+            {
+                return d.strKey.compare(s);
+            }
+
+            int operator()( const std::string& s, const my_data& d )
+            {
+                return s.compare( d.strKey );
+            }
+        };
+
+
+        // Declare type_traits
+        struct my_traits: public cds::intrusive::skip_list::type_traits
+        {
+            typedef cds::intrusive::skip_list::base_hook< cds::opt::gc< rcu_type > >   hook;
+            typedef my_data_cmp compare;
+        };
+
+        // Declare skip-list set type
+        typedef cds::intrusive::SkipListSet< rcu_type, my_data, my_traits >     traits_based_set;
+        \endcode
+
+        Equivalent option-based code:
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/intrusive/skip_list_rcu.h>
+
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        struct my_data {
+            // see above
+        };
+        struct compare {
+            // see above
+        };
+
+        // Declare option-based skip-list set
+        typedef cds::intrusive::SkipListSet< rcu_type
+            ,my_data
+            , typename cds::intrusive::skip_list::make_traits<
+                cds::intrusive::opt::hook< cds::intrusive::skip_list::base_hook< cds::opt::gc< rcu_type > > >
+                ,cds::intrusive::opt::compare< my_data_cmp >
+            >::type
+        > option_based_set;
+
+        \endcode
+    */
+    template <
+        class RCU
+       ,typename T
+#ifdef CDS_DOXYGEN_INVOKED
+       ,typename Traits = skip_list::type_traits
+#else
+       ,typename Traits
+#endif
+    >
+    class SkipListSet< cds::urcu::gc< RCU >, T, Traits >
+    {
+    public:
+        typedef T       value_type      ;   ///< type of value stored in the skip-list
+        typedef Traits  options         ;   ///< Traits template parameter
+
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined key_comparator  ;    ///< key comparison functor based on opt::compare and opt::less option setter.
+#   else
+        typedef typename opt::details::make_comparator< value_type, options >::type key_comparator;
+#   endif
+
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+
+        typedef cds::urcu::gc< RCU >            gc          ;   ///< Garbage collector
+        typedef typename options::item_counter  item_counter;   ///< Item counting policy used
+        typedef typename options::memory_model  memory_model;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::random_level_generator    random_level_generator  ;   ///< random level generator
+        typedef typename options::allocator     allocator_type  ;   ///< allocator for maintaining array of next pointers of the node
+        typedef typename options::back_off      back_off    ;   ///< Back-off trategy
+        typedef typename options::stat          stat        ;   ///< internal statistics type
+        typedef typename options::rcu_check_deadlock    rcu_check_deadlock ; ///< Deadlock checking policy
+        typedef typename gc::scoped_lock        rcu_lock    ;   ///< RCU scoped lock
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = false; ///< Group of \p extract_xxx functions does not require external locking
+
+
+        /// Max node height. The actual node height should be in range <tt>[0 .. c_nMaxHeight)</tt>
+        /**
+            The max height is specified by \ref skip_list::random_level_generator "random level generator" constant \p m_nUpperBound
+            but it should be no more than 32 (\ref skip_list::c_nHeightLimit).
+        */
+        static unsigned int const c_nMaxHeight = std::conditional<
+            (random_level_generator::c_nUpperBound <= skip_list::c_nHeightLimit),
+            std::integral_constant< unsigned int, random_level_generator::c_nUpperBound >,
+            std::integral_constant< unsigned int, skip_list::c_nHeightLimit >
+        >::type::value;
+
+        //@cond
+        static unsigned int const c_nMinHeight = 5;
+        //@endcond
+
+    protected:
+        typedef typename node_type::atomic_marked_ptr   atomic_node_ptr ;   ///< Atomic marked node pointer
+        typedef typename node_type::marked_ptr          marked_node_ptr ;   ///< Node marked pointer
+
+    protected:
+        //@cond
+        typedef skip_list::details::intrusive_node_builder< node_type, atomic_node_ptr, allocator_type > intrusive_node_builder;
+
+        typedef typename std::conditional<
+            std::is_same< typename options::internal_node_builder, cds::opt::none >::value
+            ,intrusive_node_builder
+            ,typename options::internal_node_builder
+        >::type node_builder;
+
+        typedef std::unique_ptr< node_type, typename node_builder::node_disposer >    scoped_node_ptr;
+
+        struct position {
+            node_type *   pPrev[ c_nMaxHeight ];
+            node_type *   pSucc[ c_nMaxHeight ];
+            node_type *   pNext[ c_nMaxHeight ];
+
+            node_type *   pCur;
+            node_type *   pDelChain;
+
+            position()
+                : pDelChain( null_ptr<node_type *>())
+            {}
+#       ifdef _DEBUG
+            ~position()
+            {
+                assert( pDelChain == null_ptr<node_type *>());
+            }
+#       endif
+        };
+
+        typedef cds::urcu::details::check_deadlock_policy< gc, rcu_check_deadlock>   check_deadlock_policy;
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor {
+            void operator()( value_type& )
+            {}
+        };
+
+        struct empty_erase_functor  {
+            void operator()( value_type const& )
+            {}
+        };
+
+        struct empty_find_functor {
+            template <typename Q>
+            void operator()( value_type& item, Q& val )
+            {}
+        };
+
+        struct get_functor {
+            value_type *    pFound;
+
+            template <typename Q>
+            void operator()( value_type& item, Q& val )
+            {
+                pFound = &item;
+            }
+        };
+
+        template <typename Func>
+        struct insert_at_ensure_functor {
+            Func m_func;
+            insert_at_ensure_functor( Func f ) : m_func(f) {}
+
+            void operator()( value_type& item )
+            {
+                cds::unref( m_func)( true, item, item );
+            }
+        };
+
+        struct copy_value_functor {
+            template <typename Q>
+            void operator()( Q& dest, value_type const& src ) const
+            {
+                dest = src;
+            }
+        };
+
+#   endif // ifndef CDS_CXX11_LAMBDA_SUPPORT
+
+        //@endcond
+
+    protected:
+        skip_list::details::head_node< node_type >      m_Head  ;   ///< head tower (max height)
+
+        item_counter                m_ItemCounter       ;   ///< item counter
+        random_level_generator      m_RandomLevelGen    ;   ///< random level generator instance
+        CDS_ATOMIC::atomic<unsigned int>    m_nHeight   ;   ///< estimated high level
+        CDS_ATOMIC::atomic<node_type *>     m_pDeferredDelChain ;   ///< Deferred deleted node chain
+        mutable stat                m_Stat              ;   ///< internal statistics
+
+    protected:
+        //@cond
+        unsigned int random_level()
+        {
+            // Random generator produces a number from range [0..31]
+            // We need a number from range [1..32]
+            return m_RandomLevelGen() + 1;
+        }
+
+        template <typename Q>
+        node_type * build_node( Q v )
+        {
+            return node_builder::make_tower( v, m_RandomLevelGen );
+        }
+
+        static void dispose_node( value_type * pVal )
+        {
+            assert( pVal != NULL );
+
+            typename node_builder::node_disposer()( node_traits::to_node_ptr(pVal) );
+            disposer()( pVal );
+        }
+
+        struct node_disposer
+        {
+            void operator()( value_type * pVal )
+            {
+                dispose_node( pVal );
+            }
+        };
+        //@endcond
+
+    public:
+        typedef cds::urcu::exempt_ptr< gc, value_type, value_type, node_disposer, void > exempt_ptr ; ///< pointer to extracted node
+
+    protected:
+        //@cond
+
+        bool is_extracted( marked_node_ptr const p ) const
+        {
+            return (p.bits() & 2) != 0;
+        }
+
+        template <typename Q, typename Compare >
+        bool find_position( Q const& val, position& pos, Compare cmp, bool bStopIfFound )
+        {
+            assert( gc::is_locked() );
+
+            node_type * pPred;
+            marked_node_ptr pSucc;
+            marked_node_ptr pCur;
+            int nCmp = 1;
+
+        retry:
+            pPred = m_Head.head();
+
+            for ( int nLevel = static_cast<int>(c_nMaxHeight - 1); nLevel >= 0; --nLevel ) {
+
+                while ( true ) {
+                    pCur = pPred->next( nLevel ).load( memory_model::memory_order_relaxed );
+                    if ( pCur.bits() ) {
+                        // pCur.bits() means that pPred is logically deleted
+                        goto retry;
+                    }
+
+                    if ( pCur.ptr() == null_ptr<node_type *>()) {
+                        // end of the list at level nLevel - goto next level
+                        break;
+                    }
+
+                    // pSucc contains deletion mark for pCur
+                    pSucc = pCur->next( nLevel ).load( memory_model::memory_order_relaxed );
+
+                    if ( pPred->next( nLevel ).load( memory_model::memory_order_relaxed ).all() != pCur.ptr() )
+                        goto retry;
+
+                    if ( pSucc.bits() ) {
+                        // pCur is marked, i.e. logically deleted.
+                        marked_node_ptr p( pCur.ptr() );
+                        if ( pPred->next( nLevel ).compare_exchange_strong( p, marked_node_ptr( pSucc.ptr() ),
+                             memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                        {
+                            if ( nLevel == 0 ) {
+#                       ifdef _DEBUG
+                                pCur->m_bUnlinked = true;
+#                       endif
+
+                                if ( !is_extracted( pSucc )) {
+                                    // We cannot free the node at this moment since RCU is locked
+                                    // Link deleted nodes to a chain to free later
+                                    link_for_remove( pos, pCur.ptr() );
+                                    m_Stat.onEraseWhileFind();
+                                }
+                                else {
+                                    m_Stat.onExtractWhileFind();
+                                }
+                            }
+                        }
+                        goto retry;
+                    }
+                    else {
+                        nCmp = cmp( *node_traits::to_value_ptr( pCur.ptr()), val );
+                        if ( nCmp < 0 )
+                            pPred = pCur.ptr();
+                        else if ( nCmp == 0 && bStopIfFound )
+                            goto found;
+                        else
+                            break;
+                    }
+                }
+
+                // Next level
+                pos.pPrev[ nLevel ] = pPred;
+                pos.pSucc[ nLevel ] = pCur.ptr();
+            }
+
+            if ( nCmp != 0 )
+                return false;
+
+        found:
+            pos.pCur = pCur.ptr();
+            return pCur.ptr() && nCmp == 0;
+        }
+
+        bool find_min_position( position& pos )
+        {
+            assert( gc::is_locked() );
+
+            node_type * pPred;
+            marked_node_ptr pSucc;
+            marked_node_ptr pCur;
+
+        retry:
+            pPred = m_Head.head();
+
+            for ( int nLevel = static_cast<int>(c_nMaxHeight - 1); nLevel >= 0; --nLevel ) {
+
+                pCur = pPred->next( nLevel ).load( memory_model::memory_order_relaxed );
+                // pCur.bits() means that pPred is logically deleted
+                // head cannot be deleted
+                assert( pCur.bits() == 0 );
+
+                if ( pCur.ptr() ) {
+
+                    // pSucc contains deletion mark for pCur
+                    pSucc = pCur->next( nLevel ).load( memory_model::memory_order_relaxed );
+
+                    if ( pPred->next( nLevel ).load( memory_model::memory_order_relaxed ).all() != pCur.ptr() )
+                        goto retry;
+
+                    if ( pSucc.bits() ) {
+                        // pCur is marked, i.e. logically deleted.
+                        marked_node_ptr p( pCur.ptr() );
+                        if ( pPred->next( nLevel ).compare_exchange_strong( p, marked_node_ptr( pSucc.ptr() ),
+                            memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                        {
+                            if ( nLevel == 0 ) {
+#                       ifdef _DEBUG
+                                pCur->m_bUnlinked = true;
+#                       endif
+
+                                if ( !is_extracted( pSucc )) {
+                                    // We cannot free the node at this moment since RCU is locked
+                                    // Link deleted nodes to a chain to free later
+                                    link_for_remove( pos, pCur.ptr() );
+                                    m_Stat.onEraseWhileFind();
+                                }
+                                else {
+                                    m_Stat.onExtractWhileFind();
+                                }
+                            }
+                        }
+                        goto retry;
+                    }
+                }
+
+                // Next level
+                pos.pPrev[ nLevel ] = pPred;
+                pos.pSucc[ nLevel ] = pCur.ptr();
+            }
+            return (pos.pCur = pCur.ptr()) != null_ptr<node_type *>();
+        }
+
+        bool find_max_position( position& pos )
+        {
+            assert( gc::is_locked() );
+
+            node_type * pPred;
+            marked_node_ptr pSucc;
+            marked_node_ptr pCur;
+
+retry:
+            pPred = m_Head.head();
+
+            for ( int nLevel = static_cast<int>(c_nMaxHeight - 1); nLevel >= 0; --nLevel ) {
+
+                while ( true ) {
+                    pCur = pPred->next( nLevel ).load( memory_model::memory_order_relaxed );
+                    if ( pCur.bits() ) {
+                        // pCur.bits() means that pPred is logically deleted
+                        goto retry;
+                    }
+
+                    if ( pCur.ptr() == null_ptr<node_type *>()) {
+                        // end of the list at level nLevel - goto next level
+                        break;
+                    }
+
+                    // pSucc contains deletion mark for pCur
+                    pSucc = pCur->next( nLevel ).load( memory_model::memory_order_relaxed );
+
+                    if ( pPred->next( nLevel ).load( memory_model::memory_order_relaxed ).all() != pCur.ptr() )
+                        goto retry;
+
+                    if ( pSucc.bits() ) {
+                        // pCur is marked, i.e. logically deleted.
+                        marked_node_ptr p( pCur.ptr() );
+                        if ( pPred->next( nLevel ).compare_exchange_strong( p, marked_node_ptr( pSucc.ptr() ),
+                            memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                        {
+                            if ( nLevel == 0 ) {
+#                       ifdef _DEBUG
+                                pCur->m_bUnlinked = true;
+#                       endif
+
+                                if ( !is_extracted( pSucc )) {
+                                    // We cannot free the node at this moment since RCU is locked
+                                    // Link deleted nodes to a chain to free later
+                                    link_for_remove( pos, pCur.ptr() );
+                                    m_Stat.onEraseWhileFind();
+                                }
+                                else {
+                                    m_Stat.onExtractWhileFind();
+                                }
+                            }
+                        }
+                        goto retry;
+                    }
+                    else {
+                        if ( !pSucc.ptr() )
+                            break;
+
+                        pPred = pCur.ptr();
+                    }
+                }
+
+                // Next level
+                pos.pPrev[ nLevel ] = pPred;
+                pos.pSucc[ nLevel ] = pCur.ptr();
+            }
+
+            return (pos.pCur = pCur.ptr()) != null_ptr<node_type *>();
+        }
+
+        template <typename Func>
+        bool insert_at_position( value_type& val, node_type * pNode, position& pos, Func f )
+        {
+            assert( gc::is_locked() );
+
+            unsigned int nHeight = pNode->height();
+            pNode->clear_tower();
+
+            {
+                marked_node_ptr p( pos.pSucc[0] );
+                pNode->next( 0 ).store( p, memory_model::memory_order_release );
+                if ( !pos.pPrev[0]->next(0).compare_exchange_strong( p, marked_node_ptr(pNode), memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) {
+                    return false;
+                }
+#       ifdef _DEBUG
+                pNode->m_bLinked = true;
+#       endif
+                cds::unref( f )( val );
+            }
+
+            for ( unsigned int nLevel = 1; nLevel < nHeight; ++nLevel ) {
+                marked_node_ptr p;
+                while ( true ) {
+                    marked_node_ptr q( pos.pSucc[ nLevel ]);
+                    if ( !pNode->next( nLevel ).compare_exchange_strong( p, q, memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed )) {
+                        // pNode has been marked as removed while we are inserting it
+                        // Stop inserting
+                        assert( p.bits() );
+                        m_Stat.onLogicDeleteWhileInsert();
+                        return true;
+                    }
+                    p = q;
+                    if ( pos.pPrev[nLevel]->next(nLevel).compare_exchange_strong( q, marked_node_ptr( pNode ), memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) )
+                        break;
+
+                    // Renew insert position
+                    m_Stat.onRenewInsertPosition();
+                    if ( !find_position( val, pos, key_comparator(), false )) {
+                        // The node has been deleted while we are inserting it
+                        m_Stat.onNotFoundWhileInsert();
+                        return true;
+                    }
+                }
+            }
+            return true;
+        }
+
+        static void link_for_remove( position& pos, node_type * pDel )
+        {
+            assert( pDel->m_pDelChain == null_ptr<node_type *>() );
+
+            pDel->m_pDelChain = pos.pDelChain;
+            pos.pDelChain = pDel;
+        }
+
+        template <typename Func>
+        bool try_remove_at( node_type * pDel, position& pos, Func f, bool bExtract )
+        {
+            assert( pDel != null_ptr<node_type *>());
+            assert( gc::is_locked() );
+
+            marked_node_ptr pSucc;
+
+            // logical deletion (marking)
+            for ( unsigned int nLevel = pDel->height() - 1; nLevel > 0; --nLevel ) {
+                pSucc = pDel->next(nLevel).load( memory_model::memory_order_relaxed );
+                while ( true ) {
+                    if ( pSucc.bits()
+                      || pDel->next(nLevel).compare_exchange_weak( pSucc, pSucc | 1, memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                    {
+                        break;
+                    }
+                }
+            }
+
+            pSucc = pDel->next(0).load( memory_model::memory_order_relaxed );
+            while ( true ) {
+                if ( pSucc.bits() )
+                    return false;
+
+                int const nMask = bExtract ? 3 : 1;
+                if ( pDel->next(0).compare_exchange_strong( pSucc, pSucc | nMask, memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed ))
+                {
+                    cds::unref(f)( *node_traits::to_value_ptr( pDel ));
+
+                    // physical deletion
+                    // try fast erase
+                    pSucc = pDel;
+                    for ( int nLevel = static_cast<int>( pDel->height() - 1 ); nLevel >= 0; --nLevel ) {
+                        if ( !pos.pPrev[nLevel]->next(nLevel).compare_exchange_strong( pSucc,
+                            marked_node_ptr( pDel->next(nLevel).load(memory_model::memory_order_relaxed).ptr() ),
+                            memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed) )
+                        {
+                            // Do slow erase
+                            find_position( *node_traits::to_value_ptr(pDel), pos, key_comparator(), false );
+                            if ( bExtract )
+                                m_Stat.onSlowExtract();
+                            else
+                                m_Stat.onSlowErase();
+#                        ifdef _DEBUG
+                            assert( pDel->m_bUnlinked );
+#                        endif
+                            return true;
+                        }
+                    }
+
+#               ifdef _DEBUG
+                    pDel->m_bUnlinked = true;
+#               endif
+                    if ( !bExtract ) {
+                        // We cannot free the node at this moment since RCU is locked
+                        // Link deleted nodes to a chain to free later
+                        link_for_remove( pos, pDel );
+                        m_Stat.onFastErase();
+                    }
+                    else
+                        m_Stat.onFastExtract();
+
+                    return true;
+                }
+            }
+        }
+
+        enum finsd_fastpath_result {
+            find_fastpath_found,
+            find_fastpath_not_found,
+            find_fastpath_abort
+        };
+        template <typename Q, typename Compare, typename Func>
+        finsd_fastpath_result find_fastpath( Q& val, Compare cmp, Func f ) const
+        {
+            node_type * pPred;
+            marked_node_ptr pCur;
+            marked_node_ptr pSucc;
+            marked_node_ptr pNull;
+
+            back_off bkoff;
+
+            pPred = m_Head.head();
+            for ( int nLevel = static_cast<int>(m_nHeight.load(memory_model::memory_order_relaxed) - 1); nLevel >= 0; --nLevel ) {
+                pCur = pPred->next(nLevel).load( memory_model::memory_order_acquire );
+                if ( pCur == pNull )
+                    continue;
+
+                while ( pCur != pNull ) {
+                    if ( pCur.bits() ) {
+                        // Wait until pCur is removed
+                        unsigned int nAttempt = 0;
+                        while ( pCur.bits() && nAttempt++ < 16 ) {
+                            bkoff();
+                            pCur = pPred->next(nLevel).load( memory_model::memory_order_acquire );
+                        }
+                        bkoff.reset();
+
+                        if ( pCur.bits() ) {
+                            // Maybe, we are on deleted node sequence
+                            // Abort searching, try slow-path
+                            return find_fastpath_abort;
+                        }
+                    }
+
+                    if ( pCur.ptr() ) {
+                        int nCmp = cmp( *node_traits::to_value_ptr( pCur.ptr() ), val );
+                        if ( nCmp < 0 ) {
+                            pPred = pCur.ptr();
+                            pCur = pCur->next(nLevel).load( memory_model::memory_order_acquire );
+                        }
+                        else if ( nCmp == 0 ) {
+                            // found
+                            cds::unref(f)( *node_traits::to_value_ptr( pCur.ptr() ), val );
+                            return find_fastpath_found;
+                        }
+                        else // pCur > val - go down
+                            break;
+                    }
+                }
+            }
+
+            return find_fastpath_not_found;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_slowpath( Q& val, Compare cmp, Func f, position& pos )
+        {
+            if ( find_position( val, pos, cmp, true )) {
+                assert( cmp( *node_traits::to_value_ptr( pos.pCur ), val ) == 0 );
+
+                cds::unref(f)( *node_traits::to_value_ptr( pos.pCur ), val );
+                return true;
+            }
+            else
+                return false;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool do_find_with( Q& val, Compare cmp, Func f )
+        {
+            position pos;
+            bool bRet;
+
+            rcu_lock l;
+
+            switch ( find_fastpath( val, cmp, f )) {
+            case find_fastpath_found:
+                m_Stat.onFindFastSuccess();
+                return true;
+            case find_fastpath_not_found:
+                m_Stat.onFindFastFailed();
+                return false;
+            default:
+                break;
+            }
+
+            if ( find_slowpath( val, cmp, f, pos )) {
+                m_Stat.onFindSlowSuccess();
+                bRet = true;
+            }
+            else {
+                m_Stat.onFindSlowFailed();
+                bRet = false;
+            }
+
+            defer_chain( pos );
+
+            return bRet;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool do_erase( Q const& val, Compare cmp, Func f )
+        {
+            check_deadlock_policy::check();
+
+            position pos;
+            bool bRet;
+
+            {
+                rcu_lock rcuLock;
+
+                if ( !find_position( val, pos, cmp, false ) ) {
+                    m_Stat.onEraseFailed();
+                    bRet = false;
+                }
+                else {
+                    node_type * pDel = pos.pCur;
+                    assert( cmp( *node_traits::to_value_ptr( pDel ), val ) == 0 );
+
+                    unsigned int nHeight = pDel->height();
+                    if ( try_remove_at( pDel, pos, f, false )) {
+                        --m_ItemCounter;
+                        m_Stat.onRemoveNode( nHeight );
+                        m_Stat.onEraseSuccess();
+                        bRet = true;
+                    }
+                    else {
+                        m_Stat.onEraseFailed();
+                        bRet = false;
+                    }
+                }
+            }
+
+            dispose_chain( pos );
+            return bRet;
+        }
+
+        template <typename Q, typename Compare>
+        value_type * do_extract_key( Q const& key, Compare cmp )
+        {
+            // RCU should be locked!!!
+            assert( gc::is_locked() );
+
+            position pos;
+            node_type * pDel;
+
+            if ( !find_position( key, pos, cmp, false ) ) {
+                m_Stat.onExtractFailed();
+                pDel = null_ptr<node_type *>();
+            }
+            else {
+                pDel = pos.pCur;
+                assert( cmp( *node_traits::to_value_ptr( pDel ), key ) == 0 );
+
+                unsigned int const nHeight = pDel->height();
+
+                if ( try_remove_at( pDel, pos,
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                    [](value_type const&) {}
+#       else
+                    empty_erase_functor()
+#       endif
+                    , true ))
+                {
+                    --m_ItemCounter;
+                    m_Stat.onRemoveNode( nHeight );
+                    m_Stat.onExtractSuccess();
+                }
+                else {
+                    m_Stat.onExtractFailed();
+                    pDel = null_ptr<node_type *>();
+                }
+            }
+
+            defer_chain( pos );
+            return pDel ? node_traits::to_value_ptr(pDel) : null_ptr<value_type *>();
+        }
+
+        template <typename ExemptPtr, typename Q>
+        bool do_extract( ExemptPtr& result, Q const& key )
+        {
+            check_deadlock_policy::check();
+
+            bool bReturn;
+            {
+                rcu_lock l;
+                value_type * pDel = do_extract_key( key, key_comparator() );
+                bReturn = pDel != null_ptr<value_type *>();
+                if ( bReturn )
+                    result = pDel;
+            }
+
+            dispose_deferred();
+            return bReturn;
+        }
+
+        template <typename ExemptPtr, typename Q, typename Less>
+        bool do_extract_with( ExemptPtr& result, Q const& key, Less pred )
+        {
+            check_deadlock_policy::check();
+
+            bool bReturn;
+            {
+                rcu_lock l;
+                value_type * pDel = do_extract_key( key, cds::opt::details::make_comparator_from_less<Less>() );
+                bReturn = pDel != null_ptr<value_type *>();
+                if ( bReturn )
+                    result = pDel;
+            }
+
+            dispose_deferred();
+            return bReturn;
+        }
+
+        node_type * do_extract_min()
+        {
+            assert( gc::is_locked() );
+
+            position pos;
+            node_type * pDel;
+
+            if ( !find_min_position( pos ) ) {
+                m_Stat.onExtractMinFailed();
+                pDel = null_ptr<node_type *>();
+            }
+            else {
+                pDel = pos.pCur;
+                unsigned int const nHeight = pDel->height();
+
+                if ( try_remove_at( pDel, pos,
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                    [](value_type const&) {}
+#       else
+                    empty_erase_functor()
+#       endif
+                    , true ))
+                {
+                    --m_ItemCounter;
+                    m_Stat.onRemoveNode( nHeight );
+                    m_Stat.onExtractMinSuccess();
+                }
+                else {
+                    m_Stat.onExtractMinFailed();
+                    pDel = null_ptr<node_type *>();
+                }
+            }
+
+            defer_chain( pos );
+            return pDel;
+        }
+
+        template <typename ExemptPtr>
+        bool do_extract_min( ExemptPtr& result )
+        {
+            check_deadlock_policy::check();
+
+            bool bReturn;
+            {
+                rcu_lock l;
+                node_type * pDel = do_extract_min();
+                bReturn = pDel != null_ptr<node_type *>();
+                if ( bReturn )
+                    result = node_traits::to_value_ptr(pDel);
+            }
+
+            dispose_deferred();
+            return bReturn;
+        }
+
+        node_type * do_extract_max()
+        {
+            assert( gc::is_locked() );
+
+            position pos;
+            node_type * pDel;
+
+            if ( !find_max_position( pos ) ) {
+                m_Stat.onExtractMaxFailed();
+                pDel = null_ptr<node_type *>();
+            }
+            else {
+                pDel = pos.pCur;
+                unsigned int const nHeight = pDel->height();
+
+                if ( try_remove_at( pDel, pos,
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                    [](value_type const&) {}
+#       else
+                    empty_erase_functor()
+#       endif
+                    , true ))
+                {
+                    --m_ItemCounter;
+                    m_Stat.onRemoveNode( nHeight );
+                    m_Stat.onExtractMaxSuccess();
+                }
+                else {
+                    m_Stat.onExtractMaxFailed();
+                    pDel = null_ptr<node_type *>();
+                }
+            }
+
+            defer_chain( pos );
+            return pDel;
+        }
+
+        template <typename ExemptPtr>
+        bool do_extract_max( ExemptPtr& result )
+        {
+            check_deadlock_policy::check();
+
+            bool bReturn;
+            {
+                rcu_lock l;
+                node_type * pDel = do_extract_max();
+                bReturn = pDel != null_ptr<node_type *>();
+                if ( bReturn )
+                    result = node_traits::to_value_ptr(pDel);
+            }
+
+            dispose_deferred();
+            return bReturn;
+        }
+
+        void increase_height( unsigned int nHeight )
+        {
+            unsigned int nCur = m_nHeight.load( memory_model::memory_order_relaxed );
+            if ( nCur < nHeight )
+                m_nHeight.compare_exchange_strong( nCur, nHeight, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        class deferred_list_iterator
+        {
+            node_type * pCur;
+        public:
+            explicit deferred_list_iterator( node_type * p )
+                : pCur(p)
+            {}
+            deferred_list_iterator()
+                : pCur( null_ptr<node_type *>())
+            {}
+
+            cds::urcu::retired_ptr operator *() const
+            {
+                return cds::urcu::retired_ptr( node_traits::to_value_ptr(pCur), dispose_node );
+            }
+
+            void operator ++()
+            {
+                pCur = pCur->m_pDelChain;
+            }
+
+            bool operator ==( deferred_list_iterator const& i ) const
+            {
+                return pCur == i.pCur;
+            }
+            bool operator !=( deferred_list_iterator const& i ) const
+            {
+                return !operator ==( i );
+            }
+        };
+
+        void dispose_chain( node_type * pHead )
+        {
+            // RCU should NOT be locked
+            check_deadlock_policy::check();
+
+            gc::batch_retire( deferred_list_iterator( pHead ), deferred_list_iterator() );
+        }
+
+        void dispose_chain( position& pos )
+        {
+            // RCU should NOT be locked
+            check_deadlock_policy::check();
+
+            // Delete local chain
+            if ( pos.pDelChain ) {
+                dispose_chain( pos.pDelChain );
+                pos.pDelChain = null_ptr<node_type *>();
+            }
+
+            // Delete deferred chain
+            dispose_deferred();
+        }
+
+        void dispose_deferred()
+        {
+            dispose_chain( m_pDeferredDelChain.exchange( null_ptr<node_type *>(), memory_model::memory_order_acq_rel ));
+        }
+
+        void defer_chain( position& pos )
+        {
+            if ( pos.pDelChain ) {
+                node_type * pHead = pos.pDelChain;
+                node_type * pTail = pHead;
+                while ( pTail->m_pDelChain )
+                    pTail = pTail->m_pDelChain;
+
+                node_type * pDeferList = m_pDeferredDelChain.load( memory_model::memory_order_relaxed );
+                do {
+                    pTail->m_pDelChain = pDeferList;
+                } while ( !m_pDeferredDelChain.compare_exchange_weak( pDeferList, pHead, memory_model::memory_order_acq_rel, CDS_ATOMIC::memory_order_relaxed ));
+
+                pos.pDelChain = null_ptr<node_type *>();
+            }
+        }
+
+        //@endcond
+
+    public:
+        /// Default constructor
+        SkipListSet()
+            : m_Head( c_nMaxHeight )
+            , m_nHeight( c_nMinHeight )
+            , m_pDeferredDelChain( null_ptr<node_type *>() )
+        {
+            static_assert( (std::is_same< gc, typename node_type::gc >::value), "GC and node_type::gc must be the same type" );
+
+            // Barrier for head node
+            CDS_ATOMIC::atomic_thread_fence( memory_model::memory_order_release );
+        }
+
+        /// Clears and destructs the skip-list
+        ~SkipListSet()
+        {
+            clear();
+        }
+
+    public:
+        /// Iterator type
+        typedef skip_list::details::iterator< gc, node_traits, back_off, false >  iterator;
+
+        /// Const iterator type
+        typedef skip_list::details::iterator< gc, node_traits, back_off, true >   const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a set
+        iterator begin()
+        {
+            return iterator( *m_Head.head() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        const_iterator begin() const
+        {
+            return const_iterator( *m_Head.head() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a set
+        const_iterator cbegin()
+        {
+            return const_iterator( *m_Head.head() );
+        }
+
+        /// Returns a forward iterator that addresses the location succeeding the last element in a set.
+        iterator end()
+        {
+            return iterator();
+        }
+
+        /// Returns a forward const iterator that addresses the location succeeding the last element in a set.
+        const_iterator end() const
+        {
+            return const_iterator();
+        }
+
+        /// Returns a forward const iterator that addresses the location succeeding the last element in a set.
+        const_iterator cend()
+        {
+            return const_iterator();
+        }
+
+    public:
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            The function applies RCU lock internally.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert( val, []( value_type& ) {} );
+#       else
+            return insert( val, empty_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success and may be passed by reference
+            using <tt>boost::ref</tt>
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            check_deadlock_policy::check();
+
+            position pos;
+            bool bRet;
+
+            {
+                node_type * pNode = node_traits::to_node_ptr( val );
+                scoped_node_ptr scp( pNode );
+                unsigned int nHeight = pNode->height();
+                bool bTowerOk = nHeight > 1 && pNode->get_tower() != null_ptr<atomic_node_ptr *>();
+                bool bTowerMade = false;
+
+                rcu_lock rcuLock;
+
+                while ( true )
+                {
+                    bool bFound = find_position( val, pos, key_comparator(), true );
+                    if ( bFound ) {
+                        // scoped_node_ptr deletes the node tower if we create it
+                        if ( !bTowerMade )
+                            scp.release();
+
+                        m_Stat.onInsertFailed();
+                        bRet = false;
+                        break;
+                    }
+
+                    if ( !bTowerOk ) {
+                        build_node( pNode );
+                        nHeight = pNode->height();
+                        bTowerMade =
+                            bTowerOk = true;
+                    }
+
+                    if ( !insert_at_position( val, pNode, pos, f )) {
+                        m_Stat.onInsertRetry();
+                        continue;
+                    }
+
+                    increase_height( nHeight );
+                    ++m_ItemCounter;
+                    m_Stat.onAddNode( nHeight );
+                    m_Stat.onInsertSuccess();
+                    scp.release();
+                    bRet =  true;
+                    break;
+                }
+            }
+
+            dispose_chain( pos );
+
+            return bRet;
+        }
+
+        /// Ensures that the \p val exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val is not found in the set, then \p val is inserted into the set.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refer to the same thing.
+
+            The functor can change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            check_deadlock_policy::check();
+
+            position pos;
+            std::pair<bool, bool> bRet( true, false );
+
+            {
+                node_type * pNode = node_traits::to_node_ptr( val );
+                scoped_node_ptr scp( pNode );
+                unsigned int nHeight = pNode->height();
+                bool bTowerOk = nHeight > 1 && pNode->get_tower() != null_ptr<atomic_node_ptr *>();
+                bool bTowerMade = false;
+
+#       ifndef CDS_CXX11_LAMBDA_SUPPORT
+                insert_at_ensure_functor<Func> wrapper( func );
+#       endif
+
+                rcu_lock rcuLock;
+                while ( true )
+                {
+                    bool bFound = find_position( val, pos, key_comparator(), true );
+                    if ( bFound ) {
+                        // scoped_node_ptr deletes the node tower if we create it before
+                        if ( !bTowerMade )
+                            scp.release();
+
+                        cds::unref(func)( false, *node_traits::to_value_ptr(pos.pCur), val );
+                        m_Stat.onEnsureExist();
+                        break;
+                    }
+
+                    if ( !bTowerOk ) {
+                        build_node( pNode );
+                        nHeight = pNode->height();
+                        bTowerMade =
+                            bTowerOk = true;
+                    }
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                    if ( !insert_at_position( val, pNode, pos, [&func]( value_type& item ) { cds::unref(func)( true, item, item ); }))
+#       else
+                    if ( !insert_at_position( val, pNode, pos, cds::ref(wrapper) ))
+#       endif
+                    {
+                        m_Stat.onInsertRetry();
+                        continue;
+                    }
+
+                    increase_height( nHeight );
+                    ++m_ItemCounter;
+                    scp.release();
+                    m_Stat.onAddNode( nHeight );
+                    m_Stat.onEnsureNew();
+                    bRet.second = true;
+                    break;
+                }
+            }
+
+            dispose_chain( pos );
+
+            return bRet;
+        }
+
+        /// Unlinks the item \p val from the set
+        /**
+            The function searches the item \p val in the set and unlink it from the set
+            if it is found and is equal to \p val.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of that set, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+            check_deadlock_policy::check();
+
+            position pos;
+            bool bRet;
+
+            {
+                rcu_lock rcuLock;
+
+                if ( !find_position( val, pos, key_comparator(), false ) ) {
+                    m_Stat.onUnlinkFailed();
+                    bRet = false;
+                }
+                else {
+                    node_type * pDel = pos.pCur;
+                    assert( key_comparator()( *node_traits::to_value_ptr( pDel ), val ) == 0 );
+
+                    unsigned int nHeight = pDel->height();
+
+                    if ( node_traits::to_value_ptr( pDel ) == &val && try_remove_at( pDel, pos,
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                        [](value_type const&) {}
+#       else
+                        empty_erase_functor()
+#       endif
+                        , false ))
+                    {
+                        --m_ItemCounter;
+                        m_Stat.onRemoveNode( nHeight );
+                        m_Stat.onUnlinkSuccess();
+                        bRet = true;
+                    }
+                    else {
+                        m_Stat.onUnlinkFailed();
+                        bRet = false;
+                    }
+                }
+            }
+
+            dispose_chain( pos );
+
+            return bRet;
+        }
+
+        /// Extracts the item from the set with specified \p key
+        /** \anchor cds_intrusive_SkipListSet_rcu_extract
+            The function searches an item with key equal to \p key in the set,
+            unlinks it from the set, places it to \p result parameter, and returns \p true.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not call the disposer for the item found.
+            The disposer will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+            Example:
+            \code
+            typedef cds::intrusive::SkipListSet< cds::urcu::gc< cds::urcu::general_buffered<> >, foo, my_traits > skip_list;
+            skip_list theList;
+            // ...
+
+            typename skip_list::exempt_ptr ep;
+            if ( theList.extract( ep, 5 ) ) {
+                // Deal with ep
+                //...
+
+                // Dispose returned item.
+                ep.release();
+            }
+            \endcode
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& result, Q const& key )
+        {
+            return do_extract( result, key );
+        }
+
+        /// Extracts the item from the set with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_rcu_extract "extract(exempt_ptr&, Q const&)"
+            but \p pred predicate is used for key comparing.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& result, Q const& key, Less pred )
+        {
+            return do_extract_with( result, key, pred );
+        }
+
+        /// Extracts an item with minimal key from the list
+        /**
+            The function searches an item with minimal key, unlinks it, and returns the item found in \p result parameter.
+            If the skip-list is empty the function returns \p false.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not call the disposer for the item found.
+            The disposer will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+            Example:
+            \code
+            typedef cds::intrusive::SkipListSet< cds::urcu::gc< cds::urcu::general_buffered<> >, foo, my_traits > skip_list;
+            skip_list theList;
+            // ...
+
+            typename skip_list::exempt_ptr ep;
+            if ( theList.extract_min(ep)) {
+                // Deal with ep
+                //...
+
+                // Dispose returned item.
+                ep.release();
+            }
+            \endcode
+
+            @note Due the concurrent nature of the list, the function extracts <i>nearly</i> minimum key.
+            It means that the function gets leftmost item and tries to unlink it.
+            During unlinking, a concurrent thread may insert an item with key less than leftmost item's key.
+            So, the function returns the item with minimum key at the moment of list traversing.
+        */
+        bool extract_min( exempt_ptr& result )
+        {
+            return do_extract_min( result );
+        }
+
+        /// Extracts an item with maximal key from the list
+        /**
+            The function searches an item with maximal key, unlinks it, and returns the item found in \p result parameter.
+            If the skip-list is empty the function returns \p false.
+
+            RCU \p synchronize method can be called. RCU should NOT be locked.
+            The function does not call the disposer for the item found.
+            The disposer will be implicitly invoked when \p result object is destroyed or when
+            <tt>result.release()</tt> is called, see cds::urcu::exempt_ptr for explanation.
+            @note Before reusing \p result object you should call its \p release() method.
+            Example:
+            \code
+            typedef cds::intrusive::SkipListSet< cds::urcu::gc< cds::urcu::general_buffered<> >, foo, my_traits > skip_list;
+            skip_list theList;
+            // ...
+
+            typename skip_list::exempt_ptr ep;
+            if ( theList.extract_max(ep) ) {
+                // Deal with ep
+                //...
+                // Dispose returned item.
+                ep.release();
+            }
+            \endcode
+
+            @note Due the concurrent nature of the list, the function extracts <i>nearly</i> maximal key.
+            It means that the function gets rightmost item and tries to unlink it.
+            During unlinking, a concurrent thread can insert an item with key greater than rightmost item's key.
+            So, the function returns the item with maximum key at the moment of list traversing.
+        */
+        bool extract_max( exempt_ptr& result )
+        {
+            return do_extract_max( result );
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_SkipListSet_rcu_erase
+            The function searches an item with key equal to \p val in the set,
+            unlinks it from the set, and returns \p true.
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        template <typename Q>
+        bool erase( const Q& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return do_erase( val, key_comparator(), [](value_type const&) {} );
+#       else
+            return do_erase( val, key_comparator(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Delete the item from the set with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_rcu_erase "erase(Q const&)"
+            but \p pred predicate is used for key comparing.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( const Q& val, Less pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return do_erase( val, cds::opt::details::make_comparator_from_less<Less>(), [](value_type const&) {} );
+#       else
+            return do_erase( val, cds::opt::details::make_comparator_from_less<Less>(), empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_SkipListSet_rcu_erase_func
+            The function searches an item with key equal to \p val in the set,
+            call \p f functor with item found, unlinks it from the set, and returns \p true.
+            The \ref disposer specified in \p Traits class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor can be passed by reference with <tt>boost:ref</tt>
+
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU \p synchronize method can be called. RCU should not be locked.
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& val, Func f )
+        {
+            return do_erase( val, key_comparator(), f );
+        }
+
+        /// Delete the item from the set with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_rcu_erase_func "erase(Q const&, Func)"
+            but \p pred predicate is used for key comparing.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& val, Less pred, Func f )
+        {
+            return do_erase( val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** @anchor cds_intrusive_SkipListSet_rcu_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return do_find_with( val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_rcu_find_func "find(Q&, Func)"
+            but \p cmp is used for key comparison.
+            \p Less functor has the interface like \p std::less.
+            \p cmp must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return do_find_with( val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** @anchor cds_intrusive_SkipListSet_rcu_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return do_find_with( val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_rcu_find_cfunc "find(Q const&, Func)"
+            but \p cmp is used for key comparison.
+            \p Less functor has the interface like \p std::less.
+            \p cmp must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return do_find_with( val, cds::opt::details::make_comparator_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** @anchor cds_intrusive_SkipListSet_rcu_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            The function applies RCU lock internally.
+        */
+        template <typename Q>
+        bool find( Q const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return do_find_with( val, key_comparator(), [](value_type& , Q const& ) {} );
+#       else
+            return do_find_with( val, key_comparator(), empty_find_functor() );
+#       endif
+        }
+
+        /// Finds the key \p val with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_rcu_find_val "find(Q const&)"
+            but \p pred is used for key compare.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+            return do_find_with( val, cds::opt::details::make_comparator_from_less<Less>(),
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+                [](value_type& , Q const& ) {}
+#       else
+                empty_find_functor()
+#       endif
+            );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_intrusive_SkipListSet_rcu_get
+            The function searches the item with key equal to \p val and returns the pointer to item found.
+            If \p val is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            typedef cds::intrusive::SkipListSet< cds::urcu::gc< cds::urcu::general_buffered<> >, foo, my_traits > skip_list;
+            skip_list theList;
+            // ...
+            {
+                // Lock RCU
+                skip_list::rcu_lock lock;
+
+                foo * pVal = theList.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+            }
+            // Unlock RCU by rcu_lock destructor
+            // pVal can be retired by disposer at any time after RCU has been unlocked
+            \endcode
+
+            After RCU unlocking the \p %force_dispose member function can be called manually,
+            see \ref force_dispose for explanation.
+        */
+        template <typename Q>
+        value_type * get( Q const& val )
+        {
+            assert( gc::is_locked());
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            value_type * pFound;
+            return do_find_with( val, key_comparator(), [&pFound](value_type& found, Q const& ) { pFound = &found; } )
+                ? pFound : null_ptr<value_type *>();
+#       else
+            get_functor gf;
+            return do_find_with( val, key_comparator(), cds::ref(gf) )
+                ? gf.pFound : null_ptr<value_type *>();
+#       endif
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_SkipListSet_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& val, Less pred )
+        {
+            assert( gc::is_locked());
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            value_type * pFound;
+            return do_find_with( val, cds::opt::details::make_comparator_from_less<Less>(),
+                [&pFound](value_type& found, Q const& ) { pFound = &found; } )
+                ? pFound : null_ptr<value_type *>();
+#       else
+            get_functor gf;
+            return do_find_with( val, cds::opt::details::make_comparator_from_less<Less>(), cds::ref(gf) )
+                ? gf.pFound : null_ptr<value_type *>();
+#       endif
+        }
+
+        /// Returns item count in the set
+        /**
+            The value returned depends on item counter type provided by \p Traits template parameter.
+            If it is atomicity::empty_item_counter this function always returns 0.
+            Therefore, the function is not suitable for checking the set emptiness, use \ref empty
+            member function for this purpose.
+        */
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Checks if the set is empty
+        bool empty() const
+        {
+            return m_Head.head()->next(0).load( memory_model::memory_order_relaxed ) == null_ptr<node_type *>();
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function unlink all items from the set.
+            The function is not atomic, thus, in multi-threaded environment with parallel insertions
+            this sequence
+            \code
+            set.clear();
+            assert( set.empty() );
+            \endcode
+            the assertion could be raised.
+
+            For each item the \ref disposer will be called automatically after unlinking.
+        */
+        void clear()
+        {
+            exempt_ptr ep;
+            while ( extract_min(ep) )
+                ep.release();
+        }
+
+        /// Returns maximum height of skip-list. The max height is a constant for each object and does not exceed 32.
+        static CDS_CONSTEXPR unsigned int max_height() CDS_NOEXCEPT
+        {
+            return c_nMaxHeight;
+        }
+
+        /// Returns const reference to internal statistics
+        stat const& statistics() const
+        {
+            return m_Stat;
+        }
+
+        /// Clears internal list of ready-to-remove items passing it to RCU reclamation cycle
+        /** @anchor cds_intrusive_SkipListSet_rcu_force_dispose
+            Skip list has complex multi-step algorithm for removing an item. In fact, when you
+            remove the item it is just marked as removed that is enough for the success of your operation.
+            Actual removing can take place in the future, in another call or even in another thread.
+            Inside RCU lock the removed item cannot be passed to RCU reclamation cycle
+            since it can lead to deadlock. To solve this problem, the current skip list implementation
+            has internal list of items which is ready to remove but is not yet passed to RCU reclamation.
+            Usually, this list will be passed to RCU reclamation in the next suitable call of skip list member function.
+            In some cases we want to pass it to RCU reclamation immediately after RCU unlocking.
+            This function provides such opportunity: it checks whether the RCU is not locked and if it is true
+            the function passes the internal ready-to-remove list to RCU reclamation cycle.
+
+            The RCU \p synchronize can be called.
+        */
+        void force_dispose()
+        {
+            if ( !gc::is_locked() )
+                dispose_deferred();
+        }
+    };
+
+}} // namespace cds::intrusive
+
+
+#endif // #ifndef __CDS_INTRUSIVE_SKIP_LIST_RCU_H
diff --git a/cds/intrusive/split_list.h b/cds/intrusive/split_list.h
new file mode 100644 (file)
index 0000000..e72f9f0
--- /dev/null
@@ -0,0 +1,1115 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SPLIT_LIST_H
+#define __CDS_INTRUSIVE_SPLIT_LIST_H
+
+#include <cds/intrusive/split_list_base.h>
+
+namespace cds { namespace intrusive {
+
+    /// Split-ordered list
+    /** @ingroup cds_intrusive_map
+        \anchor cds_intrusive_SplitListSet_hp
+
+        Hash table implementation based on split-ordered list algorithm discovered by Ori Shalev and Nir Shavit, see
+        - [2003] Ori Shalev, Nir Shavit "Split-Ordered Lists - Lock-free Resizable Hash Tables"
+        - [2008] Nir Shavit "The Art of Multiprocessor Programming"
+
+        The split-ordered list is a lock-free implementation of an extensible unbounded hash table. It uses original
+        recursive split-ordering algorithm discovered by Ori Shalev and Nir Shavit that allows to split buckets
+        without moving an item on resizing.
+
+        \anchor cds_SplitList_algo_desc
+        <b>Short description</b>
+        [from [2003] Ori Shalev, Nir Shavit "Split-Ordered Lists - Lock-free Resizable Hash Tables"]
+
+        The algorithm keeps all the items in one lock-free linked list, and gradually assigns the bucket pointers to
+        the places in the list where a sublist of \93correct\94 items can be found. A bucket is initialized upon first
+        access by assigning it to a new \93dummy\94 node (dashed contour) in the list, preceding all items that should be
+        in that bucket. A newly created bucket splits an older bucket\92s chain, reducing the access cost to its items. The
+        table uses a modulo 2**i hash (there are known techniques for \93pre-hashing\94 before a modulo 2**i hash
+        to overcome possible binary correlations among values). The table starts at size 2 and repeatedly doubles in size.
+
+        Unlike moving an item, the operation of directing a bucket pointer can be done
+        in a single CAS operation, and since items are not moved, they are never \93lost\94.
+        However, to make this approach work, one must be able to keep the items in the
+        list sorted in such a way that any bucket\92s sublist can be \93split\94 by directing a new
+        bucket pointer within it. This operation must be recursively repeatable, as every
+        split bucket may be split again and again as the hash table grows. To achieve this
+        goal the authors introduced recursive split-ordering, a new ordering on keys that keeps items
+        in a given bucket adjacent in the list throughout the repeated splitting process.
+
+        Magically, yet perhaps not surprisingly, recursive split-ordering is achieved by
+        simple binary reversal: reversing the bits of the hash key so that the new key\92s
+        most significant bits (MSB) are those that were originally its least significant.
+        The split-order keys of regular nodes are exactly the bit-reverse image of the original
+        keys after turning on their MSB. For example, items 9 and 13 are in the <tt>1 mod
+        4</tt> bucket, which can be recursively split in two by inserting a new node between
+        them.
+
+        To insert (respectively delete or search for) an item in the hash table, hash its
+        key to the appropriate bucket using recursive split-ordering, follow the pointer to
+        the appropriate location in the sorted items list, and traverse the list until the key\92s
+        proper location in the split-ordering (respectively until the key or a key indicating
+        the item is not in the list is found). Because of the combinatorial structure induced
+        by the split-ordering, this will require traversal of no more than an expected constant number of items.
+
+        The design is modular: to implement the ordered items list, you can use one of several
+        non-blocking list-based set algorithms: MichaelList, LazyList.
+
+        <b>Implementation</b>
+
+        Template parameters are:
+        - \p GC - Garbage collector used. Note the \p GC must be the same as the GC used for \p OrderedList
+        - \p OrderedList - ordered list implementation used as bucket for hash set, for example, MichaelList, LazyList.
+            The intrusive ordered list implementation specifies the type \p T stored in the hash-set, the reclamation
+            schema \p GC used by hash-set, the comparison functor for the type \p T and other features specific for
+            the ordered list.
+        - \p Traits - type traits. See split_list::type_traits for explanation.
+            Instead of defining \p Traits struct you may use option-based syntax with split_list::make_traits metafunction.
+
+        There are several specialization of the split-list class for different \p GC:
+        - for \ref cds_urcu_gc "RCU type" include <tt><cds/intrusive/split_list_rcu.h></tt> - see
+            \ref cds_intrusive_SplitListSet_rcu "RCU-based split-list"
+        - for cds::gc::nogc include <tt><cds/intrusive/split_list_nogc.h></tt> - see
+            \ref cds_intrusive_SplitListSet_nogc "persistent SplitListSet".
+
+        \anchor cds_SplitList_hash_functor
+        <b>Hash functor</b>
+
+        Some member functions of split-ordered list accept the key parameter of type \p Q which differs from \p value_type.
+        It is expected that type \p Q contains full key of \p value_type, and for equal keys of type \p Q and \p value_type
+        the hash values of these keys must be equal too.
+        The hash functor <tt>Traits::hash</tt> should accept parameters of both type:
+        \code
+        // Our node type
+        struct Foo {
+            std::string     key_    ;   // key field
+            // ... other fields
+        };
+
+        // Hash functor
+        struct fooHash {
+            size_t operator()( const std::string& s ) const
+            {
+                return std::hash( s );
+            }
+
+            size_t operator()( const Foo& f ) const
+            {
+                return (*this)( f.key_ );
+            }
+        };
+        \endcode
+
+        <b>How to use</b>
+
+        First, you should choose ordered list type to use in your split-list set:
+        \code
+        // For gc::HP-based MichaelList implementation
+        #include <cds/intrusive/michael_list_hp.h>
+
+        // cds::intrusive::SplitListSet declaration
+        #include <cds/intrusive/split_list.h>
+
+        // Type of set items
+            //  Note you should declare your struct based on cds::intrusive::split_list::node
+            //  which is a wrapper for ordered-list node struct.
+            //  In our case, the node type for HP-based MichaelList is cds::intrusive::michael_list::node< cds::gc::HP >
+        struct Foo: public cds::intrusive::split_list::node< cds::intrusive::michael_list::node< cds::gc::HP > >
+        {
+            std::string     key_    ;   // key field
+            unsigned        val_    ;   // value field
+            // ...  other value fields
+        };
+
+        // Declare comparator for the item
+        struct FooCmp
+        {
+            int operator()( const Foo& f1, const Foo& f2 ) const
+            {
+                return f1.key_.compare( f2.key_ );
+            }
+        };
+
+        // Declare base ordered-list type for split-list
+        // It may be any ordered list type like MichaelList, LazyList
+        typedef cds::intrusive::MichaelList< cds::gc::HP, Foo,
+            typename cds::intrusive::michael_list::make_traits<
+                // hook option
+                cds::intrusive::opt::hook< cds::intrusive::michael_list::base_hook< cds::opt::gc< cds::gc::HP > > >
+                // item comparator option
+                ,cds::opt::compare< FooCmp >
+            >::type
+        >  Foo_list;
+        \endcode
+
+        Second, you should declare split-list set container:
+        \code
+
+        // Declare hash functor
+        // Note, the hash functor accepts parameter type Foo and std::string
+        struct FooHash {
+            size_t operator()( const Foo& f ) const
+            {
+                return cds::opt::v::hash<std::string>()( f.key_ );
+            }
+            size_t operator()( const std::string& s ) const
+            {
+                return cds::opt::v::hash<std::string>()( s );
+            }
+        };
+
+        // Split-list set typedef
+        typedef cds::intrusive::SplitListSet<
+            cds::gc::HP
+            ,Foo_list
+            ,typename cds::intrusive::split_list::make_traits<
+                cds::opt::hash< FooHash >
+            >::type
+        > Foo_set;
+        \endcode
+
+        Now, you can use \p Foo_set in your application.
+        \code
+            Foo_set    fooSet;
+            Foo * foo = new Foo;
+            foo->key_ = "First";
+
+            fooSet.insert( *foo );
+
+            // and so on ...
+        \endcode
+
+    */
+    template <
+        class GC,
+        class OrderedList,
+#   ifdef CDS_DOXYGEN_INVOKED
+        class Traits = split_list::type_traits
+#   else
+        class Traits
+#   endif
+    >
+    class SplitListSet
+    {
+    public:
+        typedef Traits          options ;   ///< Traits template parameters
+        typedef GC              gc      ;   ///< Garbage collector
+
+    protected:
+        //@cond
+        typedef split_list::details::rebind_list_options<OrderedList, options> wrapped_ordered_list;
+        //@endcond
+
+    public:
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef OrderedList         ordered_list    ;   ///< type of ordered list used as base for split-list
+#   else
+        typedef typename wrapped_ordered_list::result   ordered_list;
+#   endif
+        typedef typename ordered_list::value_type       value_type      ;   ///< type of value stored in the split-list
+        typedef typename ordered_list::key_comparator   key_comparator  ;   ///< key comparison functor
+        typedef typename ordered_list::disposer         disposer        ;   ///< Node disposer functor
+
+        /// Hash functor for \p %value_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+        typedef typename options::back_off              back_off        ;   ///< back-off strategy for spinning
+        typedef typename options::memory_model          memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename ordered_list::guarded_ptr      guarded_ptr; ///< Guarded pointer
+
+    protected:
+        typedef typename ordered_list::node_type    list_node_type      ;   ///< Node type as declared in ordered list
+        typedef split_list::node<list_node_type>    node_type           ;   ///< split-list node type
+        typedef node_type                           dummy_node_type     ;   ///< dummy node type
+
+        /// Split-list node traits
+        /**
+            This traits is intended for converting between underlying ordered list node type \ref list_node_type
+            and split-list node type \ref node_type
+        */
+        typedef split_list::node_traits<typename ordered_list::node_traits>  node_traits;
+
+        //@cond
+        /// Bucket table implementation
+        typedef typename split_list::details::bucket_table_selector<
+            options::dynamic_bucket_table
+            , gc
+            , dummy_node_type
+            , opt::allocator< typename options::allocator >
+            , opt::memory_model< memory_model >
+        >::type bucket_table;
+
+        //@endcond
+
+    protected:
+        //@cond
+        /// Ordered list wrapper to access protected members
+        class ordered_list_wrapper: public ordered_list
+        {
+            typedef ordered_list base_class;
+            typedef typename base_class::auxiliary_head       bucket_head_type;
+
+        public:
+            bool insert_at( dummy_node_type * pHead, value_type& val )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::insert_at( h, val );
+            }
+
+            template <typename Func>
+            bool insert_at( dummy_node_type * pHead, value_type& val, Func f )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::insert_at( h, val, f );
+            }
+
+            template <typename Func>
+            std::pair<bool, bool> ensure_at( dummy_node_type * pHead, value_type& val, Func func )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::ensure_at( h, val, func );
+            }
+
+            bool unlink_at( dummy_node_type * pHead, value_type& val )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::unlink_at( h, val );
+            }
+
+            template <typename Q, typename Compare, typename Func>
+            bool erase_at( dummy_node_type * pHead, split_list::details::search_value_type<Q> const& val, Compare cmp, Func f )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::erase_at( h, val, cmp, f );
+            }
+
+            template <typename Q, typename Compare>
+            bool erase_at( dummy_node_type * pHead, split_list::details::search_value_type<Q> const& val, Compare cmp )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::erase_at( h, val, cmp );
+            }
+
+            template <typename Q, typename Compare>
+            bool extract_at( dummy_node_type * pHead, typename gc::Guard& guard, split_list::details::search_value_type<Q> const& val, Compare cmp )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::extract_at( h, guard, val, cmp );
+            }
+
+            template <typename Q, typename Compare, typename Func>
+            bool find_at( dummy_node_type * pHead, split_list::details::search_value_type<Q>& val, Compare cmp, Func f )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::find_at( h, val, cmp, f );
+            }
+
+            template <typename Q, typename Compare>
+            bool find_at( dummy_node_type * pHead, split_list::details::search_value_type<Q> const& val, Compare cmp )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::find_at( h, val, cmp );
+            }
+
+            template <typename Q, typename Compare>
+            bool get_at( dummy_node_type * pHead, typename gc::Guard& guard, split_list::details::search_value_type<Q> const& val, Compare cmp )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::get_at( h, guard, val, cmp );
+            }
+
+            bool insert_aux_node( dummy_node_type * pNode )
+            {
+                return base_class::insert_aux_node( pNode );
+            }
+            bool insert_aux_node( dummy_node_type * pHead, dummy_node_type * pNode )
+            {
+                bucket_head_type h(pHead);
+                return base_class::insert_aux_node( h, pNode );
+            }
+        };
+        //@endcond
+
+    protected:
+        ordered_list_wrapper    m_List              ;   ///< Ordered list containing split-list items
+        bucket_table            m_Buckets           ;   ///< bucket table
+        CDS_ATOMIC::atomic<size_t> m_nBucketCountLog2  ;   ///< log2( current bucket count )
+        item_counter            m_ItemCounter       ;   ///< Item counter
+        hash                    m_HashFunctor       ;   ///< Hash functor
+
+    protected:
+        //@cond
+        typedef cds::details::Allocator< dummy_node_type, typename options::allocator >   dummy_node_allocator;
+        static dummy_node_type * alloc_dummy_node( size_t nHash )
+        {
+            return dummy_node_allocator().New( nHash );
+        }
+        static void free_dummy_node( dummy_node_type * p )
+        {
+            dummy_node_allocator().Delete( p );
+        }
+
+        /// Calculates hash value of \p key
+        template <typename Q>
+        size_t hash_value( Q const& key ) const
+        {
+            return m_HashFunctor( key );
+        }
+
+        size_t bucket_no( size_t nHash ) const
+        {
+            return nHash & ( (1 << m_nBucketCountLog2.load(CDS_ATOMIC::memory_order_relaxed)) - 1 );
+        }
+
+        static size_t parent_bucket( size_t nBucket )
+        {
+            assert( nBucket > 0 );
+            return nBucket & ~( 1 << bitop::MSBnz( nBucket ) );
+        }
+
+        dummy_node_type * init_bucket( size_t nBucket )
+        {
+            assert( nBucket > 0 );
+            size_t nParent = parent_bucket( nBucket );
+
+            dummy_node_type * pParentBucket = m_Buckets.bucket( nParent );
+            if ( pParentBucket == null_ptr<dummy_node_type *>() ) {
+                pParentBucket = init_bucket( nParent );
+            }
+
+            assert( pParentBucket != null_ptr<dummy_node_type *>() );
+
+            // Allocate a dummy node for new bucket
+            {
+                dummy_node_type * pBucket = alloc_dummy_node( split_list::dummy_hash( nBucket ) );
+                if ( m_List.insert_aux_node( pParentBucket, pBucket ) ) {
+                    m_Buckets.bucket( nBucket, pBucket );
+                    return pBucket;
+                }
+                free_dummy_node( pBucket );
+            }
+
+            // Another thread set the bucket. Wait while it done
+
+            // In this point, we must wait while nBucket is empty.
+            // The compiler can decide that waiting loop can be "optimized" (stripped)
+            // To prevent this situation, we use waiting on volatile bucket_head_ptr pointer.
+            //
+            back_off bkoff;
+            while ( true ) {
+                dummy_node_type volatile * p = m_Buckets.bucket( nBucket );
+                if ( p != null_ptr<dummy_node_type volatile *>() )
+                    return const_cast<dummy_node_type *>( p );
+                bkoff();
+            }
+        }
+
+        dummy_node_type * get_bucket( size_t nHash )
+        {
+            size_t nBucket = bucket_no( nHash );
+
+            dummy_node_type * pHead = m_Buckets.bucket( nBucket );
+            if ( pHead == null_ptr<dummy_node_type *>() )
+                pHead = init_bucket( nBucket );
+
+            assert( pHead->is_dummy() );
+
+            return pHead;
+        }
+
+        void init()
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename ordered_list::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ), "atomicity::empty_item_counter is not allowed as a item counter");
+
+            // Initialize bucket 0
+            dummy_node_type * pNode = alloc_dummy_node( 0 /*split_list::dummy_hash(0)*/ );
+
+            // insert_aux_node cannot return false for empty list
+            CDS_VERIFY( m_List.insert_aux_node( pNode ));
+
+            m_Buckets.bucket( 0, pNode );
+        }
+
+        void    inc_item_count()
+        {
+            size_t sz = m_nBucketCountLog2.load(CDS_ATOMIC::memory_order_relaxed);
+            if ( ( ++m_ItemCounter >> sz ) > m_Buckets.load_factor() && ((size_t)(1 << sz )) < m_Buckets.capacity() )
+            {
+                m_nBucketCountLog2.compare_exchange_strong( sz, sz + 1, CDS_ATOMIC::memory_order_seq_cst, CDS_ATOMIC::memory_order_relaxed );
+            }
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_( Q& val, Compare cmp, Func f )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return m_List.find_at( pHead, sv, cmp,
+                [&f](value_type& item, split_list::details::search_value_type<Q>& val){ cds::unref(f)(item, val.val ); });
+#       else
+            split_list::details::find_functor_wrapper<Func> ffw( f );
+            return m_List.find_at( pHead, sv, cmp, cds::ref(ffw) );
+#       endif
+        }
+
+        template <typename Q, typename Compare>
+        bool find_( Q const& val, Compare cmp )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            return m_List.find_at( pHead, sv, cmp );
+        }
+
+        template <typename Q, typename Compare>
+        bool get_( typename gc::Guard& guard, Q const& val, Compare cmp )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            return m_List.get_at( pHead, guard, sv, cmp );
+        }
+
+        template <typename Q>
+        bool get_( typename gc::Guard& guard, Q const& key)
+        {
+            return get_( guard, key, key_comparator());
+        }
+
+        template <typename Q, typename Less>
+        bool get_with_( typename gc::Guard& guard, Q const& key, Less )
+        {
+            return get_( guard, key, typename wrapped_ordered_list::template make_compare_from_less<Less>());
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_( Q const& val, Compare cmp, Func f )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            if ( m_List.erase_at( pHead, sv, cmp, f )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        bool erase_( Q const& val, Compare cmp )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            if ( m_List.erase_at( pHead, sv, cmp ) ) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare>
+        bool extract_( typename gc::Guard& guard, Q const& val, Compare cmp )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            if ( m_List.extract_at( pHead, guard, sv, cmp ) ) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Q>
+        bool extract_( typename gc::Guard& guard, Q const& key)
+        {
+            return extract_( guard, key, key_comparator());
+        }
+
+        template <typename Q, typename Less>
+        bool extract_with_( typename gc::Guard& guard, Q const& key, Less )
+        {
+            return extract_( guard, key, typename wrapped_ordered_list::template make_compare_from_less<Less>() );
+        }
+
+        //@endcond
+
+    public:
+        /// Initialize split-ordered list of default capacity
+        /**
+            The default capacity is defined in bucket table constructor.
+            See split_list::expandable_bucket_table, split_list::static_ducket_table
+            which selects by split_list::dynamic_bucket_table option.
+        */
+        SplitListSet()
+            : m_nBucketCountLog2(1)
+        {
+            init();
+        }
+
+        /// Initialize split-ordered list
+        SplitListSet(
+            size_t nItemCount           ///< estimate average of item count
+            , size_t nLoadFactor = 1    ///< load factor - average item count per bucket. Small integer up to 8, default is 1.
+            )
+            : m_Buckets( nItemCount, nLoadFactor )
+            , m_nBucketCountLog2(1)
+        {
+            init();
+        }
+
+    public:
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            size_t nHash = hash_value( val );
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            node_traits::to_node_ptr( val )->m_nHash = split_list::regular_hash( nHash );
+
+            if ( m_List.insert_at( pHead, val )) {
+                inc_item_count();
+                return true;
+            }
+            return false;
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success and may be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            size_t nHash = hash_value( val );
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            node_traits::to_node_ptr( val )->m_nHash = split_list::regular_hash( nHash );
+
+            if ( m_List.insert_at( pHead, val, f )) {
+                inc_item_count();
+                return true;
+            }
+            return false;
+        }
+
+        /// Ensures that the \p val exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val is not found in the set, then \p val is inserted into the set.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refers to the same thing.
+
+            The functor can change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            size_t nHash = hash_value( val );
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            node_traits::to_node_ptr( val )->m_nHash = split_list::regular_hash( nHash );
+
+            std::pair<bool, bool> bRet = m_List.ensure_at( pHead, val, func );
+            if ( bRet.first && bRet.second )
+                inc_item_count();
+            return bRet;
+        }
+
+        /// Unlinks the item \p val from the set
+        /**
+            The function searches the item \p val in the set and unlinks it from the set
+            if it is found and is equal to \p val.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of that set, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+            size_t nHash = hash_value( val );
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            if ( m_List.unlink_at( pHead, val ) ) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_SplitListSet_hp_erase
+            The function searches an item with key equal to \p val in the set,
+            unlinks it from the set, and returns \p true.
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of that set, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool erase( Q const& val )
+        {
+            return erase_( val, key_comparator() );
+        }
+
+        /// Deletes the item from the set with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_hp_erase "erase(Q const&)"
+            but \p pred predicate is used for key comparing.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( const Q& val, Less pred )
+        {
+            return erase_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>() );
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_SplitListSet_hp_erase_func
+            The function searches an item with key equal to \p val in the set,
+            call \p f functor with item found, unlinks it from the set, and returns \p true.
+            The \ref disposer specified by \p OrderedList class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor can be passed by reference with <tt>boost:ref</tt>
+
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& val, Func f )
+        {
+            return erase_( val, key_comparator(), f );
+        }
+
+        /// Deletes the item from the set with comparing functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_hp_erase_func "erase(Q const&, Func)"
+            but \p pred predicate is used for key comparing.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& val, Less pred, Func f )
+        {
+            return erase_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>(), f );
+        }
+
+        /// Extracts the item with specified \p key
+        /** \anchor cds_intrusive_SplitListSet_hp_extract
+            The function searches an item with key equal to \p key,
+            unlinks it from the set, and returns it in \p dest parameter.
+            If the item with key equal to \p key is not found the function returns \p false.
+
+            Note the compare functor should accept a parameter of type \p Q that may be not the same as \p value_type.
+
+            The \ref disposer specified in \p OrderedList class' template parameter is called automatically
+            by garbage collector \p GC when returned \ref guarded_ptr object will be destroyed or released.
+            @note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::SplitListSet< your_template_args > splitlist_set;
+            splitlist_set theSet;
+            // ...
+            {
+                splitlist_set::guarded_ptr gp;
+                theSet.extract( gp, 5 );
+                // Deal with gp
+                // ...
+
+                // Destructor of gp releases internal HP guard
+            }
+            \endcode
+        */
+        template <typename Q>
+        bool extract( guarded_ptr& dest, Q const& key )
+        {
+            return extract_( dest.guard(), key );
+        }
+
+        /// Extracts the item using compare functor \p pred
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_hp_extract "extract(guarded_ptr&, Q const&)"
+            but \p pred predicate is used for key comparing.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( guarded_ptr& dest, Q const& key, Less pred )
+        {
+            return extract_with_( dest.guard(), key, pred );
+        }
+
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SplitListSet_hp_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_( val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val with \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_hp_find_func "find(Q&, Func)"
+            but \p cmp is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p cmp must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SplitListSet_hp_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_( val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val with \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_hp_find_cfunc "find(Q const&, Func)"
+            but \p cmp is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p cmp must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SplitListSet_hp_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+            Otherwise, you may use \p find_with functions with explicit predicate for key comparing.
+        */
+        template <typename Q>
+        bool find( Q const& val )
+        {
+            return find_( val, key_comparator() );
+        }
+
+        /// Finds the key \p val with \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_hp_find_val "find(Q const&)"
+            but \p cmp is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p cmp must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+            return find_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_intrusive_SplitListSet_hp_get
+            The function searches the item with key equal to \p val
+            and assigns the item found to guarded pointer \p ptr.
+            The function returns \p true if \p val is found, and \p false otherwise.
+            If \p val is not found the \p ptr parameter is not changed.
+
+            The \ref disposer specified in \p OrderedList class' template parameter is called
+            by garbage collector \p GC automatically when returned \ref guarded_ptr object
+            will be destroyed or released.
+            @note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
+
+            Usage:
+            \code
+            typedef cds::intrusive::SplitListSet< your_template_params >  splitlist_set;
+            splitlist_set theSet;
+            // ...
+            {
+                splitlist_set::guarded_ptr gp;
+                if ( theSet.get( gp, 5 )) {
+                    // Deal with gp
+                    //...
+                }
+                // Destructor of guarded_ptr releases internal HP guard
+            }
+            \endcode
+
+            Note the compare functor specified for \p OrderedList template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool get( guarded_ptr& ptr, Q const& val )
+        {
+            return get_( ptr.guard(), val );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_hp_get "get( guarded_ptr& ptr, Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool get_with( guarded_ptr& ptr, Q const& val, Less pred )
+        {
+            return get_with_( ptr.guard(), val, pred );
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+            Thus, the correct item counting feature is an important part of split-list set implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function unlink all items from the set.
+            The function is not atomic. Therefore, \p clear may be used only for debugging purposes.
+
+            For each item the \p disposer is called after unlinking.
+        */
+        void clear()
+        {
+            iterator it = begin();
+            while ( it != end() ) {
+                iterator i(it);
+                ++i;
+                unlink( *it );
+                it = i;
+            }
+        }
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type
+            :public split_list::details::iterator_type<node_traits, ordered_list, IsConst>
+        {
+            typedef split_list::details::iterator_type<node_traits, ordered_list, IsConst> iterator_base_class;
+            typedef typename iterator_base_class::list_iterator list_iterator;
+        public:
+            iterator_type()
+                : iterator_base_class()
+            {}
+
+            iterator_type( iterator_type const& src )
+                : iterator_base_class( src )
+            {}
+
+            // This ctor should be protected...
+            iterator_type( list_iterator itCur, list_iterator itEnd )
+                : iterator_base_class( itCur, itEnd )
+            {}
+        };
+        //@endcond
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for a split-list has some features:
+            - it has no post-increment operator
+            - it depends on iterator of underlying \p OrderedList
+            - The iterator cannot be moved across thread boundary since it may contain GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the split-list.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use the iterator on the concurrent container
+            for debug purpose only.
+        */
+        typedef iterator_type<false>    iterator;
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a split-list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_List.begin(), m_List.end() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a split-list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+
+            The returned value can be used only to control reaching the end of the split-list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_List.end(), m_List.end() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a split-list
+        const_iterator begin() const
+        {
+            return const_iterator( m_List.begin(), m_List.end() );
+        }
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a split-list
+        const_iterator end() const
+        {
+            return const_iterator( m_List.end(), m_List.end() );
+        }
+
+    };
+
+}}  // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_SPLIT_LIST_H
diff --git a/cds/intrusive/split_list_base.h b/cds/intrusive/split_list_base.h
new file mode 100644 (file)
index 0000000..98609d0
--- /dev/null
@@ -0,0 +1,824 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SPLIT_LIST_BASE_H
+#define __CDS_INTRUSIVE_SPLIT_LIST_BASE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/cxx11_atomic.h>
+#include <cds/details/allocator.h>
+#include <cds/int_algo.h>
+#include <cds/bitop.h>
+#include <cds/details/functor_wrapper.h>
+
+namespace cds { namespace intrusive {
+
+    /// Split-ordered list related definitions
+    /** @ingroup cds_intrusive_helper
+    */
+    namespace split_list {
+        /// Split-ordered list node
+        /**
+            Template parameter:
+            - OrderedListNode - node type for underlying ordered list
+        */
+        template <typename OrderedListNode>
+        struct node: public OrderedListNode
+        {
+            //@cond
+            typedef OrderedListNode base_class;
+            //@endcond
+
+            size_t  m_nHash ;   ///< Hash value for node
+
+            /// Default constructor
+            node()
+                : m_nHash(0)
+            {
+                assert( is_dummy() );
+            }
+
+            /// Initializes dummy node with \p nHash value
+            node( size_t nHash )
+                : m_nHash( nHash )
+            {
+                assert( is_dummy() );
+            }
+
+            /// Checks if the node is dummy node
+            bool is_dummy() const
+            {
+                return (m_nHash & 1) == 0;
+            }
+        };
+
+
+        /// Type traits for SplitListSet class
+        struct type_traits {
+            /// Hash function
+            /**
+                Hash function converts the key fields of struct \p T stored in the split list
+                into value of type \p size_t called hash value that is an index of hash table.
+
+                This is mandatory type and has no predefined one.
+            */
+            typedef opt::none       hash;
+
+            /// Item counter
+            /**
+                The item counting is an important part of SplitListSet algorithm:
+                the <tt>empty()</tt> member function depends on correct item counting.
+                Therefore, atomicity::empty_item_counter is not allowed as a type of the option.
+
+                Default is atomicity::item_counter.
+            */
+            typedef atomicity::item_counter item_counter;
+
+            /// Bucket table allocator
+            /**
+                Allocator for bucket table. Default is \ref CDS_DEFAULT_ALLOCATOR
+            */
+            typedef CDS_DEFAULT_ALLOCATOR   allocator;
+
+            /// C++ memory model for atomic operations
+            /**
+                Can be opt::v::relaxed_ordering (relaxed memory model, the default) or opt::v::sequential_consistent (sequentially consisnent memory model).
+            */
+            typedef opt::v::relaxed_ordering    memory_model;
+
+            /// What type of bucket table is used
+            /**
+                \p true - use split_list::expandable_bucket_table that can be expanded
+                    if the load factor of the set is exhausted
+                \p false - use split_list::static_bucket_table that cannot be expanded
+
+                Default is \p true.
+            */
+            static const bool dynamic_bucket_table = true;
+
+            /// back-off strategy used
+            /**
+                If the option is not specified, the cds::backoff::Default is used.
+            */
+            typedef cds::backoff::Default             back_off;
+        };
+
+        /// [value-option] Split-list dynamic bucket table option
+        /**
+            The option is used to select bucket table implementation.
+            Possible values of \p Value are:
+            - \p true - select \ref expandable_bucket_table implementation
+            - \p false - select \ref static_bucket_table implementation
+        */
+        template <bool Value>
+        struct dynamic_bucket_table
+        {
+            //@cond
+            template <typename Base> struct pack: public Base
+            {
+                enum { dynamic_bucket_table = Value };
+            };
+            //@endcond
+        };
+
+        /// Metafunction converting option list to traits struct
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+
+            Available \p Options:
+            - opt::hash - mandatory option, specifies hash functor.
+            - opt::item_counter - optional, specifies item counting policy. See type_traits::item_counter
+                for default type.
+            - opt::memory_model - C++ memory model for atomic operations.
+                Can be opt::v::relaxed_ordering (relaxed memory model, the default) or opt::v::sequential_consistent (sequentially consisnent memory model).
+            - opt::allocator - optional, bucket table allocator. Default is \ref CDS_DEFAULT_ALLOCATOR.
+            - split_list::dynamic_bucket_table - use dynamic or static bucket table implementation.
+                Dynamic bucket table expands its size up to maximum bucket count when necessary
+            - opt::back_off - back-off strategy used for spinning. If the option is not specified, the cds::backoff::Default is used.
+
+            See \ref MichaelHashSet, \ref type_traits.
+        */
+        template <CDS_DECL_OPTIONS6>
+        struct make_traits {
+            typedef typename cds::opt::make_options< type_traits, CDS_OPTIONS6>::type type  ;   ///< Result of metafunction
+        };
+
+
+        /// Static bucket table
+        /**
+            Non-resizeable bucket table for SplitListSet class.
+            The capacity of table (max bucket count) is defined in the constructor call.
+
+            Template parameter:
+            - \p GC - garbage collector used
+            - \p Node - node type, must be a type based on\ref node template
+            - \p Options... - options
+
+            \p Options are:
+            - \p opt::allocator - allocator used to allocate bucket table. Default is \ref CDS_DEFAULT_ALLOCATOR
+            - \p opt::memory_model - memory model used. Possible types are opt::v::sequential_consistent, opt::v::relaxed_ordering
+        */
+        template <typename GC, typename Node, CDS_DECL_OPTIONS2>
+        class static_bucket_table
+        {
+            //@cond
+            struct default_options
+            {
+                typedef CDS_DEFAULT_ALLOCATOR       allocator;
+                typedef opt::v::relaxed_ordering    memory_model;
+            };
+            typedef typename opt::make_options< default_options, CDS_OPTIONS2 >::type   options;
+            //@endcond
+
+        public:
+            typedef GC      gc          ;   ///< Garbage collector
+            typedef Node    node_type   ;   ///< Bucket node type
+            typedef CDS_ATOMIC::atomic<node_type *> table_entry ;   ///< Table entry type
+
+            /// Bucket table allocator
+            typedef cds::details::Allocator< table_entry, typename options::allocator >  bucket_table_allocator;
+
+            /// Memory model for atomic operations
+            typedef typename options::memory_model     memory_model;
+
+        protected:
+            const size_t   m_nLoadFactor    ;    ///< load factor (average count of items per bucket)
+            const size_t   m_nCapacity      ;    ///< Bucket table capacity
+            table_entry *  m_Table          ;    ///< Bucket table
+
+        protected:
+            //@cond
+            void allocate_table()
+            {
+                m_Table = bucket_table_allocator().NewArray( m_nCapacity, null_ptr<node_type *>() );
+            }
+
+            void destroy_table()
+            {
+                bucket_table_allocator().Delete( m_Table, m_nCapacity );
+            }
+            //@endcond
+
+        public:
+            /// Constructs bucket table for 512K buckets. Load factor is 1.
+            static_bucket_table()
+                : m_nLoadFactor(1)
+                , m_nCapacity( 512 * 1024 )
+            {
+                allocate_table();
+            }
+
+            /// Constructs
+            static_bucket_table(
+                size_t nItemCount,        ///< Max expected item count in split-ordered list
+                size_t nLoadFactor        ///< Load factor
+                )
+                : m_nLoadFactor( nLoadFactor > 0 ? nLoadFactor : (size_t) 1 ),
+                m_nCapacity( cds::beans::ceil2( nItemCount / m_nLoadFactor ) )
+            {
+                // m_nCapacity must be power of 2
+                assert( cds::beans::is_power2( m_nCapacity ) );
+                allocate_table();
+            }
+
+            /// Destroy bucket table
+            ~static_bucket_table()
+            {
+                destroy_table();
+            }
+
+            /// Returns head node of bucket \p nBucket
+            node_type * bucket( size_t nBucket ) const
+            {
+                assert( nBucket < capacity() );
+                return m_Table[ nBucket ].load(memory_model::memory_order_acquire);
+            }
+
+            /// Set head node \p pNode of bucket \p nBucket
+            void bucket( size_t nBucket, node_type * pNode )
+            {
+                assert( nBucket < capacity() );
+                assert( bucket(nBucket) == null_ptr<node_type *>() );
+
+                m_Table[ nBucket ].store( pNode, memory_model::memory_order_release );
+            }
+
+            /// Returns the capacity of the bucket table
+            size_t capacity() const
+            {
+                return m_nCapacity;
+            }
+
+            /// Returns the load factor, i.e. average count of items per bucket
+            size_t load_factor() const
+            {
+                return m_nLoadFactor;
+            }
+        };
+
+        /// Expandable bucket table
+        /**
+            This bucket table can dynamically grow its capacity when necessary
+            up to maximum bucket count.
+
+            Template parameter:
+            - \p GC - garbage collector used
+            - \p Node - node type, must be an instantiation of \ref node template
+            - \p Options... - options
+
+            \p Options are:
+            - \p opt::allocator - allocator used to allocate bucket table. Default is \ref CDS_DEFAULT_ALLOCATOR
+            - \p opt::memory_model - memory model used. Possible types are opt::v::sequential_consistent, opt::v::relaxed_ordering
+        */
+        template <typename GC, typename Node, CDS_DECL_OPTIONS2>
+        class expandable_bucket_table
+        {
+            //@cond
+            struct default_options
+            {
+                typedef CDS_DEFAULT_ALLOCATOR       allocator;
+                typedef opt::v::relaxed_ordering    memory_model;
+            };
+            typedef typename opt::make_options< default_options, CDS_OPTIONS2 >::type   options;
+            //@endcond
+        public:
+            typedef GC      gc          ;   ///< Garbage collector
+            typedef Node    node_type   ;   ///< Bucket node type
+            typedef CDS_ATOMIC::atomic<node_type *> table_entry ;   ///< Table entry type
+
+            /// Memory model for atomic operations
+            typedef typename options::memory_model     memory_model;
+
+        protected:
+            typedef CDS_ATOMIC::atomic<table_entry *>   segment_type    ;   ///< Bucket table segment type
+
+        public:
+            /// Bucket table allocator
+            typedef cds::details::Allocator< segment_type, typename options::allocator >  bucket_table_allocator;
+
+            /// Bucket table segment allocator
+            typedef cds::details::Allocator< table_entry, typename options::allocator >  segment_allocator;
+
+        protected:
+            /// Bucket table metrics
+            struct metrics {
+                size_t    nSegmentCount     ;    ///< max count of segments in bucket table
+                size_t    nSegmentSize      ;    ///< the segment's capacity. The capacity must be power of two.
+                size_t    nSegmentSizeLog2  ;    ///< log2( m_nSegmentSize )
+                size_t    nLoadFactor       ;    ///< load factor
+                size_t    nCapacity         ;    ///< max capacity of bucket table
+
+                metrics()
+                    : nSegmentCount(1024)
+                    , nSegmentSize(512)
+                    , nSegmentSizeLog2( cds::beans::log2( nSegmentSize ) )
+                    , nLoadFactor(1)
+                    , nCapacity( nSegmentCount * nSegmentSize )
+                {}
+            };
+
+            const metrics   m_metrics   ;    ///< Dynamic bucket table metrics
+
+        protected:
+            //const size_t   m_nLoadFactor;    ///< load factor (average count of items per bucket)
+            //const size_t   m_nCapacity  ;    ///< Bucket table capacity
+            segment_type * m_Segments   ;    ///< bucket table - array of segments
+
+        protected:
+            //@cond
+            metrics calc_metrics( size_t nItemCount, size_t nLoadFactor )
+            {
+                metrics m;
+
+                // Calculate m_nSegmentSize and m_nSegmentCount  by nItemCount
+                m.nLoadFactor = nLoadFactor > 0 ? nLoadFactor : 1;
+
+                size_t nBucketCount = (size_t)( ((float) nItemCount) / m.nLoadFactor );
+                if ( nBucketCount <= 2 ) {
+                    m.nSegmentCount = 1;
+                    m.nSegmentSize = 2;
+                }
+                else if ( nBucketCount <= 1024 ) {
+                    m.nSegmentCount = 1;
+                    m.nSegmentSize = ((size_t) 1) << beans::log2ceil( nBucketCount );
+                }
+                else {
+                    nBucketCount = beans::log2ceil( nBucketCount );
+                    m.nSegmentCount =
+                        m.nSegmentSize = ((size_t) 1) << ( nBucketCount / 2 );
+                    if ( nBucketCount & 1 )
+                        m.nSegmentSize *= 2;
+                    if ( m.nSegmentCount * m.nSegmentSize * m.nLoadFactor < nItemCount )
+                        m.nSegmentSize *= 2;
+                }
+                m.nCapacity = m.nSegmentCount * m.nSegmentSize;
+                m.nSegmentSizeLog2 = cds::beans::log2( m.nSegmentSize );
+                assert( m.nSegmentSizeLog2 != 0 )   ;   //
+                return m;
+            }
+
+            segment_type * allocate_table()
+            {
+                return bucket_table_allocator().NewArray( m_metrics.nSegmentCount, null_ptr<table_entry *>() );
+            }
+
+            void destroy_table( segment_type * pTable )
+            {
+                bucket_table_allocator().Delete( pTable, m_metrics.nSegmentCount );
+            }
+
+            table_entry * allocate_segment()
+            {
+                return segment_allocator().NewArray( m_metrics.nSegmentSize, null_ptr<node_type *>() );
+            }
+
+            void destroy_segment( table_entry * pSegment )
+            {
+                segment_allocator().Delete( pSegment, m_metrics.nSegmentSize );
+            }
+
+            void init_segments()
+            {
+                // m_nSegmentSize must be 2**N
+                assert( cds::beans::is_power2( m_metrics.nSegmentSize ));
+                assert( ( ((size_t) 1) << m_metrics.nSegmentSizeLog2) == m_metrics.nSegmentSize );
+
+                // m_nSegmentCount must be 2**K
+                assert( cds::beans::is_power2( m_metrics.nSegmentCount ));
+
+                m_Segments = allocate_table();
+            }
+
+            //@endcond
+
+        public:
+            /// Constructs bucket table for 512K buckets. Load factor is 1.
+            expandable_bucket_table()
+                : m_metrics( calc_metrics( 512 * 1024, 1 ))
+            {
+                init_segments();
+            }
+
+            /// Constructs
+            expandable_bucket_table(
+                size_t nItemCount,        ///< Max expected item count in split-ordered list
+                size_t nLoadFactor        ///< Load factor
+                )
+                : m_metrics( calc_metrics( nItemCount, nLoadFactor ))
+            {
+                init_segments();
+            }
+
+            /// Destroy bucket table
+            ~expandable_bucket_table()
+            {
+                segment_type * pSegments = m_Segments;
+                for ( size_t i = 0; i < m_metrics.nSegmentCount; ++i ) {
+                    table_entry * pEntry = pSegments[i].load(memory_model::memory_order_relaxed);
+                    if ( pEntry != null_ptr<table_entry *>() )
+                        destroy_segment( pEntry );
+                }
+                destroy_table( pSegments );
+            }
+
+            /// Returns head node of the bucket \p nBucket
+            node_type * bucket( size_t nBucket ) const
+            {
+                size_t nSegment = nBucket >> m_metrics.nSegmentSizeLog2;
+                assert( nSegment < m_metrics.nSegmentCount );
+
+                table_entry * pSegment = m_Segments[ nSegment ].load(memory_model::memory_order_acquire);
+                if ( pSegment == null_ptr<table_entry *>() )
+                    return null_ptr<node_type *>() ;    // uninitialized bucket
+                return pSegment[ nBucket & (m_metrics.nSegmentSize - 1) ].load(memory_model::memory_order_acquire);
+            }
+
+            /// Set head node \p pNode of bucket \p nBucket
+            void bucket( size_t nBucket, node_type * pNode )
+            {
+                size_t nSegment = nBucket >> m_metrics.nSegmentSizeLog2;
+                assert( nSegment < m_metrics.nSegmentCount );
+
+                segment_type& segment = m_Segments[nSegment];
+                if ( segment.load(memory_model::memory_order_relaxed) == null_ptr<table_entry *>() ) {
+                    table_entry * pNewSegment = allocate_segment();
+                    table_entry * pNull = null_ptr<table_entry *>();
+                    if ( !segment.compare_exchange_strong( pNull, pNewSegment, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) {
+                        destroy_segment( pNewSegment );
+                    }
+                }
+                segment.load(memory_model::memory_order_acquire)[ nBucket & (m_metrics.nSegmentSize - 1) ].store( pNode, memory_model::memory_order_release );
+            }
+
+            /// Returns the capacity of the bucket table
+            size_t capacity() const
+            {
+                return m_metrics.nCapacity;
+            }
+
+            /// Returns the load factor, i.e. average count of items per bucket
+            size_t load_factor() const
+            {
+                return m_metrics.nLoadFactor;
+            }
+        };
+
+        /// Split-list node traits
+        /**
+            This traits is intended for converting between underlying ordered list node type
+            and split-list node type
+
+            Template parameter:
+            - \p BaseNodeTraits - node traits of base ordered list type
+        */
+        template <class BaseNodeTraits>
+        struct node_traits: private BaseNodeTraits
+        {
+            typedef BaseNodeTraits base_class ;     ///< Base ordered list type
+            typedef typename base_class::value_type value_type      ;   ///< Value type
+            typedef typename base_class::node_type  base_node_type  ;   ///< Ordered list node type
+            typedef node<base_node_type>            node_type       ;   ///< Spit-list node type
+
+            /// Convert value reference to node pointer
+            static node_type * to_node_ptr( value_type& v )
+            {
+                return static_cast<node_type *>( base_class::to_node_ptr( v ) );
+            }
+
+            /// Convert value pointer to node pointer
+            static node_type * to_node_ptr( value_type * v )
+            {
+                return static_cast<node_type *>( base_class::to_node_ptr( v ) );
+            }
+
+            /// Convert value reference to node pointer (const version)
+            static node_type const * to_node_ptr( value_type const& v )
+            {
+                return static_cast<node_type const*>( base_class::to_node_ptr( v ) );
+            }
+
+            /// Convert value pointer to node pointer (const version)
+            static node_type const * to_node_ptr( value_type const * v )
+            {
+                return static_cast<node_type const *>( base_class::to_node_ptr( v ) );
+            }
+
+            /// Convert node refernce to value pointer
+            static value_type * to_value_ptr( node_type&  n )
+            {
+                return base_class::to_value_ptr( static_cast<base_node_type &>( n ) );
+            }
+
+            /// Convert node pointer to value pointer
+            static value_type * to_value_ptr( node_type *  n )
+            {
+                return base_class::to_value_ptr( static_cast<base_node_type *>( n ) );
+            }
+
+            /// Convert node reference to value pointer (const version)
+            static const value_type * to_value_ptr( node_type const & n )
+            {
+                return base_class::to_value_ptr( static_cast<base_node_type const &>( n ) );
+            }
+
+            /// Convert node pointer to value pointer (const version)
+            static const value_type * to_value_ptr( node_type const * n )
+            {
+                return base_class::to_value_ptr( static_cast<base_node_type const *>( n ) );
+            }
+        };
+
+
+        //@cond
+        namespace details {
+            template <bool Value, typename GC, typename Node, CDS_DECL_OPTIONS2>
+            struct bucket_table_selector;
+
+            template <typename GC, typename Node, CDS_SPEC_OPTIONS2>
+            struct bucket_table_selector< true, GC, Node, CDS_OPTIONS2>
+            {
+                typedef expandable_bucket_table<GC, Node, CDS_OPTIONS2>    type;
+            };
+
+            template <typename GC, typename Node, CDS_SPEC_OPTIONS2>
+            struct bucket_table_selector< false, GC, Node, CDS_OPTIONS2>
+            {
+                typedef static_bucket_table<GC, Node, CDS_OPTIONS2>    type;
+            };
+
+            template <typename GC, class Alloc >
+            struct dummy_node_disposer {
+                template <typename Node>
+                void operator()( Node * p )
+                {
+                    typedef cds::details::Allocator< Node, Alloc >  node_deallocator;
+                    node_deallocator().Delete( p );
+                }
+            };
+
+            template <typename Q>
+            struct search_value_type
+            {
+                Q&      val;
+                size_t  nHash;
+
+                search_value_type( Q& v, size_t h )
+                    : val( v )
+                    , nHash( h )
+                {}
+                /*
+                operator Q&() const
+                {
+                    return val;
+                }
+                */
+            };
+
+#       ifndef CDS_CXX11_LAMBDA_SUPPORT
+            template <typename Func>
+            class find_functor_wrapper: protected cds::details::functor_wrapper<Func>
+            {
+                typedef cds::details::functor_wrapper<Func> base_class;
+            public:
+                find_functor_wrapper( Func f )
+                    : base_class( f )
+                {}
+
+                template <typename ValueType, typename Q>
+                void operator()( ValueType& item, split_list::details::search_value_type<Q>& val )
+                {
+                    base_class::get()( item, val.val );
+                }
+            };
+#       endif
+
+            template <class OrderedList, class Options>
+            class rebind_list_options
+            {
+                typedef OrderedList native_ordered_list;
+                typedef Options     options;
+
+                typedef typename native_ordered_list::gc                gc;
+                typedef typename native_ordered_list::key_comparator    native_key_comparator;
+                typedef typename native_ordered_list::node_type         node_type;
+                typedef typename native_ordered_list::value_type        value_type;
+                typedef typename native_ordered_list::node_traits       node_traits;
+                typedef typename native_ordered_list::disposer          native_disposer;
+
+                typedef split_list::node<node_type>                     splitlist_node_type;
+
+                struct key_compare {
+                    int operator()( value_type const& v1, value_type const& v2 ) const
+                    {
+                        splitlist_node_type const * n1 = static_cast<splitlist_node_type const *>( node_traits::to_node_ptr( v1 ));
+                        splitlist_node_type const * n2 = static_cast<splitlist_node_type const *>( node_traits::to_node_ptr( v2 ));
+                        if ( n1->m_nHash != n2->m_nHash )
+                            return n1->m_nHash < n2->m_nHash ? -1 : 1;
+
+                        if ( n1->is_dummy() ) {
+                            assert( n2->is_dummy() );
+                            return 0;
+                        }
+
+                        assert( !n1->is_dummy() && !n2->is_dummy() );
+
+                        return native_key_comparator()( v1, v2 );
+                    }
+
+                    template <typename Q>
+                    int operator()( value_type const& v, search_value_type<Q> const& q ) const
+                    {
+                        splitlist_node_type const * n = static_cast<splitlist_node_type const *>( node_traits::to_node_ptr( v ));
+                        if ( n->m_nHash != q.nHash )
+                            return n->m_nHash < q.nHash ? -1 : 1;
+
+                        assert( !n->is_dummy() );
+                        return native_key_comparator()( v, q.val );
+                    }
+
+                    template <typename Q>
+                    int operator()( search_value_type<Q> const& q, value_type const& v ) const
+                    {
+                        return -operator()( v, q );
+                    }
+                };
+
+                struct wrapped_disposer
+                {
+                    void operator()( value_type * v )
+                    {
+                        splitlist_node_type * p = static_cast<splitlist_node_type *>( node_traits::to_node_ptr( v ));
+                        if ( p->is_dummy() )
+                            dummy_node_disposer<gc, typename options::allocator>()( p );
+                        else
+                            native_disposer()( v );
+                    }
+                };
+
+            public:
+                template <typename Less>
+                struct make_compare_from_less: public cds::opt::details::make_comparator_from_less<Less>
+                {
+                    typedef cds::opt::details::make_comparator_from_less<Less>  base_class;
+
+                    template <typename Q>
+                    int operator()( value_type const& v, search_value_type<Q> const& q ) const
+                    {
+                        splitlist_node_type const * n = static_cast<splitlist_node_type const *>( node_traits::to_node_ptr( v ));
+                        if ( n->m_nHash != q.nHash )
+                            return n->m_nHash < q.nHash ? -1 : 1;
+
+                        assert( !n->is_dummy() );
+                        return base_class()( v, q.val );
+                    }
+
+                    template <typename Q>
+                    int operator()( search_value_type<Q> const& q, value_type const& v ) const
+                    {
+                        splitlist_node_type const * n = static_cast<splitlist_node_type const *>( node_traits::to_node_ptr( v ));
+                        if ( n->m_nHash != q.nHash )
+                            return q.nHash < n->m_nHash ? -1 : 1;
+
+                        assert( !n->is_dummy() );
+                        return base_class()( q.val, v );
+                    }
+
+                    template <typename Q1, typename Q2>
+                    int operator()( Q1 const& v1, Q2 const& v2 ) const
+                    {
+                        return base_class()( v1, v2 );
+                    }
+                };
+
+                typedef typename native_ordered_list::template rebind_options<
+                    opt::compare< key_compare >
+                    ,opt::disposer< wrapped_disposer >
+                    ,opt::boundary_node_type< splitlist_node_type >
+                >::type    result;
+            };
+
+            template <typename OrderedList, bool IsConst>
+            struct select_list_iterator;
+
+            template <typename OrderedList>
+            struct select_list_iterator<OrderedList, false>
+            {
+                typedef typename OrderedList::iterator  type;
+            };
+
+            template <typename OrderedList>
+            struct select_list_iterator<OrderedList, true>
+            {
+                typedef typename OrderedList::const_iterator  type;
+            };
+
+            template <typename NodeTraits, typename OrderedList, bool IsConst>
+            class iterator_type
+            {
+                typedef OrderedList     ordered_list_type;
+            protected:
+                typedef typename select_list_iterator<ordered_list_type, IsConst>::type    list_iterator;
+                typedef NodeTraits      node_traits;
+
+            private:
+                list_iterator   m_itCur;
+                list_iterator   m_itEnd;
+
+            public:
+                typedef typename list_iterator::value_ptr   value_ptr;
+                typedef typename list_iterator::value_ref   value_ref;
+
+            public:
+                iterator_type()
+                {}
+
+                iterator_type( iterator_type const& src )
+                    : m_itCur( src.m_itCur )
+                    , m_itEnd( src.m_itEnd )
+                {}
+
+                // This ctor should be protected...
+                iterator_type( list_iterator itCur, list_iterator itEnd )
+                    : m_itCur( itCur )
+                    , m_itEnd( itEnd )
+                {
+                    // skip dummy nodes
+                    while ( m_itCur != m_itEnd && node_traits::to_node_ptr( *m_itCur )->is_dummy() )
+                        ++m_itCur;
+                }
+
+
+                value_ptr operator ->() const
+                {
+                    return m_itCur.operator->();
+                }
+
+                value_ref operator *() const
+                {
+                    return m_itCur.operator*();
+                }
+
+                /// Pre-increment
+                iterator_type& operator ++()
+                {
+                    if ( m_itCur != m_itEnd ) {
+                        do {
+                            ++m_itCur;
+                        } while ( m_itCur != m_itEnd && node_traits::to_node_ptr( *m_itCur )->is_dummy() );
+                    }
+                    return *this;
+                }
+
+                iterator_type& operator = (iterator_type const& src)
+                {
+                    m_itCur = src.m_itCur;
+                    m_itEnd = src.m_itEnd;
+                    return *this;
+                }
+
+                template <bool C>
+                bool operator ==(iterator_type<node_traits, ordered_list_type, C> const& i ) const
+                {
+                    return m_itCur == i.m_itCur;
+                }
+                template <bool C>
+                bool operator !=(iterator_type<node_traits, ordered_list_type, C> const& i ) const
+                {
+                    return m_itCur != i.m_itCur;
+                }
+            };
+
+
+        }   // namespace details
+        //@endcond
+
+        //@cond
+        // Helper functions
+
+        /// Reverses bit order in \p nHash
+        static inline size_t reverse_bits( size_t nHash )
+        {
+            return bitop::RBO( nHash );
+        }
+
+        static inline size_t regular_hash( size_t nHash )
+        {
+            return reverse_bits( nHash ) | size_t(1);
+        }
+
+        static inline size_t dummy_hash( size_t nHash )
+        {
+            return reverse_bits( nHash ) & ~size_t(1);
+        }
+        //@endcond
+
+    }   // namespace split_list
+
+    //@cond
+    // Forward declaration
+    template <class GC, class OrderedList, class Traits = split_list::type_traits>
+    class SplitListSet;
+    //@endcond
+
+}}  // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_SPLIT_LIST_BASE_H
diff --git a/cds/intrusive/split_list_nogc.h b/cds/intrusive/split_list_nogc.h
new file mode 100644 (file)
index 0000000..a5b5457
--- /dev/null
@@ -0,0 +1,624 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SPLIT_LIST_NOGC_H
+#define __CDS_INTRUSIVE_SPLIT_LIST_NOGC_H
+
+#include <cds/intrusive/split_list_base.h>
+#include <cds/gc/nogc.h>
+
+namespace cds { namespace intrusive {
+
+    /// Split-ordered list (template specialization for gc::nogc)
+    /** @ingroup cds_intrusive_map
+        \anchor cds_intrusive_SplitListSet_nogc
+
+        This specialization is intended for so-called persistent usage when no item
+        reclamation may be performed. The class does not support deleting of list item.
+
+        See \ref cds_intrusive_SplitListSet_hp "SplitListSet" for description of template parameters.
+        The template parameter \p OrderedList should be any gc::nogc-derived ordered list, for example,
+        \ref cds_intrusive_MichaelList_nogc "persistent MichaelList",
+        \ref cds_intrusive_LazyList_nogc "persistent LazyList"
+
+        The interface of the specialization is a slightly different.
+    */
+    template <
+        class OrderedList,
+#ifdef CDS_DOXYGEN_INVOKED
+        class Traits = split_list::type_traits
+#else
+        class Traits
+#endif
+    >
+    class SplitListSet< gc::nogc, OrderedList, Traits >
+    {
+    public:
+        typedef Traits          options ;   ///< Traits template parameters
+        typedef gc::nogc        gc      ;   ///< Garbage collector
+
+        /// Hash functor for \ref value_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+
+    protected:
+        //@cond
+        typedef split_list::details::rebind_list_options<OrderedList, options> wrapped_ordered_list;
+        //@endcond
+
+    public:
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef OrderedList         ordered_list    ;   ///< type of ordered list used as base for split-list
+#   else
+        typedef typename wrapped_ordered_list::result    ordered_list;
+#   endif
+        typedef typename ordered_list::value_type   value_type  ;   ///< type of value stored in the split-list
+        typedef typename ordered_list::key_comparator    key_comparator  ;   ///< key comparison functor
+        typedef typename ordered_list::disposer disposer        ;   ///< Node disposer functor
+
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+        typedef typename options::back_off              back_off        ;   ///< back-off strategy for spinning
+        typedef typename options::memory_model          memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        typedef typename ordered_list::node_type    list_node_type      ;   ///< Node type as declared in ordered list
+        typedef split_list::node<list_node_type>    node_type           ;   ///< split-list node type
+        typedef node_type                           dummy_node_type     ;   ///< dummy node type
+
+        /// Split-list node traits
+        /**
+            This traits is intended for converting between underlying ordered list node type \ref list_node_type
+            and split-list node type \ref node_type
+        */
+        typedef split_list::node_traits<typename ordered_list::node_traits>  node_traits;
+
+        //@cond
+        /// Bucket table implementation
+        typedef typename split_list::details::bucket_table_selector<
+            options::dynamic_bucket_table
+            , gc
+            , dummy_node_type
+            , opt::allocator< typename options::allocator >
+            , opt::memory_model< memory_model >
+        >::type bucket_table;
+
+        typedef typename ordered_list::iterator list_iterator;
+        typedef typename ordered_list::const_iterator list_const_iterator;
+        //@endcond
+
+    protected:
+        //@cond
+        /// Ordered list wrapper to access protected members
+        class ordered_list_wrapper: public ordered_list
+        {
+            typedef ordered_list base_class;
+            typedef typename base_class::auxiliary_head       bucket_head_type;
+
+        public:
+            list_iterator insert_at_( dummy_node_type * pHead, value_type& val )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(static_cast<list_node_type *>(pHead));
+                return base_class::insert_at_( h, val );
+            }
+
+            template <typename Func>
+            std::pair<list_iterator, bool> ensure_at_( dummy_node_type * pHead, value_type& val, Func func )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(static_cast<list_node_type *>(pHead));
+                return base_class::ensure_at_( h, val, func );
+            }
+
+            template <typename Q, typename Compare, typename Func>
+            bool find_at( dummy_node_type * pHead, split_list::details::search_value_type<Q>& val, Compare cmp, Func f )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(static_cast<list_node_type *>(pHead));
+                return base_class::find_at( h, val, cmp, f );
+            }
+
+            template <typename Q, typename Compare>
+            list_iterator find_at_( dummy_node_type * pHead, split_list::details::search_value_type<Q> const & val, Compare cmp )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(static_cast<list_node_type *>(pHead));
+                return base_class::find_at_( h, val, cmp );
+            }
+
+            bool insert_aux_node( dummy_node_type * pNode )
+            {
+                return base_class::insert_aux_node( pNode );
+            }
+            bool insert_aux_node( dummy_node_type * pHead, dummy_node_type * pNode )
+            {
+                bucket_head_type h(static_cast<list_node_type *>(pHead));
+                return base_class::insert_aux_node( h, pNode );
+            }
+        };
+
+        //@endcond
+
+    protected:
+        ordered_list_wrapper    m_List              ;   ///< Ordered list containing split-list items
+        bucket_table            m_Buckets           ;   ///< bucket table
+        CDS_ATOMIC::atomic<size_t>  m_nBucketCountLog2  ;   ///< log2( current bucket count )
+        item_counter            m_ItemCounter       ;   ///< Item counter
+        hash                    m_HashFunctor       ;   ///< Hash functor
+
+    protected:
+        //@cond
+        typedef cds::details::Allocator< dummy_node_type, typename options::allocator >   dummy_node_allocator;
+        static dummy_node_type * alloc_dummy_node( size_t nHash )
+        {
+            return dummy_node_allocator().New( nHash );
+        }
+        static void free_dummy_node( dummy_node_type * p )
+        {
+            dummy_node_allocator().Delete( p );
+        }
+
+        /// Calculates hash value of \p key
+        template <typename Q>
+        size_t hash_value( Q const& key ) const
+        {
+            return m_HashFunctor( key );
+        }
+
+        size_t bucket_no( size_t nHash ) const
+        {
+            return nHash & ( (1 << m_nBucketCountLog2.load(CDS_ATOMIC::memory_order_relaxed)) - 1 );
+        }
+
+        static size_t parent_bucket( size_t nBucket )
+        {
+            assert( nBucket > 0 );
+            return nBucket & ~( 1 << bitop::MSBnz( nBucket ) );
+        }
+
+        dummy_node_type * init_bucket( size_t nBucket )
+        {
+            assert( nBucket > 0 );
+            size_t nParent = parent_bucket( nBucket );
+
+            dummy_node_type * pParentBucket = m_Buckets.bucket( nParent );
+            if ( pParentBucket == null_ptr<dummy_node_type *>() ) {
+                pParentBucket = init_bucket( nParent );
+            }
+
+            assert( pParentBucket != null_ptr<dummy_node_type *>() );
+
+            // Allocate a dummy node for new bucket
+            {
+                dummy_node_type * pBucket = alloc_dummy_node( split_list::dummy_hash( nBucket ) );
+                if ( m_List.insert_aux_node( pParentBucket, pBucket ) ) {
+                    m_Buckets.bucket( nBucket, pBucket );
+                    return pBucket;
+                }
+                free_dummy_node( pBucket );
+            }
+
+            // Another thread set the bucket. Wait while it done
+
+            // In this point, we must wait while nBucket is empty.
+            // The compiler can decide that waiting loop can be "optimized" (stripped)
+            // To prevent this situation, we use waiting on volatile bucket_head_ptr pointer.
+            //
+            back_off bkoff;
+            while ( true ) {
+                dummy_node_type volatile * p = m_Buckets.bucket( nBucket );
+                if ( p && p != null_ptr<dummy_node_type volatile *>() )
+                    return const_cast<dummy_node_type *>( p );
+                bkoff();
+            }
+        }
+
+        dummy_node_type * get_bucket( size_t nHash )
+        {
+            size_t nBucket = bucket_no( nHash );
+
+            dummy_node_type * pHead = m_Buckets.bucket( nBucket );
+            if ( pHead == null_ptr<dummy_node_type *>() )
+                pHead = init_bucket( nBucket );
+
+            assert( pHead->is_dummy() );
+
+            return pHead;
+        }
+
+        void init()
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename ordered_list::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ), "atomicity::empty_item_counter is not allowed as a item counter");
+
+            // Initialize bucket 0
+            dummy_node_type * pNode = alloc_dummy_node( 0 /*split_list::dummy_hash(0)*/ );
+
+            // insert_aux_node cannot return false for empty list
+            CDS_VERIFY( m_List.insert_aux_node( pNode ));
+
+            m_Buckets.bucket( 0, pNode );
+        }
+
+        void    inc_item_count()
+        {
+            size_t sz = m_nBucketCountLog2.load(CDS_ATOMIC::memory_order_relaxed);
+            if ( ( ++m_ItemCounter >> sz ) > m_Buckets.load_factor() && ((size_t)(1 << sz )) < m_Buckets.capacity() )
+            {
+                m_nBucketCountLog2.compare_exchange_strong( sz, sz + 1, CDS_ATOMIC::memory_order_seq_cst, CDS_ATOMIC::memory_order_relaxed );
+            }
+        }
+
+        //@endcond
+
+    public:
+        /// Initialize split-ordered list of default capacity
+        /**
+            The default capacity is defined in bucket table constructor.
+            See split_list::expandable_bucket_table, split_list::static_ducket_table
+            which selects by split_list::dynamic_bucket_table option.
+        */
+        SplitListSet()
+            : m_nBucketCountLog2(1)
+        {
+            init();
+        }
+
+        /// Initialize split-ordered list
+        SplitListSet(
+            size_t nItemCount           ///< estimate average of item count
+            , size_t nLoadFactor = 1    ///< load factor - average item count per bucket. Small integer up to 10, default is 1.
+            )
+            : m_Buckets( nItemCount, nLoadFactor )
+            , m_nBucketCountLog2(1)
+        {
+            init();
+        }
+
+    public:
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            return insert_( val ) != end();
+        }
+
+        /// Ensures that the \p item exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the set, then \p val is inserted into the set.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+            struct ensure_functor {
+                void operator()( bool bNew, value_type& item, value_type& val );
+            };
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refers to the same thing.
+
+            The functor can change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with given key
+            already is in the set.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            std::pair<iterator, bool> ret = ensure_( val, func );
+            return std::make_pair( ret.first != end(), ret.second );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SplitListSet_nogc_find_val
+            The function searches the item with key equal to \p val
+            and returns pointer to item found or , and \p NULL otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        value_type * find( Q const & val )
+        {
+            iterator it = find_( val );
+            if ( it == end() )
+                return null_ptr<value_type *>();
+            return &*it;
+        }
+
+        /// Finds the key \p val with \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_nogc_find_val "find(Q const&)"
+            but \p cmp is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p cmp must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        value_type * find_with( Q const& val, Less pred )
+        {
+            iterator it = find_with_( val, pred );
+            if ( it == end() )
+                return null_ptr<value_type *>();
+            return &*it;
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SplitListSet_nogc_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_( val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val with \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_nogc_find_func "find(Q&, Func)"
+            but \p cmp is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p cmp must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>(), f );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_SplitListSet_nogc_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_( val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val with \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_nogc_find_cfunc "find(Q const&, Func)"
+            but \p cmp is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p cmp must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>(), f );
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+            Thus, the correct item counting feature is an important part of split-list implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type
+            :public split_list::details::iterator_type<node_traits, ordered_list, IsConst>
+        {
+            typedef split_list::details::iterator_type<node_traits, ordered_list, IsConst> iterator_base_class;
+            typedef typename iterator_base_class::list_iterator list_iterator;
+        public:
+            iterator_type()
+                : iterator_base_class()
+            {}
+
+            iterator_type( iterator_type const& src )
+                : iterator_base_class( src )
+            {}
+
+            // This ctor should be protected...
+            iterator_type( list_iterator itCur, list_iterator itEnd )
+                : iterator_base_class( itCur, itEnd )
+            {}
+        };
+        //@endcond
+
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for a split-list has some features:
+            - it has no post-increment operator
+            - it depends on iterator of underlying \p OrderedList
+        */
+        typedef iterator_type<false>    iterator;
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a split-list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_List.begin(), m_List.end() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a split-list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+
+            The returned value can be used only to control reaching the end of the split-list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_List.end(), m_List.end() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a split-list
+        //@{
+        const_iterator begin() const
+        {
+            return const_iterator( m_List.begin(), m_List.end() );
+        }
+        const_iterator cbegin()
+        {
+            return const_iterator( m_List.cbegin(), m_List.cend() );
+        }
+        //@}
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a split-list
+        //@{
+        const_iterator end() const
+        {
+            return const_iterator( m_List.end(), m_List.end() );
+        }
+        const_iterator cend()
+        {
+            return const_iterator( m_List.cend(), m_List.cend() );
+        }
+        //@}
+
+    protected:
+        //@cond
+        iterator insert_( value_type& val )
+        {
+            size_t nHash = hash_value( val );
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            node_traits::to_node_ptr( val )->m_nHash = split_list::regular_hash( nHash );
+
+            list_iterator it = m_List.insert_at_( pHead, val );
+            if ( it != m_List.end() ) {
+                inc_item_count();
+                return iterator( it, m_List.end() );
+            }
+            return end();
+        }
+
+        template <typename Func>
+        std::pair<iterator, bool> ensure_( value_type& val, Func func )
+        {
+            size_t nHash = hash_value( val );
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            node_traits::to_node_ptr( val )->m_nHash = split_list::regular_hash( nHash );
+
+            std::pair<list_iterator, bool> ret = m_List.ensure_at_( pHead, val, func );
+            if ( ret.first != m_List.end() ) {
+                if ( ret.second )
+                    inc_item_count();
+                return std::make_pair( iterator(ret.first, m_List.end()), ret.second );
+            }
+            return std::make_pair( end(), ret.second );
+        }
+
+        template <typename Q, typename Less >
+        iterator find_with_( Q const& val, Less pred )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            return iterator( m_List.find_at_( pHead, sv, typename wrapped_ordered_list::template make_compare_from_less<Less>() ), m_List.end() );
+        }
+
+        template <typename Q>
+        iterator find_( Q const& val )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            return iterator( m_List.find_at_( pHead, sv, key_comparator() ), m_List.end() );
+
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_( Q& val, Compare cmp, Func f )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return m_List.find_at( pHead, sv, cmp,
+                [&f](value_type& item, split_list::details::search_value_type<Q>& val){ cds::unref(f)(item, val.val ); });
+#       else
+            split_list::details::find_functor_wrapper<Func> ffw( f );
+            return m_List.find_at( pHead, sv, cmp, cds::ref(ffw) );
+#       endif
+        }
+
+        //@endcond
+    };
+
+}} // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_SPLIT_LIST_NOGC_H
diff --git a/cds/intrusive/split_list_rcu.h b/cds/intrusive/split_list_rcu.h
new file mode 100644 (file)
index 0000000..2d655c1
--- /dev/null
@@ -0,0 +1,1011 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_SPLIT_LIST_RCU_H
+#define __CDS_INTRUSIVE_SPLIT_LIST_RCU_H
+
+#include <cds/intrusive/split_list_base.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+namespace cds { namespace intrusive {
+
+    /// Split-ordered list RCU specialization
+    /** @ingroup cds_intrusive_map
+        \anchor cds_intrusive_SplitListSet_rcu
+
+        Hash table implementation based on split-ordered list algorithm discovered by Ori Shalev and Nir Shavit, see
+        - [2003] Ori Shalev, Nir Shavit "Split-Ordered Lists - Lock-free Resizable Hash Tables"
+        - [2008] Nir Shavit "The Art of Multiprocessor Programming"
+
+        The split-ordered list is a lock-free implementation of an extensible unbounded hash table. It uses original
+        recursive split-ordering algorithm discovered by Ori Shalev and Nir Shavit that allows to split buckets
+        without moving an item on resizing, see \ref cds_SplitList_algo_desc "short algo description".
+
+        <b>Implementation</b>
+
+        Template parameters are:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p OrderedList - ordered list implementation used as bucket for hash set, for example, MichaelList, LazyList.
+            The intrusive ordered list implementation specifies the type \p T stored in the hash-set,
+            the comparing functor for the type \p T and other features specific for the ordered list.
+        - \p Traits - type traits. See split_list::type_traits for explanation.
+            Instead of defining \p Traits struct you may use option-based syntax with split_list::make_traits metafunction.
+
+        @note About features of hash functor needed for \p %SplitList see \ref cds_SplitList_hash_functor "SplitList general description".
+
+        \par How to use
+        Before including <tt><cds/intrusive/split_list_rcu.h></tt> you should include appropriate RCU header file,
+        see \ref cds_urcu_gc "RCU type" for list of existing RCU class and corresponding header files.
+        For example, for \ref cds_urcu_general_buffered_gc "general-purpose buffered RCU" and
+        MichaelList-based split-list you should include:
+        \code
+        #include <cds/urcu/general_buffered.h>
+        #include <cds/intrusive/michael_list_rcu.h>
+        #include <cds/intrusive/split_list_rcu.h>
+
+        // Declare Michael's list for type Foo and default traits:
+        typedef cds::intrusive::MichaelList< cds::urcu::gc< cds::urcu::general_buffered<> >, Foo > rcu_michael_list;
+
+        // Declare split-list based on rcu_michael_list
+        typedef cds::intrusive::SplitListSet< cds::urcu::gc< cds::urcu::general_buffered<> >, rcu_michael_list > rcu_split_list;
+        \endcode
+
+    */
+    template <
+        class RCU,
+        class OrderedList,
+#   ifdef CDS_DOXYGEN_INVOKED
+        class Traits = split_list::type_traits
+#   else
+        class Traits
+#   endif
+    >
+    class SplitListSet< cds::urcu::gc< RCU >, OrderedList, Traits >
+    {
+    public:
+        typedef Traits               options ;   ///< Traits template parameters
+        typedef cds::urcu::gc< RCU > gc      ;   ///< RCU garbage collector
+
+        /// Hash functor for \ref value_type and all its derivatives that you use
+        typedef typename cds::opt::v::hash_selector< typename options::hash >::type   hash;
+
+    protected:
+        //@cond
+        typedef split_list::details::rebind_list_options<OrderedList, options> wrapped_ordered_list;
+        //@endcond
+
+    public:
+#   ifdef CDS_DOXYGEN_INVOKED
+        typedef OrderedList         ordered_list    ;   ///< type of ordered list used as base for split-list
+#   else
+        typedef typename wrapped_ordered_list::result    ordered_list;
+#   endif
+        typedef typename ordered_list::value_type       value_type      ;   ///< type of value stored in the split-list
+        typedef typename ordered_list::key_comparator   key_comparator  ;   ///< key compare functor
+        typedef typename ordered_list::disposer         disposer        ;   ///< Node disposer functor
+        typedef typename ordered_list::rcu_lock         rcu_lock        ;   ///< RCU scoped lock
+        typedef typename ordered_list::exempt_ptr       exempt_ptr      ;   ///< pointer to extracted node
+        /// Group of \p extract_xxx functions require external locking if underlying ordered list requires that
+        static CDS_CONSTEXPR_CONST bool c_bExtractLockExternal = ordered_list::c_bExtractLockExternal;
+
+        typedef typename options::item_counter          item_counter    ;   ///< Item counter type
+        typedef typename options::back_off              back_off        ;   ///< back-off strategy for spinning
+        typedef typename options::memory_model          memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        typedef typename ordered_list::node_type    list_node_type      ;   ///< Node type as declared in ordered list
+        typedef split_list::node<list_node_type>    node_type           ;   ///< split-list node type
+        typedef node_type                           dummy_node_type     ;   ///< dummy node type
+
+        /// Split-list node traits
+        /**
+            This traits is intended for converting between underlying ordered list node type \ref list_node_type
+            and split-list node type \ref node_type
+        */
+        typedef split_list::node_traits<typename ordered_list::node_traits>  node_traits;
+
+        //@cond
+        /// Bucket table implementation
+        typedef typename split_list::details::bucket_table_selector<
+            options::dynamic_bucket_table
+            , gc
+            , dummy_node_type
+            , opt::allocator< typename options::allocator >
+            , opt::memory_model< memory_model >
+        >::type bucket_table;
+
+        //@endcond
+
+    protected:
+        //@cond
+        /// Ordered list wrapper to access protected members of OrderedList
+        class ordered_list_wrapper: public ordered_list
+        {
+            typedef ordered_list base_class;
+            typedef typename base_class::auxiliary_head       bucket_head_type;
+
+        public:
+            bool insert_at( dummy_node_type * pHead, value_type& val )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::insert_at( h, val );
+            }
+
+            template <typename Func>
+            bool insert_at( dummy_node_type * pHead, value_type& val, Func f )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::insert_at( h, val, f );
+            }
+
+            template <typename Func>
+            std::pair<bool, bool> ensure_at( dummy_node_type * pHead, value_type& val, Func func )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::ensure_at( h, val, func );
+            }
+
+            bool unlink_at( dummy_node_type * pHead, value_type& val )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::unlink_at( h, val );
+            }
+
+            template <typename Q, typename Compare, typename Func>
+            bool erase_at( dummy_node_type * pHead, split_list::details::search_value_type<Q> const& val, Compare cmp, Func f )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::erase_at( h, val, cmp, f );
+            }
+
+            template <typename Q, typename Compare>
+            bool erase_at( dummy_node_type * pHead, split_list::details::search_value_type<Q> const& val, Compare cmp )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::erase_at( h, val, cmp );
+            }
+
+            template <typename Q, typename Compare>
+            value_type * extract_at( dummy_node_type * pHead, split_list::details::search_value_type<Q>& val, Compare cmp )
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::extract_at( h, val, cmp );
+            }
+
+            template <typename Q, typename Compare, typename Func>
+            bool find_at( dummy_node_type * pHead, split_list::details::search_value_type<Q>& val, Compare cmp, Func f ) const
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::find_at( h, val, cmp, f );
+            }
+
+            template <typename Q, typename Compare>
+            bool find_at( dummy_node_type * pHead, split_list::details::search_value_type<Q> const & val, Compare cmp ) const
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::find_at( h, val, cmp );
+            }
+
+            template <typename Q, typename Compare>
+            value_type * get_at( dummy_node_type * pHead, split_list::details::search_value_type<Q>& val, Compare cmp ) const
+            {
+                assert( pHead != null_ptr<dummy_node_type *>() );
+                bucket_head_type h(pHead);
+                return base_class::get_at( h, val, cmp );
+            }
+
+            bool insert_aux_node( dummy_node_type * pNode )
+            {
+                return base_class::insert_aux_node( pNode );
+            }
+            bool insert_aux_node( dummy_node_type * pHead, dummy_node_type * pNode )
+            {
+                bucket_head_type h(pHead);
+                return base_class::insert_aux_node( h, pNode );
+            }
+        };
+
+        template <typename Less>
+        struct less_wrapper: public cds::opt::details::make_comparator_from_less<Less>
+        {
+            typedef cds::opt::details::make_comparator_from_less<Less> base_wrapper;
+
+            template <typename Q1, typename Q2>
+            int operator()( split_list::details::search_value_type<Q1> const& v1, Q2 const& v2 ) const
+            {
+                return base_wrapper::operator()( v1.val, v2 );
+            }
+
+            template <typename Q1, typename Q2>
+            int operator()( Q1 const& v1, split_list::details::search_value_type<Q2> const& v2 ) const
+            {
+                return base_wrapper::operator()( v1, v2.val );
+            }
+        };
+        //@endcond
+
+    protected:
+        ordered_list_wrapper    m_List              ;   ///< Ordered list containing split-list items
+        bucket_table            m_Buckets           ;   ///< bucket table
+        CDS_ATOMIC::atomic<size_t> m_nBucketCountLog2  ;   ///< log2( current bucket count )
+        item_counter            m_ItemCounter       ;   ///< Item counter
+        hash                    m_HashFunctor       ;   ///< Hash functor
+
+    protected:
+        //@cond
+        typedef cds::details::Allocator< dummy_node_type, typename options::allocator >   dummy_node_allocator;
+        static dummy_node_type * alloc_dummy_node( size_t nHash )
+        {
+            return dummy_node_allocator().New( nHash );
+        }
+        static void free_dummy_node( dummy_node_type * p )
+        {
+            dummy_node_allocator().Delete( p );
+        }
+
+        /// Calculates hash value of \p key
+        template <typename Q>
+        size_t hash_value( Q const& key ) const
+        {
+            return m_HashFunctor( key );
+        }
+
+        size_t bucket_no( size_t nHash ) const
+        {
+            return nHash & ( (1 << m_nBucketCountLog2.load(CDS_ATOMIC::memory_order_relaxed)) - 1 );
+        }
+
+        static size_t parent_bucket( size_t nBucket )
+        {
+            assert( nBucket > 0 );
+            return nBucket & ~( 1 << bitop::MSBnz( nBucket ) );
+        }
+
+        dummy_node_type * init_bucket( size_t nBucket )
+        {
+            assert( nBucket > 0 );
+            size_t nParent = parent_bucket( nBucket );
+
+            dummy_node_type * pParentBucket = m_Buckets.bucket( nParent );
+            if ( pParentBucket == null_ptr<dummy_node_type *>() ) {
+                pParentBucket = init_bucket( nParent );
+            }
+
+            assert( pParentBucket != null_ptr<dummy_node_type *>() );
+
+            // Allocate a dummy node for new bucket
+            {
+                dummy_node_type * pBucket = alloc_dummy_node( split_list::dummy_hash( nBucket ) );
+                if ( m_List.insert_aux_node( pParentBucket, pBucket ) ) {
+                    m_Buckets.bucket( nBucket, pBucket );
+                    return pBucket;
+                }
+                free_dummy_node( pBucket );
+            }
+
+            // Another thread set the bucket. Wait while it done
+
+            // In this point, we must wait while nBucket is empty.
+            // The compiler can decide that waiting loop can be "optimized" (stripped)
+            // To prevent this situation, we use waiting on volatile bucket_head_ptr pointer.
+            //
+            back_off bkoff;
+            while ( true ) {
+                dummy_node_type volatile * p = m_Buckets.bucket( nBucket );
+                if ( p != null_ptr<dummy_node_type volatile *>() )
+                    return const_cast<dummy_node_type *>( p );
+                bkoff();
+            }
+        }
+
+        dummy_node_type * get_bucket( size_t nHash )
+        {
+            size_t nBucket = bucket_no( nHash );
+
+            dummy_node_type * pHead = m_Buckets.bucket( nBucket );
+            if ( pHead == null_ptr<dummy_node_type *>() )
+                pHead = init_bucket( nBucket );
+
+            assert( pHead->is_dummy() );
+
+            return pHead;
+        }
+
+        void init()
+        {
+            // GC and OrderedList::gc must be the same
+            static_assert(( std::is_same<gc, typename ordered_list::gc>::value ), "GC and OrderedList::gc must be the same");
+
+            // atomicity::empty_item_counter is not allowed as a item counter
+            static_assert(( !std::is_same<item_counter, atomicity::empty_item_counter>::value ), "atomicity::empty_item_counter is not allowed as a item counter");
+
+            // Initialize bucket 0
+            dummy_node_type * pNode = alloc_dummy_node( 0 /*split_list::dummy_hash(0)*/ );
+
+            // insert_aux_node cannot return false for empty list
+            CDS_VERIFY( m_List.insert_aux_node( pNode ));
+
+            m_Buckets.bucket( 0, pNode );
+        }
+
+        void    inc_item_count()
+        {
+            size_t sz = m_nBucketCountLog2.load(CDS_ATOMIC::memory_order_relaxed);
+            if ( ( ++m_ItemCounter >> sz ) > m_Buckets.load_factor() && ((size_t)(1 << sz )) < m_Buckets.capacity() )
+            {
+                m_nBucketCountLog2.compare_exchange_strong( sz, sz + 1, CDS_ATOMIC::memory_order_seq_cst, CDS_ATOMIC::memory_order_relaxed );
+            }
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool find_( Q& val, Compare cmp, Func f )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return m_List.find_at( pHead, sv, cmp,
+                [&f](value_type& item, split_list::details::search_value_type<Q>& val){ cds::unref(f)(item, val.val ); });
+#       else
+            split_list::details::find_functor_wrapper<Func> ffw( f );
+            return m_List.find_at( pHead, sv, cmp, cds::ref(ffw) );
+#       endif
+        }
+
+        template <typename Q, typename Compare>
+        bool find_value( Q const& val, Compare cmp )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            return m_List.find_at( pHead, sv, cmp );
+        }
+
+        template <typename Q, typename Compare>
+        value_type * get_( Q const& val, Compare cmp )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            return m_List.get_at( pHead, sv, cmp );
+        }
+
+        template <typename Q, typename Compare>
+        value_type * extract_( Q const& val, Compare cmp )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            value_type * pNode = m_List.extract_at( pHead, sv, cmp );
+            if ( pNode )
+                --m_ItemCounter;
+            return pNode;
+        }
+
+        template <typename Q, typename Less>
+        value_type * extract_with_( Q const& val, Less pred )
+        {
+            return extract_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>());
+        }
+
+        template <typename Q, typename Compare>
+        bool erase_( const Q& val, Compare cmp )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            if ( m_List.erase_at( pHead, sv, cmp ) ) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Q, typename Compare, typename Func>
+        bool erase_( Q const& val, Compare cmp, Func f )
+        {
+            size_t nHash = hash_value( val );
+            split_list::details::search_value_type<Q const>  sv( val, split_list::regular_hash( nHash ));
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            if ( m_List.erase_at( pHead, sv, cmp, f )) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        //@endcond
+
+    public:
+        /// Initialize split-ordered list of default capacity
+        /**
+            The default capacity is defined in bucket table constructor.
+            See split_list::expandable_bucket_table, split_list::static_ducket_table
+            which selects by split_list::dynamic_bucket_table option.
+        */
+        SplitListSet()
+            : m_nBucketCountLog2(1)
+        {
+            init();
+        }
+
+        /// Initialize split-ordered list
+        SplitListSet(
+            size_t nItemCount           ///< estimate average of item count
+            , size_t nLoadFactor = 1    ///< load factor - average item count per bucket. Small integer up to 8, default is 1.
+            )
+            : m_Buckets( nItemCount, nLoadFactor )
+            , m_nBucketCountLog2(1)
+        {
+            init();
+        }
+
+    public:
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            The function makes RCU lock internally.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+            size_t nHash = hash_value( val );
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            node_traits::to_node_ptr( val )->m_nHash = split_list::regular_hash( nHash );
+
+            if ( m_List.insert_at( pHead, val )) {
+                inc_item_count();
+                return true;
+            }
+            return false;
+        }
+
+        /// Inserts new node
+        /**
+            This function is intended for derived non-intrusive containers.
+
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
+            \p val no any other changes could be made on this set's item by concurrent threads.
+            The user-defined functor is called only if the inserting is success and may be passed by reference
+            using <tt>boost::ref</tt>
+
+            The function makes RCU lock internally.
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            size_t nHash = hash_value( val );
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            node_traits::to_node_ptr( val )->m_nHash = split_list::regular_hash( nHash );
+
+            if ( m_List.insert_at( pHead, val, f )) {
+                inc_item_count();
+                return true;
+            }
+            return false;
+        }
+
+        /// Ensures that the \p val exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val is not found in the set, then \p val is inserted into the set.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refers to the same thing.
+
+            The functor can change non-key fields of the \p item; however, \p func must guarantee
+            that during changing no any other modifications could be made on this item by concurrent threads.
+
+            You can pass \p func argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The function makes RCU lock internally.
+
+            Returns std::pair<bool, bool> where \p first is \p true if operation is successfull,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            size_t nHash = hash_value( val );
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            node_traits::to_node_ptr( val )->m_nHash = split_list::regular_hash( nHash );
+
+            std::pair<bool, bool> bRet = m_List.ensure_at( pHead, val, func );
+            if ( bRet.first && bRet.second )
+                inc_item_count();
+            return bRet;
+        }
+
+        /// Unlinks the item \p val from the set
+        /**
+            The function searches the item \p val in the set and unlinks it from the set
+            if it is found and is equal to \p val.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of that set, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            RCU \p synchronize method can be called, therefore, RCU should not be locked.
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+            size_t nHash = hash_value( val );
+            dummy_node_type * pHead = get_bucket( nHash );
+            assert( pHead != null_ptr<dummy_node_type *>() );
+
+            if ( m_List.unlink_at( pHead, val ) ) {
+                --m_ItemCounter;
+                return true;
+            }
+            return false;
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_SplitListSet_rcu_erase
+            The function searches an item with key equal to \p val in the set,
+            unlinks it from the set, and returns \p true.
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Difference between \ref erase and \p unlink functions: \p erase finds <i>a key</i>
+            and deletes the item found. \p unlink finds an item by key and deletes it
+            only if \p val is an item of that set, i.e. the pointer to item found
+            is equal to <tt> &val </tt>.
+
+            RCU \p synchronize method can be called, therefore, RCU should not be locked.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool erase( Q const& val )
+        {
+            return erase_( val, key_comparator() );
+        }
+
+        /// Deletes the item from the set using \p pred for searching
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_rcu_erase "erase(Q const&)"
+            but \p cmp is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool erase_with( Q const& val, Less pred )
+        {
+            return erase_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>() );
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_SplitListSet_rcu_erase_func
+            The function searches an item with key equal to \p val in the set,
+            call \p f functor with item found, unlinks it from the set, and returns \p true.
+            The \ref disposer specified by \p OrderedList class template parameter is called
+            by garbage collector \p GC asynchronously.
+
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor can be passed by reference with <tt>boost:ref</tt>
+
+            If the item with key equal to \p val is not found the function return \p false.
+
+            RCU \p synchronize method can be called, therefore, RCU should not be locked.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q, typename Func>
+        bool erase( Q const& val, Func f )
+        {
+            return erase_( val, key_comparator(), f );
+        }
+
+        /// Deletes the item from the set using \p pred for searching
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_rcu_erase_func "erase(Q const&, Func)"
+            but \p cmp is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool erase_with( Q const& val, Less pred, Func f )
+        {
+            return erase_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>(), f );
+        }
+
+        /// Extracts an item from the set
+        /** \anchor cds_intrusive_SplitListSet_rcu_extract
+            The function searches an item with key equal to \p val in the set,
+            unlinks it, and returns pointer to an item found in \p dest argument.
+            If the item with the key equal to \p val is not found the function returns \p false.
+
+            @note The function does NOT call RCU read-side lock or synchronization,
+            and does NOT dispose the item found. It just excludes the item from the set
+            and returns a pointer to item found.
+            You should lock RCU before calling of the function, and you should synchronize RCU
+            outside the RCU lock before reusing returned pointer.
+
+            \code
+            typedef cds::urcu::gc< general_buffered<> > rcu;
+            typedef cds::intrusive::MichaelList< rcu, Foo > rcu_michael_list;
+            typedef cds::intrusive::SplitListSet< rcu, rcu_michael_list, foo_traits > rcu_splitlist_set;
+
+            rcu_splitlist_set theSet;
+            // ...
+
+            rcu_splitlist_set::exempt_ptr p;
+            {
+                // first, we should lock RCU
+                rcu_splitlist_set::rcu_lock lock;
+
+                // Now, you can apply extract function
+                // Note that you must not delete the item found inside the RCU lock
+                if ( theList.extract( p, 10 )) {
+                    // do something with p
+                    ...
+                }
+            }
+
+            // We may safely release p here
+            // release() passes the pointer to RCU reclamation cycle:
+            // it invokes RCU retire_ptr function with the disposer you provided for rcu_michael_list.
+            p.release();
+            \endcode
+        */
+        template <typename Q>
+        bool extract( exempt_ptr& dest, Q const& val )
+        {
+            value_type * pNode = extract_( val, key_comparator() );
+            if ( pNode ) {
+                dest = pNode;
+                return true;
+            }
+            return false;
+        }
+
+        /// Extracts an item from the set using \p pred for searching
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_rcu_extract "extract(exempt_ptr&, Q const&)"
+            but \p pred is used for key compare.
+            \p Less functor has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool extract_with( exempt_ptr& dest, Q const& val, Less pred )
+        {
+            value_type * pNode = extract_with_( val, pred );
+            if ( pNode ) {
+                dest = pNode;
+                return true;
+            }
+            return false;
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SplitListSet_rcu_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            can modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_( val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val with \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_rcu_find_func "find(Q&, Func)"
+            but \p cmp is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p cmp must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SplitListSet_rcu_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by value or by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor can change non-key fields of \p item. Note that the functor is only guarantee
+            that \p item cannot be disposed during functor is executing.
+            The functor does not serialize simultaneous access to the set \p item. If such access is
+            possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function applies RCU lock internally.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_( val, key_comparator(), f );
+        }
+
+        /// Finds the key \p val with \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_rcu_find_cfunc "find(Q const&, Func)"
+            but \p cmp is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>(), f );
+        }
+
+        /// Finds the key \p val
+        /** \anchor cds_intrusive_SplitListSet_rcu_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if \p val found or \p false otherwise.
+        */
+        template <typename Q>
+        bool find( Q const& val )
+        {
+            return find_value( val, key_comparator() );
+        }
+
+        /// Finds the key \p val with \p pred predicate for comparing
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_rcu_find_val "find(Q const&)"
+            but \p cmp is used for key compare.
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+            return find_value( val, typename wrapped_ordered_list::template make_compare_from_less<Less>() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /** \anchor cds_intrusive_SplitListSet_rcu_get
+            The function searches the item with key equal to \p val and returns the pointer to item found.
+            If \p val is not found it returns \p NULL.
+
+            Note the compare functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            RCU should be locked before call of this function.
+            Returned item is valid only while RCU is locked:
+            \code
+            cds::intrusive::SplitListSet< your_template_parameters > theSet;
+            // ...
+            {
+                // Lock RCU
+                hash_set::rcu_lock lock;
+
+                foo * pVal = theSet.get( 5 );
+                if ( pVal ) {
+                    // Deal with pVal
+                    //...
+                }
+                // Unlock RCU by rcu_lock destructor
+                // pVal can be retired by disposer at any time after RCU has been unlocked
+            }
+            \endcode
+        */
+        template <typename Q>
+        value_type * get( Q const& val )
+        {
+            return get_( val, key_comparator() );
+        }
+
+        /// Finds the key \p val and return the item found
+        /**
+            The function is an analog of \ref cds_intrusive_SplitListSet_rcu_get "get(Q const&)"
+            but \p pred is used for comparing the keys.
+
+            \p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
+            in any order.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        value_type * get_with( Q const& val, Less pred )
+        {
+            return get_( val, typename wrapped_ordered_list::template make_compare_from_less<Less>());
+        }
+
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+            Thus, the correct item counting feature is an important part of split-list set implementation.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Clears the set (non-atomic)
+        /**
+            The function unlink all items from the set.
+            The function is not atomic. Therefore, \p clear may be used only for debugging purposes.
+        */
+        void clear()
+        {
+            iterator it = begin();
+            while ( it != end() ) {
+                iterator i(it);
+                ++i;
+                unlink( *it );
+                it = i;
+            }
+        }
+
+    protected:
+        //@cond
+        template <bool IsConst>
+        class iterator_type
+            :public split_list::details::iterator_type<node_traits, ordered_list, IsConst>
+        {
+            typedef split_list::details::iterator_type<node_traits, ordered_list, IsConst> iterator_base_class;
+            typedef typename iterator_base_class::list_iterator list_iterator;
+        public:
+            iterator_type()
+                : iterator_base_class()
+            {}
+
+            iterator_type( iterator_type const& src )
+                : iterator_base_class( src )
+            {}
+
+            // This ctor should be protected...
+            iterator_type( list_iterator itCur, list_iterator itEnd )
+                : iterator_base_class( itCur, itEnd )
+            {}
+        };
+        //@endcond
+    public:
+        /// Forward iterator
+        /**
+            The forward iterator for a split-list has some features:
+            - it has no post-increment operator
+            - it depends on iterator of underlying \p OrderedList
+            - The iterator cannot be moved across thread boundary since it may contain GC's guard that is thread-private GC data.
+            - Iterator ensures thread-safety even if you delete the item that iterator points to. However, in case of concurrent
+              deleting operations it is no guarantee that you iterate all item in the split-list.
+
+            Therefore, the use of iterators in concurrent environment is not good idea. Use the iterator on the concurrent container
+            for debug purpose only.
+        */
+        typedef iterator_type<false>    iterator;
+        /// Const forward iterator
+        /**
+            For iterator's features and requirements see \ref iterator
+        */
+        typedef iterator_type<true>     const_iterator;
+
+        /// Returns a forward iterator addressing the first element in a split-list
+        /**
+            For empty list \code begin() == end() \endcode
+        */
+        iterator begin()
+        {
+            return iterator( m_List.begin(), m_List.end() );
+        }
+
+        /// Returns an iterator that addresses the location succeeding the last element in a split-list
+        /**
+            Do not use the value returned by <tt>end</tt> function to access any item.
+
+            The returned value can be used only to control reaching the end of the split-list.
+            For empty list \code begin() == end() \endcode
+        */
+        iterator end()
+        {
+            return iterator( m_List.end(), m_List.end() );
+        }
+
+        /// Returns a forward const iterator addressing the first element in a split-list
+        const_iterator begin() const
+        {
+            return const_iterator( m_List.begin(), m_List.end() );
+        }
+
+        /// Returns an const iterator that addresses the location succeeding the last element in a split-list
+        const_iterator end() const
+        {
+            return const_iterator( m_List.end(), m_List.end() );
+        }
+
+    };
+
+}}  // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_SPLIT_LIST_RCU_H
diff --git a/cds/intrusive/striped_set.h b/cds/intrusive/striped_set.h
new file mode 100644 (file)
index 0000000..0c1a1ac
--- /dev/null
@@ -0,0 +1,894 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_H
+#define __CDS_INTRUSIVE_STRIPED_SET_H
+
+#include <cds/intrusive/base.h>
+#include <cds/intrusive/striped_set/adapter.h>
+#include <cds/intrusive/striped_set/striping_policy.h>
+
+namespace cds { namespace intrusive {
+    /// StripedSet related definitions
+    namespace striped_set {
+    }   // namespace striped_set
+
+    /// Striped hash set
+    /** @ingroup cds_intrusive_map
+
+        Source
+            - [2008] Maurice Herlihy, Nir Shavit "The Art of Multiprocessor Programming"
+
+        Lock striping is very simple technique.
+        The set consists of the bucket table and the array of locks.
+        Initially, the capacity of lock array and bucket table is the same.
+        When set is resized, bucket table capacity will be doubled but lock array will not.
+        The lock \p i protects each bucket \p j, where <tt> j = i mod L </tt>,
+        where \p L - the size of lock array.
+
+        Template arguments:
+            - \p Container - the container class that is used as bucket table entry. The \p Container class should support
+                an uniform interface described below.
+            - \p Options - options
+
+        The \p %StripedSet class does not exactly dictate the type of container that should be used as a \p Container bucket.
+        Instead, the class supports different intrusive container type for the bucket, for exampe, \p boost::intrusive::list, \p boost::intrusive::set and others.
+
+        Remember that \p %StripedSet class algorithm ensures sequential blocking access to its bucket through the mutex type you specify
+        among \p Options template arguments.
+
+        The \p Options are:
+        - opt::mutex_policy - concurrent access policy.
+            Available policies: striped_set::striping, striped_set::refinable.
+            Default is striped_set::striping.
+        - cds::opt::hash - hash functor. Default option value see <tt>opt::v::hash_selector <opt::none></tt> which selects default hash functor for
+            your compiler.
+        - cds::opt::compare - key comparison functor. No default functor is provided.
+            If the option is not specified, the opt::less is used.
+        - cds::opt::less - specifies binary predicate used for key comparison. Default is \p std::less<T>.
+        - cds::opt::item_counter - item counter type. Default is \p atomicity::item_counter since some operation on the counter is performed
+            without locks. Note that item counting is an essential part of the set algorithm, so dummy type like atomicity::empty_item_counter
+            is not suitable.
+        - cds::opt::allocator - the allocator type using for memory allocation of bucket table and lock array. Default is CDS_DEFAULT_ALLOCATOR.
+        - cds::opt::resizing_policy - the resizing policy that is a functor that decides when to resize the hash set.
+            Default option value depends on bucket container type:
+                for sequential containers like \p boost::intrusive::list the resizing policy is <tt>cds::container::striped_set::load_factor_resizing <4></tt>;
+                for other type of containers like \p boost::intrusive::set  the resizing policy is cds::container::striped_set::no_resizing.
+            See cds::container::striped_set namespace for list of all possible types of the option.
+            Note that the choose of resizing policy depends of \p Container type:
+            for sequential containers like \p boost::intrusive::list right choosing of the policy can significantly improve performance.
+            For other, non-sequential types of \p Container (like a \p boost::intrusive::set) the resizing policy is not so important.
+        - cds::opt::buffer - a buffer type used only for boost::intrusive::unordered_set.
+            Default is cds::opt::v::static_buffer< cds::any_type, 256 >.
+
+            opt::compare or opt::less options are used in some \p Container class for ordering.
+            opt::compare option has the highest priority: if opt::compare is specified, opt::less is not used.
+
+            You can pass other option that would be passed to <tt>adapt</tt> metafunction, see below.
+
+        <b>Internal details</b>
+
+            The \p %StripedSet class cannot utilize the \p Container container specified directly, but only its adapted variant which
+            supports an unified interface. Internally, the adaptation is made via intrusive::striped_set::adapt metafunction that wraps bucket container
+            and provides the unified bucket interface suitable for \p %StripedSet. Such adaptation is completely transparent for you -
+            you don't need to call \p adapt metafunction directly, \p %StripedSet class's internal machinery itself invokes appropriate
+            \p adapt metafunction specialization to adjust your \p Container container class to \p %StripedSet bucket's internal interface.
+            All you need is to include a right header before <tt>striped_set.h</tt>.
+
+            By default, <tt>intrusive::striped_set::adapt<AnyContainer, OptionPack> </tt> metafunction does not make any wrapping to \p AnyContainer,
+            so, the result <tt>intrusive::striped_set::adapt<AnyContainer, OptionPack>::type </tt> is the same as \p AnyContainer.
+            However, there are a lot of specializations of \p %intrusive::striped_set::adapt for \p boost::intrusive containers, see table below.
+            Any of this specialization wraps corresponding container making it suitable for the set's bucket.
+            Remember, you should include the proper header file for \p adapt <b>before</b> including <tt>striped_set.h</tt>.
+
+            \note It is important to specify <tt>boost::intrusive::constant_time_size<true></tt> option
+            for all \p boost::intrusive container that supports this option. Fast item counting feature is essential part of
+            \p %StripedSet resizing algorithm.
+
+            <table>
+                <tr>
+                    <th>Container</th>
+                    <th>.h-file for \p adapt</th>
+                    <th>Example</th>
+                    <th>Notes</th>
+                </tr>
+                <tr>
+                    <td> \p boost::intrusive::list</td>
+                    <td><tt><cds/intrusive/striped_set/boost_list.h></tt></td>
+                    <td>\code
+                        #include <cds/intrusive/striped_set/boost_list.h>
+                        #include <cds/intrusive/striped_set.h>
+                        typedef cds::intrusive::StripedSet<
+                        boost::intrusive::list<T, boost::intrusive::constant_time_size<true> >,
+                            cds::opt::less< std::less<T> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        The list is ordered.
+                        Template argument pack \p Options <b>must</b> contain cds::opt::less or cds::opt::compare for type \p T stored in the list
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::intrusive::slist</td>
+                    <td><tt><cds/intrusive/striped_set/boost_slist.h></tt></td>
+                    <td>\code
+                        #include <cds/intrusive/striped_set/boost_slist.h>
+                        #include <cds/intrusive/striped_set.h>
+                        typedef cds::intrusive::StripedSet<
+                            boost::intrusive::slist<T, boost::intrusive::constant_time_size<true> >,
+                            cds::opt::less< std::less<T> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        The list is ordered.
+                        Template argument pack \p Options <b>must</b> contain cds::opt::less or cds::opt::compare for type \p T stored in the list
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::intrusive::set</td>
+                    <td><tt><cds/intrusive/striped_set/boost_set.h></tt></td>
+                    <td>\code
+                        #include <cds/intrusive/striped_set/boost_set.h>
+                        #include <cds/intrusive/striped_set.h>
+                        typedef cds::intrusive::StripedSet<
+                            boost::intrusive::set<T, boost::intrusive::constant_time_size<true> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        Note that \p boost::intrusive::compare option using in \p boost::intrusive::set
+                        should support \p T type stored in the set and any type \p Q that you can use
+                        in \p erase and \p find member functions.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::intrusive::unordered_set</td>
+                    <td><tt><cds/intrusive/striped_set/boost_unordered_set.h></tt></td>
+                    <td>\code
+                        #include <cds/intrusive/striped_set/boost_unordered_set.h>
+                        #include <cds/intrusive/striped_set.h>
+                        typedef cds::intrusive::StripedSet<
+                            boost::intrusive::unordered_set<T
+                                ,boost::intrusive::constant_time_size<true>
+                                ,boost::intrusive::hash< user_provided_hash_functor >
+                            >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        You should provide two different hash function h1 and h2 - one for boost::intrusive::unordered_set
+                        and other for %StripedSet. For the best result, h1 and h2 must be orthogonal i.e. h1(X) != h2(X) for any value X
+
+                        The option opt::buffer is used for boost::intrusive::bucket_traits. Default is cds::opt::v::static_buffer< cds::any_type, 256 >.
+                        The resizing policy should correlate with the buffer capacity.
+                        The default resizing policy is cds::container::striped_set::load_factor_resizing<256> what gives load factor 1 for
+                        default bucket buffer that is the best for \p boost::intrusive::unordered_set.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::intrusive::avl_set</td>
+                    <td><tt><cds/intrusive/striped_set/boost_avl_set.h></tt></td>
+                    <td>\code
+                        #include <cds/intrusive/striped_set/boost_avl_set.h>
+                        #include <cds/intrusive/striped_set.h>
+                        typedef cds::intrusive::StripedSet<
+                            boost::intrusive::avl_set<T, boost::intrusive::constant_time_size<true> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        Note that \p boost::intrusive::compare option using in \p boost::intrusive::avl_set
+                        should support \p T type stored in the set and any type \p Q that you can use
+                        in \p erase and \p find member functions.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::intrusive::sg_set</td>
+                    <td><tt><cds/intrusive/striped_set/boost_sg_set.h></tt></td>
+                    <td>\code
+                        #include <cds/intrusive/striped_set/boost_sg_set.h>
+                        #include <cds/intrusive/striped_set.h>
+                        typedef cds::intrusive::StripedSet<
+                            boost::intrusive::sg_set<T, boost::intrusive::constant_time_size<true> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        Note that \p boost::intrusive::compare option using in \p boost::intrusive::sg_set
+                        should support \p T type stored in the set and any type \p Q that you can use
+                        in \p erase and \p find member functions.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::intrusive::splay_set</td>
+                    <td><tt><cds/intrusive/striped_set/boost_splay_set.h></tt></td>
+                    <td>\code
+                        #include <cds/intrusive/striped_set/boost_splay_set.h>
+                        #include <cds/intrusive/striped_set.h>
+                        typedef cds::intrusive::StripedSet<
+                            boost::intrusive::splay_set<T, boost::intrusive::constant_time_size<true> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        Note that \p boost::intrusive::compare option using in \p boost::intrusive::splay_set
+                        should support \p T type stored in the set and any type \p Q that you can use
+                        in \p erase and \p find member functions.
+                    </td>
+                </tr>
+                <tr>
+                    <td> \p boost::intrusive::treap_set</td>
+                    <td><tt><cds/intrusive/striped_set/boost_treap_set.h></tt></td>
+                    <td>\code
+                        #include <cds/intrusive/striped_set/boost_treap_set.h>
+                        #include <cds/intrusive/striped_set.h>
+                        typedef cds::intrusive::StripedSet<
+                            boost::intrusive::treap_set<T, boost::intrusive::constant_time_size<true> >
+                        > striped_set;
+                    \endcode
+                    </td>
+                    <td>
+                        Note that \p boost::intrusive::compare option using in \p boost::intrusive::treap_set
+                        should support \p T type stored in the set and any type \p Q that you can use
+                        in \p erase and \p find member functions.
+                    </td>
+                </tr>
+            </table>
+
+            You can use another intrusive container type as striped set's bucket.
+            Suppose, you have a container class \p MyBestContainer and you want to integrate it with \p StripedSet as bucket type.
+            There are two possibility:
+            - either your \p MyBestContainer class has native support of bucket's interface;
+                in this case, you can use default \p intrusive::striped_set::adapt metafunction;
+            - or your \p MyBestContainer class does not support bucket's interface, which means, that you should develop a specialization
+                <tt>cds::intrusive::striped_set::adapt<MyBestContainer> </tt> metafunction providing necessary interface.
+
+            The <tt>intrusive::striped_set::adapt< Container, OptionPack ></tt> metafunction has two template argument:
+            - \p Container is the class that should be used as the bucket, for example, <tt>boost::intrusive::list< T ></tt>.
+            - \p OptionPack is the packed options from \p %StripedSet declaration. The \p adapt metafunction can use
+                any option from \p OptionPack for its internal use. For example, a \p compare option can be passed to \p adapt
+                metafunction via \p OptionPack argument of \p %StripedSet declaration.
+
+            See intrusive::striped_set::adapt metafunction for the description of interface that the bucket container must provide
+            to be \p %StripedSet compatible.
+    */
+    template <class Container, CDS_DECL_OPTIONS9>
+    class StripedSet
+    {
+    public:
+        //@cond
+        struct default_options {
+            typedef striped_set::striping<>         mutex_policy;
+            typedef typename cds::opt::v::hash_selector< cds::opt::none >::type   hash;
+            typedef cds::atomicity::item_counter    item_counter;
+            typedef CDS_DEFAULT_ALLOCATOR           allocator;
+            typedef cds::opt::none                  resizing_policy;
+            typedef cds::opt::none                  compare;
+            typedef cds::opt::none                  less;
+        };
+
+        typedef typename cds::opt::make_options<
+            typename cds::opt::find_type_traits< default_options, CDS_OPTIONS9 >::type
+            ,CDS_OPTIONS9
+        >::type   options;
+        //@endcond
+
+        typedef Container                           underlying_container_type   ;   ///< original intrusive container type for the bucket
+        typedef typename cds::intrusive::striped_set::adapt< underlying_container_type, CDS_OPTIONS9 >::type   bucket_type ;   ///< container type adapted for hash set
+        typedef typename bucket_type::value_type    value_type  ;   ///< value type stored in the set
+
+        typedef typename options::hash              hash            ; ///< Hash functor
+        typedef typename options::item_counter      item_counter    ; ///< Item counter
+        typedef typename cds::opt::select_default<
+            typename options::resizing_policy,
+            typename bucket_type::default_resizing_policy
+        >::type                                     resizing_policy ; ///< Resizing policy
+        typedef typename options::allocator         allocator_type  ; ///< allocator type specified in options.
+        typedef typename options::mutex_policy      mutex_policy    ; ///< Mutex policy
+
+        typedef cds::details::Allocator< bucket_type, allocator_type > bucket_allocator;  ///< bucket allocator type based on allocator_type
+
+    protected:
+        bucket_type *   m_Buckets       ;   ///< Bucket table
+        size_t          m_nBucketMask   ;   ///< Bucket table size - 1. m_nBucketMask + 1 should be power of two.
+        item_counter    m_ItemCounter   ;   ///< Item counter
+        hash            m_Hash          ;   ///< Hash functor
+
+        mutex_policy    m_MutexPolicy   ;   ///< Mutex policy
+        resizing_policy m_ResizingPolicy;   ///< Resizing policy
+
+        static const size_t c_nMinimalCapacity = 16 ;   ///< Minimal capacity
+
+    protected:
+        //@cond
+        typedef typename mutex_policy::scoped_cell_lock     scoped_cell_lock;
+        typedef typename mutex_policy::scoped_full_lock     scoped_full_lock;
+        typedef typename mutex_policy::scoped_resize_lock   scoped_resize_lock;
+
+#   ifndef CDS_CXX11_LAMBDA_SUPPORT
+        struct empty_insert_functor {
+            void operator()( value_type& )
+            {}
+        };
+
+        struct empty_erase_functor  {
+            void operator()( value_type const& )
+            {}
+        };
+
+        struct empty_find_functor {
+            template <typename Q>
+            void operator()( value_type& item, Q& val )
+            {}
+        };
+#   endif
+        //@endcond
+
+    protected:
+        //@cond
+        static size_t calc_init_capacity( size_t nCapacity )
+        {
+            nCapacity = cds::beans::ceil2( nCapacity );
+            return nCapacity < c_nMinimalCapacity ? c_nMinimalCapacity : nCapacity;
+        }
+
+        void alloc_bucket_table( size_t nSize )
+        {
+            assert( cds::beans::is_power2( nSize ));
+            m_nBucketMask = nSize - 1;
+            m_Buckets = bucket_allocator().NewArray( nSize );
+        }
+
+        static void free_bucket_table( bucket_type * pBuckets, size_t nSize )
+        {
+            bucket_allocator().Delete( pBuckets, nSize );
+        }
+
+        template <typename Q>
+        size_t hashing( Q const& v ) const
+        {
+            return m_Hash( v );
+        }
+
+        bucket_type * bucket( size_t nHash ) const CDS_NOEXCEPT
+        {
+            return m_Buckets + (nHash & m_nBucketMask);
+        }
+
+        template <typename Q, typename Func>
+        bool find_( Q& val, Func f )
+        {
+            size_t nHash = hashing( val );
+
+            scoped_cell_lock sl( m_MutexPolicy, nHash );
+            return bucket( nHash )->find( val, f );
+        }
+
+        template <typename Q, typename Less, typename Func>
+        bool find_with_( Q& val, Less pred, Func f )
+        {
+            size_t nHash = hashing( val );
+            scoped_cell_lock sl( m_MutexPolicy, nHash );
+            return bucket( nHash )->find( val, pred, f );
+        }
+
+        void internal_resize( size_t nNewCapacity )
+        {
+            // All locks are already locked!
+            m_MutexPolicy.resize( nNewCapacity );
+
+            size_t nOldCapacity = bucket_count();
+            bucket_type * pOldBuckets = m_Buckets;
+
+            alloc_bucket_table( nNewCapacity );
+
+            typedef typename bucket_type::iterator bucket_iterator;
+            bucket_type * pEnd = pOldBuckets + nOldCapacity;
+            for ( bucket_type * pCur = pOldBuckets; pCur != pEnd; ++pCur ) {
+                bucket_iterator itEnd = pCur->end();
+                bucket_iterator itNext;
+                for ( bucket_iterator it = pCur->begin(); it != itEnd; it = itNext ) {
+                    itNext = it;
+                    ++itNext;
+                    bucket( m_Hash( *it ) )->move_item( *pCur, it );
+                }
+                pCur->clear();
+            }
+
+            free_bucket_table( pOldBuckets, nOldCapacity );
+
+            m_ResizingPolicy.reset();
+        }
+
+        void resize()
+        {
+            size_t nOldCapacity = bucket_count();
+            size_t volatile& refBucketMask = m_nBucketMask;
+
+            scoped_resize_lock al( m_MutexPolicy );
+            if ( al.success() ) {
+                if ( nOldCapacity != refBucketMask + 1 ) {
+                    // someone resized already
+                    return;
+                }
+
+                internal_resize( nOldCapacity * 2 );
+            }
+        }
+
+        //@endcond
+
+    public:
+        /// Default ctor. The initial capacity is 16.
+        StripedSet()
+        : m_Buckets( null_ptr<bucket_type *>() )
+        , m_nBucketMask( c_nMinimalCapacity - 1 )
+        , m_MutexPolicy( c_nMinimalCapacity )
+        {
+            alloc_bucket_table( m_nBucketMask + 1 );
+        }
+
+        /// Ctor with initial capacity specified
+        StripedSet(
+            size_t nCapacity    ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
+        )
+        : m_Buckets( null_ptr<bucket_type *>() )
+        , m_nBucketMask( calc_init_capacity(nCapacity) - 1 )
+        , m_MutexPolicy( m_nBucketMask + 1 )
+        {
+            alloc_bucket_table( m_nBucketMask + 1 );
+        }
+
+        /// Ctor with resizing policy (copy semantics)
+        /**
+            This constructor initializes m_ResizingPolicy member with copy of \p resizingPolicy parameter
+        */
+        StripedSet(
+            size_t nCapacity    ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
+            ,resizing_policy const& resizingPolicy  ///< Resizing policy
+        )
+        : m_Buckets( null_ptr<bucket_type *>() )
+        , m_nBucketMask( ( nCapacity ? calc_init_capacity(nCapacity) : c_nMinimalCapacity ) - 1 )
+        , m_MutexPolicy( m_nBucketMask + 1 )
+        , m_ResizingPolicy( resizingPolicy )
+        {
+            alloc_bucket_table( m_nBucketMask + 1 );
+        }
+
+#ifdef CDS_RVALUE_SUPPORT
+        /// Ctor with resizing policy (move semantics)
+        /**
+            This constructor initializes m_ResizingPolicy member moving \p resizingPolicy parameter
+            Move semantics is used. Available only for the compilers that supports C++11 rvalue reference.
+        */
+        StripedSet(
+            size_t nCapacity    ///< Initial size of bucket table and lock array. Must be power of two, the minimum is 16.
+            ,resizing_policy&& resizingPolicy  ///< Resizing policy
+        )
+        : m_Buckets( null_ptr<bucket_type *>() )
+        , m_nBucketMask( ( nCapacity ? calc_init_capacity(nCapacity) : c_nMinimalCapacity ) - 1 )
+        , m_MutexPolicy( m_nBucketMask + 1 )
+        , m_ResizingPolicy( resizingPolicy )
+        {
+            alloc_bucket_table( m_nBucketMask + 1 );
+        }
+#endif
+
+        /// Destructor destroys internal data
+        ~StripedSet()
+        {
+            free_bucket_table( m_Buckets, m_nBucketMask + 1 );
+        }
+
+    public:
+        /// Inserts new node
+        /**
+            The function inserts \p val in the set if it does not contain
+            an item with key equal to \p val.
+
+            Returns \p true if \p val is placed into the set, \p false otherwise.
+        */
+        bool insert( value_type& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return insert( val, []( value_type& ) {} );
+#       else
+            return insert( val, empty_insert_functor() );
+#       endif
+        }
+
+        /// Inserts new node
+        /**
+            The function allows to split creating of new item into two part:
+            - create item with key only
+            - insert new item into the set
+            - if inserting is success, calls  \p f functor to initialize value-field of \p val.
+
+            The functor signature is:
+            \code
+                void func( value_type& val );
+            \endcode
+            where \p val is the item inserted.
+
+            The user-defined functor is called only if the inserting is success and can be passed by reference
+            using <tt>boost::ref</tt>
+        */
+        template <typename Func>
+        bool insert( value_type& val, Func f )
+        {
+            bool bOk;
+            bool bResize;
+            size_t nHash = hashing( val );
+            bucket_type * pBucket;
+            {
+                scoped_cell_lock sl( m_MutexPolicy, nHash );
+                pBucket = bucket( nHash );
+                bOk = pBucket->insert( val, f );
+                bResize = bOk && m_ResizingPolicy( ++m_ItemCounter, *this, *pBucket );
+            }
+
+            if ( bResize )
+                resize();
+            return bOk;
+        }
+
+        /// Ensures that the \p val exists in the set
+        /**
+            The operation performs inserting or changing data with lock-free manner.
+
+            If the item \p val not found in the set, then \p val is inserted into the set.
+            Otherwise, the functor \p func is called with item found.
+            The functor signature is:
+            \code
+                void func( bool bNew, value_type& item, value_type& val );
+            \endcode
+            with arguments:
+            - \p bNew - \p true if the item has been inserted, \p false otherwise
+            - \p item - item of the set
+            - \p val - argument \p val passed into the \p ensure function
+            If new item has been inserted (i.e. \p bNew is \p true) then \p item and \p val arguments
+            refers to the same thing.
+
+            The functor may change non-key fields of the \p item.
+
+            You may pass \p func argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            Returns <tt> std::pair<bool, bool> </tt> where \p first is \p true if operation is successful,
+            \p second is \p true if new item has been added or \p false if the item with \p key
+            already is in the set.
+        */
+        template <typename Func>
+        std::pair<bool, bool> ensure( value_type& val, Func func )
+        {
+            std::pair<bool, bool> result;
+            bool bResize;
+            size_t nHash = hashing( val );
+            bucket_type * pBucket;
+            {
+                scoped_cell_lock sl( m_MutexPolicy, nHash );
+                pBucket = bucket( nHash );
+
+                result = pBucket->ensure( val, func );
+                bResize = result.first && result.second && m_ResizingPolicy( ++m_ItemCounter, *this, *pBucket );
+            }
+
+            if ( bResize )
+                resize();
+            return result;
+        }
+
+        /// Unlink the item \p val from the set
+        /**
+            The function searches the item \p val in the set and unlink it
+            if it is found and is equal to \p val (here, the equality means that
+            \p val belongs to the set: if \p item is an item found then
+            unlink is successful iif <tt>&val == &item</tt>)
+
+            The function returns \p true if success and \p false otherwise.
+        */
+        bool unlink( value_type& val )
+        {
+            bool bOk;
+            size_t nHash = hashing( val );
+            {
+                scoped_cell_lock sl( m_MutexPolicy, nHash );
+                bOk = bucket( nHash )->unlink( val );
+            }
+
+            if ( bOk )
+                --m_ItemCounter;
+            return bOk;
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_StripedSet_erase
+            The function searches an item with key equal to \p val in the set,
+            unlinks it from the set, and returns a pointer to unlinked item.
+
+            If the item with key equal to \p val is not found the function return \p NULL.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        value_type * erase( Q const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase( val, [](value_type const&) {} );
+#       else
+            return erase( val, empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_StripedSet_erase "erase(Q const&)"
+            but \p pred is used for key comparing
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        value_type * erase_with( Q const& val, Less pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return erase_with( val, pred, [](value_type const&) {} );
+#       else
+            return erase_with( val, pred, empty_erase_functor() );
+#       endif
+        }
+
+        /// Deletes the item from the set
+        /** \anchor cds_intrusive_StripedSet_erase_func
+
+            The function searches an item with key equal to \p val in the set,
+            call \p f functor with item found, unlinks it from the set, and returns a pointer to unlinked item.
+
+            The \p Func interface is
+            \code
+            struct functor {
+                void operator()( value_type const& item );
+            };
+            \endcode
+            The functor may be passed by reference with <tt>boost:ref</tt>
+
+            If the item with key equal to \p val is not found the function return \p false.
+
+            Note the hash functor should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q, typename Func>
+        value_type * erase( Q const& val, Func f )
+        {
+            size_t nHash = hashing( val );
+            value_type * pVal;
+            {
+                scoped_cell_lock sl( m_MutexPolicy, nHash );
+                pVal = bucket( nHash )->erase( val, f );
+            }
+
+            if ( pVal )
+                --m_ItemCounter;
+            return pVal;
+        }
+
+        /// Deletes the item from the set using \p pred predicate for searching
+        /**
+            The function is an analog of \ref cds_intrusive_StripedSet_erase_func "erase(Q const&, Func)"
+            but \p pred is used for key comparing
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        value_type * erase_with( Q const& val, Less pred, Func f )
+        {
+            size_t nHash = hashing( val );
+            value_type * pVal;
+            {
+                scoped_cell_lock sl( m_MutexPolicy, nHash );
+                pVal = bucket( nHash )->erase( val, pred, f );
+            }
+
+            if ( pVal )
+                --m_ItemCounter;
+            return pVal;
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_StripedSet_find_func
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q& val, Func f )
+        {
+            return find_( val, f );
+        }
+
+        /// Find the key \p val using \p pred predicate
+        /**
+            The function is an analog of \ref cds_intrusive_StripedSet_find_func "find(Q&, Func)"
+            but \p pred is used for key comparing
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q& val, Less pred, Func f )
+        {
+            return find_with_( val, pred, f );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_StripedSet_find_cfunc
+            The function searches the item with key equal to \p val and calls the functor \p f for item found.
+            The interface of \p Func functor is:
+            \code
+            struct functor {
+                void operator()( value_type& item, Q const& val );
+            };
+            \endcode
+            where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+            You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+            The functor may change non-key fields of \p item.
+
+            The \p val argument is non-const since it can be used as \p f functor destination i.e., the functor
+            may modify both arguments.
+
+            The function returns \p true if \p val is found, \p false otherwise.
+        */
+        template <typename Q, typename Func>
+        bool find( Q const& val, Func f )
+        {
+            return find_( val, f );
+        }
+
+        /// Find the key \p val using \p pred predicate
+        /**
+            The function is an analog of \ref cds_intrusive_StripedSet_find_cfunc "find(Q const&, Func)"
+            but \p pred is used for key comparing
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less, typename Func>
+        bool find_with( Q const& val, Less pred, Func f )
+        {
+            return find_with_( val, pred, f );
+        }
+
+        /// Find the key \p val
+        /** \anchor cds_intrusive_StripedSet_find_val
+            The function searches the item with key equal to \p val
+            and returns \p true if it is found, and \p false otherwise.
+
+            Note the hash functor specified for class \p Traits template parameter
+            should accept a parameter of type \p Q that can be not the same as \p value_type.
+        */
+        template <typename Q>
+        bool find( Q const& val )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return find( val, [](value_type&, Q const& ) {} );
+#       else
+            return find( val, empty_find_functor() );
+#       endif
+        }
+
+        /// Find the key \p val using \p pred predicate
+        /**
+            The function is an analog of \ref cds_intrusive_StripedSet_find_val "find(Q const&)"
+            but \p pred is used for key comparing
+            \p Less has the interface like \p std::less.
+            \p pred must imply the same element order as the comparator used for building the set.
+        */
+        template <typename Q, typename Less>
+        bool find_with( Q const& val, Less pred )
+        {
+#       ifdef CDS_CXX11_LAMBDA_SUPPORT
+            return find_with( val, pred, [](value_type& , Q const& ) {} );
+#       else
+            return find_with( val, pred, empty_find_functor() );
+#       endif
+        }
+
+        /// Clears the set
+        /**
+            The function unlinks all items from the set.
+        */
+        void clear()
+        {
+            // locks entire array
+            scoped_full_lock sl( m_MutexPolicy );
+
+            size_t nBucketCount = bucket_count();
+            bucket_type * pBucket = m_Buckets;
+            for ( size_t i = 0; i < nBucketCount; ++i, ++pBucket )
+                pBucket->clear();
+            m_ItemCounter.reset();
+        }
+
+        /// Clears the set and calls \p disposer for each item
+        /**
+            The function unlinks all items from the set calling \p disposer for each item.
+            \p Disposer functor interface is:
+            \code
+            struct Disposer{
+                void operator()( value_type * p );
+            };
+            \endcode
+        */
+        template <typename Disposer>
+        void clear_and_dispose( Disposer disposer )
+        {
+            // locks entire array
+            scoped_full_lock sl( m_MutexPolicy );
+
+            size_t nBucketCount = bucket_count();
+            bucket_type * pBucket = m_Buckets;
+            for ( size_t i = 0; i < nBucketCount; ++i, ++pBucket )
+                pBucket->clear( disposer );
+            m_ItemCounter.reset();
+        }
+
+        /// Checks if the set is empty
+        /**
+            Emptiness is checked by item counting: if item count is zero then the set is empty.
+        */
+        bool empty() const
+        {
+            return size() == 0;
+        }
+
+        /// Returns item count in the set
+        size_t size() const
+        {
+            return m_ItemCounter;
+        }
+
+        /// Returns the size of hash table
+        /**
+            The hash table size is non-constant and can be increased via resizing.
+        */
+        size_t bucket_count() const
+        {
+            return m_nBucketMask + 1;
+        }
+
+        /// Returns lock array size
+        size_t lock_count() const
+        {
+            return m_MutexPolicy.lock_count();
+        }
+
+        /// Returns resizing policy object
+        resizing_policy& get_resizing_policy()
+        {
+            return m_ResizingPolicy;
+        }
+
+        /// Returns resizing policy (const version)
+        resizing_policy const& get_resizing_policy() const
+        {
+            return m_ResizingPolicy;
+        }
+    };
+}}  // namespace cds::itrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_STRIPED_SET_H
diff --git a/cds/intrusive/striped_set/adapter.h b/cds/intrusive/striped_set/adapter.h
new file mode 100644 (file)
index 0000000..8655175
--- /dev/null
@@ -0,0 +1,371 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_ADAPTER_H
+#define __CDS_INTRUSIVE_STRIPED_SET_ADAPTER_H
+
+#include <cds/opt/options.h>
+#include <cds/intrusive/striped_set/resizing_policy.h>
+#include <cds/opt/hash.h>
+#include <cds/opt/compare.h>    // cds::opt::details::make_comparator - for some adapt specializations
+#include <cds/ref.h>
+
+namespace cds { namespace intrusive {
+
+    /// StripedSet related definitions
+    namespace striped_set {
+
+        /// Default adapter for intrusive striped/refinable hash set
+        /**
+            By default, the metafunction does not make any transformation for container type \p Container.
+            \p Container should provide interface suitable for the hash set.
+
+            The \p SetOptions template argument contains option pack
+            that has been passed to cds::intrusive::StripedSet.
+
+        <b>Bucket interface</b>
+
+            The result of metafunction is a container (a bucket) that should support the following interface:
+
+            Public typedefs that the bucket should provide:
+                - \p value_type - the type of the item in the bucket
+                - \p iterator - bucket's item iterator
+                - \p const_iterator - bucket's item constant iterator
+                - \p default_resizing_policy - default resizing policy preferable for the container.
+                    By default, the library defines cds::container::striped_set::load_factor_resizing<4> for sequential containers like
+                    boost::intrusive::list,  and cds::container::striped_set::no_resizing for ordered container like boost::intrusive::set.
+
+            <b>Insert value \p val of type \p Q</b>
+            \code template <typename Func> bool insert( value_type& val, Func f ) ; \endcode
+                Inserts \p val into the container and, if inserting is successful, calls functor \p f
+                with \p val.
+
+                The functor signature is:
+                \code
+                struct functor {
+                    void operator()( value_type& item );
+                };
+                \endcode
+                where \p item is the item inserted.
+
+                The user-defined functor \p f is called only if the inserting is success. It can be passed by reference
+                using <tt>boost::ref</tt>
+                <hr>
+
+            <b>Ensures that the \p item exists in the container</b>
+            \code template <typename Func> std::pair<bool, bool> ensure( value_type& val, Func f ) \endcode
+                The operation performs inserting or changing data.
+
+                If the \p val key not found in the container, then \p val is inserted.
+                Otherwise, the functor \p f is called with the item found.
+
+                The \p Func functor has the following interface:
+                \code
+                    void func( bool bNew, value_type& item, value_type& val );
+                \endcode
+                or like a functor:
+                \code
+                    struct functor {
+                        void operator()( bool bNew, value_type& item, value_type& val );
+                    };
+                \endcode
+
+                where arguments are:
+                - \p bNew - \p true if the item has been inserted, \p false otherwise
+                - \p item - container's item
+                - \p val - argument \p val passed into the \p ensure function
+
+                If \p val has been inserted (i.e. <tt>bNew == true</tt>) then \p item and \p val
+                are the same element: <tt>&item == &val</tt>. Otherwise, they are different.
+
+                The functor can change non-key fields of the \p item.
+
+                You can pass \p f argument by reference using <tt>boost::ref</tt>.
+
+                Returns <tt> std::pair<bool, bool> </tt> where \p first is true if operation is successfull,
+                \p second is true if new item has been added or \p false if the item with \p val key
+                already exists.
+                <hr>
+
+            <b>Unlink an item</b>
+            \code bool unlink( value_type& val ) \endcode
+                Unlink \p val from the container if \p val belongs to it.
+                <hr>
+
+            <b>Erase \p key</b>
+            \code template <typename Q, typename Func> bool erase( Q const& key, Func f ) \endcode
+                The function searches an item with key \p key, calls \p f functor
+                and erases the item. If \p key is not found, the functor is not called.
+
+                The functor \p Func interface is:
+                \code
+                struct functor {
+                    void operator()(value_type& val);
+                };
+                \endcode
+                The functor can be passed by reference using <tt>boost:ref</tt>
+
+                The type \p Q can differ from \ref value_type of items storing in the container.
+                Therefore, the \p value_type should be comparable with type \p Q.
+
+                Return \p true if key is found and deleted, \p false otherwise
+                <hr>
+
+
+            <b>Find the key \p val </b>
+            \code
+            template <typename Q, typename Func> bool find( Q& val, Func f )
+            template <typename Q, typename Compare, typename Func> bool find( Q& val, Compare cmp, Func f )
+            \endcode
+                The function searches the item with key equal to \p val and calls the functor \p f for item found.
+                The interface of \p Func functor is:
+                \code
+                struct functor {
+                    void operator()( value_type& item, Q& val );
+                };
+                \endcode
+                where \p item is the item found, \p val is the <tt>find</tt> function argument.
+
+                You can pass \p f argument by reference using <tt>boost::ref</tt> or cds::ref.
+
+                The functor can change non-key fields of \p item.
+                The \p val argument may be non-const since it can be used as \p f functor destination i.e., the functor
+                can modify both arguments.
+
+                The type \p Q can differ from \ref value_type of items storing in the container.
+                Therefore, the \p value_type should be comparable with type \p Q.
+
+                The first form uses default \p compare function used for key ordering.
+                The second form allows to point specific \p Compare functor \p cmp
+                that can compare \p value_typwe and \p Q type. The interface of \p Compare is the same as \p std::less.
+
+                The function returns \p true if \p val is found, \p false otherwise.
+                <hr>
+
+            <b>Clears the container</b>
+            \code
+            void clear()
+            template <typename Disposer> void clear( Disposer disposer )
+            \endcode
+            Second form calls \p disposer for each item in the container before clearing.
+            <hr>
+
+            <b>Get size of bucket</b>
+            \code size_t size() const \endcode
+            This function may be required by some resizing policy
+            <hr>
+
+            <b>Iterators</b>
+            \code
+            iterator begin();
+            const_iterator begin() const;
+            iterator end();
+            const_iterator end() const;
+            \endcode
+            <hr>
+
+            <b>Move item when resizing</b>
+            \code void move_item( adapted_container& from, iterator it ) \endcode
+                This helper function is invented for the set resizing when the item
+                pointed by \p it iterator is copied from old bucket \p from to a new bucket
+                pointed by \p this.
+            <hr>
+
+        */
+        template < typename Container, CDS_DECL_OPTIONS >
+        class adapt
+        {
+        public:
+            typedef Container   type            ;   ///< adapted container type
+            typedef typename type::value_type value_type  ;   ///< value type stored in the container
+        };
+
+        //@cond
+        struct adapted_sequential_container
+        {
+            typedef striped_set::load_factor_resizing<4>   default_resizing_policy;
+        };
+
+        struct adapted_container
+        {
+            typedef striped_set::no_resizing   default_resizing_policy;
+        };
+        //@endcond
+
+        //@cond
+        namespace details {
+            template <typename Set>
+            class boost_intrusive_set_adapter: public cds::intrusive::striped_set::adapted_container
+            {
+            public:
+                typedef Set container_type;
+
+                typedef typename container_type::value_type     value_type      ;   ///< value type stored in the container
+                typedef typename container_type::iterator       iterator        ;   ///< container iterator
+                typedef typename container_type::const_iterator const_iterator  ;   ///< container const iterator
+
+                typedef typename container_type::value_compare  key_comparator;
+
+            private:
+#       ifndef CDS_CXX11_LAMBDA_SUPPORT
+                struct empty_insert_functor {
+                    void operator()( value_type& )
+                    {}
+                };
+#       endif
+
+                container_type  m_Set;
+
+            public:
+                boost_intrusive_set_adapter()
+                {}
+
+                container_type& base_container()
+                {
+                    return m_Set;
+                }
+
+                template <typename Func>
+                bool insert( value_type& val, Func f )
+                {
+                    std::pair<iterator, bool> res = m_Set.insert( val );
+                    if ( res.second )
+                        cds::unref(f)( val );
+                    return res.second;
+                }
+
+                template <typename Func>
+                std::pair<bool, bool> ensure( value_type& val, Func f )
+                {
+                    std::pair<iterator, bool> res = m_Set.insert( val );
+                    cds::unref(f)( res.second, *res.first, val );
+                    return std::make_pair( true, res.second );
+                }
+
+                bool unlink( value_type& val )
+                {
+                    iterator it = m_Set.find( value_type(val) );
+                    if ( it == m_Set.end() || &(*it) != &val )
+                        return false;
+                    m_Set.erase( it );
+                    return true;
+                }
+
+                template <typename Q, typename Func>
+                value_type * erase( Q const& key, Func f )
+                {
+                    iterator it = m_Set.find( key, key_comparator() );
+                    if ( it == m_Set.end() )
+                        return null_ptr<value_type *>();
+                    value_type& val = *it;
+                    cds::unref(f)( val );
+                    m_Set.erase( it );
+                    return &val;
+                }
+
+                template <typename Q, typename Less, typename Func>
+                value_type * erase( Q const& key, Less pred, Func f )
+                {
+                    iterator it = m_Set.find( key, pred );
+                    if ( it == m_Set.end() )
+                        return null_ptr<value_type *>();
+                    value_type& val = *it;
+                    cds::unref(f)( val );
+                    m_Set.erase( it );
+                    return &val;
+                }
+
+                template <typename Q, typename Func>
+                bool find( Q& key, Func f )
+                {
+                    return find( key, key_comparator(), f );
+                }
+
+                template <typename Q, typename Compare, typename Func>
+                bool find( Q& key, Compare cmp, Func f )
+                {
+                    iterator it = m_Set.find( key, cmp );
+                    if ( it == m_Set.end() )
+                        return false;
+                    cds::unref(f)( *it, key );
+                    return true;
+                }
+
+                void clear()
+                {
+                    m_Set.clear();
+                }
+
+                template <typename Disposer>
+                void clear( Disposer disposer )
+                {
+                    m_Set.clear_and_dispose( disposer );
+                }
+
+                iterator begin()                { return m_Set.begin(); }
+                const_iterator begin() const    { return m_Set.begin(); }
+                iterator end()                  { return m_Set.end(); }
+                const_iterator end() const      { return m_Set.end(); }
+
+                size_t size() const
+                {
+                    return (size_t) m_Set.size();
+                }
+
+                void move_item( boost_intrusive_set_adapter& from, iterator itWhat )
+                {
+                    value_type& val = *itWhat;
+                    from.base_container().erase( itWhat );
+#           ifdef CDS_CXX11_LAMBDA_SUPPORT
+                    insert( val, []( value_type& ) {} );
+#           else
+                    insert( val, empty_insert_functor() );
+#           endif
+                }
+            };
+        }   // namespace details
+        //@endcond
+
+    } // namespace striped_set
+}} // namespace cds::intrusive
+
+//@cond
+#if defined(CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT) && defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS3    typename... BIOptions
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS4    typename... BIOptions
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS5    typename... BIOptions
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS6    typename... BIOptions
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS7    typename... BIOptions
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS8    typename... BIOptions
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS9    typename... BIOptions
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS10    typename... BIOptions
+
+#   define CDS_BOOST_INTRUSIVE_OPTIONS3    BIOptions...
+#   define CDS_BOOST_INTRUSIVE_OPTIONS4    BIOptions...
+#   define CDS_BOOST_INTRUSIVE_OPTIONS5    BIOptions...
+#   define CDS_BOOST_INTRUSIVE_OPTIONS6    BIOptions...
+#   define CDS_BOOST_INTRUSIVE_OPTIONS7    BIOptions...
+#   define CDS_BOOST_INTRUSIVE_OPTIONS8    BIOptions...
+#   define CDS_BOOST_INTRUSIVE_OPTIONS9    BIOptions...
+#   define CDS_BOOST_INTRUSIVE_OPTIONS10    BIOptions...
+#else
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS3    typename BIO1, typename BIO2, typename BIO3
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS4    CDS_BOOST_INTRUSIVE_DECL_OPTIONS3, typename BIO4
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS5    CDS_BOOST_INTRUSIVE_DECL_OPTIONS4, typename BIO5
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS6    CDS_BOOST_INTRUSIVE_DECL_OPTIONS5, typename BIO6
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS7    CDS_BOOST_INTRUSIVE_DECL_OPTIONS6, typename BIO7
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS8    CDS_BOOST_INTRUSIVE_DECL_OPTIONS7, typename BIO8
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS9    CDS_BOOST_INTRUSIVE_DECL_OPTIONS8, typename BIO9
+#   define CDS_BOOST_INTRUSIVE_DECL_OPTIONS10   CDS_BOOST_INTRUSIVE_DECL_OPTIONS9, typename BIO10
+
+#   define CDS_BOOST_INTRUSIVE_OPTIONS3    BIO1,BIO2,BIO3
+#   define CDS_BOOST_INTRUSIVE_OPTIONS4    CDS_BOOST_INTRUSIVE_OPTIONS3, BIO4
+#   define CDS_BOOST_INTRUSIVE_OPTIONS5    CDS_BOOST_INTRUSIVE_OPTIONS4, BIO5
+#   define CDS_BOOST_INTRUSIVE_OPTIONS6    CDS_BOOST_INTRUSIVE_OPTIONS5, BIO6
+#   define CDS_BOOST_INTRUSIVE_OPTIONS7    CDS_BOOST_INTRUSIVE_OPTIONS6, BIO7
+#   define CDS_BOOST_INTRUSIVE_OPTIONS8    CDS_BOOST_INTRUSIVE_OPTIONS7, BIO8
+#   define CDS_BOOST_INTRUSIVE_OPTIONS9    CDS_BOOST_INTRUSIVE_OPTIONS8, BIO9
+#   define CDS_BOOST_INTRUSIVE_OPTIONS10   CDS_BOOST_INTRUSIVE_OPTIONS9, BIO10
+#endif
+//@endcond
+
+#endif // #ifndef __CDS_INTRUSIVE_STRIPED_SET_ADAPTER_H
diff --git a/cds/intrusive/striped_set/boost_avl_set.h b/cds/intrusive/striped_set/boost_avl_set.h
new file mode 100644 (file)
index 0000000..70e1ed5
--- /dev/null
@@ -0,0 +1,25 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_AVL_SET_ADAPTER_H
+#define __CDS_INTRUSIVE_STRIPED_SET_BOOST_AVL_SET_ADAPTER_H
+
+#include <boost/intrusive/avl_set.hpp>
+#include <cds/intrusive/striped_set/adapter.h>
+
+//@cond
+namespace cds { namespace intrusive { namespace striped_set {
+
+    template <typename T, CDS_BOOST_INTRUSIVE_DECL_OPTIONS4, CDS_SPEC_OPTIONS>
+    class adapt< boost::intrusive::avl_set< T, CDS_BOOST_INTRUSIVE_OPTIONS4 >, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::intrusive::avl_set< T, CDS_BOOST_INTRUSIVE_OPTIONS4 >  container_type  ;   ///< underlying intrusive container type
+
+    public:
+        typedef details::boost_intrusive_set_adapter<container_type>   type ;  ///< Result of the metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+//@endcond
+
+#endif // #ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_AVL_SET_ADAPTER_H
diff --git a/cds/intrusive/striped_set/boost_list.h b/cds/intrusive/striped_set/boost_list.h
new file mode 100644 (file)
index 0000000..c5744b7
--- /dev/null
@@ -0,0 +1,209 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_LIST_ADAPTER_H
+#define __CDS_INTRUSIVE_STRIPED_SET_BOOST_LIST_ADAPTER_H
+
+#include <boost/intrusive/list.hpp>
+#include <cds/intrusive/striped_set/adapter.h>
+
+//@cond
+namespace cds { namespace intrusive { namespace striped_set {
+
+    template <typename T, CDS_BOOST_INTRUSIVE_DECL_OPTIONS3, CDS_SPEC_OPTIONS>
+    class adapt< boost::intrusive::list< T, CDS_BOOST_INTRUSIVE_OPTIONS3 >, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::intrusive::list< T, CDS_BOOST_INTRUSIVE_OPTIONS3 >  container_type  ;   ///< underlying intrusive container type
+
+    private:
+        /// Adapted intrusive container
+        class adapted_container: public cds::intrusive::striped_set::adapted_sequential_container
+        {
+        public:
+            typedef typename container_type::value_type     value_type  ;   ///< value type stored in the container
+            typedef typename container_type::iterator       iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+            typedef typename cds::opt::details::make_comparator_from_option_list< value_type, CDS_OPTIONS >::type key_comparator;
+
+        private:
+            struct find_predicate
+            {
+                bool operator()( value_type const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( Q const& i1, value_type const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+
+                template <typename Q>
+                bool operator()( value_type const& i1, Q const& i2) const
+                {
+                    return key_comparator()( i1, i2 ) < 0;
+                }
+            };
+
+#       ifndef CDS_CXX11_LAMBDA_SUPPORT
+            struct empty_insert_functor {
+                void operator()( value_type& )
+                {}
+            };
+#       endif
+
+            template <typename Q, typename Pred>
+            iterator find_key( Q const& key, Pred pred)
+            {
+                iterator itEnd = m_List.end();
+                iterator it;
+                for ( it = m_List.begin(); it != itEnd; ++it ) {
+                    if ( !pred( *it, key ) )
+                        break;
+                }
+                return it;
+            }
+
+        private:
+            container_type  m_List;
+
+        public:
+            adapted_container()
+            {}
+
+            container_type& base_container()
+            {
+                return m_List;
+            }
+
+            template <typename Func>
+            bool insert( value_type& val, Func f )
+            {
+                iterator it = find_key( val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, *it ) != 0 ) {
+                    m_List.insert( it, val );
+                    cds::unref( f )( val );
+
+                    return true;
+                }
+
+                // key already exists
+                return false;
+            }
+
+            template <typename Func>
+            std::pair<bool, bool> ensure( value_type& val, Func f )
+            {
+                iterator it = find_key( val, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( val, *it ) != 0 ) {
+                    // insert new
+                    m_List.insert( it, val );
+                    cds::unref( f )( true, val, val );
+                    return std::make_pair( true, true );
+                }
+                else {
+                    // already exists
+                    cds::unref( f )( false, *it, val );
+                    return std::make_pair( true, false );
+                }
+            }
+
+            bool unlink( value_type& val )
+            {
+                iterator it = find_key( val, find_predicate() );
+                if ( it == m_List.end() || &(*it) != &val )
+                    return false;
+
+                m_List.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            value_type * erase( Q const& key, Func f )
+            {
+                iterator it = find_key( key, find_predicate() );
+                if ( it == m_List.end() || key_comparator()( key, *it ) != 0 )
+                    return null_ptr<value_type *>();
+
+                // key exists
+                value_type& val = *it;
+                cds::unref( f )( val );
+                m_List.erase( it );
+
+                return &val;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            value_type * erase( Q const& key, Less pred, Func f )
+            {
+                iterator it = find_key( key, pred );
+                if ( it == m_List.end() || pred( key, *it ) || pred( *it, key ) )
+                    return null_ptr<value_type *>();
+
+                // key exists
+                value_type& val = *it;
+                cds::unref( f )( val );
+                m_List.erase( it );
+
+                return &val;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& key, Func f )
+            {
+                return find( key, find_predicate(), f );
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& key, Less pred, Func f )
+            {
+                iterator it = find_key( key, pred );
+                if ( it == m_List.end() || pred( key, *it ) || pred( *it, key ))
+                    return false;
+
+                // key exists
+                cds::unref( f )( *it, key );
+                return true;
+            }
+
+            void clear()
+            {
+                m_List.clear();
+            }
+
+            template <typename Disposer>
+            void clear( Disposer disposer )
+            {
+                m_List.clear_and_dispose( disposer );
+            }
+
+            iterator begin()                { return m_List.begin(); }
+            const_iterator begin() const    { return m_List.begin(); }
+            iterator end()                  { return m_List.end(); }
+            const_iterator end() const      { return m_List.end(); }
+
+            size_t size() const
+            {
+                return (size_t) m_List.size();
+            }
+
+            void move_item( adapted_container& from, iterator itWhat )
+            {
+                value_type& val = *itWhat;
+                from.base_container().erase( itWhat );
+#           ifdef CDS_CXX11_LAMBDA_SUPPORT
+                insert( val, []( value_type& ) {} );
+#           else
+                insert( val, empty_insert_functor() );
+#           endif
+            }
+
+        };
+    public:
+        typedef adapted_container   type ;  ///< Result of the metafunction
+    };
+}}} // namespace cds::intrusive::striped_set
+//@endcond
+
+#endif // #ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_LIST_ADAPTER_H
diff --git a/cds/intrusive/striped_set/boost_set.h b/cds/intrusive/striped_set/boost_set.h
new file mode 100644 (file)
index 0000000..c8fcadf
--- /dev/null
@@ -0,0 +1,25 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_SET_ADAPTER_H
+#define __CDS_INTRUSIVE_STRIPED_SET_BOOST_SET_ADAPTER_H
+
+#include <boost/intrusive/set.hpp>
+#include <cds/intrusive/striped_set/adapter.h>
+
+//@cond
+namespace cds { namespace intrusive { namespace striped_set {
+
+    template <typename T, CDS_BOOST_INTRUSIVE_DECL_OPTIONS4, CDS_SPEC_OPTIONS>
+    class adapt< boost::intrusive::set< T, CDS_BOOST_INTRUSIVE_OPTIONS4 >, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::intrusive::set< T, CDS_BOOST_INTRUSIVE_OPTIONS4 >  container_type  ;   ///< underlying intrusive container type
+
+    public:
+        typedef details::boost_intrusive_set_adapter<container_type>   type ;  ///< Result of the metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+//@endcond
+
+#endif // #ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_SET_ADAPTER_H
diff --git a/cds/intrusive/striped_set/boost_sg_set.h b/cds/intrusive/striped_set/boost_sg_set.h
new file mode 100644 (file)
index 0000000..d044598
--- /dev/null
@@ -0,0 +1,25 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_SG_SET_ADAPTER_H
+#define __CDS_INTRUSIVE_STRIPED_SET_BOOST_SG_SET_ADAPTER_H
+
+#include <boost/intrusive/sg_set.hpp>
+#include <cds/intrusive/striped_set/adapter.h>
+
+//@cond
+namespace cds { namespace intrusive { namespace striped_set {
+
+    template <typename T, CDS_BOOST_INTRUSIVE_DECL_OPTIONS4, CDS_SPEC_OPTIONS>
+    class adapt< boost::intrusive::sg_set< T, CDS_BOOST_INTRUSIVE_OPTIONS4 >, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::intrusive::sg_set< T, CDS_BOOST_INTRUSIVE_OPTIONS4 >  container_type  ;   ///< underlying intrusive container type
+
+    public:
+        typedef details::boost_intrusive_set_adapter<container_type>   type ;  ///< Result of the metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+//@endcond
+
+#endif // #ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_SG_SET_ADAPTER_H
diff --git a/cds/intrusive/striped_set/boost_slist.h b/cds/intrusive/striped_set/boost_slist.h
new file mode 100644 (file)
index 0000000..0d86116
--- /dev/null
@@ -0,0 +1,226 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_SLIST_ADAPTER_H
+#define __CDS_INTRUSIVE_STRIPED_SET_BOOST_SLIST_ADAPTER_H
+
+#include <boost/intrusive/slist.hpp>
+#include <cds/intrusive/striped_set/adapter.h>
+
+//@cond
+namespace cds { namespace intrusive { namespace striped_set {
+
+    template <typename T, CDS_BOOST_INTRUSIVE_DECL_OPTIONS5, CDS_SPEC_OPTIONS>
+    class adapt< boost::intrusive::slist< T, CDS_BOOST_INTRUSIVE_OPTIONS5 >, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::intrusive::slist< T, CDS_BOOST_INTRUSIVE_OPTIONS5 >  container_type  ;   ///< underlying intrusive container type
+
+    private:
+        /// Adapted intrusive container
+        class adapted_container: public cds::intrusive::striped_set::adapted_sequential_container
+        {
+        public:
+            typedef typename container_type::value_type     value_type  ;   ///< value type stored in the container
+            typedef typename container_type::iterator       iterator ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator ;    ///< container const iterator
+
+            typedef typename cds::opt::details::make_comparator_from_option_list< value_type, CDS_OPTIONS >::type key_comparator;
+
+        private:
+
+            template <typename Q, typename Less>
+            std::pair< iterator, bool > find_prev_item( Q const& key, Less pred )
+            {
+                iterator itPrev = m_List.before_begin();
+                iterator itEnd = m_List.end();
+                for ( iterator it = m_List.begin(); it != itEnd; ++it ) {
+                    if ( pred( key, *it ) )
+                        itPrev = it;
+                    else if ( pred( *it, key ) )
+                        break;
+                    else
+                        return std::make_pair( itPrev, true );
+                }
+                return std::make_pair( itPrev, false );
+            }
+
+            template <typename Q>
+            std::pair< iterator, bool > find_prev_item( Q const& key )
+            {
+                return find_prev_item_cmp( key, key_comparator() );
+            }
+
+            template <typename Q, typename Compare>
+            std::pair< iterator, bool > find_prev_item_cmp( Q const& key, Compare cmp )
+            {
+                iterator itPrev = m_List.before_begin();
+                iterator itEnd = m_List.end();
+                for ( iterator it = m_List.begin(); it != itEnd; ++it ) {
+                    int nCmp = cmp( key, *it );
+                    if ( nCmp < 0 )
+                        itPrev = it;
+                    else if ( nCmp > 0 )
+                        break;
+                    else
+                        return std::make_pair( itPrev, true );
+                }
+                return std::make_pair( itPrev, false );
+            }
+
+            template <typename Q, typename Compare, typename Func>
+            value_type * erase_( Q const& key, Compare cmp, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item_cmp( key, cmp );
+                if ( !pos.second )
+                    return null_ptr<value_type *>();
+
+                // key exists
+                iterator it = pos.first;
+                value_type& val = *(++it);
+                cds::unref( f )( val );
+                m_List.erase_after( pos.first );
+
+                return &val;
+            }
+
+
+#       ifndef CDS_CXX11_LAMBDA_SUPPORT
+            struct empty_insert_functor {
+                void operator()( value_type& )
+                {}
+            };
+#       endif
+
+        private:
+            container_type  m_List;
+
+        public:
+            adapted_container()
+            {}
+
+            container_type& base_container()
+            {
+                return m_List;
+            }
+
+            template <typename Func>
+            bool insert( value_type& val, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( val );
+                if ( !pos.second ) {
+                    m_List.insert_after( pos.first, val );
+                    cds::unref( f )( val );
+                    return true;
+                }
+
+                // key already exists
+                return false;
+            }
+
+            template <typename Func>
+            std::pair<bool, bool> ensure( value_type& val, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( val );
+                if ( !pos.second ) {
+                    // insert new
+                    m_List.insert_after( pos.first, val );
+                    cds::unref( f )( true, val, val );
+                    return std::make_pair( true, true );
+                }
+                else {
+                    // already exists
+                    cds::unref( f )( false, *(++pos.first), val );
+                    return std::make_pair( true, false );
+                }
+            }
+
+            bool unlink( value_type& val )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( val );
+                if ( !pos.second )
+                    return false;
+
+                ++pos.first;
+                if ( &(*pos.first) != &val )
+                    return false;
+
+                m_List.erase( pos.first );
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            value_type * erase( Q const& key, Func f )
+            {
+                return erase_( key, key_comparator(), f );
+            }
+
+            template <typename Q, typename Less, typename Func>
+            value_type * erase( Q const& key, Less pred, Func f )
+            {
+                return erase_( key, cds::opt::details::make_comparator_from_less<Less>(), f );
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& key, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( key );
+                if ( !pos.second )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *(++pos.first), key );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& key, Less pred, Func f )
+            {
+                std::pair< iterator, bool > pos = find_prev_item( key, pred );
+                if ( !pos.second )
+                    return false;
+
+                // key exists
+                cds::unref( f )( *(++pos.first), key );
+                return true;
+            }
+
+            void clear()
+            {
+                m_List.clear();
+            }
+
+            template <typename Disposer>
+            void clear( Disposer disposer )
+            {
+                m_List.clear_and_dispose( disposer );
+            }
+
+            iterator begin()                { return m_List.begin(); }
+            const_iterator begin() const    { return m_List.begin(); }
+            iterator end()                  { return m_List.end(); }
+            const_iterator end() const      { return m_List.end(); }
+
+            size_t size() const
+            {
+                return (size_t) m_List.size();
+            }
+
+            void move_item( adapted_container& from, iterator itWhat )
+            {
+                value_type& val = *itWhat;
+                from.base_container().erase( itWhat );
+#           ifdef CDS_CXX11_LAMBDA_SUPPORT
+                insert( val, []( value_type& ) {} );
+#           else
+                insert( val, empty_insert_functor() );
+#           endif
+            }
+
+        };
+    public:
+        typedef adapted_container   type ;  ///< Result of the metafunction
+    };
+}}} // namespace cds::intrusive::striped_set
+//@endcond
+
+#endif // #ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_SLIST_ADAPTER_H
diff --git a/cds/intrusive/striped_set/boost_splay_set.h b/cds/intrusive/striped_set/boost_splay_set.h
new file mode 100644 (file)
index 0000000..d993317
--- /dev/null
@@ -0,0 +1,25 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_SPLAY_SET_ADAPTER_H
+#define __CDS_INTRUSIVE_STRIPED_SET_BOOST_SPLAY_SET_ADAPTER_H
+
+#include <boost/intrusive/splay_set.hpp>
+#include <cds/intrusive/striped_set/adapter.h>
+
+//@cond
+namespace cds { namespace intrusive { namespace striped_set {
+
+    template <typename T, CDS_BOOST_INTRUSIVE_DECL_OPTIONS4, CDS_SPEC_OPTIONS>
+    class adapt< boost::intrusive::splay_set< T, CDS_BOOST_INTRUSIVE_OPTIONS4 >, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::intrusive::splay_set< T, CDS_BOOST_INTRUSIVE_OPTIONS4 >  container_type  ;   ///< underlying intrusive container type
+
+    public:
+        typedef details::boost_intrusive_set_adapter<container_type>   type ;  ///< Result of the metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+//@endcond
+
+#endif // #ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_SPLAY_SET_ADAPTER_H
diff --git a/cds/intrusive/striped_set/boost_treap_set.h b/cds/intrusive/striped_set/boost_treap_set.h
new file mode 100644 (file)
index 0000000..0e0cc2b
--- /dev/null
@@ -0,0 +1,25 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_TREAP_SET_ADAPTER_H
+#define __CDS_INTRUSIVE_STRIPED_SET_BOOST_TREAP_SET_ADAPTER_H
+
+#include <boost/intrusive/treap_set.hpp>
+#include <cds/intrusive/striped_set/adapter.h>
+
+//@cond
+namespace cds { namespace intrusive { namespace striped_set {
+
+    template <typename T, CDS_BOOST_INTRUSIVE_DECL_OPTIONS4, CDS_SPEC_OPTIONS>
+    class adapt< boost::intrusive::treap_set< T, CDS_BOOST_INTRUSIVE_OPTIONS4 >, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::intrusive::treap_set< T, CDS_BOOST_INTRUSIVE_OPTIONS4 >  container_type  ;   ///< underlying intrusive container type
+
+    public:
+        typedef details::boost_intrusive_set_adapter<container_type>   type ;  ///< Result of the metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+//@endcond
+
+#endif // #ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_TREAP_SET_ADAPTER_H
diff --git a/cds/intrusive/striped_set/boost_unordered_set.h b/cds/intrusive/striped_set/boost_unordered_set.h
new file mode 100644 (file)
index 0000000..d7d46a6
--- /dev/null
@@ -0,0 +1,192 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_UNORDERED_SET_ADAPTER_H
+#define __CDS_INTRUSIVE_STRIPED_SET_BOOST_UNORDERED_SET_ADAPTER_H
+
+#include <boost/intrusive/unordered_set.hpp>
+#include <cds/intrusive/striped_set/adapter.h>
+#include <cds/opt/buffer.h>
+
+//@cond
+namespace cds { namespace intrusive { namespace striped_set {
+
+    template <typename T, CDS_BOOST_INTRUSIVE_DECL_OPTIONS10, CDS_SPEC_OPTIONS>
+    class adapt< boost::intrusive::unordered_set< T, CDS_BOOST_INTRUSIVE_OPTIONS10 >, CDS_OPTIONS >
+    {
+    public:
+        typedef boost::intrusive::unordered_set< T, CDS_BOOST_INTRUSIVE_OPTIONS10 >  container_type  ;   ///< underlying intrusive container type
+
+    private:
+        class adapted_container
+        {
+        public:
+            typedef typename container_type::value_type     value_type      ;   ///< value type stored in the container
+            typedef typename container_type::iterator       iterator        ;   ///< container iterator
+            typedef typename container_type::const_iterator const_iterator  ;   ///< container const iterator
+
+            typedef typename opt::value<
+                typename opt::find_option<
+                    opt::buffer< opt::v::static_buffer< cds::any_type, 256 > >,
+                    CDS_OPTIONS
+                >::type
+            >::buffer    initial_buffer_type;
+            typedef typename initial_buffer_type::template rebind< typename container_type::bucket_type >::other    buffer_type;
+            typedef cds::intrusive::striped_set::load_factor_resizing<256>   default_resizing_policy;
+
+        private:
+#       ifndef CDS_CXX11_LAMBDA_SUPPORT
+            struct empty_insert_functor {
+                void operator()( value_type& )
+                {}
+            };
+#       endif
+
+            template <typename Compare>
+            struct equal_from_compare
+            {
+                Compare& m_cmp;
+                equal_from_compare( Compare& cmp )
+                    : m_cmp( cmp )
+                {}
+
+                equal_from_compare( equal_from_compare const& src )
+                    : m_cmp( src.m_cmp )
+                {}
+
+                template <typename A, typename B>
+                bool operator()( A& a, B& b ) const
+                {
+                    return !m_cmp( a, b ) && !m_cmp( b, a );
+                }
+
+                template <typename A, typename B>
+                bool operator()( A& a, B& b )
+                {
+                    return !m_cmp( a, b ) && !m_cmp( b, a );
+                }
+            };
+
+            buffer_type     m_Buckets   ;   // buffer should be declared first since it is used in m_Set ctor.
+            container_type  m_Set;
+
+        public:
+            adapted_container()
+                : m_Set( typename container_type::bucket_traits( m_Buckets.buffer(), m_Buckets.capacity() ))
+            {}
+
+            container_type& base_container()
+            {
+                return m_Set;
+            }
+
+            template <typename Func>
+            bool insert( value_type& val, Func f )
+            {
+                std::pair<iterator, bool> res = m_Set.insert( val );
+                if ( res.second )
+                    cds::unref(f)( val );
+                return res.second;
+            }
+
+            template <typename Func>
+            std::pair<bool, bool> ensure( value_type& val, Func f )
+            {
+                std::pair<iterator, bool> res = m_Set.insert( val );
+                cds::unref(f)( res.second, *res.first, val );
+                return std::make_pair( true, res.second );
+            }
+
+            bool unlink( value_type& val )
+            {
+                iterator it = m_Set.find( value_type(val) );
+                if ( it == m_Set.end() || &(*it) != &val )
+                    return false;
+                m_Set.erase( it );
+                return true;
+            }
+
+            template <typename Q, typename Func>
+            value_type * erase( Q const& key, Func f )
+            {
+                iterator it = m_Set.find( key, typename container_type::hasher(), typename container_type::key_equal() );
+                if ( it == m_Set.end() )
+                    return null_ptr<value_type *>();
+                value_type& val = *it;
+                cds::unref(f)( val );
+                m_Set.erase( it );
+                return &val;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            value_type * erase( Q const& key, Less pred, Func f )
+            {
+                iterator it = m_Set.find( key, typename container_type::hasher(), equal_from_compare<Less>(pred) );
+                if ( it == m_Set.end() )
+                    return null_ptr<value_type *>();
+                value_type& val = *it;
+                cds::unref(f)( val );
+                m_Set.erase( it );
+                return &val;
+            }
+
+            template <typename Q, typename Func>
+            bool find( Q& key, Func f )
+            {
+                iterator it = m_Set.find( key, typename container_type::hasher(), typename container_type::key_equal() );
+                if ( it == m_Set.end() )
+                    return false;
+                cds::unref(f)( *it, key );
+                return true;
+            }
+
+            template <typename Q, typename Less, typename Func>
+            bool find( Q& key, Less pred, Func f )
+            {
+                iterator it = m_Set.find( key, typename container_type::hasher(), equal_from_compare<Less>(pred) );
+                if ( it == m_Set.end() )
+                    return false;
+                cds::unref(f)( *it, key );
+                return true;
+            }
+
+            void clear()
+            {
+                m_Set.clear();
+            }
+
+            template <typename Disposer>
+            void clear( Disposer disposer )
+            {
+                m_Set.clear_and_dispose( disposer );
+            }
+
+            iterator begin()                { return m_Set.begin(); }
+            const_iterator begin() const    { return m_Set.begin(); }
+            iterator end()                  { return m_Set.end(); }
+            const_iterator end() const      { return m_Set.end(); }
+
+            size_t size() const
+            {
+                return (size_t) m_Set.size();
+            }
+
+            void move_item( adapted_container& from, iterator itWhat )
+            {
+                value_type& val = *itWhat;
+                from.base_container().erase( itWhat );
+#           ifdef CDS_CXX11_LAMBDA_SUPPORT
+                insert( val, []( value_type& ) {} );
+#           else
+                insert( val, empty_insert_functor() );
+#           endif
+            }
+        };
+
+    public:
+        typedef adapted_container   type ;  ///< Result of the metafunction
+
+    };
+}}} // namespace cds::intrusive::striped_set
+//@endcond
+
+#endif // #ifndef __CDS_INTRUSIVE_STRIPED_SET_BOOST_UNORDERED_SET_ADAPTER_H
diff --git a/cds/intrusive/striped_set/resizing_policy.h b/cds/intrusive/striped_set/resizing_policy.h
new file mode 100644 (file)
index 0000000..2ffdc33
--- /dev/null
@@ -0,0 +1,189 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_RESIZING_POLICY_H
+#define __CDS_INTRUSIVE_STRIPED_SET_RESIZING_POLICY_H
+
+#include <cds/opt/options.h>
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// Load factor based resizing policy
+    /**
+        When total item count in a container exceeds
+        <tt>container.bucket_count() * LoadFactor</tt>
+        then resizing is needed.
+
+        This policy is stateless.
+
+        The <tt>reset()</tt> function is called after the resizing is done.
+        The function is intended for resetting internal state of the policy.
+    */
+    template <size_t LoadFactor>
+    struct load_factor_resizing
+    {
+        /// Main policy operator returns \p true when resizing is needed
+        template <typename Container, typename Bucket>
+        bool operator ()(
+            size_t nSize,                   ///< Current item count of \p container
+            Container const& container,     ///< Container
+            Bucket const& /*bucket*/        ///< reference to a container's bucket (not used)
+        ) const
+        {
+            return nSize > container.bucket_count() * LoadFactor;
+        }
+
+        /// Resets internal state of the policy (does nothing)
+        void reset()
+        {}
+    };
+
+    /// Load factor based resizing policy, stateful specialization
+    /**
+        This specialization allows to specify a load factor at runtime.
+    */
+    template <>
+    struct load_factor_resizing<0>
+    {
+        ///@cond
+        const size_t m_nLoadFactor;
+        //@endcond
+    public:
+        /// Default ctor, load factor is 4
+        load_factor_resizing()
+            : m_nLoadFactor(4)
+        {}
+
+        /// Ctor with explicitly defined \p nLoadFactor
+        explicit load_factor_resizing( size_t nLoadFactor )
+            : m_nLoadFactor( nLoadFactor )
+        {}
+
+        /// Copy ctor
+        load_factor_resizing( load_factor_resizing const& src )
+            : m_nLoadFactor( src.m_nLoadFactor )
+        {}
+
+#   ifdef CDS_RVALUE_SUPPORT
+        /// Move ctor (for the compilers supporting rvalue reference)
+        load_factor_resizing( load_factor_resizing&& src )
+            : m_nLoadFactor( src.m_nLoadFactor )
+        {}
+#   endif
+
+        /// Main policy operator returns \p true when resizing is needed
+        template <typename Container, typename Bucket>
+        bool operator ()(
+            size_t nSize,                   ///< Current item count of \p container
+            Container const& container,     ///< Container
+            Bucket const& /*bucket*/        ///< reference to a container's bucket (not used)
+        )
+        {
+            return nSize > container.bucket_count() * m_nLoadFactor;
+        }
+
+        /// Resets internal state of the policy (does nothing)
+        void reset()
+        {}
+    };
+
+
+    /// Single bucket threshold resizing policy
+    /**
+        If any single bucket size exceeds the global \p Threshold then resizing is needed.
+
+        This policy is stateless.
+    */
+    template <size_t Threshold>
+    struct single_bucket_size_threshold
+    {
+        /// Main policy operator returns \p true when resizing is needed
+        template <typename Container, typename Bucket>
+        bool operator ()(
+            size_t /*nSize*/,                   ///< Current item count of \p container (not used)
+            Container const& /*container*/,     ///< Container (not used)
+            Bucket const& bucket                ///< reference to a container's bucket
+            ) const
+        {
+            return bucket.size() > Threshold;
+        }
+
+        /// Resets internal state of the policy (does nothing)
+        void reset()
+        {}
+    };
+
+
+    /// Single bucket threshold resizing policy, stateful specialization
+    /**
+        This specialization allows to specify and modify a threshold at runtime.
+    */
+    template <>
+    struct single_bucket_size_threshold<0>
+    {
+        size_t  m_nThreshold    ;   ///< The bucket size threshold
+
+        /// Default ctor, the threshold is 4
+        single_bucket_size_threshold()
+            : m_nThreshold(4)
+        {}
+
+        /// Ctor with explicitly defined \p nThreshold
+        explicit single_bucket_size_threshold( size_t nThreshold )
+            : m_nThreshold( nThreshold )
+        {}
+
+        /// Copy ctor
+        single_bucket_size_threshold( single_bucket_size_threshold const& src )
+            : m_nThreshold( src.m_nThreshold )
+        {}
+
+#   ifdef CDS_RVALUE_SUPPORT
+        /// Move ctor (for the compilers supporting rvalue reference)
+        single_bucket_size_threshold( single_bucket_size_threshold&& src )
+            : m_nThreshold( src.m_nThreshold )
+        {}
+#   endif
+
+        /// Main policy operator returns \p true when resizing is needed
+        template <typename Container, typename Bucket>
+        bool operator ()(
+            size_t /*nSize*/,                   ///< Current item count of \p container (not used)
+            Container const& /*container*/,     ///< Container (not used)
+            Bucket const& bucket                ///< reference to a container's bucket
+            ) const
+        {
+            return bucket.size() > m_nThreshold;
+        }
+
+        /// Resets internal state of the policy (does nothing)
+        void reset()
+        {}
+    };
+
+    /// Dummy resizing policy
+    /**
+        This policy is dummy and always returns \p false that means no resizing is needed.
+
+        This policy is stateless.
+    */
+    struct no_resizing
+    {
+        /// Main policy operator always returns \p false
+        template <typename Container, typename Bucket>
+        bool operator ()(
+            size_t /*nSize*/,                   ///< Current item count of \p container (not used)
+            Container const& /*container*/,     ///< Container (not used)
+            Bucket const& /*bucket*/            ///< reference to a container's bucket (not used)
+        ) const
+        {
+            return false;
+        }
+
+        /// Resets internal state of the policy (does nothing)
+        void reset()
+        {}
+    };
+
+}}} // namespace cds::intrusive::striped_set
+
+#endif // #define __CDS_INTRUSIVE_STRIPED_SET_RESIZING_POLICY_H
diff --git a/cds/intrusive/striped_set/striping_policy.h b/cds/intrusive/striped_set/striping_policy.h
new file mode 100644 (file)
index 0000000..881d2cf
--- /dev/null
@@ -0,0 +1,360 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_STRIPED_SET_STRIPING_POLICY_H
+#define __CDS_INTRUSIVE_STRIPED_SET_STRIPING_POLICY_H
+
+#include <cds/lock/array.h>
+#include <cds/os/thread.h>
+#include <cds/details/std/memory.h>
+#include <cds/lock/spinlock.h>
+
+#include <cds/details/std/mutex.h>
+//#include <boost/thread/mutex.hpp>
+//#include <boost/thread/recursive_mutex.hpp>
+
+
+namespace cds { namespace intrusive { namespace striped_set {
+
+    /// Lock striping concurrent access policy
+    /**
+        This is one of available opt::mutex_policy option type for StripedSet
+
+        Lock striping is very simple technique.
+        The set consists of the bucket table and the array of locks.
+        Initially, the capacity of lock array and bucket table is the same.
+        When set is resized, bucket table capacity will be doubled but lock array will not.
+        The lock \p i protects each bucket \p j, where <tt> j = i mod L </tt>,
+        where \p L - the size of lock array.
+
+        The policy contains an internal array of \p Lock locks.
+
+        Template arguments:
+        - \p Lock - the type of mutex. The default is \p cds_std::mutex. The mutex type should be default-constructible.
+            Note that a spin-lock is not so good suitable for lock striping for performance reason.
+        - \p Alloc - allocator type used for lock array memory allocation. Default is \p CDS_DEFAULT_ALLOCATOR.
+    */
+    template <class Lock = cds_std::mutex, class Alloc = CDS_DEFAULT_ALLOCATOR >
+    class striping
+    {
+    public:
+        typedef Lock    lock_type       ;   ///< lock type
+        typedef Alloc   allocator_type  ;   ///< allocator type
+
+        typedef cds::lock::array< lock_type, cds::lock::pow2_select_policy, allocator_type >    lock_array_type ;   ///< lock array type
+
+    protected:
+        //@cond
+        lock_array_type m_Locks;
+        //@endcond
+
+    public:
+        //@cond
+        class scoped_cell_lock {
+            cds::lock::scoped_lock< lock_array_type >   m_guard;
+
+        public:
+            scoped_cell_lock( striping& policy, size_t nHash )
+                : m_guard( policy.m_Locks, nHash )
+            {}
+        };
+
+        class scoped_full_lock {
+            cds::lock::scoped_lock< lock_array_type >   m_guard;
+        public:
+            scoped_full_lock( striping& policy )
+                : m_guard( policy.m_Locks )
+            {}
+        };
+
+        class scoped_resize_lock: public scoped_full_lock {
+        public:
+            scoped_resize_lock( striping& policy )
+                : scoped_full_lock( policy )
+            {}
+
+            bool success() const
+            {
+                return true;
+            }
+        };
+        //@endcond
+
+    public:
+        /// Constructor
+        striping(
+            size_t nLockCount   ///< The size of lock array. Must be power of two.
+        )
+            : m_Locks( nLockCount, cds::lock::pow2_select_policy( nLockCount ))
+        {}
+
+        /// Returns lock array size
+        /**
+            Lock array size is unchanged during \p striped object lifetime
+        */
+        size_t lock_count() const
+        {
+            return m_Locks.size();
+        }
+
+        //@cond
+        void resize( size_t /*nNewCapacity*/ )
+        {}
+        //@endcond
+    };
+
+
+    /// Refinable concurrent access policy
+    /**
+        This is one of available opt::mutex_policy option type for StripedSet
+
+        Refining is like a striping technique (see striped_set::striping)
+        but it allows growing the size of lock array when resizing the hash table.
+        So, the sizes of hash table and lock array are equal.
+
+        Template arguments:
+        - \p RecursiveLock - the type of mutex. Reentrant (recursive) mutex is required.
+            The default is \p cds_std::recursive_mutex. The mutex type should be default-constructible.
+        - \p BackOff - back-off strategy. Default is cds::backoff::yield
+        - \p Alloc - allocator type used for lock array memory allocation. Default is \p CDS_DEFAULT_ALLOCATOR.
+    */
+    template <
+        class RecursiveLock = cds_std::recursive_mutex,
+        typename BackOff = cds::backoff::yield,
+        class Alloc = CDS_DEFAULT_ALLOCATOR>
+    class refinable
+    {
+    public:
+        typedef RecursiveLock   lock_type   ;   ///< lock type
+        typedef BackOff         back_off    ;   ///< back-off strategy used
+        typedef Alloc           allocator_type; ///< allocator type
+
+    protected:
+        //@cond
+        typedef cds::lock::trivial_select_policy  lock_selection_policy;
+
+        class lock_array_type
+            : public cds::lock::array< lock_type, lock_selection_policy, allocator_type >
+            , public std::enable_shared_from_this< lock_array_type >
+        {
+            typedef cds::lock::array< lock_type, lock_selection_policy, allocator_type >    lock_array_base;
+        public:
+            lock_array_type( size_t nCapacity )
+                : lock_array_base( nCapacity )
+            {}
+        };
+        typedef std::shared_ptr< lock_array_type >  lock_array_ptr;
+        typedef cds::details::Allocator< lock_array_type, allocator_type >  lock_array_allocator;
+
+        typedef unsigned long long  owner_t;
+        typedef cds::OS::ThreadId   threadId_t;
+
+        typedef cds::lock::Spin     spinlock_type;
+        typedef cds::lock::scoped_lock< spinlock_type > scoped_spinlock;
+        //@endcond
+
+    protected:
+        //@cond
+        static owner_t const c_nOwnerMask = (((owner_t) 1) << (sizeof(owner_t) * 8 - 1)) - 1;
+
+        lock_array_ptr                  m_arrLocks  ;   ///< Lock array. The capacity of array is specified in constructor.
+        CDS_ATOMIC::atomic< owner_t >   m_Owner     ;   ///< owner mark (thread id + boolean flag)
+        CDS_ATOMIC::atomic<size_t>      m_nCapacity ;   ///< Lock array capacity
+        spinlock_type                   m_access    ;   ///< access to m_arrLocks
+        //@endcond
+
+    protected:
+        //@cond
+        struct lock_array_disposer {
+            void operator()( lock_array_type * pArr )
+            {
+                lock_array_allocator().Delete( pArr );
+            }
+        };
+
+        lock_array_ptr create_lock_array( size_t nCapacity )
+        {
+            m_nCapacity.store( nCapacity, CDS_ATOMIC::memory_order_relaxed );
+            return lock_array_ptr( lock_array_allocator().New( nCapacity ), lock_array_disposer() );
+        }
+
+        lock_type& acquire( size_t nHash )
+        {
+            owner_t me = (owner_t) cds::OS::getCurrentThreadId();
+            owner_t who;
+
+            back_off bkoff;
+            while ( true ) {
+                // wait while resizing
+                while ( true ) {
+                    who = m_Owner.load( CDS_ATOMIC::memory_order_acquire );
+                    if ( !( who & 1 ) || (who >> 1) == (me & c_nOwnerMask) )
+                        break;
+                    bkoff();
+                }
+
+                lock_array_ptr pLocks;
+                {
+                    scoped_spinlock sl(m_access);
+                    pLocks = m_arrLocks;
+                }
+
+                lock_type& lock = pLocks->at( nHash & (pLocks->size() - 1));
+                lock.lock();
+
+                who = m_Owner.load( CDS_ATOMIC::memory_order_acquire );
+                if ( ( !(who & 1) || (who >> 1) == (me & c_nOwnerMask) ) && m_arrLocks == pLocks )
+                    return lock;
+                lock.unlock();
+            }
+        }
+
+        lock_array_ptr acquire_all()
+        {
+            owner_t me = (owner_t) cds::OS::getCurrentThreadId();
+            owner_t who;
+
+            back_off bkoff;
+            while ( true ) {
+                // wait while resizing
+                while ( true ) {
+                    who = m_Owner.load( CDS_ATOMIC::memory_order_acquire );
+                    if ( !( who & 1 ) || (who >> 1) == (me & c_nOwnerMask) )
+                        break;
+                    bkoff();
+                }
+
+                lock_array_ptr pLocks;
+                {
+                    scoped_spinlock sl(m_access);
+                    pLocks = m_arrLocks;
+                }
+
+                pLocks->lock_all();
+
+                who = m_Owner.load( CDS_ATOMIC::memory_order_acquire );
+                if ( ( !(who & 1) || (who >> 1) == (me & c_nOwnerMask) ) && m_arrLocks == pLocks )
+                    return pLocks;
+
+                pLocks->unlock_all();
+            }
+        }
+
+        void release_all( lock_array_ptr p )
+        {
+            p->unlock_all();
+        }
+
+        bool acquire_resize()
+        {
+            owner_t me = (owner_t) cds::OS::getCurrentThreadId();
+
+            back_off bkoff;
+            for (unsigned int nAttempts = 0; nAttempts < 32; ++nAttempts ) {
+                owner_t ownNull = 0;
+                if ( m_Owner.compare_exchange_strong( ownNull, (me << 1) | 1, CDS_ATOMIC::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed )) {
+                    lock_array_ptr pOldLocks = m_arrLocks;
+                    size_t const nLockCount = pOldLocks->size();
+                    for ( size_t i = 0; i < nLockCount; ++i ) {
+                        typename lock_array_type::lock_type& lock = pOldLocks->at(i);
+                        bkoff.reset();
+                        while ( !lock.try_lock() )
+                            bkoff();
+                        lock.unlock();
+                    }
+                    return true;
+                }
+                else
+                    bkoff();
+            }
+            return false;
+        }
+
+        void release_resize()
+        {
+            m_Owner.store( 0, CDS_ATOMIC::memory_order_release );
+        }
+        //@endcond
+    public:
+        //@cond
+        class scoped_cell_lock {
+            cds::lock::scoped_lock< lock_type >   m_guard;
+
+        public:
+            scoped_cell_lock( refinable& policy, size_t nHash )
+                : m_guard( policy.acquire( nHash ), true )
+            {}
+        };
+
+        class scoped_full_lock {
+            refinable&      m_Policy;
+            lock_array_ptr  m_Locks;
+        public:
+            scoped_full_lock( refinable& policy )
+                : m_Policy( policy )
+            {
+                m_Locks = policy.acquire_all();
+            }
+            ~scoped_full_lock()
+            {
+                m_Policy.release_all( m_Locks );
+            }
+        };
+
+        class scoped_resize_lock {
+            refinable&      m_Policy;
+            bool            m_bSucceess;
+
+        public:
+            scoped_resize_lock( refinable& policy )
+                : m_Policy( policy )
+            {
+                m_bSucceess = policy.acquire_resize();
+            }
+
+            ~scoped_resize_lock()
+            {
+                if ( m_bSucceess )
+                    m_Policy.release_resize();
+            }
+
+            bool success() const
+            {
+                return m_bSucceess;
+            }
+        };
+        //@endcond
+
+    public:
+        /// Constructor
+        refinable(
+            size_t nLockCount   ///< Initial size of lock array. Must be power of two.
+        )
+        : m_Owner(0)
+        , m_nCapacity( nLockCount )
+        {
+            assert( cds::beans::is_power2( nLockCount ));
+            m_arrLocks = create_lock_array( nLockCount );
+        }
+
+        /// Returns lock array size
+        /**
+            Lock array size is not a constant for \p refinable policy and can be changed when the set is resized.
+        */
+        size_t lock_count() const
+        {
+            return m_nCapacity.load( CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Resize for new capacity
+        void resize( size_t nNewCapacity )
+        {
+            // Expect the access is locked by scoped_resize_lock!!!
+            lock_array_ptr pNewArr = create_lock_array( nNewCapacity );
+            scoped_spinlock sl(m_access);
+            m_arrLocks.swap( pNewArr );
+        }
+    };
+
+}}} // namespace cds::intrusive::striped_set
+
+#endif
diff --git a/cds/intrusive/treiber_stack.h b/cds/intrusive/treiber_stack.h
new file mode 100644 (file)
index 0000000..713790b
--- /dev/null
@@ -0,0 +1,696 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_TREIBER_STACK_H
+#define __CDS_INTRUSIVE_TREIBER_STACK_H
+
+#include <cds/intrusive/single_link_struct.h>
+#include <cds/ref.h>
+#include <cds/algo/elimination.h>
+#include <cds/opt/buffer.h>
+#include <cds/lock/spinlock.h>
+#include <cds/lock/scoped_lock.h>
+#include <cds/details/std/type_traits.h>
+#include <cds/details/type_padding.h>
+
+namespace cds { namespace intrusive {
+
+    /// TreiberStack related definitions
+    /** @ingroup cds_intrusive_helper
+    */
+    namespace treiber_stack {
+
+        //@cond
+        /// Operation id for the \ref cds_elimination_description "elimination back-off"
+        enum operation_id {
+            op_push,    ///< push op id
+            op_pop      ///< pop op id
+        };
+
+        /// Operation descriptor for the \ref cds_elimination_description "elimination back-off"
+        template <typename T>
+        struct operation: public cds::algo::elimination::operation_desc
+        {
+            operation_id    idOp;   ///< Op id
+            T *             pVal;   ///< for push: pointer to argument; for pop: accepts a return value
+            CDS_ATOMIC::atomic<unsigned int> nStatus; ///< Internal elimination status
+
+            operation()
+                : pVal( null_ptr<T *>() )
+                , nStatus(0)
+            {}
+        };
+        //@endcond
+
+        /// Stack internal statistics. May be useful for debugging or profiling
+        /**
+            Template argument \p Counter defines type of counter.
+            Default is cds::atomicity::event_counter.
+            You may use stronger type of counter like as cds::atomicity::item_counter,
+            or even an integral type, for example, \p int
+        */
+        template <typename Counter = cds::atomicity::event_counter >
+        struct stat
+        {
+            typedef Counter     counter_type    ;   ///< Counter type
+
+            counter_type m_PushCount        ;  ///< Push call count
+            counter_type m_PopCount         ;  ///< Pop call count
+            counter_type m_PushRace         ;  ///< Count of push race conditions encountered
+            counter_type m_PopRace          ;  ///< Count of pop race conditions encountered
+            counter_type m_ActivePushCollision  ; ///< Count of active push collision for elimination back-off
+            counter_type m_ActivePopCollision   ; ///< Count of active pop collision for elimination back-off
+            counter_type m_PassivePushCollision ; ///< Count of passive push collision for elimination back-off
+            counter_type m_PassivePopCollision  ; ///< Count of passive pop collision for elimination back-off
+            counter_type m_EliminationFailed    ; ///< Count of unsuccessful elimination back-off
+
+            //@cond
+            void onPush()               { ++m_PushCount; }
+            void onPop()                { ++m_PopCount; }
+            void onPushRace()           { ++m_PushRace; }
+            void onPopRace()            { ++m_PopRace; }
+            void onActiveCollision( operation_id opId )
+            {
+                if ( opId == treiber_stack::op_push )
+                    ++m_ActivePushCollision;
+                else
+                    ++m_ActivePopCollision;
+            }
+            void onPassiveCollision( operation_id opId )
+            {
+                if ( opId == treiber_stack::op_push )
+                    ++m_PassivePushCollision;
+                else
+                    ++m_PassivePopCollision;
+            }
+            void onEliminationFailed()          { ++m_EliminationFailed;}
+            //@endcond
+        };
+
+        /// Empty (no overhead) stack statistics. Support interface like treiber_stack::stat
+        struct empty_stat
+        {
+            //@cond
+            void onPush()       {}
+            void onPop()        {}
+            void onPushRace()   {}
+            void onPopRace()    {}
+            void onActiveCollision( operation_id )  {}
+            void onPassiveCollision( operation_id ) {}
+            void onEliminationFailed() {}
+            //@endcond
+        };
+
+        //@cond
+        namespace details {
+
+            template <bool EnableElimination, typename T, typename Traits>
+            class elimination_backoff;
+
+            template <typename T, typename Traits>
+            class elimination_backoff<false, T, Traits>
+            {
+                typedef typename Traits::back_off   back_off;
+
+                back_off    m_bkoff;
+            public:
+                elimination_backoff()
+                {}
+
+                elimination_backoff( size_t )
+                {}
+
+                void reset()
+                {
+                    m_bkoff.reset();
+                }
+
+                template <typename Stat>
+                bool backoff(treiber_stack::operation< T >&, Stat& )
+                {
+                    m_bkoff();
+                    return false;
+                }
+            };
+
+            template <typename T, typename Traits>
+            class elimination_backoff<true, T, Traits>
+            {
+                typedef typename Traits::back_off   back_off;
+
+                /// Back-off for elimination (usually delay)
+                typedef typename Traits::elimination_backoff elimination_backoff_type;
+                /// Lock type used in elimination back-off
+                typedef typename Traits::lock_type elimination_lock_type;
+                /// Random engine used in elimination back-off
+                typedef typename Traits::random_engine elimination_random_engine;
+
+                /// Per-thread elimination record
+                typedef cds::algo::elimination::record  elimination_rec;
+
+                /// Collision array record
+                struct collision_array_record {
+                    elimination_rec *     pRec;
+                    elimination_lock_type lock;
+                };
+
+                /// Collision array used in elimination-backoff; each item is optimized for cache-line size
+                typedef typename Traits::buffer::template rebind<
+                    typename cds::details::type_padding<collision_array_record, cds::c_nCacheLineSize >::type
+                >::other collision_array;
+
+                /// Operation descriptor used in elimination back-off
+                typedef treiber_stack::operation< T >  operation_desc;
+
+#           if !(defined(CDS_CXX11_LAMBDA_SUPPORT) && !(CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC10))
+                struct bkoff_predicate {
+                    operation_desc * pOp;
+                    bkoff_predicate( operation_desc * p ): pOp(p) {}
+                    bool operator()() { return pOp->nStatus.load( CDS_ATOMIC::memory_order_acquire ) != op_busy; }
+                };
+#           endif
+
+                /// Elimination back-off data
+                struct elimination_data {
+                    elimination_random_engine   randEngine; ///< random engine
+                    collision_array             collisions; ///< collision array
+
+                    elimination_data()
+                    {
+                        //TODO: check Traits::buffer must be static!
+                    }
+                    elimination_data( size_t nCollisionCapacity )
+                        : collisions( nCollisionCapacity )
+                    {}
+                };
+
+                elimination_data m_Elimination;
+
+                enum operation_status {
+                    op_free = 0,
+                    op_busy = 1,
+                    op_collided = 2
+                };
+
+                typedef cds::lock::scoped_lock< elimination_lock_type > slot_scoped_lock;
+
+            public:
+                elimination_backoff()
+                {
+                    m_Elimination.collisions.zeroize();
+                }
+
+                elimination_backoff( size_t nCollisionCapacity )
+                    : m_Elimination( nCollisionCapacity )
+                {
+                    m_Elimination.collisions.zeroize();
+                }
+
+                void reset()
+                {}
+
+                template <typename Stat>
+                bool backoff( operation_desc& op, Stat& stat )
+                {
+                    elimination_backoff_type bkoff;
+                    op.nStatus.store( op_busy, CDS_ATOMIC::memory_order_relaxed );
+
+                    elimination_rec * myRec = cds::algo::elimination::init_record( op );
+
+                    collision_array_record& slot = m_Elimination.collisions[m_Elimination.randEngine() % m_Elimination.collisions.capacity()];
+                    {
+                        slot.lock.lock();
+                        elimination_rec * himRec = slot.pRec;
+                        if ( himRec ) {
+                            operation_desc * himOp = static_cast<operation_desc *>( himRec->pOp );
+                            assert( himOp );
+                            if ( himOp->idOp != op.idOp ) {
+                                if ( op.idOp == treiber_stack::op_push )
+                                    himOp->pVal = op.pVal;
+                                else
+                                    op.pVal = himOp->pVal;
+                                slot.pRec = null_ptr<elimination_rec *>();
+                                slot.lock.unlock();
+
+                                himOp->nStatus.store( op_collided, CDS_ATOMIC::memory_order_release );
+                                cds::algo::elimination::clear_record();
+                                stat.onActiveCollision( op.idOp );
+                                return true;
+                            }
+                            himOp->nStatus.store( op_free, CDS_ATOMIC::memory_order_release );
+                        }
+                        slot.pRec = myRec;
+                        slot.lock.unlock();
+                    }
+
+                    // Wait for colliding operation
+#               if defined(CDS_CXX11_LAMBDA_SUPPORT) && !(CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC10)
+                    // MSVC++ 2010 compiler error C2065: 'op_busy' : undeclared identifier
+                    bkoff( [&op]() -> bool { return op.nStatus.load( CDS_ATOMIC::memory_order_acquire ) != op_busy; } );
+#               else
+                    // Local structs is not supported by old compilers (for example, GCC 4.3)
+                    //struct bkoff_predicate {
+                    //    operation_desc * pOp;
+                    //    bkoff_predicate( operation_desc * p ): pOp(p) {}
+                    //    bool operator()() { return pOp->nStatus.load( CDS_ATOMIC::memory_order_acquire ) != op_busy; }
+                    //};
+                    bkoff( bkoff_predicate(&op) );
+#               endif
+
+                    {
+                        slot_scoped_lock l( slot.lock );
+                        if ( slot.pRec == myRec )
+                            slot.pRec = null_ptr<elimination_rec *>();
+                    }
+
+                    bool bCollided = op.nStatus.load( CDS_ATOMIC::memory_order_acquire ) == op_collided;
+
+                    if ( !bCollided )
+                        stat.onEliminationFailed();
+                    else
+                        stat.onPassiveCollision( op.idOp );
+
+                    cds::algo::elimination::clear_record();
+                    return bCollided;
+                }
+            };
+
+        } // namespace details
+        //@endcond
+    } // namespace treiber_stack
+
+    /// Treiber stack
+    /** @ingroup cds_intrusive_stack
+        Intrusive implementation of well-known Treiber's stack algorithm:
+        - R. K. Treiber. Systems programming: Coping with parallelism. Technical Report RJ 5118, IBM Almaden Research Center, April 1986.
+
+        \ref cds_elimination_description "Elimination back-off technique" can be used optionally.
+        The idea of elimination algorithm is taken from:
+        - [2004] Danny Hendler, Nir Shavit, Lena Yerushalmi "A Scalable Lock-free Stack Algorithm"
+
+        The elimination algorithm uses a single elimination array as a back-off schema
+        on a shared lock-free stack. If the threads fail on the stack, they attempt to eliminate
+        on the array, and if they fail in eliminating, they attempt to access the stack again and so on.
+
+        @note Hendler's et al paper describes a lock-free implementation of elimination back-off which is quite complex.
+        The main difficulty is the managing life-time of elimination record.
+        Our implementation uses simplified lock-based (spin-based) approach which allows
+        the elimination record allocation on thread's stack.
+        This approach demonstrates sufficient performance under high load.
+
+        Template arguments:
+        - \p GC - garbage collector type: gc::HP, gc::HRC, gc::PTB
+        - \p T - type to be inserted into the stack
+        - \p Options - options
+
+        \p Options are:
+        - opt::hook - hook used. Possible values are: single_link::base_hook, single_link::member_hook, single_link::traits_hook.
+            If the option is not specified, <tt>single_link::base_hook<></tt> is used.
+            For Gidenstam's gc::HRC, only single_link::base_hook is supported.
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::Default is used.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer. This option is used only
+            in \ref clear function.
+        - opt::link_checker - the type of node's link fields checking. Default is \ref opt::debug_check_link.
+            Note: for gc::HRC garbage collector, link checking policy is always selected as \ref opt::always_check_link.
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::stat - the type to gather internal statistics.
+            Possible option value are: \ref treiber_stack::stat, \ref treiber_stack::empty_stat (the default),
+            user-provided class that supports treiber_stack::stat interface.
+        - opt::enable_elimination - enable elimination back-off for the stack. Default value is \p valse.
+
+        If elimination back-off is enabled (\p %cds::opt::enable_elimination< true >) additional options can be specified:
+        - opt::buffer - a buffer type for elimination array, see \p opt::v::static_buffer, \p opt::v::dynamic_buffer.
+            The buffer can be any size: \p Exp2 template parameter of those classes can be \p false.
+            The size should be selected empirically for your application and hardware, there are no common rules for that.
+            Default is <tt> %opt::v::static_buffer< any_type, 4 > </tt>.
+        - opt::random_engine - a random engine to generate a random position in elimination array.
+            Default is opt::v::c_rand.
+        - opt::elimination_backoff - back-off strategy to wait for elimination, default is cds::backoff::delay<>
+        - opt::lock_type - a lock type used in elimination back-off, default is cds::lock::Spin.
+
+        Garbage collecting schema \p GC must be consistent with the single_link::node GC.
+
+        Be careful when you want destroy an item popped, see \ref cds_intrusive_item_destroying "Destroying items of intrusive containers".
+
+        @anchor cds_intrusive_TreiberStack_examples
+        \par Examples
+
+        Example of how to use \p single_link::base_hook.
+        Your class that objects will be pushed on \p %TreiberStack should be based on \p single_link::node class
+        \code
+        #include <cds/intrusive/stack/treiber_stack.h>
+        #include <cds/gc/hp.h>
+
+        namespace ci = cds::intrusive;
+        typedef cds::gc::HP gc;
+
+        struct myData: public ci::single_link::node< gc >
+        {
+            // ...
+        };
+
+        // Stack type
+        typedef ci::TreiberStack< gc,
+            myData,
+            ci::opt::hook< ci::single_link::base_hook< gc > >
+        > stack_t;
+
+        // Stack with elimination back-off enabled
+        typedef ci::TreiberStack< gc,
+            myData,
+            ci::opt::hook< ci::single_link::base_hook< gc > >,
+            cds::opt::enable_elimination<true>
+        > elimination_stack_t;
+        \endcode
+
+        Example of how to use \p base_hook with different tags.
+        \code
+        #include <cds/intrusive/stack/treiber_stack.h>
+        #include <cds/gc/hp.h>
+
+        namespace ci = cds::intrusive;
+        typedef cds::gc::HP gc;
+
+        // It is not necessary to declare complete type for tags
+        struct tag1;
+        struct tag2;
+
+        struct myData
+            : public ci::single_link::node< gc, tag1 >
+            , public ci::single_link::node< gc, tag2 >
+        {
+            // ...
+        };
+
+        typedef ci::TreiberStack< gc, myData, ci::opt::hook< ci::single_link::base_hook< gc, tag1 > > stack1_t;
+        typedef ci::TreiberStack< gc, myData, ci::opt::hook< ci::single_link::base_hook< gc, tag2 > > stack2_t;
+
+        // You may add myData objects in the objects of type stack1_t and stack2_t independently
+        void foo() {
+            stack1_t    s1;
+            stack2_t    s2;
+
+            myData i1, i2;
+            s1.push( i1 );
+            s2.push( i2 );
+            s2.push( i1 )   ;   // i1 is now contained in s1 and s2.
+
+            myData * p;
+
+            p = s1.pop()    ;   // pop i1 from s1
+            p = s1.pop()    ;   // p == NULL, s1 is empty
+            p = s2.pop()    ;   // pop i1 from s2
+            p = s2.pop()    ;   // pop i2 from s2
+            p = s2.pop()    ;   // p == NULL, s2 is empty
+        }
+        \endcode
+
+        Example of how to use \p member_hook.
+        Your class that will be pushed on \p %TreiberStack should have a member of type \p single_link::node
+        \code
+        #include <cds/intrusive/stack/treiber_stack.h>
+        #include <cds/gc/hp.h>
+        #include <stddef.h>     // offsetof macro
+
+        namespace ci = cds::intrusive;
+        typedef cds::gc::HP gc;
+
+        struct myData
+        {
+            // ...
+            ci::single_link::node< gc >      member_hook_;
+            // ...
+        };
+
+        typedef ci::TreiberStack< gc, myData,
+            ci::opt::hook<
+                ci::single_link::member_hook< offsetof(myData, member_hook_),
+                gc
+            >
+        > stack_t;
+        \endcode
+    */
+    template <typename GC, typename T, CDS_DECL_OPTIONS13>
+    class TreiberStack
+    {
+        //@cond
+        struct default_options
+        {
+            typedef cds::backoff::Default           back_off;
+            typedef single_link::base_hook<>        hook;
+            typedef opt::v::empty_disposer          disposer;
+            typedef atomicity::empty_item_counter   item_counter;
+            typedef opt::v::relaxed_ordering        memory_model;
+            typedef treiber_stack::empty_stat       stat;
+            static CDS_CONSTEXPR_CONST opt::link_check_type link_checker = opt::debug_check_link;
+
+            // Elimination back-off options
+            static CDS_CONSTEXPR_CONST bool enable_elimination = false;
+            typedef cds::backoff::delay<>          elimination_backoff;
+            typedef opt::v::static_buffer< int, 4 > buffer;
+            typedef opt::v::c_rand                  random_engine;
+            typedef cds::lock::Spin                 lock_type;
+        };
+        //@endcond
+
+    public:
+        //@cond
+        typedef typename opt::make_options<
+            typename cds::opt::find_type_traits< default_options, CDS_OPTIONS13 >::type
+            ,CDS_OPTIONS13
+        >::type   options;
+        //@endcond
+
+    public:
+        /// Rebind template arguments
+        template <typename GC2, typename T2, CDS_DECL_OTHER_OPTIONS13>
+        struct rebind {
+            typedef TreiberStack< GC2, T2, CDS_OTHER_OPTIONS13> other   ;   ///< Rebinding result
+        };
+
+    public:
+        typedef T  value_type   ;   ///< type of value stored in the stack
+        typedef typename options::hook      hook        ;   ///< hook type
+        typedef typename hook::node_type    node_type   ;   ///< node type
+        typedef typename options::disposer  disposer    ;   ///< disposer used
+        typedef typename get_node_traits< value_type, node_type, hook>::type node_traits ;    ///< node traits
+        typedef typename single_link::get_link_checker< node_type, options::link_checker >::type link_checker   ;   ///< link checker
+        typedef typename options::memory_model  memory_model      ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename options::item_counter item_counter ;   ///< Item counting policy used
+        typedef typename options::stat      stat        ;   ///< Internal statistics policy used
+
+        typedef GC  gc          ;   ///< Garbage collector
+        typedef typename options::back_off  back_off    ;   ///< back-off strategy
+
+    public: // related to elimination back-off
+
+        /// Elimination back-off is enabled or not
+        static CDS_CONSTEXPR_CONST bool enable_elimination = options::enable_elimination;
+        /// back-off strategy used to wait for elimination
+        typedef typename options::elimination_backoff elimination_backoff_type;
+        /// Lock type used in elimination back-off
+        typedef typename options::lock_type elimination_lock_type;
+        /// Random engine used in elimination back-off
+        typedef typename options::random_engine elimination_random_engine;
+
+
+    protected:
+        typename node_type::atomic_node_ptr m_Top       ;   ///< Top of the stack
+        item_counter        m_ItemCounter   ;   ///< Item counter
+        stat                m_stat          ;   ///< Internal statistics
+
+        //@cond
+        treiber_stack::details::elimination_backoff<enable_elimination, value_type, options> m_Backoff;
+
+        typedef intrusive::node_to_value<TreiberStack>  node_to_value;
+        typedef treiber_stack::operation< value_type >  operation_desc;
+        //@endcond
+
+    protected:
+        //@cond
+        void clear_links( node_type * pNode ) CDS_NOEXCEPT
+        {
+            pNode->m_pNext.store( null_ptr<node_type *>(), memory_model::memory_order_relaxed );
+        }
+
+        template <bool EnableElimination>
+        struct elimination_backoff_impl;
+
+        void init()
+        {
+            // GC and node_type::gc must be the same
+            static_assert(( std::is_same<gc, typename node_type::gc>::value ), "GC and node_type::gc must be the same");
+
+            // For cds::gc::HRC, only base_hook is allowed
+            static_assert((
+                std::conditional<
+                std::is_same<gc, cds::gc::HRC>::value,
+                std::is_same< typename hook::hook_type, opt::base_hook_tag >,
+                boost::true_type
+                >::type::value
+                ), "For cds::gc::HRC, only base_hook is allowed");
+
+            static_assert( (!enable_elimination || std::is_same<typename elimination_random_engine::result_type, unsigned int>::value),
+                "Random engine result type must be unsigned int" );
+        }
+
+        //@endcond
+
+    public:
+        /// Constructs empty stack
+        TreiberStack()
+            : m_Top(null_ptr<node_type *>())
+        {
+            init();
+        }
+
+        /// Constructs empty stack and initializes elimination back-off data
+        /**
+            This form should be used if you use elimination back-off with dynamically allocated collision array, i.e
+            \p Options... contains cds::opt::buffer< cds::opt::v::dynamic_buffer >.
+            \p nCollisionCapacity parameter specifies the capacity of collision array.
+        */
+        TreiberStack( size_t nCollisionCapacity )
+            : m_Top(null_ptr<node_type *>())
+            , m_Backoff( nCollisionCapacity )
+        {
+            init();
+        }
+
+        /// Destructor calls \ref cds_intrusive_TreiberStack_clear "clear" member function
+        ~TreiberStack()
+        {
+            clear();
+        }
+
+        /// Push the item \p val on the stack
+        /**
+            No copying is made since it is intrusive stack.
+        */
+        bool push( value_type& val )
+        {
+            node_type * pNew = node_traits::to_node_ptr( val );
+            link_checker::is_empty( pNew );
+
+            m_Backoff.reset();
+
+            operation_desc op;
+            if ( enable_elimination ) {
+                op.idOp = treiber_stack::op_push;
+                op.pVal = &val;
+            }
+
+            node_type * t = m_Top.load(memory_model::memory_order_relaxed);
+            while ( true ) {
+                pNew->m_pNext.store( t, memory_model::memory_order_relaxed );
+                if ( m_Top.compare_exchange_weak( t, pNew, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) {     // #1 sync-with #2
+                    ++m_ItemCounter;
+                    m_stat.onPush();
+                    return true;
+                }
+                m_stat.onPushRace();
+
+                if ( m_Backoff.backoff( op, m_stat ))
+                    return true;
+            }
+        }
+
+        /// Pop an item from the stack
+        /**
+            If stack is empty, returns \p NULL.
+            The disposer is <b>not</b> called for popped item.
+            See \ref cds_intrusive_item_destroying "Destroying items of intrusive containers".
+        */
+        value_type * pop()
+        {
+            m_Backoff.reset();
+            typename gc::Guard  guard;
+
+            operation_desc op;
+            if ( enable_elimination ) {
+                op.idOp = treiber_stack::op_pop;
+            }
+
+            while ( true ) {
+                node_type * t = guard.protect( m_Top, node_to_value() );
+                if ( t == null_ptr<node_type *>() )
+                    return null_ptr<value_type *>() ;    // stack is empty
+
+                node_type * pNext = t->m_pNext.load(memory_model::memory_order_relaxed);
+                if ( m_Top.compare_exchange_weak( t, pNext, memory_model::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed )) {              // #2
+                    clear_links( t );
+                    --m_ItemCounter;
+                    m_stat.onPop();
+                    return node_traits::to_value_ptr( *t );
+                }
+
+                m_stat.onPopRace();
+                if ( m_Backoff.backoff( op, m_stat )) {
+                    // may return NULL if stack is empty
+                    return op.pVal;
+                }
+            }
+        }
+
+        /// Check if stack is empty
+        bool empty() const
+        {
+            // http://www.manning-sandbox.com/thread.jspa?threadID=46245&tstart=0
+            return m_Top.load(memory_model::memory_order_relaxed) == null_ptr<node_type *>();
+        }
+
+        /// Clear the stack
+        /** @anchor cds_intrusive_TreiberStack_clear
+            For each removed item the disposer is called.
+
+            <b>Caution</b>
+            It is possible that after <tt>clear()</tt> the <tt>empty()</tt> returns \p false
+            if some other thread pushes an item into the stack during \p clear works
+        */
+        void clear()
+        {
+            back_off bkoff;
+            node_type * pTop;
+            while ( true ) {
+                pTop = m_Top.load( memory_model::memory_order_relaxed );
+                if ( pTop == null_ptr<node_type *>() )
+                    return;
+                if ( m_Top.compare_exchange_weak( pTop, null_ptr<node_type *>(), memory_model::memory_order_acq_rel, CDS_ATOMIC::memory_order_relaxed )) {    // sync-with #1 and #2
+                    m_ItemCounter.reset();
+                    break;
+                }
+                bkoff();
+            }
+
+            while( pTop ) {
+                node_type * p = pTop;
+                pTop = p->m_pNext.load(memory_model::memory_order_relaxed);
+                clear_links( p );
+                gc::template retire<disposer>( node_traits::to_value_ptr( *p ) );
+            }
+        }
+
+        /// Returns stack's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+
+            <b>Warning</b>: even if you use real item counter and it returns 0, this fact is not mean that the stack
+            is empty. To check emptyness use \ref empty() method.
+        */
+        size_t    size() const
+        {
+            return m_ItemCounter.value();
+        }
+
+        /// Returns reference to internal statistics
+        stat const& statistics() const
+        {
+            return m_stat;
+        }
+    };
+
+}} // namespace cds::intrusive
+
+#endif  // #ifndef __CDS_INTRUSIVE_TREIBER_STACK_H
diff --git a/cds/intrusive/tsigas_cycle_queue.h b/cds/intrusive/tsigas_cycle_queue.h
new file mode 100644 (file)
index 0000000..73131d3
--- /dev/null
@@ -0,0 +1,370 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_TSIGAS_CYCLE_QUEUE_H
+#define __CDS_INTRUSIVE_TSIGAS_CYCLE_QUEUE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/cxx11_atomic.h>
+#include <cds/details/bounded_container.h>
+#include <cds/opt/buffer.h>
+#include <cds/ref.h>
+
+namespace cds { namespace intrusive {
+
+    /// Non-blocking cyclic queue discovered by Philippas Tsigas and Yi Zhang
+    /** @ingroup cds_intrusive_queue
+
+        Source:
+        \li [2000] Philippas Tsigas, Yi Zhang "A Simple, Fast and Scalable Non-Blocking Concurrent FIFO Queue
+            for Shared Memory Multiprocessor Systems"
+
+        Template arguments:
+        - T - data stored in queue. The queue stores pointers to passed data of type \p T.
+            <b>Restriction</b>: the queue can manage at least two-byte aligned data: the least significant bit (LSB)
+            of any pointer stored in the queue must be zero since the algorithm may use LSB
+            as a flag that marks the free cell.
+        - Options - options
+
+        \p Options are:
+        - opt::buffer - buffer to store items. Mandatory option, see option description for full list of possible types.
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer. This option is used
+            only in \ref clear function.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::back_off - back-off strategy used. If the option is not specified, the cds::backoff::empty is used.
+        - opt::alignment - the alignment for internal queue data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+        This queue algorithm does not require any garbage collector.
+
+        \par Examples:
+        \code
+        #include <cds/intrusive/tsigas_cycle_queue.h>
+
+        struct Foo {
+            ...
+        };
+
+        // Queue of Foo pointers, capacity is 1024, statically allocated buffer:
+        typedef cds::intrusive::TsigasCycleQueue<
+            Foo
+            ,cds::opt::buffer< cds::opt::v::static_buffer< Foo, 1024 > >
+        > static_queue;
+        static_queue    stQueue;
+
+        // Queue of Foo pointers, capacity is 1024, dynamically allocated buffer:
+        typedef cds::intrusive::TsigasCycleQueue<
+            Foo
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< Foo > >
+        > dynamic_queue;
+        dynamic_queue    dynQueue( 1024 );
+        \endcode
+    */
+    template <typename T, CDS_DECL_OPTIONS7>
+    class TsigasCycleQueue: public cds::bounded_container
+    {
+        //@cond
+        struct default_options
+        {
+            typedef cds::backoff::empty         back_off;
+            typedef opt::v::empty_disposer      disposer;
+            typedef atomicity::empty_item_counter item_counter;
+            typedef opt::v::relaxed_ordering    memory_model;
+            enum { alignment = opt::cache_line_alignment };
+        };
+        //@endcond
+
+    public:
+        //@cond
+        typedef typename opt::make_options<
+            typename cds::opt::find_type_traits< default_options, CDS_OPTIONS7>::type
+            ,CDS_OPTIONS7
+        >::type   options;
+        //@endcond
+
+    public:
+        /// Rebind template arguments
+        template <typename T2, CDS_DECL_OTHER_OPTIONS7>
+        struct rebind {
+            typedef TsigasCycleQueue< T2, CDS_OTHER_OPTIONS7> other   ;   ///< Rebinding result
+        };
+
+    public:
+        typedef T value_type    ;   ///< type of value stored in the queue
+        typedef typename options::item_counter  item_counter;   ///< Item counter type
+        typedef typename options::disposer      disposer    ;   ///< Item disposer
+        typedef typename options::back_off      back_off    ;   ///< back-off strategy used
+        typedef typename options::memory_model  memory_model;   ///< Memory ordering. See cds::opt::memory_model option
+
+    protected:
+        //@cond
+        typedef typename options::buffer::template rebind< CDS_ATOMIC::atomic<value_type *> >::other buffer;
+        typedef typename opt::details::alignment_setter< buffer, options::alignment >::type aligned_buffer;
+        typedef size_t index_type;
+        typedef typename opt::details::alignment_setter< CDS_ATOMIC::atomic<index_type>, options::alignment >::type aligned_index;
+        //@endcond
+
+    protected:
+        //@cond
+        buffer          m_buffer    ;   ///< array of pointer T *, array size is equal to m_nCapacity+1
+        aligned_index   m_nHead     ;   ///< index of queue's head
+        aligned_index   m_nTail     ;   ///< index of queue's tail
+        item_counter    m_ItemCounter   ;   ///< item counter
+        //@endcond
+
+    protected:
+        //@cond
+        static CDS_CONSTEXPR value_type * free0() CDS_NOEXCEPT
+        {
+            return null_ptr<value_type *>();
+        }
+        static CDS_CONSTEXPR value_type * free1() CDS_NOEXCEPT
+        {
+            return (value_type*) 1;
+        }
+        static bool is_free( const value_type * p ) CDS_NOEXCEPT
+        {
+            return p == free0() || p == free1();
+        }
+
+        size_t buffer_capacity() const CDS_NOEXCEPT
+        {
+            return m_buffer.capacity();
+        }
+
+        index_type modulo() const CDS_NOEXCEPT
+        {
+            return buffer_capacity() - 1;
+        }
+        //@endcond
+
+    public:
+        /// Initialize empty queue of capacity \p nCapacity
+        /**
+            For cds::opt::v::static_buffer the \p nCapacity parameter is ignored.
+
+            Note that the real capacity of queue is \p nCapacity - 2.
+        */
+        TsigasCycleQueue( size_t nCapacity = 0 )
+            : m_buffer( nCapacity )
+            , m_nHead(0)
+            , m_nTail(1)
+        {
+            m_buffer.zeroize();
+        }
+
+        /// Clears the queue
+        ~TsigasCycleQueue()
+        {
+            clear();
+        }
+
+        /// Returns queue's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+        */
+        size_t size() const CDS_NOEXCEPT
+        {
+            return m_ItemCounter.value();
+        }
+
+        /// Returns capacity of cyclic buffer
+        size_t capacity() const CDS_NOEXCEPT
+        {
+            return buffer_capacity() - 2;
+        }
+
+        /// Enqueues item from the queue
+        /** @anchor cds_intrusive_TsigasQueue_enqueue
+            Returns \p true if success, \p false otherwise (for example, if queue is full)
+        */
+        bool enqueue( value_type& data )
+        {
+            value_type * pNewNode  = &data;
+            assert( (reinterpret_cast<ptr_atomic_t>( pNewNode ) & 1) == 0 );
+            back_off bkoff;
+
+            const index_type nModulo = modulo();
+
+            do {
+                index_type te = m_nTail.load(memory_model::memory_order_acquire);
+                index_type ate = te;
+                value_type * tt = m_buffer[ ate ].load(memory_model::memory_order_relaxed);
+                index_type temp = ( ate + 1 ) & nModulo ;    // next item after tail
+
+                // Looking for actual tail
+                while ( !is_free( tt ) ) {
+                    if ( te != m_nTail.load(memory_model::memory_order_relaxed) )    // check the tail consistency
+                        goto TryAgain;
+                    if ( temp == m_nHead.load(memory_model::memory_order_acquire) )    // queue full?
+                        break;
+                    tt = m_buffer[ temp ].load(memory_model::memory_order_relaxed);
+                    ate = temp;
+                    temp = (temp + 1) & nModulo;
+                }
+
+                if ( te != m_nTail.load(memory_model::memory_order_relaxed) )
+                    continue;
+
+                // Check whether queue is full
+                if ( temp == m_nHead.load(memory_model::memory_order_acquire) ) {
+                    ate = ( temp + 1 ) & nModulo;
+                    tt = m_buffer[ ate ].load(memory_model::memory_order_relaxed);
+                    if ( !is_free( tt ) ) {
+                        return false    ;    // Queue is full
+                    }
+
+                    // help the dequeue to update head
+                    m_nHead.compare_exchange_strong( temp, ate, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+                    continue;
+                }
+
+                if ( tt == free1() )
+                    pNewNode = reinterpret_cast<value_type *>(reinterpret_cast<intptr_t>( pNewNode ) | 1);
+                if ( te != m_nTail.load(memory_model::memory_order_relaxed) )
+                    continue;
+
+                // get actual tail and try to enqueue new node
+                if ( m_buffer[ate].compare_exchange_strong( tt, pNewNode, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) ) {
+                    if ( temp % 2 == 0 )
+                        m_nTail.compare_exchange_strong( te, temp, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+                    ++m_ItemCounter;
+                    return true;
+                }
+            TryAgain:;
+            } while ( bkoff(), true );
+
+            // No control path reaches this line!
+            return false;
+        }
+
+        /// Dequeues item from the queue
+        /** @anchor cds_intrusive_TsigasQueue_dequeue
+            If the queue is empty the function returns \a NULL
+
+            Dequeue does not call value disposer. You can manually dispose returned value if it is needed.
+        */
+        value_type * dequeue()
+        {
+            back_off bkoff;
+
+            const index_type nModulo = modulo();
+            do {
+                index_type th = m_nHead.load(memory_model::memory_order_acquire);
+                index_type temp = ( th + 1 ) & nModulo;
+                value_type * tt = m_buffer[ temp ].load(memory_model::memory_order_relaxed);
+                value_type * pNull;
+
+                // find the actual head after this loop
+                while ( is_free( tt ) ) {
+                    if ( th != m_nHead.load(memory_model::memory_order_relaxed) )
+                        goto TryAgain;
+
+                    // two consecutive NULL means queue empty
+                    if ( temp == m_nTail.load(memory_model::memory_order_acquire) )
+                        return NULL;
+
+                    temp = ( temp + 1 ) & nModulo;
+                    tt = m_buffer[ temp ].load(memory_model::memory_order_relaxed);
+                }
+
+                if ( th != m_nHead.load(memory_model::memory_order_relaxed) )
+                    continue;
+
+                // check whether the queue is empty
+                if ( temp == m_nTail.load(memory_model::memory_order_acquire) ) {
+                    // help the enqueue to update end
+                    m_nTail.compare_exchange_strong( temp, (temp + 1) & nModulo, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+                    continue;
+                }
+
+                pNull = (reinterpret_cast<ptr_atomic_t>( tt ) & 1) ? free0() : free1();
+
+                if ( th != m_nHead.load(memory_model::memory_order_relaxed) )
+                    continue;
+
+                // Get the actual head, null means empty
+                if ( m_buffer[temp].compare_exchange_strong( tt, pNull, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) {
+                    if ( temp % 2 == 0 )
+                        m_nHead.compare_exchange_strong( th, temp, memory_model::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+                    --m_ItemCounter;
+                    return reinterpret_cast<value_type *>(reinterpret_cast<intptr_t>( tt ) & ~intptr_t(1));
+                }
+
+            TryAgain:;
+            } while ( bkoff(), true );
+
+            // No control path reaches this line!
+            return null_ptr<value_type *>();
+        }
+
+        /// Synonym of \ref cds_intrusive_TsigasQueue_enqueue "enqueue"
+        bool push( value_type& data )
+        {
+            return enqueue( data );
+        }
+
+        /// Synonym of \ref cds_intrusive_TsigasQueue_dequeue "dequeue"
+        value_type * pop()
+        {
+            return dequeue();
+        }
+
+        /// Checks if the queue is empty
+        bool empty() const
+        {
+            const index_type nModulo = modulo();
+
+        TryAgain:
+            index_type th = m_nHead.load(memory_model::memory_order_relaxed);
+            index_type temp = ( th + 1 ) & nModulo;
+            const value_type * tt = m_buffer[ temp ].load(memory_model::memory_order_relaxed);
+
+            // find the actual head after this loop
+            while ( is_free( tt ) ) {
+                if ( th != m_nHead.load(memory_model::memory_order_relaxed) )
+                    goto TryAgain;
+                // two consecutive NULL means queue empty
+                if ( temp == m_nTail.load(memory_model::memory_order_relaxed) )
+                    return true;
+                temp = ( temp + 1 ) & nModulo;
+                tt = m_buffer[ temp ].load(memory_model::memory_order_relaxed);
+            }
+            return false;
+        }
+
+        /// Clears queue in lock-free manner.
+        /**
+            \p f parameter is a functor to dispose removed items.
+            The interface of \p DISPOSER is:
+            \code
+            struct myDisposer {
+                void operator ()( T * val );
+            };
+            \endcode
+            You can pass \p disposer by reference using \p boost::ref.
+            The disposer will be called immediately for each item.
+        */
+        template <typename Disposer>
+        void clear( Disposer f )
+        {
+            value_type * pv;
+            while ( (pv = pop()) != null_ptr<value_type *>() ) {
+                unref(f)( pv );
+            }
+        }
+
+        /// Clears the queue
+        /**
+            This function uses the disposer that is specified in \p Options.
+        */
+        void clear()
+        {
+            clear( disposer() );
+        }
+    };
+
+}}  // namespace cds::intrusive
+
+#endif  // #ifndef __CDS_INTRUSIVE_TSIGAS_CYCLE_QUEUE_H
diff --git a/cds/intrusive/vyukov_mpmc_cycle_queue.h b/cds/intrusive/vyukov_mpmc_cycle_queue.h
new file mode 100644 (file)
index 0000000..be6c48d
--- /dev/null
@@ -0,0 +1,176 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_VYUKOV_MPMC_CYCLE_QUEUE_H
+#define __CDS_INTRUSIVE_VYUKOV_MPMC_CYCLE_QUEUE_H
+
+#include <cds/intrusive/base.h>
+#include <cds/container/vyukov_mpmc_cycle_queue.h>
+
+namespace cds { namespace intrusive {
+
+    /// Vyukov's MPMC bounded queue
+    /** @ingroup cds_intrusive_queue
+        This algorithm is developed by Dmitry Vyukov (see http://www.1024cores.net)
+
+        Implementation of intrusive version is based on non-intrusive class container::VyukovMPMCCycleQueue.
+
+        Template parameters:
+        - \p T - type stored in queue.
+        - \p Options - queue's options
+
+        Options \p Options are:
+        - opt::buffer - buffer to store items. Mandatory option, see option description for full list of possible types.
+        - opt::item_counter - the type of item counting feature. Default is \ref atomicity::empty_item_counter
+        - opt::disposer - the functor used for dispose removed items. Default is opt::v::empty_disposer. This option is used
+            only in \ref clear function.
+        - opt::alignment - the alignment for internal queue data. Default is opt::cache_line_alignment
+        - opt::memory_model - C++ memory ordering model. Can be opt::v::relaxed_ordering (relaxed memory model, the default)
+            or opt::v::sequential_consistent (sequentially consisnent memory model).
+
+
+        Instead of saving copy of enqueued data, the intrusive implementation stores pointer to passed data.
+
+        \par Examples:
+        \code
+        #include <cds/intrusive/vyukov_mpmc_cycle_queue.h>
+
+        struct Foo {
+            ...
+        };
+
+        // Queue of Foo pointers, capacity is 1024, statically allocated buffer:
+        typedef cds::intrusive::VyukovMPMCCycleQueue<
+            Foo
+            ,cds::opt::buffer< cds::opt::v::static_buffer< Foo, 1024 > >
+        > static_queue;
+        static_queue    stQueue;
+
+        // Queue of Foo pointers, capacity is 1024, dynamically allocated buffer:
+        typedef cds::intrusive::VyukovMPMCCycleQueue<
+            Foo
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< Foo > >
+        > dynamic_queue;
+        dynamic_queue    dynQueue( 1024 );
+
+        \endcode
+    */
+    template <typename T, CDS_DECL_OPTIONS6>
+    class VyukovMPMCCycleQueue
+        : private container::VyukovMPMCCycleQueue< T *, CDS_OPTIONS6 >
+    {
+        //@cond
+        typedef container::VyukovMPMCCycleQueue< T *, CDS_OPTIONS6 > base_class;
+        //@endcond
+    public:
+        typedef T value_type    ;   ///< type of data stored in the queue
+        typedef typename base_class::item_counter   item_counter    ;   ///< Item counter type
+        typedef typename base_class::memory_model   memory_model    ;   ///< Memory ordering. See cds::opt::memory_model option
+        typedef typename base_class::options::disposer disposer     ;   ///< Item disposer
+
+        //@cond
+        typedef typename base_class::options    options;
+        //@endcond
+
+    public:
+        /// Rebind template arguments
+        template <typename T2, CDS_DECL_OTHER_OPTIONS6>
+        struct rebind {
+            typedef VyukovMPMCCycleQueue< T2, CDS_OTHER_OPTIONS6> other   ;   ///< Rebinding result
+        };
+
+    public:
+        /// Constructs the queue of capacity \p nCapacity
+        /**
+            For cds::opt::v::static_buffer the \p nCapacity parameter is ignored.
+        */
+        VyukovMPMCCycleQueue( size_t nCapacity = 0 )
+            : base_class( nCapacity )
+        {}
+
+        /// Enqueues \p data to queue
+        /**
+            Note that the intrusive queue stores pointer to \p data passed, not the copy of data.
+        */
+        bool enqueue( value_type& data )
+        {
+            return base_class::enqueue( &data );
+        }
+
+        /// Dequeues an item from queue
+        /**
+            If queue is empty, returns \p NULL.
+        */
+        value_type * dequeue()
+        {
+            value_type * p = null_ptr<value_type *>();
+            return base_class::dequeue( p ) ? p : null_ptr<value_type *>();
+        }
+
+        /// Synonym of \ref enqueue
+        bool push( value_type& data )
+        {
+            return enqueue( data );
+        }
+
+        /// Synonym of \ref dequeue
+        value_type * pop()
+        {
+            return dequeue();
+        }
+
+        /// Clears queue in lock-free manner.
+        /**
+            \p f parameter is a functor to dispose removed items.
+            The interface of \p DISPOSER is:
+            \code
+            struct myDisposer {
+                void operator ()( T * val );
+            };
+            \endcode
+            You can pass \p disposer by reference using \p boost::ref.
+            The disposer will be called immediately for each item.
+        */
+        template <typename Disposer>
+        void clear( Disposer f )
+        {
+            value_type * pv;
+            while ( (pv = pop()) != null_ptr<value_type *>() ) {
+                unref(f)( pv );
+            }
+        }
+
+        /// Clears the queue
+        /**
+            This function uses the disposer that is specified in \p Options.
+        */
+        void clear()
+        {
+            clear( disposer() );
+        }
+
+        /// Checks if the queue is empty
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+
+        /// Returns queue's item count
+        /**
+            The value returned depends on opt::item_counter option. For atomicity::empty_item_counter,
+            this function always returns 0.
+        */
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        /// Returns capacity of cyclic buffer
+        size_t capacity() const
+        {
+            return base_class::capacity();
+        }
+    };
+}}  // namespace cds::intrusive
+
+#endif // #ifndef __CDS_INTRUSIVE_VYUKOV_MPMC_CYCLE_QUEUE_H
diff --git a/cds/lock/array.h b/cds/lock/array.h
new file mode 100644 (file)
index 0000000..ce96cc0
--- /dev/null
@@ -0,0 +1,324 @@
+//$$CDS-header$$
+
+#ifndef __CDS_LOCK_ARRAY_H
+#define __CDS_LOCK_ARRAY_H
+
+#include <cds/details/allocator.h>
+#include <cds/lock/scoped_lock.h>
+#include <cds/int_algo.h>
+
+#include <boost/mpl/if.hpp>
+
+namespace cds { namespace lock {
+
+    /// Trivial lock \ref array selection policy
+    struct trivial_select_policy
+    {
+        /// Returns \p nWhat
+        size_t operator()( size_t nWhat, size_t nCapacity ) const
+        {
+            assert( nWhat < nCapacity );
+            return nWhat;
+        }
+
+        /// Checks if \p nCapacity is acceptable by policy. For trivial policy, any \p nCapacity is accepted.
+        static bool is_capacity_accepted( size_t nCapacity )
+        {
+            return true;
+        }
+    };
+
+    /// The lock \ref array cell selection policy "division by modulo"
+    struct mod_select_policy
+    {
+        /// Returns <tt> nWhat % nCapacity </tt>
+        size_t operator()( size_t nWhat, size_t nCapacity ) const
+        {
+            return nWhat % nCapacity;
+        }
+
+        /// Checks if \p nCapacity is acceptable by policy. For modulo policy, any positive \p nCapacity is accepted.
+        static bool is_capacity_accepted( size_t nCapacity )
+        {
+            return nCapacity > 0;
+        }
+    };
+
+    /// The lock \ref array cell selection policy "division by modulo of power of 2"
+    /**
+        This policy may be used if the size of lock array is equal to power of two.
+    */
+    struct pow2_select_policy
+    {
+        //@cond
+        const size_t    m_nMask;
+        //@endcond
+
+        /// Ctor. \p nCapacity must be power of two.
+        pow2_select_policy( size_t nCapacity )
+            : m_nMask( nCapacity - 1 )
+        {
+            assert( is_capacity_accepted( nCapacity ));
+        }
+
+        /// Copy constructor
+        pow2_select_policy( pow2_select_policy const& src )
+            : m_nMask( src.m_nMask )
+        {}
+
+#   ifdef CDS_RVALUE_SUPPORT
+        /// Move constructor
+        pow2_select_policy( pow2_select_policy&& src )
+            : m_nMask( src.m_nMask )
+        {}
+#   endif
+
+        /// Returns <tt>nWhat & (nPow2 - 1)</tt>
+        size_t operator()( size_t nWhat, size_t ) const
+        {
+            return nWhat & m_nMask;
+        }
+
+        /// Checks if \p nCapacity is acceptable by policy. \p nCapacity must be power of two
+        static bool is_capacity_accepted( size_t nCapacity )
+        {
+            return cds::beans::is_power2( nCapacity );
+        }
+    };
+
+    /// Array of locks
+    /**
+        The lock array is useful for building fine-grained lock-based data structure
+        based on striping technique. Instead of locking access to data struct (a hash map, for example)
+        at whole, the striping locks only part of the map (a bucket). So, access to different buckets
+        can be simultaneous.
+
+        Template arguments:
+        - \p Lock - lock type, for example, \p boost::mutex, \p cds::lock::Spinlock
+        - \p SelectPolicy - array cell selection policy, the default is \ref mod_select_policy
+             Available policies: \ref trivial_select_policy, \ref pow2_select_policy, \ref mod_select_policy.
+        - \p Alloc - memory allocator for array
+
+        To determine array's cell the selection policy \p SelectPolicy functor is used. Two arguments
+        are passed to the policy:
+        \code size_t operator()( size_t nHint, size_t nCapacity ) const \endcode
+        - \p nHint - a hint to calculate cell index in the lock array. Usually, it is a hash value.
+        - \p nCapacity - the size of the lock array
+        The functor should return the index in the lock array.
+
+        Note that the type of \p nHint parameter can be any.
+    */
+    template <typename Lock
+        , typename SelectPolicy = mod_select_policy
+        , class Alloc = CDS_DEFAULT_ALLOCATOR
+    >
+    class array
+    {
+        //@cond
+        typedef ::cds::details::Allocator< Lock, Alloc > cxx_allocator;
+        //@endcond
+    public:
+        typedef Lock            lock_type           ;   ///< lock type
+        typedef SelectPolicy    select_cell_policy  ;   ///< Cell selection policy functor
+        static size_t const     c_nUnspecifiedCell = (size_t) -1 ;  ///< failed \ref try_lock call result
+
+    protected:
+        lock_type *         m_arrLocks  ;   ///< lock array
+        size_t const        m_nCapacity ;   ///< array capacity
+
+        select_cell_policy  m_SelectCellPolicy  ;   ///< Cell selection policy
+
+    protected:
+        //@cond
+        static lock_type * create_lock_array( size_t nCapacity )
+        {
+            return cxx_allocator().NewArray( nCapacity );
+        }
+        static void delete_lock_array( lock_type * pArr, size_t nCapacity )
+        {
+            if ( pArr )
+                cxx_allocator().Delete( pArr, nCapacity );
+        }
+
+        // Only for internal use!!!
+        array()
+            : m_arrLocks( null_ptr<lock_type *>() )
+            , m_nCapacity(0)
+        {}
+        array( select_cell_policy const& policy )
+            : m_arrLocks( null_ptr<lock_type *>() )
+            , m_nCapacity(0)
+            , m_SelectCellPolicy( policy )
+        {}
+        //@endcond
+
+    public:
+        /// Constructs array of locks
+        /**
+            Allocates the array and initializes all locks as unlocked.
+        */
+        array(
+            size_t nCapacity        ///< [in] Array size
+        )
+        : m_arrLocks( null_ptr<lock_type *>() )
+        , m_nCapacity( nCapacity )
+        {
+            m_arrLocks = create_lock_array( nCapacity );
+        }
+
+        /// Constructs array of lock and copy cell selection policy
+        /**
+            Allocates the array and initializes all locks as unlocked.
+        */
+        array(
+            size_t nCapacity,       ///< [in] Array size
+            select_cell_policy const& policy    ///< Cell selection policy (copy-constructible)
+        )
+        : m_arrLocks( null_ptr<lock_type *>() )
+        , m_nCapacity( nCapacity )
+        , m_SelectCellPolicy( policy )
+        {
+            m_arrLocks = create_lock_array( m_nCapacity );
+        }
+
+#   ifdef CDS_RVALUE_SUPPORT
+        /// Constructs array of lock and move cell selection policy
+        /**
+            Allocates the array and initializes all locks as unlocked.
+        */
+        array(
+            size_t nCapacity,       ///< [in] Array size
+            select_cell_policy&& policy    ///< Cell selection policy (move-constructible)
+        )
+        : m_arrLocks( null_ptr<lock_type *>() )
+        , m_nCapacity( nCapacity )
+        , m_SelectCellPolicy( std::forward<select_cell_policy>( policy ))
+        {
+            m_arrLocks = create_lock_array( m_nCapacity );
+        }
+#   endif
+
+        /// Destructs array of locks and frees used memory
+        ~array()
+        {
+            delete_lock_array( m_arrLocks, m_nCapacity );
+        }
+
+        /// Locks a lock at cell \p hint
+        /**
+            To define real array's cell which should be locked, \ref select_cell_policy is used.
+            The target cell is a result of <tt>select_cell_policy( hint, size() )</tt>.
+
+            Returns the index of locked lock.
+        */
+        template <typename Q>
+        size_t lock( Q const& hint )
+        {
+            size_t nCell = m_SelectCellPolicy( hint, size() );
+            assert( nCell < size() );
+            lock_type& l = m_arrLocks[ nCell ];
+            l.lock();
+            return nCell;
+        }
+
+        /// Try lock a lock at cell \p hint
+        /**
+            To define real array's cell which should be locked, \ref select_cell_policy is used.
+            The target cell is a result of <tt>select_cell_policy( hint, size() )</tt>.
+
+            Returns the index of locked lock if success, \ref c_nUnspecifiedCell constant otherwise.
+        */
+        template <typename Q>
+        size_t try_lock( Q const& hint )
+        {
+            size_t nCell = m_SelectCellPolicy( hint, size() );
+            assert( nCell < size() );
+            lock_type& l = m_arrLocks[ nCell ];
+            if ( l.try_lock() )
+                return nCell;
+            return c_nUnspecifiedCell;
+        }
+
+        /// Unlock the lock specified by index \p nCell
+        void unlock( size_t nCell )
+        {
+            assert( nCell < size() );
+            m_arrLocks[nCell].unlock();
+        }
+
+        /// Lock all
+        void lock_all()
+        {
+            lock_type * pLock = m_arrLocks;
+            for ( size_t i = 0; i < size(); ++i, ++pLock )
+                pLock->lock();
+        }
+
+        /// Unlock all
+        void unlock_all()
+        {
+            lock_type * pLock = m_arrLocks;
+            for ( size_t i = 0; i < size(); ++i, ++pLock )
+                pLock->unlock();
+        }
+
+        /// Get lock at cell \p nCell.
+        /**
+            Precondition: <tt>nCell < size()</tt>
+        */
+        lock_type& at( size_t nCell ) const
+        {
+            assert( nCell < size() );
+            return m_arrLocks[ nCell ];
+        }
+
+        /// Size of lock array.
+        size_t size() const
+        {
+            return m_nCapacity;
+        }
+    };
+
+    /// Specialization \ref scoped_lock for lock::array
+    template <typename Lock, typename SelectPolicy, class Alloc>
+    class scoped_lock< cds::lock::array< Lock, SelectPolicy, Alloc > >: public cds::details::noncopyable
+    {
+    public:
+        typedef cds::lock::array< Lock, SelectPolicy, Alloc >   lock_array_type ;   ///< Lock array type
+
+    private:
+        //@cond
+        lock_array_type&    m_arrLocks;
+        size_t              m_nLockGuarded;
+
+        static const size_t c_nLockAll = ~size_t(0);
+        //@endcond
+
+    public:
+        /// Onws the lock array \p arrLocks and locks a cell determined by \p hint parameter
+        template <typename Q>
+        scoped_lock( lock_array_type& arrLocks, Q const& hint )
+            : m_arrLocks( arrLocks )
+            , m_nLockGuarded( arrLocks.lock( hint ))
+        {}
+
+        /// Locks all from \p arrLocks array
+        scoped_lock( lock_array_type& arrLocks )
+            : m_arrLocks( arrLocks )
+            , m_nLockGuarded( c_nLockAll )
+        {
+            arrLocks.lock_all();
+        }
+
+        ~scoped_lock()
+        {
+            if ( m_nLockGuarded == c_nLockAll )
+                m_arrLocks.unlock_all();
+            else
+                m_arrLocks.unlock( m_nLockGuarded );
+        }
+    };
+
+}} // namespace cds::lock
+
+#endif // #ifndef __CDS_LOCK_ARRAY_H
diff --git a/cds/lock/scoped_lock.h b/cds/lock/scoped_lock.h
new file mode 100644 (file)
index 0000000..8542367
--- /dev/null
@@ -0,0 +1,72 @@
+//$$CDS-header$$
+
+#ifndef __CDS_LOCK_SCOPED_LOCK_H
+#define __CDS_LOCK_SCOPED_LOCK_H
+
+#include <cds/details/defs.h>
+#include <cds/details/noncopyable.h>
+
+namespace cds { namespace lock {
+
+    /// Scoped lock
+    /**
+
+        An object of type \p scoped_lock controls the ownership of a lockable object within a scope.
+        A \p scoped_lock object maintains ownership of a lockable object throughout the \p scoped_lock object\92s lifetime.
+        The behavior of a program is undefined if the lockable object does not exist for the entire lifetime
+        of the \p scoped_lock object.
+        The supplied \p Lock type shall have two methods: \p lock and \p unlock.
+
+        The constructor locks the wrapped lock object, the destructor unlocks it.
+
+        Scoped lock is not copy-constructible and not default-constructible.
+
+        This class is similar to \p std::lock_quard
+    */
+    template <class Lock>
+    class scoped_lock: public cds::details::noncopyable
+    {
+    public:
+        typedef Lock lock_type ;    ///< Lock type
+
+    protected:
+        lock_type&  m_Lock ;        ///< Owned lock object
+
+    protected:
+        //@cond
+        // Only for internal use!!!
+        scoped_lock()
+        {}
+        //@endcond
+    public:
+        /// Get ownership of lock object \p l and calls <tt>l.lock()</tt>
+        scoped_lock( lock_type& l )
+            : m_Lock( l )
+        {
+            l.lock();
+        }
+
+        /// Get ownership of lock object \p l and conditionally locks it
+        /**
+            The constructor calls <tt>l.lock()</tt> only if \p bAlreadyLocked is \p false.
+            If \p bAlreadyLocked is \p true, no locking is performed.
+
+            In any case, the destructor of \p scoped_lock object invokes <tt>l.unlock()</tt>.
+        */
+        scoped_lock( lock_type& l, bool bAlreadyLocked )
+            : m_Lock( l )
+        {
+            if ( !bAlreadyLocked )
+                l.lock();
+        }
+
+        /// Unlock underlying lock object and release ownership
+        ~scoped_lock()
+        {
+            m_Lock.unlock();
+        }
+    };
+}}  // namespace cds::lock
+
+
+#endif // #ifndef __CDS_LOCK_SCOPED_LOCK_H
diff --git a/cds/lock/spinlock.h b/cds/lock/spinlock.h
new file mode 100644 (file)
index 0000000..19be1a4
--- /dev/null
@@ -0,0 +1,422 @@
+//$$CDS-header$$
+
+#ifndef __CDS_LOCK_SPINLOCK_H
+#define __CDS_LOCK_SPINLOCK_H
+
+/*
+    Defines spin-lock primitives
+    Editions:
+        2012.01.23  1.1.0 khizmax     Refactoring: use C++11 atomics
+        2010.01.22  0.6.0 khizmax     Refactoring: use cds::atomic namespace
+                                      Explicit memory ordering specification (atomic::memory_order_xxx)
+        2006              khizmax     Created
+*/
+
+#include <cds/cxx11_atomic.h>
+#include <cds/os/thread.h>
+#include <cds/backoff_strategy.h>
+#include <cds/lock/scoped_lock.h>
+
+#include <cds/details/noncopyable.h>
+
+namespace cds {
+    /// Synchronization primitives
+    namespace lock {
+        /// Spin lock.
+        /**
+            Simple and light-weight spin-lock critical section
+            It is useful to gain access to small (short-timed) code
+
+            Algorithm:
+
+                TATAS (test-and-test-and-lock)
+                [1984] L. Rudolph, Z. Segall. Dynamic Decentralized Cache Schemes for MIMD Parallel Processors.
+
+            No serialization performed - any of waiting threads may owns the spin-lock.
+            This spin-lock is NOT recursive: the thread owned the lock cannot call lock() method withod deadlock.
+            The method unlock() can call any thread
+
+            DEBUG version: The spinlock stores owner thead id. Assertion is raised when:
+                - double lock attempt encountered by same thread (deadlock)
+                - unlock by another thread
+
+            If spin-lock is locked the Backoff algorithm is called. Predefined backoff::LockDefault class yields current
+            thread and repeats lock attempts later
+
+            Template parameters:
+                - @p Backoff    backoff strategy. Used when spin lock is locked
+        */
+        template <class Backoff >
+        class Spinlock
+        {
+        public:
+            typedef        Backoff      backoff_strategy    ;        ///< back-off strategy type
+        private:
+            CDS_ATOMIC::atomic<bool>    m_spin  ;       ///< Spin
+#    ifdef CDS_DEBUG
+            typename OS::ThreadId       m_dbgOwnerId        ;       ///< Owner thread id (only for debug mode)
+#    endif
+
+        public:
+            /// Construct free (unlocked) spin-lock
+            Spinlock() CDS_NOEXCEPT
+#    ifdef CDS_DEBUG
+                :m_dbgOwnerId( OS::nullThreadId() )
+#    endif
+            {
+                m_spin.store( false, CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Construct spin-lock in specified state
+            /**
+                In debug mode: if \p bLocked = true then spin-lock is made owned by current thread
+            */
+            Spinlock( bool bLocked ) CDS_NOEXCEPT
+#    ifdef CDS_DEBUG
+                :m_dbgOwnerId( bLocked ? OS::getCurrentThreadId() : OS::nullThreadId() )
+#    endif
+            {
+                m_spin.store( bLocked, CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Dummy copy constructor
+            /**
+                In theory, spin-lock cannot be copied. However, it is not practical.
+                Therefore, we provide dummy copy constructor that do no copy in fact. The ctor
+                initializes the spin to free (unlocked) state like default ctor.
+            */
+            Spinlock(const Spinlock<Backoff>& ) CDS_NOEXCEPT
+                : m_spin( false )
+#   ifdef CDS_DEBUG
+                , m_dbgOwnerId( OS::nullThreadId() )
+#   endif
+            {}
+
+            /// Destructor. On debug time it checks whether spin-lock is free
+            ~Spinlock()
+            {
+                assert( !m_spin.load( CDS_ATOMIC::memory_order_relaxed ) );
+            }
+
+            /// Check if the spin is locked
+            bool is_locked() const CDS_NOEXCEPT
+            {
+                return m_spin.load( CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            /// Try to lock the object
+            /**
+                Returns \p true if locking is succeeded
+                otherwise (if the spin is already locked) returns \p false
+
+                Debug version: deadlock can be detected
+            */
+            bool try_lock() CDS_NOEXCEPT
+            {
+                return tryLock();
+            }
+
+            /// Try to lock the object (synonym for \ref try_lock)
+            bool tryLock() CDS_NOEXCEPT
+            {
+                bool bCurrent = false;
+                m_spin.compare_exchange_strong( bCurrent, true, CDS_ATOMIC::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed );
+
+                CDS_DEBUG_DO(
+                    if ( !bCurrent ) {
+                        m_dbgOwnerId = OS::getCurrentThreadId();
+                    }
+                )
+                return !bCurrent;
+            }
+
+            /// Try to lock the object, repeat @p nTryCount times if failed
+            /**
+                Returns \p true if locking is succeeded
+                otherwise (if the spin is already locked) returns \p false
+            */
+            bool try_lock( unsigned int nTryCount ) CDS_NOEXCEPT
+            {
+                return tryLock( nTryCount );
+            }
+
+            /// Try to lock the object (synonym for \ref try_lock)
+            bool tryLock( unsigned int nTryCount ) CDS_NOEXCEPT
+            {
+                Backoff backoff;
+                while ( nTryCount-- ) {
+                    if ( tryLock() )
+                        return true;
+                    backoff();
+                }
+                return false;
+            }
+
+            /// Lock the spin-lock. Waits infinitely while spin-lock is locked. Debug version: deadlock may be detected
+            void lock() CDS_NOEXCEPT
+            {
+                Backoff backoff;
+
+                // Deadlock detected
+                assert( m_dbgOwnerId != OS::getCurrentThreadId() );
+
+                // TATAS algorithm
+                while ( !tryLock() ) {
+                    while ( m_spin.load( CDS_ATOMIC::memory_order_relaxed ) ) {
+                        backoff();
+                    }
+                }
+                assert( m_dbgOwnerId == OS::getCurrentThreadId() );
+            }
+
+            /// Unlock the spin-lock. Debug version: deadlock may be detected
+            void unlock() CDS_NOEXCEPT
+            {
+                assert( m_spin.load( CDS_ATOMIC::memory_order_relaxed ) );
+
+                assert( m_dbgOwnerId == OS::getCurrentThreadId() );
+                CDS_DEBUG_DO( m_dbgOwnerId = OS::nullThreadId() ;)
+
+                m_spin.store( false, CDS_ATOMIC::memory_order_release );
+            }
+        };
+
+        /// Spin-lock implementation default for the current platform
+        typedef Spinlock<backoff::LockDefault >                 Spin;
+
+        /// Recursive spin lock.
+        /**
+            Allows recursive calls: the owner thread may recursive enter to critical section guarded by the spin-lock.
+
+            Template parameters:
+                - @p Integral       one of integral atomic type: <tt>unsigned int</tt>, <tt>int</tt>, and others
+                - @p Backoff        backoff strategy. Used when spin lock is locked
+        */
+        template <typename Integral, class Backoff>
+        class ReentrantSpinT
+        {
+            typedef OS::ThreadId    thread_id    ;        ///< The type of thread id
+
+        public:
+            typedef Integral        integral_type       ; ///< The integral type
+            typedef Backoff         backoff_strategy    ; ///< The backoff type
+
+        private:
+            CDS_ATOMIC::atomic<integral_type>   m_spin      ; ///< spin-lock atomic
+            thread_id                           m_OwnerId   ; ///< Owner thread id. If spin-lock is not locked it usually equals to OS::nullThreadId()
+
+        private:
+            //@cond
+            void beOwner( thread_id tid ) CDS_NOEXCEPT
+            {
+                m_OwnerId = tid;
+            }
+
+            void free() CDS_NOEXCEPT
+            {
+                m_OwnerId = OS::nullThreadId();
+            }
+
+            bool isOwned( thread_id tid ) const CDS_NOEXCEPT
+            {
+                return m_OwnerId == tid;
+            }
+
+            bool    tryLockOwned( thread_id tid ) CDS_NOEXCEPT
+            {
+                if ( isOwned( tid )) {
+                    m_spin.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+                    return true;
+                }
+                return false;
+            }
+
+            bool tryAcquireLock() CDS_NOEXCEPT
+            {
+                integral_type nCurrent = 0;
+                return m_spin.compare_exchange_weak( nCurrent, 1, CDS_ATOMIC::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed );
+            }
+
+            bool tryAcquireLock( unsigned int nTryCount ) CDS_NOEXCEPT_( noexcept( backoff_strategy()() ))
+            {
+                backoff_strategy bkoff;
+
+                while ( nTryCount-- ) {
+                    if ( tryAcquireLock() )
+                        return true;
+                    bkoff();
+                }
+                return false;
+            }
+
+            void acquireLock() CDS_NOEXCEPT_( noexcept( backoff_strategy()() ))
+            {
+                // TATAS algorithm
+                backoff_strategy bkoff;
+                while ( !tryAcquireLock() ) {
+                    while ( m_spin.load( CDS_ATOMIC::memory_order_relaxed ) )
+                        bkoff();
+                }
+            }
+            //@endcond
+
+        public:
+            /// Default constructor initializes spin to free (unlocked) state
+            ReentrantSpinT() CDS_NOEXCEPT
+                : m_spin(0)
+                , m_OwnerId( OS::nullThreadId() )
+            {}
+
+            /// Dummy copy constructor
+            /**
+                In theory, spin-lock cannot be copied. However, it is not practical.
+                Therefore, we provide dummy copy constructor that do no copy in fact. The ctor
+                initializes the spin to free (unlocked) state like default ctor.
+            */
+            ReentrantSpinT(const ReentrantSpinT<Integral, Backoff>& ) CDS_NOEXCEPT
+                : m_spin(0)
+                , m_OwnerId( OS::nullThreadId() )
+            {}
+
+            /// Construct object for specified state
+            ReentrantSpinT(bool bLocked) CDS_NOEXCEPT
+                : m_spin(0),
+                m_OwnerId( OS::nullThreadId() )
+            {
+                if ( bLocked )
+                    lock();
+            }
+
+            /// Checks if the spin is locked
+            /**
+                The spin is locked if lock count > 0 and the current thread is not an owner of the lock.
+                Otherwise (i.e. lock count == 0 or the curren thread owns the spin) the spin is unlocked.
+            */
+            bool is_locked() const CDS_NOEXCEPT
+            {
+                return !( m_spin.load( CDS_ATOMIC::memory_order_relaxed ) == 0 || isOwned( cds::OS::getCurrentThreadId() ));
+            }
+
+            /// Try to lock the spin-lock (synonym for \ref try_lock)
+            bool tryLock() CDS_NOEXCEPT
+            {
+                thread_id tid = OS::getCurrentThreadId();
+                if ( tryLockOwned( tid ) )
+                    return true;
+                if ( tryAcquireLock()) {
+                    beOwner( tid );
+                    return true;
+                }
+                return false;
+            }
+
+            /// Try to lock the spin-lock. If spin-lock is free the current thread owns it. Return @p true if locking is success
+            bool try_lock() CDS_NOEXCEPT
+            {
+                return tryLock();
+            }
+
+            /// Try to lock the object (synonym for \ref try_lock)
+            bool tryLock( unsigned int nTryCount )
+#       if !( (CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40600 && CDS_COMPILER_VERSION < 40700) || (CDS_COMPILER == CDS_COMPILER_CLANG && CDS_COMPILER_VERSION < 30100) )
+                // GCC 4.6, clang 3.0 error in noexcept expression:
+                // cannot call member function \91bool cds::lock::ReentrantSpinT<Integral, Backoff>::tryAcquireLock(unsigned int) without object
+                CDS_NOEXCEPT_( noexcept( tryAcquireLock(nTryCount) ))
+#       endif
+            {
+                thread_id tid = OS::getCurrentThreadId();
+                if ( tryLockOwned( tid ) )
+                    return true;
+                if ( tryAcquireLock( nTryCount )) {
+                    beOwner( tid );
+                    return true;
+                }
+                return false;
+            }
+
+            /// Try to lock the object.
+            /**
+                If the spin-lock is locked the method repeats attempts to own spin-lock up to @p nTryCount times.
+                Between attempts @p backoff() is called.
+                Return @p true if current thread owns the lock @p false otherwise
+            */
+            bool try_lock( unsigned int nTryCount )
+#       if !( (CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40600 && CDS_COMPILER_VERSION < 40700) || (CDS_COMPILER == CDS_COMPILER_CLANG && CDS_COMPILER_VERSION < 30100) )
+                // GCC 4.6, clang 3.0 error in noexcept expression:
+                // cannot call member function \91bool cds::lock::ReentrantSpinT<Integral, Backoff>::tryLock(unsigned int) without object
+                CDS_NOEXCEPT_( noexcept( tryLock(nTryCount) ))
+#       endif
+            {
+                return tryLock( nTryCount );
+            }
+
+            /// Lock the object waits if it is busy
+            void lock() CDS_NOEXCEPT
+            {
+                thread_id tid = OS::getCurrentThreadId();
+                if ( !tryLockOwned( tid ) ) {
+                    acquireLock();
+                    beOwner( tid );
+                }
+            }
+
+            /// Unlock the spin-lock. Return @p true if the current thread is owner of spin-lock @p false otherwise
+            bool unlock() CDS_NOEXCEPT
+            {
+                if ( isOwned( OS::getCurrentThreadId() ) ) {
+                    integral_type n = m_spin.load( CDS_ATOMIC::memory_order_relaxed );
+                    if ( n > 1 )
+                        m_spin.store( n - 1, CDS_ATOMIC::memory_order_relaxed );
+                    else {
+                        free();
+                        m_spin.store( 0, CDS_ATOMIC::memory_order_release );
+                    }
+                    return true;
+                }
+                return false;
+            }
+
+            /// Change the owner of locked spin-lock. May be called by thread that is owner of the spin-lock
+            bool changeOwner( OS::ThreadId newOwnerId ) CDS_NOEXCEPT
+            {
+                if ( isOwned( OS::getCurrentThreadId() ) ) {
+                    assert( newOwnerId != OS::nullThreadId() );
+                    m_OwnerId = newOwnerId;
+                    return true;
+                }
+                return false;
+            }
+        };
+
+        /// Recursive spin-lock based on atomic32u_t
+        typedef ReentrantSpinT<atomic32u_t, backoff::LockDefault>   ReentrantSpin32;
+
+        /// Recursive spin-lock based on atomic64u_t type
+        typedef ReentrantSpinT<atomic64u_t, backoff::LockDefault>   ReentrantSpin64;
+
+        /// Recursive spin-lock based on atomic32_t type
+        typedef ReentrantSpin32                                     ReentrantSpin;
+
+        /// The best (for the current platform) auto spin-lock
+        typedef scoped_lock<Spin>   AutoSpin;
+
+    }    // namespace lock
+
+    /// Standard (best for the current platform) spin-lock implementation
+    typedef lock::Spin              SpinLock;
+
+    /// Standard (best for the current platform) recursive spin-lock implementation
+    typedef lock::ReentrantSpin     RecursiveSpinLock;
+
+    /// 32bit recursive spin-lock shortcut
+    typedef lock::ReentrantSpin32   RecursiveSpinLock32;
+
+    /// 64bit recursive spin-lock shortcut
+    typedef lock::ReentrantSpin64   RecursiveSpinLock64;
+
+    /// Auto spin-lock shortcut
+    typedef lock::AutoSpin          AutoSpinLock;
+
+} // namespace cds
+
+#endif  // #ifndef __CDS_LOCK_SPINLOCK_H
diff --git a/cds/memory/michael/allocator.h b/cds/memory/michael/allocator.h
new file mode 100644 (file)
index 0000000..f571ed1
--- /dev/null
@@ -0,0 +1,1917 @@
+//$$CDS-header$$
+
+#ifndef __CDS_MEMORY_MICHAEL_ALLOCATOR_TMPL_H
+#define __CDS_MEMORY_MICHAEL_ALLOCATOR_TMPL_H
+
+/*
+    Michael allocator implementation
+    Source:
+        [2004] Maged Michael "Scalable Lock-Free Dynamic Memory Allocation"
+
+    Editions:
+    2011.09.07 khizmax  Optimization: small page (about 64K) is allocated by Heap::alloc call.
+                        This optimization allows to allocate system memory more regularly,
+                        in blocks of 1M that leads to less memory fragmentation.
+    2011.01.02 khizmax  Created
+*/
+
+#include <cds/init.h>
+#include <cds/memory/michael/options.h>
+#include <cds/memory/michael/bound_check.h>
+#include <cds/memory/michael/procheap_stat.h>
+#include <cds/memory/michael/osalloc_stat.h>
+
+#include <cds/os/topology.h>
+#include <cds/os/alloc_aligned.h>
+#include <cds/lock/spinlock.h>
+#include <cds/details/type_padding.h>
+#include <cds/details/marked_ptr.h>
+#include <cds/container/vyukov_mpmc_cycle_queue.h>
+#include <cds/user_setup/cache_line.h>
+#include <cds/details/lib.h>
+
+#include <stdlib.h>
+#include <boost/intrusive/list.hpp>
+
+namespace cds {
+    /// Memory-related algorithms: allocators etc.
+namespace memory {
+    /// Michael's allocator (class Heap)
+    /**
+        \par Source
+            \li [2004] M.Michael "Scalable Lock-free Dynamic Memory Allocation"
+
+        This namespace declares the main class Heap and a lot of helper classes.
+    */
+namespace michael {
+
+    /// Size class
+    struct size_class {
+        unsigned int    nBlockSize  ;   ///< block size in bytes
+        unsigned int    nSBSize     ;   ///< superblock size (64K or 1M)
+        unsigned int    nCapacity   ;   ///< superblock capacity (nSBSize / nBlockSize)
+        unsigned int    nSBSizeIdx  ;   ///< internal superblock size index (page index)
+    };
+
+    /// %Heap based on system \p malloc and \p free functions
+    struct malloc_heap
+    {
+        /// Allocates memory block of \p nSize bytes (\p malloc wrapper)
+        static void * alloc( size_t nSize )
+        {
+            return ::malloc( nSize );
+        }
+        /// Returning memory block to the system (\p free wrapper)
+        static void free( void * p )
+        {
+            ::free( p );
+        }
+    };
+
+    /// %Heap based on system provided aligned \p malloc and \p free functions
+    struct aligned_malloc_heap
+    {
+        /// Allocates aligned memory block of \p nSize bytes with alignment \p nAlignment
+        static void * alloc( size_t nSize, size_t nAlignment  )
+        {
+            return cds::OS::aligned_malloc( nSize, nAlignment );
+        }
+        /// Frees aligned memory block \p p that has been previosly allocated by \ref alloc call
+        static void free( void * p )
+        {
+            cds::OS::aligned_free( p );
+        }
+    };
+
+    /// Page heap based on \p Heap
+    /**
+        Page heap can allocate memory by page-sized block only.
+        \p Heap may be any heap that provides interface like \ref malloc_heap.
+
+        This class is one of available implementation of opt::page_heap option.
+    */
+    template <class Heap = malloc_heap>
+    class page_allocator: public Heap
+    {
+        //@cond
+        typedef Heap base_class;
+        size_t  m_nPageSize;
+        //@endcond
+
+    public:
+        /// Initializes heap
+        page_allocator(
+            size_t nPageSize    ///< page size in bytes
+        )
+            : m_nPageSize( nPageSize )
+        {}
+
+        /// Allocate new page
+        void * alloc()
+        {
+            return base_class::alloc( m_nPageSize );
+        }
+
+        /// Free page \p pPage
+        void free( void * pPage )
+        {
+            base_class::free( pPage );
+        }
+    };
+
+    /// Page cacheable heap
+    /**
+        To improve performance this allocator maintains small list of free pages.
+        Page heap can allocate memory by page-sized block only.
+
+        Template parameters:
+            \li \p FreeListCapacity - capacity of free-list, default value is 64 page
+            \li \p Heap may be any heap that provides interface like \ref malloc_heap.
+
+        This class is one of available implementation of opt::page_heap option.
+    */
+    template <size_t FreeListCapacity = 64, class Heap = malloc_heap>
+    class page_cached_allocator: public page_allocator<Heap>
+    {
+        //@cond
+        typedef page_allocator<Heap> base_class;
+
+#ifdef _DEBUG
+        struct make_null_ptr {
+            void operator ()(void *& p)
+            {
+                p = null_ptr<void *>();
+            }
+        };
+#endif
+
+        typedef container::VyukovMPMCCycleQueue<
+            void *,
+            opt::buffer< opt::v::static_buffer<void *, FreeListCapacity> >
+#ifdef _DEBUG
+            , opt::value_cleaner< make_null_ptr >
+#endif
+        >   free_list;
+
+        free_list   m_FreeList;
+        //@endcond
+
+    public:
+        /// Initializes heap
+        page_cached_allocator(
+            size_t nPageSize    ///< page size in bytes
+        )
+            : base_class( nPageSize )
+            , m_FreeList( FreeListCapacity )
+        {}
+
+        //@cond
+        ~page_cached_allocator()
+        {
+            void * pPage;
+            while ( m_FreeList.pop(pPage) )
+                base_class::free( pPage );
+        }
+        //@endcond
+
+        /// Allocate new page
+        void * alloc()
+        {
+            void * pPage;
+            if ( !m_FreeList.pop( pPage ) )
+                pPage = base_class::alloc();
+            return pPage;
+        }
+
+        /// Free page \p pPage
+        void free( void * pPage )
+        {
+            if ( !m_FreeList.push( pPage ))
+                base_class::free( pPage );
+        }
+    };
+
+    /// Implementation of opt::sizeclass_selector option
+    /**
+        Default size-class selector can manage memory blocks up to 64K.
+    */
+    class CDS_EXPORT_API default_sizeclass_selector
+    {
+        //@cond
+        /// Count of different size-classes
+        static const size_t c_nSizeClassCount = 63;
+
+        /// Max block size
+        static const size_t c_nMaxBlockSize = 64 * 1024;
+
+        /// Page size of type 0 (64K)
+        static const unsigned int c_nPage64K = 64 * 1024 - 32;
+
+        /// Page size of type 1 (1M)
+        static const unsigned int c_nPage1M = 1024 * 1024;
+
+        static CDS_DATA_ALIGNMENT(128) unsigned int const m_szClassBounds[c_nSizeClassCount];
+        static size_class const m_szClass[c_nSizeClassCount];
+        static unsigned char const m_szClassMap[];
+        //@endcond
+    public:
+        /// Type of size-class index
+        typedef unsigned int sizeclass_index;
+
+#ifdef _DEBUG
+        default_sizeclass_selector();
+#endif
+
+        /// "No size class" index
+        static const sizeclass_index c_nNoSizeClass = (unsigned int) (0 - 1);
+
+        /// Returns size-class count
+        static sizeclass_index size()
+        {
+            return c_nSizeClassCount;
+        }
+
+        /// Returns page size in bytes for given page type \p nPageType
+        static size_t page_size(size_t nPageType )
+        {
+            switch (nPageType) {
+            case 0:
+                return c_nPage64K;
+            case 1:
+                return c_nPage1M;
+            default:
+                assert(false)   ;   // anything forgotten?..
+            }
+            return c_nPage1M;
+        }
+
+        /// Returns count of page size-class
+        /**
+            This class supports pages of two types: 64K page for small objects and 1M page for other objects.
+        */
+        static size_t pageTypeCount()
+        {
+            return 2;
+        }
+
+        /// Returns size-class index for \p nSize
+        /**
+            For large blocks that cannot be allocated by Michael's allocator
+            the function must return -1.
+        */
+        static sizeclass_index find( size_t nSize )
+        {
+            if ( nSize > c_nMaxBlockSize ) {
+                // Too large block - allocate from system
+                return c_nNoSizeClass;
+            }
+            sizeclass_index szClass = m_szClassMap[ (nSize + 15) / 16 ];
+            assert( nSize <= m_szClassBounds[ szClass ] );
+            assert( szClass == 0 || m_szClassBounds[ szClass - 1] < nSize );
+
+            return szClass;
+        }
+
+        /// Gets details::size_class struct for size-class index \p nIndex
+        static const size_class * at( sizeclass_index nIndex )
+        {
+            assert( nIndex < size() );
+            return m_szClass + nIndex;
+        }
+    };
+
+    //@cond
+    namespace details {
+        struct free_list_tag;
+        typedef boost::intrusive::list_base_hook< boost::intrusive::tag< free_list_tag > >  free_list_locked_hook;
+
+        struct partial_list_tag;
+        typedef boost::intrusive::list_base_hook< boost::intrusive::tag< partial_list_tag > >  partial_list_locked_hook;
+
+        struct intrusive_superblock_desc: public free_list_locked_hook, partial_list_locked_hook
+        {};
+    }
+    //@endcond
+
+    /// List of free superblock descriptor
+    /**
+        This class is a implementation of \ref opt::free_list option
+    */
+    template <class Lock, class T = details::intrusive_superblock_desc>
+    class free_list_locked: public boost::intrusive::list<T, boost::intrusive::base_hook<details::free_list_locked_hook> >
+    {
+        //@cond
+        typedef boost::intrusive::list<T, boost::intrusive::base_hook<details::free_list_locked_hook> > base_class;
+    public:
+        typedef details::free_list_locked_hook item_hook;
+        typedef Lock lock_type;
+    protected:
+        typedef cds::lock::scoped_lock<lock_type>   auto_lock;
+
+        mutable lock_type   m_access;
+        //@endcond
+
+    public:
+        /// Rebinds to other item type \p T2
+        template <class T2>
+        struct rebind {
+            typedef free_list_locked<Lock, T2>    other   ;   ///< rebind result
+        };
+
+    public:
+        /// Push superblock descriptor to free-list
+        void push( T * pDesc )
+        {
+            assert( base_class::node_algorithms::inited( static_cast<item_hook *>(pDesc) ) );
+            auto_lock al(m_access);
+            base_class::push_back( *pDesc );
+        }
+
+        /// Pop superblock descriptor from free-list
+        T *   pop()
+        {
+            auto_lock al(m_access);
+            if ( base_class::empty() )
+                return null_ptr<T *>();
+            T& rDesc = base_class::front();
+            base_class::pop_front();
+            assert( base_class::node_algorithms::inited( static_cast<item_hook *>(&rDesc) ) );
+            return &rDesc;
+        }
+
+        /// Returns current count of superblocks in free-list
+        size_t  size() const
+        {
+            auto_lock al(m_access);
+            return base_class::size();
+        }
+    };
+
+    /// List of partial filled superblock descriptor
+    /**
+        This class is a implementation of \ref opt::partial_list option
+    */
+    template <class Lock, class T = details::intrusive_superblock_desc>
+    class partial_list_locked: public boost::intrusive::list<T, boost::intrusive::base_hook<details::partial_list_locked_hook> >
+    {
+        //@cond
+        typedef boost::intrusive::list<T, boost::intrusive::base_hook<details::partial_list_locked_hook> > base_class;
+    public:
+        typedef details::partial_list_locked_hook item_hook;
+        typedef Lock    lock_type;
+    protected:
+        typedef cds::lock::scoped_lock<lock_type>   auto_lock;
+
+        mutable lock_type   m_access;
+        //@endcond
+
+    public:
+        /// Rebinds to other item type \p T2
+        template <class T2>
+        struct rebind {
+            typedef partial_list_locked<Lock, T2>    other   ;   ///< rebind result
+        };
+
+    public:
+        /// Push a superblock \p pDesc to the list
+        void    push( T * pDesc )
+        {
+            auto_lock al( m_access );
+            assert( base_class::node_algorithms::inited( static_cast<item_hook *>(pDesc) ) );
+            base_class::push_back( *pDesc );
+        }
+
+        /// Pop superblock from the list
+        T * pop()
+        {
+            auto_lock al( m_access );
+            if ( base_class::empty() )
+                return null_ptr<T *>();
+            T& rDesc = base_class::front();
+            base_class::pop_front();
+            assert( base_class::node_algorithms::inited( static_cast<item_hook *>(&rDesc) ) );
+            return &rDesc;
+        }
+
+        /// Removes \p pDesc descriptor from the free-list
+        bool unlink( T * pDesc )
+        {
+            assert( pDesc != null_ptr<T *>() );
+            auto_lock al( m_access );
+            // !inited(pDesc) is equal to "pDesc is being linked to partial list"
+            if ( !base_class::node_algorithms::inited( static_cast<item_hook *>(pDesc) ) ) {
+                base_class::erase( base_class::iterator_to( *pDesc ) );
+                return true;
+            }
+            return false;
+        }
+
+        /// Count of element in the list
+        size_t size() const
+        {
+            auto_lock al( m_access );
+            return base_class::size();
+        }
+    };
+
+    /// Summary processor heap statistics
+    /**
+        Summary heap statistics for use with Heap::summaryStat function.
+    */
+    struct summary_stat
+    {
+        size_t      nAllocFromActive    ;  ///< Event count of allocation from active superblock
+        size_t      nAllocFromPartial   ;  ///< Event count of allocation from partial superblock
+        size_t      nAllocFromNew       ;  ///< Event count of allocation from new superblock
+        size_t      nFreeCount          ;  ///< Count of \p free function call
+        size_t      nPageAllocCount     ;  ///< Count of page (superblock) allocated
+        size_t      nPageDeallocCount   ;  ///< Count of page (superblock) deallocated
+        size_t      nDescAllocCount     ;  ///< Count of superblock descriptors
+        size_t      nDescFull           ;  ///< Count of full superblock
+        atomic64u_t nBytesAllocated     ;  ///< Count of allocated bytes (for heap managed memory blocks)
+        atomic64u_t nBytesDeallocated   ;  ///< Count of deallocated bytes (for heap managed memory blocks)
+
+        size_t      nSysAllocCount      ;  ///< Count of \p alloc and \p alloc_aligned function call (for large memory blocks that allocated directly from OS)
+        size_t      nSysFreeCount       ;  ///< Count of \p free and \p free_aligned function call (for large memory blocks that allocated directly from OS)
+        atomic64u_t nSysBytesAllocated  ;  ///< Count of allocated bytes (for large memory blocks that allocated directly from OS)
+        atomic64_t  nSysBytesDeallocated;  ///< Count of deallocated bytes (for large memory blocks that allocated directly from OS)
+
+        // Internal contention indicators
+        /// CAS failure counter for updating active field of active block of \p alloc_from_active Heap internal function
+        /**
+            Contention indicator. The less value is better
+        */
+        size_t      nActiveDescCASFailureCount;
+        /// CAS failure counter for updating active field of active block of \p alloc_from_active Heap internal function
+        /**
+            Contention indicator. The less value is better
+        */
+        size_t      nActiveAnchorCASFailureCount;
+        /// CAS failure counter for updating anchor field of partial block of \p alloc_from_partial Heap internal function
+        /**
+            Contention indicator. The less value is better
+        */
+        size_t      nPartialDescCASFailureCount;
+        /// CAS failure counter for updating anchor field of partial block of \p alloc_from_partial Heap internal function
+        /**
+            Contention indicator. The less value is better
+        */
+        size_t      nPartialAnchorCASFailureCount;
+
+
+    public:
+        /// Constructs empty statistics. All counters are zero.
+        summary_stat()
+        {
+            clear();
+        }
+
+        /// Difference statistics
+        /**
+            This operator computes difference between \p *this and \p stat and places the difference to \p this.
+            Returns \p *this;
+        */
+        summary_stat& operator -=( const summary_stat& stat )
+        {
+            nAllocFromActive    -= stat.nAllocFromActive;
+            nAllocFromPartial   -= stat.nAllocFromPartial;
+            nAllocFromNew       -= stat.nAllocFromNew;
+            nFreeCount          -= stat.nFreeCount;
+            nPageAllocCount     -= stat.nPageAllocCount;
+            nPageDeallocCount   -= stat.nPageDeallocCount;
+            nDescAllocCount     -= stat.nDescAllocCount;
+            nDescFull           -= stat.nDescFull;
+            nBytesAllocated     -= stat.nBytesAllocated;
+            nBytesDeallocated   -= stat.nBytesDeallocated;
+
+            nSysAllocCount      -= stat.nSysAllocCount;
+            nSysFreeCount       -= stat.nSysFreeCount;
+            nSysBytesAllocated  -= stat.nSysBytesAllocated;
+            nSysBytesDeallocated -= stat.nSysBytesDeallocated;
+
+            nActiveDescCASFailureCount      -= stat.nActiveDescCASFailureCount;
+            nActiveAnchorCASFailureCount    -= stat.nActiveAnchorCASFailureCount;
+            nPartialDescCASFailureCount     -= stat.nPartialDescCASFailureCount;
+            nPartialAnchorCASFailureCount   -= stat.nPartialAnchorCASFailureCount;
+
+            return *this;
+        }
+
+        /// Clears statistics
+        /**
+            All counters are set to zero.
+        */
+        void clear()
+        {
+            memset( this, 0, sizeof(*this));
+        }
+
+        //@cond
+        template <typename Stat>
+        summary_stat& add_procheap_stat( const Stat& stat )
+        {
+            nAllocFromActive    += stat.allocFromActive();
+            nAllocFromPartial   += stat.allocFromPartial();
+            nAllocFromNew       += stat.allocFromNew();
+            nFreeCount          += stat.freeCount();
+            nPageAllocCount     += stat.blockAllocated();
+            nPageDeallocCount   += stat.blockDeallocated();
+            nDescAllocCount     += stat.descAllocCount();
+            nDescFull           += stat.descFull();
+            nBytesAllocated     += stat.allocatedBytes();
+            nBytesDeallocated   += stat.deallocatedBytes();
+
+            nActiveDescCASFailureCount      += stat.activeDescCASFailureCount();
+            nActiveAnchorCASFailureCount    += stat.activeAnchorCASFailureCount();
+            nPartialDescCASFailureCount     += stat.partialDescCASFailureCount();
+            nPartialAnchorCASFailureCount   += stat.partialAnchorCASFailureCount();
+
+            return *this;
+        }
+
+        template <typename Stat>
+        summary_stat& add_heap_stat( const Stat& stat )
+        {
+            nSysAllocCount      += stat.allocCount();
+            nSysFreeCount       += stat.freeCount();
+
+            nSysBytesAllocated  += stat.allocatedBytes();
+            nSysBytesDeallocated+= stat.deallocatedBytes();
+
+            return *this;
+        }
+        //@endcond
+    };
+
+    /// Michael's allocator
+    /**
+        This class provides base functionality for Michael's allocator. It does not provide
+        the interface described by \p std::allocator, therefore, we name it as a heap, not as an allocator.
+        The heap interface is closer to semantics of \p malloc / \p free system functions.
+        The heap supports allocation of aligned and unaligned data.
+
+        The algorithm is based on simplified version of
+            \li [2004] M.Michael "Scalable Lock-free Dynamic Memory Allocation"
+
+        that, in turn, is concurrent version of well-known Hoard allocator developed by Emery Berger, see
+            \li [2002] Emery Berger "Memory Management for High-Performance Application", PhD thesis
+
+        This is powerful, scalable, fully customizable heap with fast-path without any locks
+        that has been developed specifically for multi-threading.
+        With opt:sys_topology you can set as many allocation arena ("processor heap") as you need.
+        You can manually bound any your thread to any arena ("processor"). With opt::sizeclass_selector option you can manage
+        allocation granularity. With opt::page_heap you can utilize any OS-provided features for page allocation
+        like \p mmap, \p VirtualAlloc etc. The heap can gather internal statistics that helps you to tune your application.
+        The opt::check_bounds feature can help you to find a memory buffer overflow.
+
+        Brief algorithm description from Michael's work:
+
+        Large blocks (greater than 64K) are allocated directly from the OS and freed directly to the OS. For smaller block sizes,
+        the heap is composed of large superblocks (64 KB or 1MB size). Each superblock is divided into multiple equal-sized blocks.
+        Superblocks are distributed among size classes based on their block sizes. Each size class contains multiple processor
+        heaps proportional to the number of processors in the system. A processor heap contains at most one active superblock.
+        An active superblock contains one or more blocks available for reservation that are guaranteed to be available to threads
+        that reach them through the header of the processor heap. Each superblock is associated with a descriptor. Each allocated
+        block contains a prefix (8 bytes) that points to the descriptor of its superblock. On the first call to malloc, the static
+        structures for the size classes and processor heaps (about 16 KB for a 16 processor machine) are allocated and initialized
+        in a lock-free manner.
+
+        Malloc starts by identifying the appropriate processor heap, based on the requested block size and the identity of
+        the calling thread. Typically, the heap already has an active superblock with blocks available for reservation. The thread
+        atomically reads a pointer to the descriptor of the active superblock and reserves a block. Next, the thread atomically
+        pops a block from that superblock and updates its descriptor. A typical free pushes the freed block into the list of
+        available blocks of its original superblock by atomically updating its descriptor.
+
+        <b>Constraint</b>: one superblock may contain up to 2048 block. This restriction imposes a restriction on the maximum
+        superblock size.
+
+        Available \p Options:
+        - \ref opt::sys_topology - class that describes system topology needed for allocator.
+            Default is \p cds::OS::topology (see cds::OS::Win32::topology for interface description)
+        - \ref opt::system_heap - option setter for an allocator for large blocks that is used for direct allocation from OS.
+            Default is \ref malloc_heap.
+        - \ref opt::aligned_heap - option setter for a heap used for internal aligned memory management.
+            Default is \ref aligned_malloc_heap
+        - \ref opt::page_heap - option setter for a heap used for page (superblock) allocation of 64K/1M size.
+            Default is \ref page_cached_allocator
+        - \ref opt::sizeclass_selector - option setter for a class used to select appropriate size-class
+            for incoming allocation request.
+            Default is \ref default_sizeclass_selector
+        - \ref opt::free_list - option setter for a class to manage a list of free superblock descriptors
+            Default is \ref free_list_locked
+        - \ref opt::partial_list - option setter for a class to manage a list of partial filled superblocks
+            Default is \ref partial_list_locked
+        - \ref opt::procheap_stat - option setter for a class to gather internal statistics for memory allocation
+            that is maintained by the heap.
+            Default is \ref procheap_empty_stat
+        - \ref opt::os_allocated_stat - option setter for a class to gather internal statistics for large block
+            allocation. Term "large block" is specified by the size-class selector (see \ref opt::sizeclass_selector)
+            and it is 64K for \ref default_sizeclass_selector. Any block that is large that 64K is allocated from
+            OS directly. \p os_allocated_stat option is set a class to gather statistics for large blocks.
+            Default is \ref os_allocated_empty
+        - \ref opt::check_bounds - a bound checker.
+            Default is no bound checker (cds::opt::none)
+
+        \par Usage:
+        The heap is the basic building block for your allocator or <tt> operator new</tt> implementation.
+
+        \code
+        #include <cds/memory/michael/allocator.h>
+
+        // Heap with explicitly defined options:
+        cds::memory::michael::Heap<
+            opt::aligned_heap< aligned_malloc_heap >,
+            opt::page_heap< page_cached_allocator<16, malloc_heap> >
+        >   myHeap;
+
+        // Heap with default options:
+        cds::memory::michael::Heap<>    myDefHeap;
+        \endcode
+
+        \par How to make std-like allocator
+
+        There are serious differencies of heap and <tt>std::allocator</tt> interface:
+            - Heap is stateful, and \p std::allocator is stateless.
+            - Heap has much more template parameters than \p std::allocator
+            - Heap has low-level interface for memory allocating only unlike the allocator
+                interface that can construct/destroy objects of any type T.
+
+        To convert heap interface into \p std::allocator -like interface you should:
+            - Declare object of class cds::memory::michael::Heap specifying the necessary
+                template parameters; this is usually static object
+            - Create a class with \p std::allocator interface that uses the function of heap.
+        \code
+        #include <cds/memory/michael/allocator.h>
+
+        template <class T>
+        class MichaelAllocator
+        {
+            typedef std::allocator<T>               std_allocator;
+            typedef cds::memory::michael::Heap<>    michael_heap;
+
+            // Michael heap static object
+            static michael_heap     s_Heap;
+        public:
+            // Declare typedefs from std::allocator
+            typedef typename std_allocator::const_pointer   const_pointer;
+            typedef typename std_allocator::pointer         pointer;
+            typedef typename std_allocator::const_reference const_reference;
+            typedef typename std_allocator::reference       reference;
+            typedef typename std_allocator::difference_type difference_type;
+            typedef typename std_allocator::size_type       size_type;
+            typedef typename std_allocator::value_type      value_type;
+
+            // Allocation function
+            pointer allocate( size_type _Count, const void* _Hint )
+            {
+                return reinterpret_cast<pointer>( s_Heap.alloc( sizeof(T) * _Count ));
+            }
+
+            // Deallocation function
+            void deallocate( pointer _Ptr, size_type _Count )
+            {
+                s_Heap.free( _Ptr );
+            }
+
+            // Other std::allocator specific functions: address, construct, destroy, etc.
+            ...
+
+            // Rebinding allocator to other type
+            template <class _Other>
+            struct rebind {
+                typedef MichaelAllocator<_Other> other;
+            };
+        };
+
+        // In .cpp file:
+        MichaelAllocator::michael_heap MichaelAllocator::s_Heap;
+
+        \endcode
+    */
+#ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+    template <typename... Options>
+#else
+    template <
+        typename O1 = opt::none,
+        typename O2 = opt::none,
+        typename O3 = opt::none,
+        typename O4 = opt::none,
+        typename O5 = opt::none,
+        typename O6 = opt::none,
+        typename O7 = opt::none,
+        typename O8 = opt::none,
+        typename O9 = opt::none,
+        typename O10= opt::none
+    >
+#endif
+    class Heap {
+    protected:
+
+        //@cond
+        static const unsigned int c_nAlignment = cds::c_nCacheLineSize;
+        static const unsigned int c_nDefaultBlockAlignment = 8;
+
+        struct default_options {
+            typedef cds::OS::topology           sys_topology;
+            typedef malloc_heap                 system_heap;
+            typedef page_cached_allocator<>     page_heap;
+            typedef aligned_malloc_heap         aligned_heap;
+            typedef default_sizeclass_selector  sizeclass_selector;
+            typedef free_list_locked<cds::lock::Spin>  free_list;
+            typedef partial_list_locked<cds::lock::Spin>    partial_list;
+            typedef procheap_empty_stat         procheap_stat;
+            typedef os_allocated_empty          os_allocated_stat;
+            typedef cds::opt::none              check_bounds;
+        };
+        //@endcond
+
+    protected:
+        //@cond
+#ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+        typedef typename opt::make_options<default_options, Options...>::type   options;
+#else
+        typedef typename opt::make_options<default_options, O1, O2, O3, O4, O5, O6, O7, O8, O9, O10 >::type   options;
+#endif
+        //@endcond
+
+        //@cond
+        typedef unsigned char   byte;
+        //@endcond
+    public:
+        typedef typename options::sys_topology          sys_topology        ;   ///< effective system topology
+        typedef typename options::system_heap           system_heap         ;   ///< effective system heap
+        typedef typename options::aligned_heap          aligned_heap        ;   ///< effective aligned heap
+        typedef typename options::sizeclass_selector    sizeclass_selector  ;   ///< effective sizeclass selector
+        typedef typename options::page_heap             page_heap           ;   ///< effective page heap
+        typedef typename options::procheap_stat         procheap_stat       ;   ///< effective processor heap statistics
+        typedef typename options::os_allocated_stat     os_allocated_stat   ;   ///< effective OS-allocated memory statistics
+        typedef details::bound_checker_selector< typename options::check_bounds >    bound_checker   ;  ///< effective bound checker
+
+        // forward declarations
+        //@cond
+        struct superblock_desc;
+        struct processor_heap_base;
+        struct processor_desc;
+        //@endcond
+
+        /// Superblock states
+        /**
+            A superblock can be in one of four states: \p ACTIVE, \p FULL,
+            \p PARTIAL, or \p EMPTY. A superblock is \p ACTIVE if it is the active
+            superblock in a heap, or if a thread intends to try to install it
+            as such. A superblock is \p FULL if all its blocks are either allocated
+            or reserved. A superblock is \p PARTIAL if it is not \p ACTIVE
+            and contains unreserved available blocks. A superblock is
+            \p EMPTY if all its blocks are free and it is not \p ACTIVE.
+        */
+        enum superblock_state {
+            SBSTATE_ACTIVE  = 0,    ///< superblock is active
+            SBSTATE_FULL    = 1,    ///< superblock is full
+            SBSTATE_PARTIAL = 2,    ///< superblock is partially allocated
+            SBSTATE_EMPTY   = 3     ///< superblock is empty and may be freed
+        };
+
+        static const size_t c_nMaxBlockInSuperBlock = 1024 * 2  ;   ///< Max count of blocks in superblock (2 ** 11)
+
+        /// Anchor of the superblock descriptor. Updated by CAS
+        struct anchor_tag {
+            unsigned long long  avail:11    ;   ///< index of first available block in the superblock
+            unsigned long long  count:11    ;   ///< number of unreserved blocks in the superblock
+            unsigned long long  state: 2    ;   ///< state of the superblock (see \ref superblock_state enum)
+            unsigned long long    tag:40    ;   ///< ABA prevention tag
+        };
+
+        /// Superblock descriptor
+        struct superblock_desc
+            : public options::free_list::item_hook
+            , public options::partial_list::item_hook
+        {
+            CDS_ATOMIC::atomic<anchor_tag>          anchor      ;   ///< anchor, see \ref anchor_tag
+            byte *              pSB         ;   ///< ptr to superblock
+            processor_heap_base * pProcHeap ;   ///< pointer to owner processor heap
+            unsigned int        nBlockSize  ;   ///< block size in bytes
+            unsigned int        nCapacity   ;   ///< superblock size/block size
+
+            //@cond
+            superblock_desc()
+                : pSB( null_ptr<byte *>() )
+                , pProcHeap( null_ptr<processor_heap_base *>() )
+            {}
+            //@endcond
+        };
+
+        //@cond
+        typedef typename options::free_list::template rebind<superblock_desc>::other    free_list;
+        typedef typename options::partial_list::template rebind<superblock_desc>::other partial_list;
+        //@endcond
+
+#if CDS_BUILD_BITS == 32
+        /// Allocated block header
+        /**
+            Each allocated block has 8-byte header.
+            The header contains pointer to owner superblock descriptor and the redirection flag.
+            If the block has been allocated by \ref alloc, then the redirection flag is 0 and the block's structure is:
+            \code
+                +---------------+
+                | blockHeader   |   [8 byte] pointer to owner superblock (flag=0)
+                +---------------+
+                |               | <- memory allocated
+                |   memory      |
+                |               |
+                +---------------+
+            \endcode
+            If the block has been allocated by \ref alloc_aligned, then it is possible that pointer returned must be aligned.
+            In this case the redirection flag is 1 and the block's structure is:
+            \code
+                +---------------+
+            +-> | blockHeader   |   [8 byte] pointer to owner superblock (flag=0)
+            |   +---------------+
+            |   |   padding     |
+            |   |   (unused)    |
+            |   |               |
+            |   +---------------+
+            +-- | blockHeader   |   [8 byte] pointer to block head (flag=1)
+                +---------------+
+                |               | <- memory allocated
+                |   memory      |
+                |               |
+                +---------------+
+            \endcode
+        */
+        class block_header
+        {
+        //@cond
+            enum {
+                bitAligned = 1,
+                bitOSAllocated = 2
+            };
+
+            union {
+                superblock_desc *   pDesc       ;   // pointer to superblock descriptor
+                atomic32u_t         nSize       ;   // block size (allocated form OS)
+            };
+            atomic32u_t         nFlags;
+
+        public:
+            void  set( superblock_desc * pdesc, atomic32u_t isAligned )
+            {
+                pDesc = pdesc;
+                nFlags = isAligned ? bitAligned : 0;
+            }
+
+            superblock_desc * desc()
+            {
+                assert( (nFlags & bitOSAllocated) == 0 );
+                return (nFlags & bitAligned) ? reinterpret_cast<block_header *>( pDesc )->desc() : pDesc;
+            }
+
+            block_header * begin()
+            {
+                return (nFlags & bitAligned) ? reinterpret_cast<block_header *>(pDesc) : this;
+            }
+
+            bool isAligned() const
+            {
+                return (nFlags & bitAligned) != 0;
+            }
+
+            bool isOSAllocated() const
+            {
+                return (nFlags & bitOSAllocated) != 0;
+            }
+
+            void setOSAllocated( size_t sz )
+            {
+                nSize = sz;
+                nFlags = bitOSAllocated;
+            }
+
+            size_t getOSAllocSize() const
+            {
+                assert( isOSAllocated() );
+                return nSize;
+            }
+
+        //@endcond
+        };
+#elif CDS_BUILD_BITS == 64
+        //@cond
+        class block_header
+        {
+            enum {
+                bitAligned = 1,
+                bitOSAllocated = 2
+            };
+            typedef cds::details::marked_ptr<superblock_desc, bitAligned|bitOSAllocated> marked_desc_ptr;
+            // If bitOSAllocated is set the pDesc contains size of memory block
+            // allocated from OS
+            marked_desc_ptr     pDesc;
+        public:
+            void  set( superblock_desc * pdesc, atomic32u_t isAligned )
+            {
+                pDesc = marked_desc_ptr( pdesc, isAligned );
+            }
+
+            superblock_desc * desc()
+            {
+                assert( !isOSAllocated() );
+                return (pDesc.bits() & bitAligned) ? reinterpret_cast<block_header *>( pDesc.ptr() )->desc() : pDesc.ptr();
+            }
+
+            block_header * begin()
+            {
+                return (pDesc.bits() & bitAligned) ? reinterpret_cast<block_header *>( pDesc.ptr() ) : this;
+            }
+
+            bool isAligned() const
+            {
+                return (pDesc.bits() & bitAligned) != 0;
+            }
+
+            bool isOSAllocated() const
+            {
+                return (pDesc.bits() & bitOSAllocated) != 0;
+            }
+
+            void setOSAllocated( size_t nSize )
+            {
+
+                pDesc = marked_desc_ptr( reinterpret_cast<superblock_desc *>(nSize << 2), bitOSAllocated );
+            }
+
+            size_t getOSAllocSize() const
+            {
+                assert( isOSAllocated() );
+                return reinterpret_cast<uptr_atomic_t>( pDesc.ptr() ) >> 2;
+            }
+
+        };
+        //@endcond
+#else
+#       error "Unexpected value of CDS_BUILD_BITS"
+#endif  // CDS_BUILD_BITS
+
+        //@cond
+        struct free_block_header: block_header {
+            unsigned int    nNextFree;
+        };
+        //@endcond
+
+#if CDS_BUILD_BITS == 32
+        /// Processor heap's \p active field
+        /**
+            The \p active field in the processor heap structure is primarily a pointer to the descriptor
+            of the active superblock owned by the processor heap. If the value of \p active is not \p NULL, it is
+            guaranteed that the active superblock has at least one block available for reservation.
+            Since the addresses of superblock descriptors can be guaranteed to be aligned to some power
+            of 2 (e.g., 64), as an optimization, we can carve a credits subfield to hold the number
+            of blocks available for reservation in the active superblock less one. That is, if the value
+            of credits is n, then the active superblock contains n+1 blocks available for reservation
+            through the \p active field. Note that the number of blocks in a superblock is not limited
+            to the maximum reservations that can be held in the credits subfield. In a typical malloc operation
+            (i.e., when \p active != \p NULL and \p credits > 0), the thread reads \p active and then
+            atomically decrements credits while validating that the active superblock is still valid.
+        */
+        class active_tag {
+        //@cond
+            superblock_desc *       pDesc;
+            atomic32u_t             nCredits;
+
+        public:
+            static const unsigned int c_nMaxCredits = 0 - 1;
+
+        public:
+            CDS_CONSTEXPR active_tag() CDS_NOEXCEPT
+                : pDesc(null_ptr<superblock_desc *>())
+                , nCredits(0)
+            {}
+
+#   ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            active_tag( active_tag const& ) CDS_NOEXCEPT_DEFAULTED = default;
+            ~active_tag() CDS_NOEXCEPT_DEFAULTED = default;
+            active_tag& operator=(active_tag const& ) CDS_NOEXCEPT_DEFAULTED = default;
+#       if defined(CDS_MOVE_SEMANTICS_SUPPORT) && !defined(CDS_DISABLE_DEFAULT_MOVE_CTOR)
+            active_tag( active_tag&& ) CDS_NOEXCEPT_DEFAULTED = default;
+            active_tag& operator=(active_tag&&) CDS_NOEXCEPT_DEFAULTED = default;
+#       endif
+#   endif
+
+            /// Returns pointer to superblock descriptor
+            superblock_desc * ptr() const
+            {
+                return pDesc;
+            }
+
+            /// Sets superblock descriptor
+            void ptr( superblock_desc * p )
+            {
+                pDesc = p;
+            }
+
+            unsigned int credits() const
+            {
+                return nCredits;
+            }
+
+            void credits( unsigned int n )
+            {
+                nCredits = n;
+            }
+
+            void clear()
+            {
+                pDesc = null_ptr<superblock_desc *>();
+                nCredits = 0;
+            }
+
+            void set( superblock_desc * pSB, unsigned int n )
+            {
+                pDesc = pSB;
+                nCredits = n;
+            }
+        //@endcond
+        };
+#elif CDS_BUILD_BITS == 64
+        //@cond
+        class active_tag
+        {
+        public:
+            static const unsigned int c_nMaxCredits = c_nAlignment - 1 ; // 0x003F;
+        protected:
+            typedef cds::details::marked_ptr<superblock_desc, c_nMaxCredits> marked_desc_ptr;
+            marked_desc_ptr pDesc;
+
+        public:
+            active_tag() CDS_NOEXCEPT
+                : pDesc( null_ptr<superblock_desc *>() )
+            {}
+#   ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+            // Clang 3.1: error: first argument to atomic operation must be a pointer to a trivially-copyable type
+            //active_tag() CDS_NOEXCEPT_DEFAULTED = default;
+            active_tag( active_tag const& ) CDS_NOEXCEPT_DEFAULTED = default;
+            ~active_tag() CDS_NOEXCEPT_DEFAULTED = default;
+            active_tag& operator=(active_tag const&) CDS_NOEXCEPT_DEFAULTED = default;
+#       if defined(CDS_MOVE_SEMANTICS_SUPPORT) && !defined(CDS_DISABLE_DEFAULT_MOVE_CTOR)
+            active_tag( active_tag&& ) CDS_NOEXCEPT_DEFAULTED = default;
+            active_tag& operator=(active_tag&&) CDS_NOEXCEPT_DEFAULTED = default;
+#       endif
+#   endif
+            superblock_desc *    ptr() const
+            {
+                return pDesc.ptr();
+            }
+
+            void ptr( superblock_desc * p )
+            {
+                assert( (reinterpret_cast<uptr_atomic_t>(p) & c_nMaxCredits) == 0 );
+                pDesc = marked_desc_ptr( p, pDesc.bits());
+            }
+
+            unsigned int credits()
+            {
+                return (unsigned int) pDesc.bits();
+            }
+
+            void credits( unsigned int n )
+            {
+                assert( n <= c_nMaxCredits );
+                pDesc = marked_desc_ptr( pDesc.ptr(), n );
+            }
+
+            void clear()
+            {
+                pDesc = marked_desc_ptr();
+            }
+
+            void set( superblock_desc * pSB, unsigned int n )
+            {
+                assert( (reinterpret_cast<uptr_atomic_t>(pSB) & c_nMaxCredits) == 0 );
+                pDesc = marked_desc_ptr( pSB, n );
+            }
+
+        };
+        //@endcond
+#else
+#       error "Unexpected value of CDS_BUILD_BITS"
+#endif  // CDS_BUILD_BITS
+
+
+        /// Processor heap
+        struct processor_heap_base
+        {
+            CDS_DATA_ALIGNMENT(8) CDS_ATOMIC::atomic<active_tag> active;   ///< pointer to the descriptor of active superblock owned by processor heap
+            processor_desc *    pProcDesc   ;   ///< pointer to parent processor descriptor
+            const size_class *  pSizeClass  ;   ///< pointer to size class
+            CDS_ATOMIC::atomic<superblock_desc *>   pPartial    ;   ///< pointer to partial filled superblock (may be NULL)
+            partial_list        partialList ;   ///< list of partial filled superblocks owned by the processor heap
+            unsigned int        nPageIdx    ;   ///< page size-class index, \ref c_nPageSelfAllocation - "small page"
+
+            /// Small page marker
+            /**
+                If page is small and can be allocated by the Heap, the \p nPageIdx value is \p c_nPageSelfAllocation.
+                This optimization allows to allocate system memory more regularly, in blocks of 1M that leads
+                to less memory fragmentation.
+            */
+            static const unsigned int c_nPageSelfAllocation = (unsigned int) -1;
+
+            procheap_stat       stat        ;   ///< heap statistics
+            //processor_heap_statistics   stat;
+
+            //@cond
+            processor_heap_base() CDS_NOEXCEPT
+                : pProcDesc( null_ptr<processor_desc *>() )
+                , pSizeClass( null_ptr<size_class *>() )
+                , pPartial( null_ptr<superblock_desc *>() )
+            {
+                assert( (reinterpret_cast<uptr_atomic_t>(this) & (c_nAlignment - 1)) == 0 );
+            }
+            //@endcond
+
+            /// Get partial superblock owned by the processor heap
+            superblock_desc * get_partial()
+            {
+                superblock_desc * pDesc = pPartial.load(CDS_ATOMIC::memory_order_acquire);
+                do {
+                    if ( !pDesc ) {
+                        pDesc =  partialList.pop();
+                        break;
+                    }
+                } while ( !pPartial.compare_exchange_weak( pDesc, null_ptr<superblock_desc *>(), CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed));
+
+                //assert( pDesc == NULL || free_desc_list<superblock_desc>::node_algorithms::inited( static_cast<sb_free_list_hook *>(pDesc) ));
+                //assert( pDesc == NULL || partial_desc_list<superblock_desc>::node_algorithms::inited( static_cast<sb_partial_list_hook *>(pDesc) ) );
+                return pDesc;
+            }
+
+            /// Add partial superblock \p pDesc to the list
+            void add_partial( superblock_desc * pDesc )
+            {
+                assert( pPartial != pDesc );
+                //assert( partial_desc_list<superblock_desc>::node_algorithms::inited( static_cast<sb_partial_list_hook *>(pDesc) ) );
+
+                superblock_desc * pCur = null_ptr<superblock_desc *>();
+                if ( !pPartial.compare_exchange_strong(pCur, pDesc, CDS_ATOMIC::memory_order_acq_rel, CDS_ATOMIC::memory_order_relaxed) )
+                    partialList.push( pDesc );
+            }
+
+
+            /// Remove superblock \p pDesc from the list of partial superblock
+            bool unlink_partial( superblock_desc * pDesc )
+            {
+                return partialList.unlink( pDesc );
+            }
+        };
+
+        /// Aligned superblock descriptor
+        typedef typename cds::details::type_padding<processor_heap_base, c_nAlignment>::type processor_heap;
+
+        /// Processor descriptor
+        struct processor_desc
+        {
+            processor_heap *    arrProcHeap     ; ///< array of processor heap
+            free_list           listSBDescFree  ; ///< List of free superblock descriptors
+            page_heap *         pageHeaps       ; ///< array of page heap (one for each page size)
+
+            //@cond
+            processor_desc()
+                : arrProcHeap( null_ptr<processor_heap *>() )
+                , pageHeaps( null_ptr<page_heap *>() )
+            {}
+            //@endcond
+        };
+
+
+    protected:
+        sys_topology        m_Topology           ;  ///< System topology
+        system_heap         m_LargeHeap          ;  ///< Heap for large block
+        aligned_heap        m_AlignedHeap        ;  ///< Internal aligned heap
+        sizeclass_selector  m_SizeClassSelector  ;  ///< Size-class selector
+        CDS_ATOMIC::atomic<processor_desc *> *   m_arrProcDesc  ;  ///< array of pointers to the processor descriptors
+        unsigned int        m_nProcessorCount    ;  ///< Processor count
+        bound_checker       m_BoundChecker       ;  ///< Bound checker
+
+        os_allocated_stat   m_OSAllocStat        ;  ///< OS-allocated memory statistics
+
+    protected:
+        //@cond
+
+        /// Allocates large block from system memory
+        block_header * alloc_from_OS( size_t nSize )
+        {
+            block_header * p = reinterpret_cast<block_header *>( m_LargeHeap.alloc( nSize ) );
+            m_OSAllocStat.incBytesAllocated( nSize );
+            p->setOSAllocated( nSize );
+            return p;
+        }
+
+        /// Allocates from the active superblock if it possible
+        block_header * alloc_from_active( processor_heap * pProcHeap )
+        {
+            active_tag  oldActive;
+            int nCollision = -1;
+
+            // Reserve block
+            while ( true ) {
+                ++nCollision;
+                oldActive = pProcHeap->active.load(CDS_ATOMIC::memory_order_acquire);
+                if ( !oldActive.ptr() )
+                    return null_ptr<block_header *>();
+                unsigned int nCredits = oldActive.credits();
+                active_tag  newActive   ; // default = 0
+                if ( nCredits != 0 ) {
+                    newActive = oldActive;
+                    newActive.credits( nCredits - 1 );
+                }
+                if ( pProcHeap->active.compare_exchange_strong( oldActive, newActive, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                    break;
+            }
+
+            if ( nCollision )
+                pProcHeap->stat.incActiveDescCASFailureCount( nCollision );
+
+            // pop block
+            superblock_desc * pDesc = oldActive.ptr();
+
+            anchor_tag  oldAnchor;
+            anchor_tag  newAnchor;
+            byte * pAddr;
+            unsigned int nMoreCredits = 0;
+
+            nCollision = -1;
+            do {
+                ++nCollision;
+                newAnchor = oldAnchor = pDesc->anchor.load(CDS_ATOMIC::memory_order_acquire);
+
+                assert( oldAnchor.avail < pDesc->nCapacity );
+                pAddr = pDesc->pSB + oldAnchor.avail * (unsigned long long) pDesc->nBlockSize;
+                newAnchor.avail = reinterpret_cast<free_block_header *>( pAddr )->nNextFree;
+                newAnchor.tag += 1;
+
+                if ( oldActive.credits() == 0 ) {
+                    // state must be ACTIVE
+                    if ( oldAnchor.count == 0 )
+                        newAnchor.state = SBSTATE_FULL;
+                    else {
+                        nMoreCredits = oldAnchor.count < active_tag::c_nMaxCredits ? ((unsigned int) oldAnchor.count) : active_tag::c_nMaxCredits;
+                        newAnchor.count -= nMoreCredits;
+                    }
+                }
+            } while ( !pDesc->anchor.compare_exchange_strong( oldAnchor, newAnchor, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+
+            if ( nCollision )
+                pProcHeap->stat.incActiveAnchorCASFailureCount( nCollision );
+
+            assert( newAnchor.state != SBSTATE_EMPTY );
+
+            if ( newAnchor.state == SBSTATE_FULL )
+                pProcHeap->stat.incDescFull();
+            if ( oldActive.credits() == 0 && oldAnchor.count > 0 )
+                update_active( pProcHeap, pDesc, nMoreCredits );
+
+            pProcHeap->stat.incAllocFromActive();
+
+            // block_header fields is not needed to setup
+            // It was set in alloc_from_new_superblock
+            assert( reinterpret_cast<block_header *>( pAddr )->desc() == pDesc );
+            assert( !reinterpret_cast<block_header *>( pAddr )->isOSAllocated() );
+            assert( !reinterpret_cast<block_header *>( pAddr )->isAligned() );
+
+            return reinterpret_cast<block_header *>( pAddr );
+        }
+
+        /// Allocates from a partial filled superblock if it possible
+        block_header * alloc_from_partial( processor_heap * pProcHeap )
+        {
+        retry:
+            superblock_desc * pDesc = pProcHeap->get_partial();
+            if ( !pDesc )
+                return null_ptr<block_header *>();
+
+            // reserve blocks
+            anchor_tag  oldAnchor;
+            anchor_tag  newAnchor;
+            //byte * pAddr;
+            unsigned int nMoreCredits = 0;
+
+            int nCollision = -1;
+            do {
+                ++nCollision;
+
+                newAnchor = oldAnchor = pDesc->anchor.load(CDS_ATOMIC::memory_order_acquire);
+                if ( oldAnchor.state == SBSTATE_EMPTY ) {
+                    free_superblock( pDesc );
+                    goto retry;
+                }
+
+                nMoreCredits = ((unsigned int)(oldAnchor.count - 1)) < active_tag::c_nMaxCredits ? (unsigned int)(oldAnchor.count - 1) : active_tag::c_nMaxCredits;
+                newAnchor.count -= nMoreCredits + 1;
+                newAnchor.state = (nMoreCredits > 0) ? SBSTATE_ACTIVE : SBSTATE_FULL;
+                newAnchor.tag += 1;
+            } while ( !pDesc->anchor.compare_exchange_strong(oldAnchor, newAnchor, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed) );
+
+            if ( nCollision )
+                pProcHeap->stat.incPartialDescCASFailureCount( nCollision );
+
+            if ( newAnchor.state == SBSTATE_FULL )
+                pProcHeap->stat.incDescFull();
+
+            // Now, the thread is guaranteed to have reserved one or more blocks
+            // pop reserved block
+            byte * pAddr;
+            nCollision = -1;
+            do {
+                ++nCollision;
+
+                newAnchor = oldAnchor = pDesc->anchor.load(CDS_ATOMIC::memory_order_acquire);
+
+                assert( oldAnchor.avail < pDesc->nCapacity );
+                pAddr = pDesc->pSB + oldAnchor.avail * pDesc->nBlockSize;
+                newAnchor.avail = reinterpret_cast<free_block_header *>( pAddr )->nNextFree;
+                ++newAnchor.tag;
+            } while ( !pDesc->anchor.compare_exchange_strong(oldAnchor, newAnchor, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed) );
+
+            if ( nCollision )
+                pProcHeap->stat.incPartialAnchorCASFailureCount( nCollision );
+
+            assert( newAnchor.state != SBSTATE_EMPTY );
+
+            pProcHeap->stat.incAllocFromPartial();
+
+            if ( nMoreCredits > 0 )
+                update_active( pProcHeap, pDesc, nMoreCredits );
+
+            // block_header fields is not needed to setup
+            // It was set in alloc_from_new_superblock
+            assert( reinterpret_cast<block_header *>( pAddr )->desc() == pDesc );
+            assert( !reinterpret_cast<block_header *>( pAddr )->isAligned() );
+            assert( !reinterpret_cast<block_header *>( pAddr )->isOSAllocated() );
+
+            return reinterpret_cast<block_header *>( pAddr );
+        }
+
+        /// Allocates from the new superblock
+        block_header * alloc_from_new_superblock( processor_heap * pProcHeap )
+        {
+            superblock_desc * pDesc = new_superblock_desc( pProcHeap );
+            assert( pDesc != null_ptr<superblock_desc *>() );
+            pDesc->pSB = new_superblock_buffer( pProcHeap );
+
+            anchor_tag anchor = pDesc->anchor.load(CDS_ATOMIC::memory_order_relaxed);
+            anchor.tag += 1;
+
+            // Make single-linked list of free blocks in superblock
+            byte * pEnd = pDesc->pSB + pDesc->nCapacity * pDesc->nBlockSize;
+            unsigned int nNext = 0;
+            const unsigned int nBlockSize = pDesc->nBlockSize;
+            for ( byte * p = pDesc->pSB; p < pEnd; p += nBlockSize ) {
+                reinterpret_cast<block_header *>( p )->set( pDesc, 0 );
+                reinterpret_cast<free_block_header *>( p )->nNextFree = ++nNext;
+            }
+            reinterpret_cast<free_block_header *>( pEnd - nBlockSize )->nNextFree = 0;
+
+            active_tag newActive;
+            newActive.set( pDesc, ( (pDesc->nCapacity - 1 < active_tag::c_nMaxCredits) ? pDesc->nCapacity - 1 : active_tag::c_nMaxCredits ) - 1 );
+
+            anchor.count = pDesc->nCapacity - 1 - (newActive.credits() + 1);
+            anchor.state = SBSTATE_ACTIVE;
+            pDesc->anchor.store(anchor, CDS_ATOMIC::memory_order_relaxed);
+
+            active_tag curActive;
+            if ( pProcHeap->active.compare_exchange_strong( curActive, newActive, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed )) {
+                pProcHeap->stat.incAllocFromNew();
+                //reinterpret_cast<block_header *>( pDesc->pSB )->set( pDesc, 0 );
+                return reinterpret_cast<block_header *>( pDesc->pSB );
+            }
+
+            free_superblock( pDesc );
+            return null_ptr<block_header *>();
+        }
+
+        /// Find appropriate processor heap based on size-class selected
+        processor_heap * find_heap( typename sizeclass_selector::sizeclass_index nSizeClassIndex )
+        {
+            assert( nSizeClassIndex < m_SizeClassSelector.size() );
+
+            unsigned int nProcessorId = m_Topology.current_processor();
+            assert( nProcessorId < m_nProcessorCount );
+
+            if ( nProcessorId >= m_nProcessorCount )
+                nProcessorId = 0;
+
+            processor_desc * pDesc = m_arrProcDesc[ nProcessorId ].load( CDS_ATOMIC::memory_order_relaxed );
+            while ( !pDesc ) {
+
+                processor_desc * pNewDesc = new_processor_desc( nProcessorId );
+                if ( m_arrProcDesc[nProcessorId].compare_exchange_strong( pDesc, pNewDesc, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) ) {
+                    pDesc = pNewDesc;
+                    break;
+                }
+                free_processor_desc( pNewDesc );
+            }
+
+            return &( pDesc->arrProcHeap[ nSizeClassIndex ] );
+        }
+
+        /// Updates active field of processor heap \p pProcHeap
+        void update_active( processor_heap * pProcHeap, superblock_desc * pDesc, unsigned int nCredits )
+        {
+            assert( pProcHeap == pDesc->pProcHeap );
+
+            active_tag  nullActive;
+            active_tag  newActive;
+            newActive.set( pDesc, nCredits - 1 );
+
+            if ( pProcHeap->active.compare_exchange_strong( nullActive, newActive, CDS_ATOMIC::memory_order_seq_cst, CDS_ATOMIC::memory_order_relaxed ) )
+                return;
+
+            // Someone installed another active superblock.
+            // Return credits to superblock and make it partial
+
+            anchor_tag  oldAnchor;
+            anchor_tag  newAnchor;
+
+            do {
+                newAnchor = oldAnchor = pDesc->anchor.load(CDS_ATOMIC::memory_order_acquire);
+                newAnchor.count += nCredits;
+                newAnchor.state = SBSTATE_PARTIAL;
+            } while ( !pDesc->anchor.compare_exchange_weak( oldAnchor, newAnchor, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+
+            pDesc->pProcHeap->add_partial( pDesc );
+        }
+
+        /// Allocates new processor descriptor
+        processor_desc * new_processor_desc( unsigned int nProcessorId )
+        {
+            processor_desc * pDesc;
+            const size_t nPageHeapCount = m_SizeClassSelector.pageTypeCount();
+
+            /*
+                Processor descriptor layout
+
+                proc_desc -  64-byte alignment
+                page_heap[0] 64-byte alignment
+                page_heap[1] 64-byte alignment
+                ...
+                page_heap[P] 64-byte alignment
+
+                proc_heap[0] 64-byte alignment
+                proc_heap[1] 64-byte alignment
+                ...
+                proc_heap[N] 64-byte alignment
+            */
+
+            const size_t szDesc =
+                ( sizeof(processor_desc)
+                    + sizeof(pDesc->pageHeaps[0]) * nPageHeapCount
+                    + c_nAlignment - 1
+                ) / c_nAlignment
+;
+
+            const size_t szTotal = szDesc * c_nAlignment + sizeof(processor_heap) * m_SizeClassSelector.size();
+
+            static_assert( (sizeof(processor_heap) % c_nAlignment) == 0, "sizeof(processor_heap) error" );
+
+            pDesc = new( m_AlignedHeap.alloc( szTotal, c_nAlignment ) ) processor_desc;
+
+            pDesc->pageHeaps = reinterpret_cast<page_heap *>( pDesc + 1 );
+            for ( size_t i = 0; i < nPageHeapCount; ++i )
+                new (pDesc->pageHeaps + i) page_heap( m_SizeClassSelector.page_size(i));
+
+            // initialize processor heaps
+            pDesc->arrProcHeap =
+                reinterpret_cast<processor_heap *>(
+                    reinterpret_cast<uptr_atomic_t>(reinterpret_cast<byte *>(pDesc + 1) + sizeof(pDesc->pageHeaps[0]) * nPageHeapCount + c_nAlignment - 1)
+                    & ~(uptr_atomic_t(c_nAlignment) - 1)
+                );
+
+            processor_heap * pProcHeap = pDesc->arrProcHeap;
+            processor_heap * pProcHeapEnd = pDesc->arrProcHeap + m_SizeClassSelector.size();
+            for ( unsigned int i = 0; pProcHeap != pProcHeapEnd; ++pProcHeap, ++i ) {
+                new (pProcHeap) processor_heap();
+                pProcHeap->pProcDesc = pDesc;
+                pProcHeap->pSizeClass = m_SizeClassSelector.at(i);
+                if ( m_SizeClassSelector.find( pProcHeap->pSizeClass->nSBSize ) != sizeclass_selector::c_nNoSizeClass )
+                    pProcHeap->nPageIdx = processor_heap::c_nPageSelfAllocation;
+                else
+                    pProcHeap->nPageIdx = pProcHeap->pSizeClass->nSBSizeIdx;
+            }
+            return pDesc;
+        }
+
+
+        void free_processor_heap( processor_heap * pProcHeap )
+        {
+            if ( pProcHeap->nPageIdx == processor_heap::c_nPageSelfAllocation ) {
+                superblock_desc * pDesc;
+
+                for ( pDesc = pProcHeap->partialList.pop(); pDesc; pDesc = pProcHeap->partialList.pop()) {
+                    free( pDesc->pSB );
+                    m_AlignedHeap.free( pDesc );
+                }
+
+                superblock_desc * pPartial = pProcHeap->pPartial.load(CDS_ATOMIC::memory_order_relaxed);
+                if ( pPartial ) {
+                    free( pPartial->pSB );
+                    m_AlignedHeap.free( pPartial );
+                }
+
+                pDesc = pProcHeap->active.load(CDS_ATOMIC::memory_order_relaxed).ptr();
+                if ( pDesc ) {
+                    free( pDesc->pSB );
+                    m_AlignedHeap.free( pDesc );
+                }
+            }
+            else {
+                page_heap& pageHeap = pProcHeap->pProcDesc->pageHeaps[pProcHeap->nPageIdx];
+                superblock_desc * pDesc;
+
+                for ( pDesc = pProcHeap->partialList.pop(); pDesc; pDesc = pProcHeap->partialList.pop()) {
+                    pageHeap.free( pDesc->pSB );
+                    m_AlignedHeap.free( pDesc );
+                }
+
+                superblock_desc * pPartial = pProcHeap->pPartial.load(CDS_ATOMIC::memory_order_relaxed);
+                if ( pPartial ) {
+                    pageHeap.free( pPartial->pSB );
+                    m_AlignedHeap.free( pPartial );
+                }
+
+                pDesc = pProcHeap->active.load(CDS_ATOMIC::memory_order_relaxed).ptr();
+                if ( pDesc ) {
+                    pageHeap.free( pDesc->pSB );
+                    m_AlignedHeap.free( pDesc );
+                }
+            }
+            pProcHeap->~processor_heap();
+        }
+
+        /// Frees processor descriptor
+        void free_processor_desc( processor_desc * pDesc )
+        {
+            const size_t nPageHeapCount = m_SizeClassSelector.pageTypeCount();
+
+            for (unsigned int j = 0; j < m_SizeClassSelector.size(); ++j )
+                free_processor_heap( pDesc->arrProcHeap + j );
+
+            for ( superblock_desc * pSBDesc = pDesc->listSBDescFree.pop(); pSBDesc; pSBDesc = pDesc->listSBDescFree.pop())
+                m_AlignedHeap.free( pSBDesc );
+
+            for (size_t i = 0; i < nPageHeapCount; ++i )
+                (pDesc->pageHeaps + i)->page_heap::~page_heap();
+
+            //m_IntHeap.free( pDesc->pageHeaps );
+            pDesc->pageHeaps = null_ptr<page_heap *>();
+
+            pDesc->processor_desc::~processor_desc();
+            m_AlignedHeap.free( pDesc );
+        }
+
+        /// Allocates new superblock descriptor
+        superblock_desc * new_superblock_desc( processor_heap * pProcHeap )
+        {
+            anchor_tag anchor;
+            superblock_desc * pDesc = pProcHeap->pProcDesc->listSBDescFree.pop();
+            if ( pDesc == null_ptr<superblock_desc *>() ) {
+                pDesc = new( m_AlignedHeap.alloc(sizeof(superblock_desc), c_nAlignment ) ) superblock_desc;
+                assert( (uptr_atomic_t(pDesc) & (c_nAlignment - 1)) == 0 );
+
+                anchor = pDesc->anchor.load( CDS_ATOMIC::memory_order_relaxed );
+                anchor.tag = 0;
+                pDesc->anchor.store( anchor, CDS_ATOMIC::memory_order_relaxed );
+
+                pProcHeap->stat.incDescAllocCount();
+            }
+            pDesc->nBlockSize = pProcHeap->pSizeClass->nBlockSize;
+            pDesc->nCapacity = pProcHeap->pSizeClass->nCapacity;
+            assert( pDesc->nCapacity <= c_nMaxBlockInSuperBlock );
+            pDesc->pProcHeap = pProcHeap;
+
+            anchor = pDesc->anchor.load( CDS_ATOMIC::memory_order_relaxed );
+            anchor.avail = 1;
+            pDesc->anchor.store( anchor, CDS_ATOMIC::memory_order_relaxed );
+
+            return pDesc;
+        }
+
+        /// Allocates superblock page
+        byte * new_superblock_buffer( processor_heap * pProcHeap )
+        {
+            pProcHeap->stat.incBlockAllocated();
+            if ( pProcHeap->nPageIdx == processor_heap::c_nPageSelfAllocation ) {
+                return (byte *) alloc( pProcHeap->pSizeClass->nSBSize );
+            }
+            else {
+                return (byte *) pProcHeap->pProcDesc->pageHeaps[pProcHeap->nPageIdx].alloc();
+            }
+        }
+
+        /// Frees superblock descriptor and its page
+        void free_superblock( superblock_desc * pDesc )
+        {
+            pDesc->pProcHeap->stat.incBlockDeallocated();
+            processor_desc * pProcDesc = pDesc->pProcHeap->pProcDesc;
+            if ( pDesc->pSB ) {
+                if ( pDesc->pProcHeap->nPageIdx == processor_heap::c_nPageSelfAllocation ) {
+                    free( pDesc->pSB );
+                }
+                else {
+                    pProcDesc->pageHeaps[pDesc->pProcHeap->nPageIdx].free( pDesc->pSB );
+                }
+            }
+            pProcDesc->listSBDescFree.push( pDesc );
+        }
+
+        /// Allocate memory block
+        block_header * int_alloc(
+            size_t nSize    ///< Size of memory block to allocate in bytes
+            )
+        {
+            typename sizeclass_selector::sizeclass_index nSizeClassIndex = m_SizeClassSelector.find( nSize );
+            if ( nSizeClassIndex == sizeclass_selector::c_nNoSizeClass ) {
+                return alloc_from_OS( nSize );
+            }
+            assert( nSizeClassIndex < m_SizeClassSelector.size() );
+
+            block_header * pBlock;
+            processor_heap * pProcHeap;
+            while ( true ) {
+                pProcHeap = find_heap( nSizeClassIndex );
+                if ( !pProcHeap )
+                    return alloc_from_OS( nSize );
+
+                if ( (pBlock = alloc_from_active( pProcHeap )) != null_ptr<block_header *>() )
+                    break;
+                if ( (pBlock = alloc_from_partial( pProcHeap )) != null_ptr<block_header *>() )
+                    break;
+                if ( (pBlock = alloc_from_new_superblock( pProcHeap )) != null_ptr<block_header *>() )
+                    break;
+            }
+
+            pProcHeap->stat.incAllocatedBytes( pProcHeap->pSizeClass->nBlockSize );
+
+            assert( pBlock != null_ptr<block_header *>() );
+            return pBlock;
+        }
+
+        //@endcond
+    public:
+        /// Heap constructor
+        Heap()
+        {
+            // Explicit libcds initialization is needed since a static object may be constructed
+            cds::Initialize();
+
+            m_nProcessorCount = m_Topology.processor_count();
+            m_arrProcDesc = new( m_AlignedHeap.alloc(sizeof(processor_desc *) * m_nProcessorCount, c_nAlignment ))
+                CDS_ATOMIC::atomic<processor_desc *>[ m_nProcessorCount ];
+            memset( m_arrProcDesc, 0, sizeof(processor_desc *) * m_nProcessorCount )    ;   // ?? memset for atomic<>
+        }
+
+        /// Heap destructor
+        /**
+            The destructor frees all memory allocated by the heap.
+        */
+        ~Heap()
+        {
+            for ( unsigned int i = 0; i < m_nProcessorCount; ++i ) {
+                processor_desc * pDesc = m_arrProcDesc[i].load(CDS_ATOMIC::memory_order_relaxed);
+                if ( pDesc )
+                    free_processor_desc( pDesc );
+            }
+
+            m_AlignedHeap.free( m_arrProcDesc );
+
+            // Explicit termination of libcds
+            cds::Terminate();
+        }
+
+        /// Allocate memory block
+        void * alloc(
+            size_t nSize    ///< Size of memory block to allocate in bytes
+        )
+        {
+            block_header * pBlock = int_alloc( nSize + sizeof(block_header) + bound_checker::trailer_size );
+
+            // Bound checking is only for our blocks
+            if ( !pBlock->isOSAllocated() ) {
+                // the block is allocated from our heap - bound checker is applicable
+                m_BoundChecker.make_trailer(
+                    reinterpret_cast<byte *>(pBlock + 1),
+                    reinterpret_cast<byte *>(pBlock) + pBlock->desc()->nBlockSize,
+                    nSize
+                );
+            }
+
+            return pBlock + 1;
+        }
+
+        /// Free previously allocated memory block
+        void free(
+            void * pMemory  ///< Pointer to memory block to free
+        )
+        {
+            if ( !pMemory )
+                return;
+
+            block_header * pRedirect = (reinterpret_cast<block_header *>( pMemory ) - 1);
+            block_header * pBlock = pRedirect->begin();
+
+            if ( pBlock->isOSAllocated() ) {
+                // Block has been allocated from OS
+                m_OSAllocStat.incBytesDeallocated( pBlock->getOSAllocSize() );
+                m_LargeHeap.free( pBlock );
+                return;
+            }
+
+            assert( !pBlock->isAligned() );
+            superblock_desc * pDesc = pBlock->desc();
+
+            m_BoundChecker.check_bounds(
+                pRedirect + 1,
+                reinterpret_cast<byte *>( pBlock ) + pDesc->nBlockSize,
+                pDesc->nBlockSize
+            );
+
+
+            anchor_tag oldAnchor;
+            anchor_tag newAnchor;
+            processor_heap_base * pProcHeap = pDesc->pProcHeap;
+
+            pProcHeap->stat.incDeallocatedBytes( pDesc->nBlockSize );
+
+            oldAnchor = pDesc->anchor.load(CDS_ATOMIC::memory_order_acquire);
+            do {
+                newAnchor = oldAnchor;
+                reinterpret_cast<free_block_header *>( pBlock )->nNextFree = oldAnchor.avail;
+                newAnchor.avail = (reinterpret_cast<byte *>( pBlock ) - pDesc->pSB) / pDesc->nBlockSize;
+                newAnchor.tag += 1;
+
+                assert( oldAnchor.state != SBSTATE_EMPTY );
+
+                if ( oldAnchor.state == SBSTATE_FULL )
+                    newAnchor.state = SBSTATE_PARTIAL;
+
+                if ( oldAnchor.count == pDesc->nCapacity - 1 ) {
+                    //pProcHeap = pDesc->pProcHeap;
+                    //CDS_COMPILER_RW_BARRIER         ;   // instruction fence is needed?..
+                    newAnchor.state = SBSTATE_EMPTY;
+                }
+                else
+                    newAnchor.count += 1;
+            } while ( !pDesc->anchor.compare_exchange_strong( oldAnchor, newAnchor, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ) );
+
+            pProcHeap->stat.incFreeCount();
+
+            if ( newAnchor.state == SBSTATE_EMPTY ) {
+                if ( pProcHeap->unlink_partial( pDesc ))
+                    free_superblock( pDesc );
+            }
+            else if (oldAnchor.state == SBSTATE_FULL ) {
+                assert( pProcHeap != null_ptr<processor_heap_base *>() );
+                pProcHeap->stat.decDescFull();
+                pProcHeap->add_partial( pDesc );
+            }
+        }
+
+        /// Reallocate memory block
+        /**
+            If \p nNewSize is zero, then the block pointed to by \p pMemory is freed;
+            the return value is \p NULL, and \p pMemory is left pointing at a freed block.
+
+            If there is not enough available memory to expand the block to the given size,
+            the original block is left unchanged, and \p NULL is returned.
+
+            Aligned memory block cannot be realloc'ed: if \p pMemory has been allocated by \ref alloc_aligned,
+            then the return value is \p NULL and the original block is left unchanged.
+        */
+        void * realloc(
+            void *  pMemory,    ///< Pointer to previously allocated memory block
+            size_t  nNewSize    ///< New size of memory block, in bytes
+        )
+        {
+            if ( nNewSize == 0 ) {
+                free( pMemory );
+                return null_ptr<void *>();
+            }
+
+            const size_t nOrigSize = nNewSize;
+            nNewSize += sizeof(block_header) + bound_checker::trailer_size;
+
+            block_header * pBlock = reinterpret_cast<block_header *>( pMemory ) - 1;
+
+            // Reallocation of aligned block is not possible
+            if ( pBlock->isAligned() ) {
+                assert( false );
+                return null_ptr<void *>();
+            }
+
+            if ( pBlock->isOSAllocated() ) {
+                // The block has been allocated from OS
+                size_t nCurSize = pBlock->getOSAllocSize();
+
+                if ( nCurSize >= nNewSize )
+                    return pMemory;
+
+                // Grow block size
+                void * pNewBuf = alloc( nOrigSize );
+                if ( pNewBuf ) {
+                    memcpy( pNewBuf, pMemory, nCurSize - sizeof(block_header) );
+                    free( pMemory );
+                }
+                return pNewBuf;
+            }
+
+            superblock_desc * pDesc = pBlock->desc();
+            if ( pDesc->nBlockSize <= nNewSize ) {
+                // In-place reallocation
+                m_BoundChecker.make_trailer(
+                    reinterpret_cast<byte *>(pBlock + 1),
+                    reinterpret_cast<byte *>(pBlock) + pBlock->desc()->nBlockSize,
+                    nOrigSize
+                    );
+
+                return pMemory;
+            }
+
+            void * pNew = alloc( nNewSize );
+            if ( pNew ) {
+                memcpy( pNew, pMemory, pDesc->nBlockSize - sizeof(block_header) );
+                free( pMemory );
+                return pNew;
+            }
+
+            return null_ptr<void *>();
+        }
+
+        /// Allocate aligned memory block
+        void * alloc_aligned(
+            size_t nSize,       ///< Size of memory block to allocate in bytes
+            size_t nAlignment   ///< Alignment
+        )
+        {
+            if ( nAlignment <= c_nDefaultBlockAlignment ) {
+                void * p = alloc( nSize );
+                assert( (reinterpret_cast<uptr_atomic_t>(p) & (nAlignment - 1)) == 0 );
+                return p;
+            }
+
+            block_header * pBlock = int_alloc( nSize + nAlignment + sizeof(block_header) + bound_checker::trailer_size );
+
+            block_header * pRedirect;
+            if ( (reinterpret_cast<uptr_atomic_t>( pBlock + 1) & (nAlignment - 1)) != 0 ) {
+                pRedirect = reinterpret_cast<block_header *>( (reinterpret_cast<uptr_atomic_t>( pBlock ) & ~(nAlignment - 1)) + nAlignment ) - 1;
+                assert( pRedirect != pBlock );
+                pRedirect->set( reinterpret_cast<superblock_desc *>(pBlock), 1 );
+
+                assert( (reinterpret_cast<uptr_atomic_t>(pRedirect + 1) & (nAlignment - 1)) == 0 );
+            }
+            else
+                pRedirect = pBlock;
+
+
+            // Bound checking is only for our blocks
+            if ( !pBlock->isOSAllocated() ) {
+                // the block is allocated from our heap - bound checker is applicable
+                m_BoundChecker.make_trailer(
+                    reinterpret_cast<byte *>(pRedirect + 1),
+                    reinterpret_cast<byte *>(pBlock) + pBlock->desc()->nBlockSize,
+                    nSize
+                );
+            }
+
+            return pRedirect + 1;
+        }
+
+        /// Free aligned memory block previously allocated by \ref alloc_aligned
+        void free_aligned(
+            void * pMemory      ///< Pointer to memory block to free
+        )
+        {
+            free( pMemory );
+        }
+
+    public:
+
+        /// Get instant summary statistics
+        void summaryStat( summary_stat& st )
+        {
+            size_t nProcHeapCount = m_SizeClassSelector.size();
+            for ( unsigned int nProcessor = 0; nProcessor < m_nProcessorCount; ++nProcessor ) {
+                processor_desc * pProcDesc = m_arrProcDesc[nProcessor].load(CDS_ATOMIC::memory_order_relaxed);
+                if ( pProcDesc ) {
+                    for ( unsigned int i = 0; i < nProcHeapCount; ++i ) {
+                        processor_heap_base * pProcHeap = pProcDesc->arrProcHeap + i;
+                        if ( pProcHeap ) {
+                            st.add_procheap_stat( pProcHeap->stat );
+                        }
+                    }
+                }
+            }
+
+            st.add_heap_stat( m_OSAllocStat );
+        }
+    };
+
+}}} // namespace cds::memory::michael
+
+#endif // __CDS_MEMORY_MICHAEL_ALLOCATOR_TMPL_H
diff --git a/cds/memory/michael/bound_check.h b/cds/memory/michael/bound_check.h
new file mode 100644 (file)
index 0000000..46f9f9d
--- /dev/null
@@ -0,0 +1,153 @@
+//$$CDS-header$$
+
+#ifndef __CDS_MEMORY_MICHAEL_ALLOCATOR_BOUND_CHECK_H
+#define __CDS_MEMORY_MICHAEL_ALLOCATOR_BOUND_CHECK_H
+
+#include <cds/opt/options.h>
+#include <exception>
+#include <memory.h>
+
+namespace cds { namespace memory { namespace michael {
+
+    //@cond
+    namespace details {
+        class bound_checker
+        {
+        protected:
+            typedef atomic64u_t trailer_type;
+            static const trailer_type s_BoundCheckerTrailer = 0xbadcafeedeadc0feULL;
+
+        public:
+            enum {
+                trailer_size = sizeof(trailer_type) + sizeof(size_t)
+            };
+
+            void make_trailer( void * pStartArea, void * pEndBlock, size_t nAllocSize )
+            {
+                char * pArea = reinterpret_cast<char *>(pStartArea);
+                assert( reinterpret_cast<char *>(pEndBlock) - (pArea + nAllocSize) >= trailer_size );
+
+                trailer_type trailer = s_BoundCheckerTrailer;
+                memcpy( pArea + nAllocSize, &trailer, sizeof(trailer) );
+
+                // the next assignment is correct because pBlock is at least sizeof(size_t)-byte aligned
+                assert( (reinterpret_cast<uptr_atomic_t>(pEndBlock) & (sizeof(size_t) - 1)) == 0 );
+                *(reinterpret_cast<size_t *>( pEndBlock ) - 1) = nAllocSize;
+            }
+
+            bool check_bounds( void * pStartArea, void * pEndBlock, size_t nBlockSize )
+            {
+                trailer_type trailer = s_BoundCheckerTrailer;
+                size_t nAllocSize = *(reinterpret_cast<size_t *>( pEndBlock ) - 1);
+
+                assert( nAllocSize < nBlockSize );
+                return nAllocSize < nBlockSize
+                    && memcmp( reinterpret_cast<char *>(pStartArea) + nAllocSize, &trailer, sizeof(trailer) ) == 0;
+            }
+        };
+    }
+    //@endcond
+
+#if defined(CDS_DOXYGEN_INVOKED) || defined(_DEBUG)
+    /// Debug bound checker
+    /**
+        This is one of value of opt::check_bounds option for Michael's \ref Heap memory allocator.
+        It is intended for debug mode only. It throws an assertion when memory bound violation is detected.
+        In release mode it is equal to <tt>opt::check_bounds<cds::opt::none> </tt>.
+    */
+    class debug_bound_checking: public details::bound_checker
+    {
+    //@cond
+        typedef details::bound_checker  base_class;
+    public:
+        void check_bounds( void * pStartArea, void * pEndBlock, size_t nBlockSize )
+        {
+            // Bound checking assertion
+            assert( base_class::check_bounds( pStartArea, pEndBlock, nBlockSize ) );
+        }
+
+    //@endcond
+    };
+#else
+    typedef cds::opt::none  debug_bound_checking;
+#endif
+
+    /// %Exception of \ref strong_bound_checking bound checker
+    class bound_checker_exception: public std::exception
+    {
+    //@cond
+    public:
+        virtual const char * what() const throw()
+        {
+            return "Memory bound checking violation";
+        }
+    //@endcond
+    };
+
+    /// %Exception throwing bound checker
+    /**
+        This is one of value of opt::check_bounds option for Michael's \ref Heap memory allocator.
+        It is intended for debug and release mode.
+        When memory bound violation is detected
+            \li In debug mode - an assertion is raised
+            \li In release mode  - an exception of type \ref bound_checker_exception is thrown
+    */
+    class strong_bound_checking: public details::bound_checker
+    {
+    //@cond
+        typedef details::bound_checker  base_class;
+    public:
+        void check_bounds( void * pStartArea, void * pEndBlock, size_t nBlockSize )
+        {
+            if ( !base_class::check_bounds( pStartArea, pEndBlock, nBlockSize ) ) {
+                throw bound_checker_exception();
+            }
+        }
+
+    //@endcond
+    };
+
+
+    //@cond
+    namespace details {
+        template <typename BOUND_CHECKER>
+        class bound_checker_selector: public BOUND_CHECKER
+        {
+            typedef BOUND_CHECKER base_class;
+        public:
+            enum {
+                trailer_size = base_class::trailer_size
+            };
+
+            void make_trailer( void * pStartArea, void * pEndBlock, size_t nAllocSize )
+            {
+                base_class::make_trailer( pStartArea, pEndBlock, nAllocSize );
+            }
+
+            void check_bounds( void * pStartArea, void * pEndBlock, size_t nBlockSize )
+            {
+                base_class::check_bounds( pStartArea, pEndBlock, nBlockSize );
+            }
+        };
+
+        template <>
+        class bound_checker_selector<cds::opt::none>
+        {
+        public:
+            enum {
+                trailer_size = 0
+            };
+
+            void make_trailer( void * /*pStartArea*/, void * /*pEndBlock*/, size_t /*nAllocSize*/ )
+            {}
+
+            void check_bounds( void * /*pStartArea*/, void * /*pEndBlock*/, size_t /*nBlockSize*/ )
+            {}
+        };
+    }   // namespace details
+    //@endcond
+
+
+}}} // namespace cds::memory::michael
+
+#endif // #ifndef __CDS_MEMORY_MICHAEL_ALLOCATOR_BOUND_CHECK_H
diff --git a/cds/memory/michael/options.h b/cds/memory/michael/options.h
new file mode 100644 (file)
index 0000000..95a9d5a
--- /dev/null
@@ -0,0 +1,254 @@
+//$$CDS-header$$
+
+#ifndef __CDS_MEMORY_MICHAEL_OPTIONS_H
+#define __CDS_MEMORY_MICHAEL_OPTIONS_H
+
+/*
+    Options for Michael allocator
+    Source:
+        [2004] Maged Michael "Scalable Lock-Free Dynamic Memory Allocation"
+
+    Editions:
+        2011.01.23 khizmax  Created
+*/
+
+#include <cds/opt/options.h>
+
+namespace cds { namespace memory { namespace michael {
+
+    /// Options related for Michael's allocator \ref Heap
+    namespace opt {
+        using namespace cds::opt;
+
+        /// Option setter specifies system topology
+        /**
+            See cds::OS::Win32::topology for interface example.
+
+            Default type: \p cds::OS::topology selects appropriate implementation for target system.
+        */
+        template <typename TOPOLOGY>
+        struct sys_topology {
+            //@cond
+            template<class BASE> struct pack: public BASE
+            {
+                typedef TOPOLOGY sys_topology;
+            };
+            //@endcond
+        };
+
+        /// Option setter specifies system heap for large blocks
+        /**
+            If the block size requested is more that Michael's allocator upper limit
+            then an allocator provided by \p system_heap option is called.
+            By default, Michael's allocator can maintain blocks up to 64K bytes length;
+            for blocks larger than 64K the allocator defined by this option is used.
+
+            Available \p HEAP implementations:
+                - malloc_heap
+        */
+        template <typename HEAP>
+        struct system_heap
+        {
+            //@cond
+            template<class BASE> struct pack: public BASE
+            {
+                typedef HEAP system_heap;
+            };
+            //@endcond
+        };
+
+        /// Option setter specifies internal aligned heap
+        /**
+            This heap is used by Michael's allocator for obtaining aligned memory.
+
+            Available \p HEAP implementations:
+                - aligned_malloc_heap
+        */
+        template <typename HEAP>
+        struct aligned_heap {
+            //@cond
+            template<class BASE> struct pack: public BASE
+            {
+                typedef HEAP aligned_heap;
+            };
+            //@endcond
+        };
+
+        /// Option setter specifies page heap
+        /**
+            This heap is used by Michael's allocator for superblock allocation.
+            The size of superblock is:
+                - 64K - for small blocks
+                - 1M - for other blocks
+
+            Available \p HEAP implementations:
+                - page_allocator
+                - page_cached_allocator
+        */
+        template <typename HEAP>
+        struct page_heap {
+            //@cond
+            template<class BASE> struct pack: public BASE
+            {
+                typedef HEAP page_heap;
+            };
+            //@endcond
+        };
+
+        /// Option setter specifies size-class selector
+        /**
+            The size-class selector determines the best size-class for requested block size,
+            i.e. it specifies allocation granularity.
+            In fact, it selects superblock descriptor within processor heap.
+
+            Available \p Type implementation:
+                - default_sizeclass_selector
+        */
+        template <typename Type>
+        struct sizeclass_selector {
+            //@cond
+            template<class BASE> struct pack: public BASE
+            {
+                typedef Type sizeclass_selector;
+            };
+            //@endcond
+        };
+
+        /// Option setter specifies free-list of superblock descriptor
+        /**
+            Available \p Type implementations:
+                - free_list_locked
+        */
+        template <typename Type>
+        struct free_list {
+            //@cond
+            template<class BASE> struct pack: public BASE
+            {
+                typedef Type free_list;
+            };
+            //@endcond
+        };
+
+        /// Option setter specifies partial list of superblocks
+        /**
+            Available \p Type implementations:
+                - partial_list_locked
+        */
+        template <typename Type>
+        struct partial_list {
+            //@cond
+            template<class BASE> struct pack: public BASE
+            {
+                typedef Type partial_list;
+            };
+            //@endcond
+        };
+
+        /// Option setter for processor heap statistics
+        /**
+            The option specifies a type for gathering internal processor heap statistics.
+            The processor heap statistics is gathered on per processor basis.
+            Large memory block (more than 64K) allocated directly from OS does not fall into these statistics.
+            For OS-allocated memory block see \ref os_allocated_stat option.
+
+            Available \p Type implementations:
+                - \ref procheap_atomic_stat
+                - \ref procheap_empty_stat
+
+            For interface of type \p Type see \ref procheap_atomic_stat.
+        */
+        template <typename Type>
+        struct procheap_stat {
+            //@cond
+            template <class BASE> struct pack: public BASE
+            {
+                typedef Type procheap_stat;
+            };
+            //@endcond
+        };
+
+        /// Option setter for OS-allocated memory
+        /**
+            The option specifies a type for gathering internal statistics of
+            large (OS-allocated) memory blocks that is too big to maintain by Michael's heap
+            (with default \ref sizeclass_selector, the block that large than 64K is not
+            maintained by Michael's heap and passed directly to system allocator).
+
+            Note that OS-allocated memory statistics does not include memory allocation
+            for heap's internal purposes. Only direct call of \p alloc or \p alloc_aligned
+            for large memory block is counted.
+
+            Available \p Type implementations:
+                - \ref os_allocated_atomic
+                - \ref os_allocated_empty
+        */
+        template <typename Type>
+        struct os_allocated_stat {
+            //@cond
+            template <class BASE> struct pack: public BASE
+            {
+                typedef Type os_allocated_stat;
+            };
+            //@endcond
+        };
+
+        /// Option setter for bounds checking
+        /**
+            This option defines a strategy to check upper memory boundary of allocated blocks.
+            \p Type defines a class for bound checking with following interface:
+
+            \code
+            class bound_checker
+            {
+            public:
+                enum {
+                    trailer_size = numeric_const
+                };
+
+                void make_trailer( void * pStartArea, void * pEndBlock, size_t nAllocSize );
+                bool check_bounds( void * pStartArea, void * pEndBlock, size_t nBlockSize );
+            }
+            \endcode
+
+            Before allocating a memory block of size N, the heap adds the \p trailer_size to N and really it
+            allocates N + trailer_size bytes. Then, the heap calls \p make_trailer function of bound checker with arguments:
+                - \p pStartArea - start of allocated block
+                - \p pEndBlock - the first byte after really allocated block; \code pEndBlock - pStartArea >= N + trailer_size \endcode
+                - \p nAllocSize -  requested size in bytes (i.e. N)
+            So, \p make_trailer function can place some predefined value called bound mark of any type, for example, int64,
+            on address pStartArea + nAllocSize, and store real allocated block size N to pEndBlock - sizeof(size_t).
+            In this example, \p trailer_size constant is equal sizeof(int64) + sizeof(size_t).
+
+            Before the memory block previously allocated is deallocating, the \p check_bounds function is called.
+            The function has similar signature:
+                - \p pStartArea - start of allocated block (like \p make_trailer fist argument)
+                - \p pEndBlock - the first byte after allocated block (like \p make_trailer second argument)
+                - \p nBlockSize - real allocated block size, not equal to \p nAllocSize argument of \p make_trailer
+
+            The function can:
+                - calculate real allocated block size: \code N = *reinterpret_cast<size_t>(pEndBlock - sizeof(size_t)) \endcode
+                - check whether the bound mark is unchanged: \code *reinterpret_cast<int64>(pStartArea + N) == bound_mark \endcode
+                - if it is not equal - make assertion
+
+            The library provides the following predefined bound checkers, i.e they are possible values of \p Type
+            template argument:
+                \li cds::opt::none - no bound checking is performed (default)
+                \li michael::debug_bound_checking - an assertion is thrown when memory bound violation is detected.
+                    This option is acceptable only in debug mode. For release mode it is equal to cds::opt::none.
+                \li michael::strong_bound_checking - an assertion is thrown in debug mode if memory bound violation is detected;
+                    an exception is thrown in release mode.
+        */
+        template <typename Type>
+        struct check_bounds {
+            //@cond
+            template <class BASE> struct pack: public BASE
+            {
+                typedef Type check_bounds;
+            };
+            //@endcond
+        };
+    }
+
+}}} // namespace cds::memory::michael
+
+#endif // #ifndef __CDS_MEMORY_MICHAEL_OPTIONS_H
diff --git a/cds/memory/michael/osalloc_stat.h b/cds/memory/michael/osalloc_stat.h
new file mode 100644 (file)
index 0000000..4d04dfb
--- /dev/null
@@ -0,0 +1,111 @@
+//$$CDS-header$$
+
+#ifndef __CDS_MEMORY_MICHAEL_ALLOCATOR_OSALLOC_STAT_H
+#define __CDS_MEMORY_MICHAEL_ALLOCATOR_OSALLOC_STAT_H
+
+#include <cds/cxx11_atomic.h>
+
+namespace cds { namespace memory { namespace michael {
+
+    /// Statistics for large  (allocated directly from %OS) block
+    struct os_allocated_atomic
+    {
+        ///@cond
+        CDS_ATOMIC::atomic<size_t>              nAllocCount         ;   ///< Event count of large block allocation from %OS
+        CDS_ATOMIC::atomic<size_t>              nFreeCount          ;   ///< Event count of large block deallocation to %OS
+        CDS_ATOMIC::atomic<unsigned long long>  nBytesAllocated     ;   ///< Total size of allocated large blocks, in bytes
+        CDS_ATOMIC::atomic<unsigned long long>  nBytesDeallocated   ;   ///< Total size of deallocated large blocks, in bytes
+
+        os_allocated_atomic()
+            : nAllocCount(0)
+            , nFreeCount(0)
+            , nBytesAllocated(0)
+            , nBytesDeallocated(0)
+        {}
+        ///@endcond
+
+        /// Adds \p nSize to nBytesAllocated counter
+        void incBytesAllocated( size_t nSize )
+        {
+            nAllocCount.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed);
+            nBytesAllocated.fetch_add( nSize, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Adds \p nSize to nBytesDeallocated counter
+        void incBytesDeallocated( size_t nSize )
+        {
+            nFreeCount.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+            nBytesDeallocated.fetch_add( nSize, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Returns count of \p alloc and \p alloc_aligned function call (for large block allocated directly from %OS)
+        size_t allocCount() const
+        {
+            return nAllocCount.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Returns count of \p free and \p free_aligned function call (for large block allocated directly from %OS)
+        size_t freeCount() const
+        {
+            return nFreeCount.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Returns current value of nBytesAllocated counter
+        atomic64u_t allocatedBytes() const
+        {
+            return nBytesAllocated.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Returns current value of nBytesAllocated counter
+        atomic64u_t deallocatedBytes() const
+        {
+            return nBytesDeallocated.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+    };
+
+    /// Dummy statistics for large (allocated directly from %OS) block
+    /**
+        This class does not gather any statistics.
+        Class interface is the same as \ref os_allocated_atomic.
+    */
+    struct os_allocated_empty
+    {
+    //@cond
+        /// Adds \p nSize to nBytesAllocated counter
+        void incBytesAllocated( size_t nSize )
+        { CDS_UNUSED(nSize); }
+
+        /// Adds \p nSize to nBytesDeallocated counter
+        void incBytesDeallocated( size_t nSize )
+        { CDS_UNUSED(nSize); }
+
+        /// Returns count of \p alloc and \p alloc_aligned function call (for large block allocated directly from OS)
+        size_t allocCount() const
+        {
+            return 0;
+        }
+
+        /// Returns count of \p free and \p free_aligned function call (for large block allocated directly from OS)
+        size_t freeCount() const
+        {
+            return 0;
+        }
+
+        /// Returns current value of nBytesAllocated counter
+        atomic64u_t allocatedBytes() const
+        {
+            return 0;
+        }
+
+        /// Returns current value of nBytesAllocated counter
+        atomic64u_t deallocatedBytes() const
+        {
+            return 0;
+        }
+    //@endcond
+    };
+
+
+}}} // namespace cds::memory::michael
+
+#endif  /// __CDS_MEMORY_MICHAEL_ALLOCATOR_OSALLOC_STAT_H
diff --git a/cds/memory/michael/procheap_stat.h b/cds/memory/michael/procheap_stat.h
new file mode 100644 (file)
index 0000000..fa2466c
--- /dev/null
@@ -0,0 +1,392 @@
+//$$CDS-header$$
+
+#ifndef __CDS_MEMORY_MICHAEL_ALLOCATOR_PROCHEAP_STAT_H
+#define __CDS_MEMORY_MICHAEL_ALLOCATOR_PROCHEAP_STAT_H
+
+#include <cds/cxx11_atomic.h>
+
+namespace cds { namespace memory { namespace michael {
+
+        /// processor heap statistics
+    /**
+        This class is implementation of \ref opt::procheap_stat option.
+        The statistic counter implementation is based on atomic operations.
+
+        Template parameters:
+            - \p INC_FENCE - memory fence for increment operation (default is release semantics)
+            - \p READ_FENCE - memory fence for reading of statistic values (default is acquire semantics)
+    */
+    class procheap_atomic_stat
+    {
+        //@cond
+        CDS_ATOMIC::atomic<size_t>      nAllocFromActive    ;  ///< Event count of allocation from active superblock
+        CDS_ATOMIC::atomic<size_t>      nAllocFromPartial   ;  ///< Event count of allocation from partial superblock
+        CDS_ATOMIC::atomic<size_t>      nAllocFromNew       ;  ///< Event count of allocation from new superblock
+        CDS_ATOMIC::atomic<size_t>      nFreeCount          ;  ///< \ref free function call count
+        CDS_ATOMIC::atomic<size_t>      nBlockCount         ;  ///< Count of superblock allocated
+        CDS_ATOMIC::atomic<size_t>      nBlockDeallocCount  ;  ///< Count of superblock deallocated
+        CDS_ATOMIC::atomic<size_t>      nDescAllocCount     ;  ///< Count of superblock descriptors
+        CDS_ATOMIC::atomic<size_t>      nDescFull           ;  ///< Count of full superblock
+        CDS_ATOMIC::atomic<unsigned long long> nBytesAllocated     ;  ///< Count of allocated bytes
+        CDS_ATOMIC::atomic<unsigned long long> nBytesDeallocated   ;  ///< Count of deallocated bytes
+
+        CDS_ATOMIC::atomic<size_t>      nActiveDescCASFailureCount ;   ///< CAS failure counter for active block of \p alloc_from_active Heap function
+        CDS_ATOMIC::atomic<size_t>      nActiveAnchorCASFailureCount;   ///< CAS failure counter for active block of \p alloc_from_active Heap function
+        CDS_ATOMIC::atomic<size_t>      nPartialDescCASFailureCount ;   ///< CAS failure counter for partial block of \p alloc_from_partial Heap function
+        CDS_ATOMIC::atomic<size_t>      nPartialAnchorCASFailureCount;   ///< CAS failure counter for partial block of \p alloc_from_partial Heap function
+
+        //@endcond
+
+    public:
+        //@cond
+        procheap_atomic_stat()
+            : nAllocFromActive(0)
+            , nAllocFromPartial(0)
+            , nAllocFromNew(0)
+            , nFreeCount(0)
+            , nBlockCount(0)
+            , nDescFull(0)
+            , nBytesAllocated(0)
+            , nBytesDeallocated(0)
+            , nActiveDescCASFailureCount(0)
+            , nActiveAnchorCASFailureCount(0)
+            , nPartialDescCASFailureCount(0)
+            , nPartialAnchorCASFailureCount(0)
+        {}
+        //@endcond
+
+    public:
+        /// Increment event counter of allocation from active superblock
+        void incAllocFromActive()
+        {
+            nAllocFromActive.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+        }
+        /// Increment event counter of allocation from active superblock by \p n
+        void incAllocFromActive( size_t n )
+        {
+            nAllocFromActive.fetch_add( n, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Increment event counter of allocation from partial superblock
+        void incAllocFromPartial()
+        {
+            nAllocFromPartial.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+        }
+        /// Increment event counter of allocation from partial superblock by \p n
+        void incAllocFromPartial( size_t n )
+        {
+            nAllocFromPartial.fetch_add( n, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Increment event count of allocation from new superblock
+        void incAllocFromNew()
+        {
+            nAllocFromNew.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+        }
+        /// Increment event count of allocation from new superblock by \p n
+        void incAllocFromNew( size_t n )
+        {
+            nAllocFromNew.fetch_add( n, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Increment event counter of free calling
+        void incFreeCount()
+        {
+            nFreeCount.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+        }
+        /// Increment event counter of free calling by \p n
+        void incFreeCount( size_t n )
+        {
+            nFreeCount.fetch_add( n, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Increment counter of superblock allocated
+        void incBlockAllocated()
+        {
+            nBlockCount.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+        }
+        /// Increment counter of superblock allocated by \p n
+        void incBlockAllocated( size_t n )
+        {
+            nBlockCount.fetch_add( n, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Increment counter of superblock deallocated
+        void incBlockDeallocated()
+        {
+            nBlockDeallocCount.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+        }
+        /// Increment counter of superblock deallocated by \p n
+        void incBlockDeallocated( size_t n )
+        {
+            nBlockDeallocCount.fetch_add( n, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Increment counter of superblock descriptor allocated
+        void incDescAllocCount()
+        {
+            nDescAllocCount.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+        }
+        /// Increment counter of superblock descriptor allocated by \p n
+        void incDescAllocCount( size_t n )
+        {
+            nDescAllocCount.fetch_add( n, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Increment counter of full superblock descriptor
+        void incDescFull()
+        {
+            nDescFull.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+        }
+        /// Increment counter of full superblock descriptor by \p n
+        void incDescFull( size_t n )
+        {
+            nDescFull.fetch_add( n, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Decrement counter of full superblock descriptor
+        void decDescFull()
+        {
+            nDescFull.fetch_sub( 1, CDS_ATOMIC::memory_order_relaxed );
+        }
+        /// Decrement counter of full superblock descriptor by \p n
+        void decDescFull(size_t n)
+        {
+            nDescFull.fetch_sub( n, CDS_ATOMIC::memory_order_relaxed );
+        }
+        /// Add \p nBytes to allocated bytes counter
+        void incAllocatedBytes( size_t nBytes )
+        {
+            nBytesAllocated.fetch_add( nBytes, CDS_ATOMIC::memory_order_relaxed );
+        }
+        /// Add \p nBytes to deallocated bytes counter
+        void incDeallocatedBytes( size_t nBytes )
+        {
+            nBytesDeallocated.fetch_add( nBytes, CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Add \p nCount to CAS failure counter of updating \p active field of active descriptor for \p alloc_from_active internal Heap function
+        void incActiveDescCASFailureCount( int nCount )
+        {
+            nActiveDescCASFailureCount.fetch_add( nCount, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Add \p nCount to CAS failure counter of updating \p anchor field of active descriptor for \p alloc_from_active internal Heap function
+        void incActiveAnchorCASFailureCount( int nCount )
+        {
+            nActiveAnchorCASFailureCount.fetch_add( nCount, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Add \p nCount to CAS failure counter of updating \p active field of partial descriptor for \p alloc_from_partial internal Heap function
+        void incPartialDescCASFailureCount( int nCount )
+        {
+            nPartialDescCASFailureCount.fetch_add( nCount, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Add \p nCount to CAS failure counter of updating \p anchor field of partial descriptor for \p alloc_from_partial internal Heap function
+        void incPartialAnchorCASFailureCount( int nCount )
+        {
+            nPartialAnchorCASFailureCount.fetch_add( nCount, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        // -----------------------------------------------------------------
+        // Reading
+
+        /// Read event counter of allocation from active superblock
+        size_t allocFromActive() const
+        {
+            return nAllocFromActive.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Read event counter of allocation from partial superblock
+        size_t allocFromPartial() const
+        {
+            return nAllocFromPartial.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Read event count of allocation from new superblock
+        size_t allocFromNew() const
+        {
+            return nAllocFromNew.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Read event counter of free calling
+        size_t freeCount() const
+        {
+            return nFreeCount.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Read counter of superblock allocated
+        size_t blockAllocated() const
+        {
+            return nBlockCount.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Read counter of superblock deallocated
+        size_t blockDeallocated() const
+        {
+            return nBlockDeallocCount.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Read counter of superblock descriptor allocated
+        size_t descAllocCount() const
+        {
+            return nDescAllocCount.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Read counter of full superblock descriptor
+        size_t descFull() const
+        {
+            return nDescFull.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Get counter of allocated bytes
+        /**
+            This counter only counts the bytes allocated by Heap, OS allocation (large blocks) is not counted.
+
+            To get count of bytes allocated but not yet deallocated you should call
+            \code allocatedBytes() - deallocatedBytes() \endcode
+        */
+        atomic64u_t allocatedBytes() const
+        {
+            return nBytesAllocated.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Get counter of deallocated bytes
+        /**
+            This counter only counts the bytes allocated by Heap, OS allocation (large blocks) is not counted.unter of deallocated bytes
+
+            See \ref allocatedBytes notes
+        */
+        atomic64u_t deallocatedBytes() const
+        {
+            return nBytesDeallocated.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Get CAS failure counter of updating \p active field of active descriptor for \p alloc_from_active internal Heap function
+        size_t activeDescCASFailureCount() const
+        {
+            return nActiveDescCASFailureCount.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Get CAS failure counter of updating \p anchor field of active descriptor for \p alloc_from_active internal Heap function
+        size_t activeAnchorCASFailureCount() const
+        {
+            return nActiveAnchorCASFailureCount.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Get CAS failure counter of updating \p active field of partial descriptor for \p alloc_from_active internal Heap function
+        size_t partialDescCASFailureCount() const
+        {
+            return nPartialDescCASFailureCount.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+
+        /// Get CAS failure counter of updating \p anchor field of partial descriptor for \p alloc_from_active internal Heap function
+        size_t partialAnchorCASFailureCount() const
+        {
+            return nPartialAnchorCASFailureCount.load(CDS_ATOMIC::memory_order_relaxed);
+        }
+    };
+
+    /// Empty processor heap statistics
+    /**
+        This class is dummy implementation of \ref opt::procheap_stat option.
+        No statistic gathering is performed.
+
+        Interface - see procheap_atomic_stat.
+        All getter methods return 0.
+    */
+    class procheap_empty_stat
+    {
+    //@cond
+    public:
+        void incAllocFromActive()
+        {}
+        void incAllocFromPartial()
+        {}
+        void incAllocFromNew()
+        {}
+        void incFreeCount()
+        {}
+        void incBlockAllocated()
+        {}
+        void incBlockDeallocated()
+        {}
+        void incDescAllocCount()
+        {}
+        void incDescFull()
+        {}
+        void decDescFull()
+        {}
+
+        // Add -------------------------------------------------------------
+        void incAllocFromActive(size_t)
+        {}
+        void incAllocFromPartial(size_t)
+        {}
+        void incAllocFromNew(size_t)
+        {}
+        void incFreeCount(size_t)
+        {}
+        void incBlockAllocated(size_t)
+        {}
+        void incBlockDeallocated(size_t)
+        {}
+        void incDescAllocCount(size_t)
+        {}
+        void incDescFull(size_t)
+        {}
+        void decDescFull(size_t)
+        {}
+        void incAllocatedBytes( size_t /*nBytes*/ )
+        {}
+        void incDeallocatedBytes( size_t /*nBytes*/ )
+        {}
+        void incActiveDescCASFailureCount( int /*nCount*/ )
+        {}
+        void incActiveAnchorCASFailureCount( int /*nCount*/ )
+        {}
+        void incPartialDescCASFailureCount( int /*nCount*/ )
+        {}
+        void incPartialAnchorCASFailureCount( int /*nCount*/ )
+        {}
+
+        // -----------------------------------------------------------------
+        // Reading
+
+        size_t allocFromActive() const
+        { return 0; }
+        size_t allocFromPartial() const
+        { return 0; }
+        size_t allocFromNew() const
+        { return 0; }
+        size_t freeCount() const
+        { return 0; }
+        size_t blockAllocated() const
+        { return 0; }
+        size_t blockDeallocated() const
+        { return 0; }
+        size_t descAllocCount() const
+        { return 0; }
+        size_t descFull() const
+        { return 0; }
+        atomic64u_t allocatedBytes() const
+        { return 0; }
+        atomic64u_t deallocatedBytes() const
+        { return 0; }
+        size_t activeDescCASFailureCount() const
+        { return 0; }
+        size_t activeAnchorCASFailureCount() const
+        { return 0; }
+        size_t partialDescCASFailureCount() const
+        { return 0; }
+        size_t partialAnchorCASFailureCount() const
+        { return 0; }
+
+    //@endcond
+    };
+
+
+}}} // namespace cds::memory::michael
+
+#endif  /// __CDS_MEMORY_MICHAEL_ALLOCATOR_PROCHEAP_STAT_H
diff --git a/cds/memory/pool_allocator.h b/cds/memory/pool_allocator.h
new file mode 100644 (file)
index 0000000..e821749
--- /dev/null
@@ -0,0 +1,129 @@
+//$$CDS-header$$
+
+#ifndef __CDS_MEMORY_POOL_ALLOCATOR_H
+#define __CDS_MEMORY_POOL_ALLOCATOR_H
+
+#include <cds/details/defs.h>
+#include <utility>
+
+namespace cds { namespace memory {
+
+    ///@defgroup cds_memory_pool Simple memory pool
+
+    /// Pool allocator adapter
+    /**
+        This class is an adapter for an object pool. It gives \p std::allocator interface
+        for the @ref cds_memory_pool "pool".
+
+        Template arguments:
+        - \p T - value type
+        - \p Accessor - a functor to access to pool object. The pool has the following interface:
+            \code
+            template <typename T>
+            class pool {
+                typedef T value_type    ;   // Object type maintained by pool
+                T * allocate( size_t n )            ;   // Allocate an array of object of type T
+                void deallocate( T * p, size_t n )  ;   // Deallocate the array p of size n
+            };
+            \endcode
+
+        <b>Usage</b>
+
+            Suppose, we have got a pool with interface above. Usually, the pool is a static object:
+            \code
+                static pool<Foo>     thePool;
+            \endcode
+
+            The \p %pool_allocator gives \p std::allocator interface for the pool.
+            It is needed to declare an <i>accessor</i> functor to access to \p thePool:
+            \code
+                struct pool_accessor {
+                    typedef typename pool::value_type   value_type;
+
+                    pool& operator()() const
+                    {
+                        return thePool;
+                    }
+                };
+            \endcode
+
+            Now, <tt>cds::memory::pool_allocator< T, pool_accessor > </tt> can be used instead of \p std::allocator.
+    */
+    template <typename T, typename Accessor>
+    class pool_allocator
+    {
+    //@cond
+    public:
+        typedef Accessor    accessor_type;
+
+        typedef size_t      size_type;
+        typedef ptrdiff_t   difference_type;
+        typedef T*          pointer;
+        typedef const T*    const_pointer;
+        typedef T&          reference;
+        typedef const T&    const_reference;
+        typedef T           value_type;
+
+        template <class U> struct rebind {
+            typedef pool_allocator<U, accessor_type> other;
+        };
+
+    public:
+        pool_allocator() CDS_NOEXCEPT
+        {}
+
+        pool_allocator(const pool_allocator&) CDS_NOEXCEPT
+        {}
+        template <class U> pool_allocator(const pool_allocator<U, accessor_type>&) CDS_NOEXCEPT
+        {}
+        ~pool_allocator()
+        {}
+
+        pointer address(reference x) const CDS_NOEXCEPT
+        {
+            return &x;
+        }
+        const_pointer address(const_reference x) const CDS_NOEXCEPT
+        {
+            return &x;
+        }
+        pointer allocate( size_type n, void const * hint = 0)
+        {
+            static_assert( sizeof(value_type) <= sizeof(typename accessor_type::value_type), "Incompatible type" );
+
+            return reinterpret_cast<pointer>( accessor_type()().allocate( n ));
+        }
+        void deallocate(pointer p, size_type n) CDS_NOEXCEPT
+        {
+            accessor_type()().deallocate( reinterpret_cast<typename accessor_type::value_type *>( p ), n );
+        }
+        size_type max_size() const CDS_NOEXCEPT
+        {
+            return size_t(-1) / sizeof(value_type);
+        }
+
+#   if defined(CDS_MOVE_SEMANTICS_SUPPORT) && defined(CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT)
+        template <class U, class... Args>
+        void construct(U* p, Args&&... args)
+        {
+            new((void *)p) U( std::forward<Args>(args)...);
+        }
+#   else
+        template <typename Arg>
+        void construct(pointer p, Arg const& val )
+        {
+            new((void *) p) value_type(val);
+        }
+#   endif
+        template <class U>
+        void destroy(U* p)
+        {
+            p->~U();
+        }
+    //@endcond
+    };
+
+}} // namespace cds::memory
+
+
+#endif // #ifndef __CDS_MEMORY_POOL_ALLOCATOR_H
diff --git a/cds/memory/vyukov_queue_pool.h b/cds/memory/vyukov_queue_pool.h
new file mode 100644 (file)
index 0000000..250e371
--- /dev/null
@@ -0,0 +1,481 @@
+//$$CDS-header$$
+
+#ifndef __CDS_MEMORY_VYUKOV_QUEUE_ALLOCATOR_H
+#define __CDS_MEMORY_VYUKOV_QUEUE_ALLOCATOR_H
+
+#include <cds/details/allocator.h>
+#include <cds/intrusive/vyukov_mpmc_cycle_queue.h>
+
+namespace cds { namespace memory {
+
+    /// Free-list based on bounded lock-free queue cds::intrusive::VyukovMPMCCycleQueue
+    /** @ingroup cds_memory_pool
+        Template parameters:
+        - \p T - the type of object maintaining by free-list
+        - \p Options - the options of cds::intrusive::VyukovMPMCCycleQueue class plus
+            cds::opt::allocator option.
+
+        \b Internals
+
+        This free-list is very simple.
+        At construction time, the free-list allocates the array of N items
+        and stores them into queue, where N is the queue capacity.
+        When allocating the free-list tries to pop an object from
+        internal queue i.e. from preallocated pool. If success the popped object is returned.
+        Otherwise a new one is allocated. When deallocating, the free-list checks whether
+        the object is from preallocated pool. If so, the object is pushed into queue, otherwise
+        it is deallocated by using the allocator provided.
+        The pool can manage more than \p N items but only \p N items is contained in the free-list.
+
+        \b Usage
+
+        \p %vyukov_queue_pool should be used together with \ref pool_allocator.
+        You should declare an static object of type \p %vyukov_queue_pool, provide
+        an accessor to that object and use \p pool_allocator as an allocator:
+        \code
+        #include <cds/memory/vyukov_queue_pool.h>
+        #include <cds/memory/pool_allocator.h>
+
+        // Pool of Foo object of size 1024.
+        typedef cds::memory::vyukov_queue_pool< Foo, cds::opt::buffer< cds::opt::v::static_buffer< Foo, 1024 > > pool_type;
+        static pool_type thePool;
+
+        struct pool_accessor {
+            typedef typename pool_type::value_type  value_type;
+
+            pool_type& operator()() const
+            {
+                return thePool;
+            }
+        };
+
+        // Declare pool allocator
+        typedef cds::memory::pool_allocator< Foo, pool_accessor >   pool_allocator;
+
+        // Use pool_allocator
+        // Allocate an object
+        Foo * p = pool_allocator().allocate( 1 );
+
+        // construct object
+        new(p) Foo;
+
+        //...
+
+        // Destruct object
+        p->~Foo();
+
+        // Deallocate object
+        pool_allocator().deallocate( p , 1 );
+        \endcode
+    */
+    template <typename T, CDS_DECL_OPTIONS6>
+    class vyukov_queue_pool
+    {
+    public:
+        typedef cds::intrusive::VyukovMPMCCycleQueue< T, CDS_OPTIONS6 > queue_type  ;   ///< Queue type
+
+    protected:
+        //@cond
+        struct default_options: public queue_type::options
+        {
+            typedef CDS_DEFAULT_ALLOCATOR   allocator;
+        };
+        typedef typename opt::make_options< default_options, CDS_OPTIONS6 >::type   options;
+        //@endcond
+
+    public:
+        typedef T  value_type ; ///< Value type
+        typedef typename options::allocator::template rebind<value_type>::other allocator_type  ;   ///< allocator type
+
+    protected:
+        //@cond
+        queue_type      m_Queue;
+        value_type *    m_pFirst;
+        value_type *    m_pLast;
+        //@endcond
+
+    protected:
+        //@cond
+        void preallocate_pool()
+        {
+            m_pFirst = allocator_type().allocate( m_Queue.capacity() );
+            m_pLast = m_pFirst + m_Queue.capacity();
+
+            for ( value_type * p = m_pFirst; p < m_pLast; ++p )
+                CDS_VERIFY( m_Queue.push( *p )) ;   // must be true
+        }
+
+        bool from_pool( value_type * p ) const
+        {
+            return m_pFirst <= p && p < m_pLast;
+        }
+        //@endcond
+
+    public:
+        /// Preallocates the pool of object
+        /**
+            \p nCapacity argument is the queue capacity. It should be passed
+            if the queue is based on dynamically-allocated buffer.
+            See cds::intrusive::VyukovMPMCCycleQueue for explanation.
+        */
+        vyukov_queue_pool( size_t nCapacity = 0 )
+            : m_Queue( nCapacity )
+        {
+            preallocate_pool();
+        }
+
+        /// Deallocates the pool.
+        ~vyukov_queue_pool()
+        {
+            m_Queue.clear();
+            allocator_type().deallocate( m_pFirst, m_Queue.capacity() );
+        }
+
+        /// Allocates an object from pool
+        /**
+            The pool supports allocation only single object (\p n = 1).
+            If \p n > 1 the behaviour is undefined.
+
+            If the queue is not empty, the popped value is returned.
+            Otherwise, a new value allocated.
+        */
+        value_type * allocate( size_t n )
+        {
+            assert( n == 1 );
+
+            value_type * p = m_Queue.pop();
+            if ( p ) {
+                assert( from_pool(p) );
+                return p;
+            }
+
+            return allocator_type().allocate( n );
+        }
+
+        /// Deallocated the object \p p
+        /**
+            The pool supports allocation only single object (\p n = 1).
+            If \p n > 1 the behaviour is undefined.
+
+            If \p p is from preallocated pool, it pushes into the queue.
+            Otherwise, \p p is deallocated by allocator provided.
+        */
+        void deallocate( value_type * p, size_t n )
+        {
+            assert( n == 1 );
+
+            if ( p ) {
+                if ( from_pool( p ) )
+                    m_Queue.push( *p );
+                else
+                    allocator_type().deallocate( p, n );
+            }
+        }
+    };
+
+    /// Lazy free-list based on bounded lock-free queue cds::intrusive::VyukovMPMCCycleQueue
+    /** @ingroup cds_memory_pool
+        Template parameters:
+        - \p T - the type of object maintaining by free-list
+        - \p Options - the options of cds::intrusive::VyukovMPMCCycleQueue class plus
+            cds::opt::allocator option.
+
+        \b Internals
+
+        This free-list is very simple.
+        At construction time the pool is empty.
+        When allocating the free-list tries to pop an object from
+        internal queue. If success the popped object is returned.
+        Otherwise a new one is allocated.
+        When deallocating, the free-list tries to push the object into the pool.
+        If internal queue is full, the object is deallocated by using the allocator provided.
+        The pool can manage more than \p N items but only \p N items is placed in the free-list.
+
+        \b Usage
+
+        \p %lazy_vyukov_queue_pool should be used together with \ref pool_allocator.
+        You should declare an static object of type \p %lazy_vyukov_queue_pool, provide
+        an accessor functor to this object and use \p pool_allocator as an allocator:
+        \code
+        #include <cds/memory/vyukov_queue_pool.h>
+        #include <cds/memory/pool_allocator.h>
+
+        // Pool of Foo object of size 1024.
+        typedef cds::memory::lazy_vyukov_queue_pool< Foo, cds::opt::buffer< cds::opt::v::dynamic_buffer< Foo > > pool_type;
+        static pool_type thePool( 1024 );
+
+        struct pool_accessor {
+            typedef typename pool_type::value_type  value_type;
+
+            pool_type& operator()() const
+            {
+                return thePool;
+            }
+        };
+
+        // Declare pool allocator
+        typedef cds::memory::pool_allocator< Foo, pool_accessor >   pool_allocator;
+
+        // Use pool_allocator
+        // Allocate an object
+        Foo * p = pool_allocator().allocate( 1 );
+
+        // construct object
+        new(p) Foo;
+
+        //...
+
+        // Destruct object
+        p->~Foo();
+
+        // Deallocate object
+        pool_allocator().deallocate( p , 1 );
+        \endcode
+
+    */
+    template <typename T, CDS_DECL_OPTIONS6>
+    class lazy_vyukov_queue_pool
+    {
+    public:
+        typedef cds::intrusive::VyukovMPMCCycleQueue< T, CDS_OPTIONS6 > queue_type  ;   ///< Queue type
+
+    protected:
+        //@cond
+        struct default_options: public queue_type::options
+        {
+            typedef CDS_DEFAULT_ALLOCATOR   allocator;
+        };
+        typedef typename opt::make_options< default_options, CDS_OPTIONS6 >::type   options;
+        //@endcond
+
+    public:
+        typedef T  value_type ; ///< Value type
+        typedef typename options::allocator::template rebind<value_type>::other allocator_type  ;   ///< allocator type
+
+    protected:
+        //@cond
+        queue_type      m_Queue;
+        //@endcond
+
+    public:
+        /// Constructs empty pool
+        lazy_vyukov_queue_pool( size_t nCapacity = 0 )
+            : m_Queue( nCapacity )
+        {}
+
+        /// Deallocates all objects from the pool
+        ~lazy_vyukov_queue_pool()
+        {
+            allocator_type a;
+            while ( !m_Queue.empty() ) {
+                value_type * p = m_Queue.pop();
+                a.deallocate( p, 1 );
+            }
+        }
+
+        /// Allocates an object from pool
+        /**
+            The pool supports allocation only single object (\p n = 1).
+            If \p n > 1 the behaviour is undefined.
+
+            If the queue is not empty, the popped value is returned.
+            Otherwise, a new value allocated.
+        */
+        value_type * allocate( size_t n )
+        {
+            assert( n == 1 );
+
+            value_type * p = m_Queue.pop();
+            if ( p )
+                return p;
+
+            return allocator_type().allocate( n );
+        }
+
+        /// Deallocated the object \p p
+        /**
+            The pool supports allocation only single object (\p n = 1).
+            If \p n > 1 the behaviour is undefined.
+
+            If the queue is not full, \p p is pushed into the queue.
+            Otherwise, \p p is deallocated by allocator provided.
+        */
+        void deallocate( value_type * p, size_t n )
+        {
+            assert( n == 1 );
+
+            if ( p ) {
+                if ( !m_Queue.push( *p ))
+                    allocator_type().deallocate( p, n );
+            }
+        }
+
+    };
+
+    /// Bounded free-list based on bounded lock-free queue cds::intrusive::VyukovMPMCCycleQueue
+    /** @ingroup cds_memory_pool
+        Template parameters:
+        - \p T - the type of object maintaining by free-list
+        - \p Options - the options of cds::intrusive::VyukovMPMCCycleQueue class plus
+            cds::opt::allocator option.
+
+        \b Internals
+
+        At construction time, the free-list allocates the array of N items
+        and stores them into queue, where N is the queue capacity.
+        When allocating the free-list tries to pop an object from
+        internal queue i.e. from preallocated pool. If success the popped object is returned.
+        Otherwise a \p std::bad_alloc exception is raised.
+        So, the pool can contain up to \p N items.
+        When deallocating, the object is pushed into queue.
+        In debug mode the \ref deallocate member function asserts
+        that the pointer is from preallocated pool.
+
+        \b Usage
+
+        \p %bounded_vyukov_queue_pool should be used together with \ref pool_allocator.
+        You should declare an static object of type \p %bounded_vyukov_queue_pool, provide
+        an accessor functor to this object and use \p pool_allocator as an allocator:
+        \code
+        #include <cds/memory/vyukov_queue_pool.h>
+        #include <cds/memory/pool_allocator.h>
+
+        // Pool of Foo object of size 1024.
+        typedef cds::memory::bounded_vyukov_queue_pool< Foo, cds::opt::buffer< cds::opt::v::static_buffer< Foo, 1024 > > pool_type;
+        static pool_type thePool;
+
+        struct pool_accessor {
+            typedef typename pool_type::value_type  value_type;
+
+            pool_type& operator()() const
+            {
+                return thePool;
+            }
+        };
+
+        // Declare pool allocator
+        typedef cds::memory::pool_allocator< Foo, pool_accessor >   pool_allocator;
+
+        // Use pool_allocator
+        // Allocate an object
+        Foo * p = pool_allocator().allocate( 1 );
+
+        // construct object
+        new(p) Foo;
+
+        //...
+
+        // Destruct object
+        p->~Foo();
+
+        // Deallocate object
+        pool_allocator().deallocate( p , 1 );
+        \endcode
+    */
+    template <typename T, CDS_DECL_OPTIONS6>
+    class bounded_vyukov_queue_pool
+    {
+    public:
+        typedef cds::intrusive::VyukovMPMCCycleQueue< T, CDS_OPTIONS6 > queue_type  ;   ///< Queue type
+
+    protected:
+        //@cond
+        struct default_options: public queue_type::options
+        {
+            typedef CDS_DEFAULT_ALLOCATOR   allocator;
+        };
+        typedef typename opt::make_options< default_options, CDS_OPTIONS6 >::type   options;
+        //@endcond
+
+    public:
+        typedef T  value_type ; ///< Value type
+        typedef typename options::allocator::template rebind<value_type>::other allocator_type  ;   ///< allocator type
+
+    protected:
+        //@cond
+        queue_type      m_Queue;
+        value_type *    m_pFirst;
+        value_type *    m_pLast;
+        //@endcond
+
+    protected:
+        //@cond
+        void preallocate_pool()
+        {
+            m_pFirst = allocator_type().allocate( m_Queue.capacity() );
+            m_pLast = m_pFirst + m_Queue.capacity();
+
+            for ( value_type * p = m_pFirst; p < m_pLast; ++p )
+                CDS_VERIFY( m_Queue.push( *p )) ;   // must be true
+        }
+
+        bool from_pool( value_type * p ) const
+        {
+            return m_pFirst <= p && p < m_pLast;
+        }
+        //@endcond
+
+    public:
+        /// Preallocates the pool of object
+        /**
+            \p nCapacity argument is the queue capacity. It should be passed
+            if the queue is based on dynamically-allocated buffer.
+            See cds::intrusive::VyukovMPMCCycleQueue for explanation.
+        */
+        bounded_vyukov_queue_pool( size_t nCapacity = 0 )
+            : m_Queue( nCapacity )
+        {
+            preallocate_pool();
+        }
+
+        /// Deallocates the pool.
+        ~bounded_vyukov_queue_pool()
+        {
+            m_Queue.clear();
+            allocator_type().deallocate( m_pFirst, m_Queue.capacity() );
+        }
+
+        /// Allocates an object from pool
+        /**
+            The pool supports allocation only single object (\p n = 1).
+            If \p n > 1 the behaviour is undefined.
+
+            If the queue is not empty, the popped value is returned.
+            Otherwise, a \p std::bad_alloc exception is raised.
+        */
+        value_type * allocate( size_t n )
+        {
+            assert( n == 1 );
+
+            value_type * p = m_Queue.pop();
+            if ( p ) {
+                assert( from_pool(p) );
+                return p;
+            }
+
+            throw std::bad_alloc();
+        }
+
+        /// Deallocated the object \p p
+        /**
+            The pool supports allocation only single object (\p n = 1).
+            If \p n > 1 the behaviour is undefined.
+
+            \p should be from preallocated pool.
+        */
+        void deallocate( value_type * p, size_t n )
+        {
+            assert( n == 1 );
+
+            if ( p ) {
+                assert( from_pool( p ));
+                m_Queue.push( *p );
+            }
+        }
+    };
+
+
+}}  // namespace cds::memory
+
+
+#endif // #ifndef __CDS_MEMORY_VYUKOV_QUEUE_ALLOCATOR_H
diff --git a/cds/numtraits.h b/cds/numtraits.h
new file mode 100644 (file)
index 0000000..89f5aa7
--- /dev/null
@@ -0,0 +1,247 @@
+//$$CDS-header$$
+
+#ifndef __CDS_NUMERIC_TRAITS_H
+#define __CDS_NUMERIC_TRAITS_H
+
+/*
+    Filename: numtraits.h
+    Created 2007.04.22 by Maxim.Khiszinsky
+
+    Description:
+        Various numeric constants and algorithms
+        Many algorithms are static (compile-time)
+        Result of static algorithm is the constant (enum) called "result".
+
+    Editions:
+        2007.04.22  Maxim.Khiszinsky    Created
+        2007.07.20  Maxim.Khiszinsky    Added functions: exponent2, exp2Ceil
+*/
+
+namespace cds {
+    /// Some helper compile-time tricks
+    namespace beans {
+
+        // @cond details
+        namespace details {
+            template <int N, int MOD> struct Exponent2Helper;
+            template <int N> struct Exponent2Helper< N, 0 > {
+                enum { result = Exponent2Helper< N / 2, N % 2 >::result + 1 };
+            };
+            template <> struct Exponent2Helper< 1, 0 > {
+                enum { result = 0 };
+            };
+        }
+        // @endcond
+
+        /*! Compile-time computing of log2(N)
+
+            If N = 2**k for some natural k then Exponent2<N>::result = k
+            If N != 2**k for any natural k then compile-time error has been encountered
+        */
+        template <int N> struct Exponent2 {
+            enum {
+                native    = N,
+                base    = 2,
+                result    = details::Exponent2Helper< N / 2, N % 2 >::result + 1
+            };
+        };
+        //@cond details
+        template <> struct Exponent2<1> {
+            enum {
+                native    = 1,
+                base    = 2,
+                result    = 0
+            };
+        };
+        //@endcond
+
+        //TODO - deprecated. Use is_power2 from int_algo.h
+        /// A tricky runtime algorithm to ensure that @p n is power of 2
+        static inline bool isExp2( size_t n )
+        {
+            return(n & (n - 1)) == 0 && n;
+        }
+
+        //TODO: deprecated. Use log2 from int_algo.h
+        /// Runtime algorithm to compute log2( @p nTest ). If @p nTest is not power of two then -1 returns
+        static inline int exponent2( size_t nTest )
+        {
+            int nExp = -1;
+            size_t nMask = 1;
+            for ( size_t n = 0; n < CDS_BUILD_BITS; n++ ) {
+                if ( nTest & nMask ) {
+                    if ( nExp == -1 )
+                        nExp = (int) n;
+                    else
+                        return -1    ;    // nTest íå ÿâëÿåòñÿ ñòåïåíüþ äâîéêè
+                }
+                nMask = nMask << 1;
+            }
+            return nExp;
+        }
+
+        /// Returns @a N: 2**N is nearest to @p nNumber, 2**N < nNumber
+        static inline size_t exp2Ceil( size_t nNumber )
+        {
+            static_assert( sizeof(size_t) == (CDS_BUILD_BITS / 8), "Internal assumption error" );
+
+            size_t nExp = 0;
+            size_t nBit = CDS_BUILD_BITS - 1;
+#if CDS_BUILD_BITS == 32
+            size_t nMask = 0x80000000;
+#else
+            size_t nMask = 0x8000000000000000;
+#endif
+            while ( nMask != 0 ) {
+                if ( nNumber & nMask ) {
+                    nExp = nBit;
+                    break;
+                }
+                nMask = nMask >> 1;
+                --nBit;
+            }
+            if ( ( nNumber % ( ((size_t) 1) << nExp )) > ( ((size_t) 1) << (nExp - 1)) )
+                ++nExp;
+            return nExp;
+        }
+
+        /* ExponentN< int BASE, int N >
+            Exponent
+            If N = BASE**k then the algorithm returns k
+            Else compile-time error is encountered
+        */
+        //@cond details
+        namespace details {
+            template <int N, int BASE, int MOD> struct ExponentNHelper;
+            template <int N, int BASE> struct ExponentNHelper< N, BASE, 0 > {
+                enum { result = ExponentNHelper< N / BASE, BASE, N % BASE >::result + 1 };
+            };
+            template <int BASE> struct ExponentNHelper< 1, BASE, 0 > {
+                enum { result = 0 };
+            };
+        }
+        //@endcond
+
+        /// Compile-time computing log(@p N) based @p BASE. Result in @a Exponent<BASE, N>::result
+        template <int BASE, int N> struct ExponentN {
+            enum {
+                native    = N,
+                base    = BASE,
+                result    = details::ExponentNHelper< N / BASE, BASE, N % BASE >::result + 1
+            };
+        };
+        //@cond
+        template <int BASE> struct ExponentN< BASE, 1 > {
+            enum {
+                native    = 1,
+                base    = BASE,
+                result    = 0
+            };
+        };
+        template <int BASE> struct ExponentN< BASE, 0 >;
+        //@endcond
+
+        //@cond none
+        template <int N> struct Power2 {
+            enum {
+                exponent = N,
+                result = 1 << N
+            };
+        };
+        template <> struct Power2<0> {
+            enum {
+                exponent = 0,
+                result = 1
+            };
+        };
+        //@endcond
+
+        //@cond none
+        template <int BASE, int N > struct PowerN {
+            enum {
+                exponent = N,
+                base     = BASE,
+                result = PowerN< BASE, N - 1 >::result * BASE
+            };
+        };
+        template <int BASE> struct PowerN<BASE, 0> {
+            enum {
+                exponent = 0,
+                base     = BASE,
+                result     = 1
+            };
+        };
+        //@endcond
+
+        //@cond none
+        namespace details {
+            template <int N, int ALIGN, int MOD> struct NearestCeilHelper {
+                enum { result = N + ALIGN - MOD };
+            };
+            template <int N, int ALIGN> struct NearestCeilHelper< N, ALIGN, 0> {
+                enum { result = N };
+            };
+        }
+        template <int N, int ALIGN> struct NearestCeil {
+            enum {
+                native    = N,
+                align    = ALIGN,
+                result    = details::NearestCeilHelper< N, ALIGN, N % ALIGN >::result
+            };
+        };
+        //@endcond
+
+        //@cond none
+        template <typename T, int ALIGN> struct AlignedSize {
+            typedef T    NativeType;
+            enum {
+                nativeSize    = sizeof(T),
+                result        = NearestCeil< sizeof(T), ALIGN >::result,
+                alignBytes    = result - nativeSize,
+                alignedSize = result
+            };
+        };
+        //@endcond
+
+        //@cond none
+        namespace details {
+            template < int N1, int N2, bool LESS > struct Max;
+            template < int N1, int N2 >
+            struct Max< N1, N2, true > {
+                enum { result = N2  };
+            };
+
+            template < int N1, int N2 >
+            struct Max< N1, N2, false > {
+                enum { result = N1  };
+            };
+
+            template < int N1, int N2, bool LESS > struct Min;
+            template < int N1, int N2 >
+            struct Min< N1, N2, true > {
+                enum { result = N1  };
+            };
+
+            template < int N1, int N2 >
+            struct Min< N1, N2, false > {
+                enum { result = N2  };
+            };
+        }
+        //@endcond
+
+        /// Returns max(N1, N2) as Max<N1,N2>::result
+        template <int N1, int N2>
+        struct Max {
+            enum { result = details::Max< N1, N2, N1 < N2 >::result  };
+        };
+
+        /// Returns min(N1, N2) as Min<N1,N2>::result
+        template <int N1, int N2>
+        struct Min {
+            enum { result = details::Min< N1, N2, N1 < N2 >::result  };
+        };
+
+    }    // namespace beans
+}    // namespace cds
+
+#endif    // __CDS_NUMERIC_TRAITS_H
diff --git a/cds/opt/buffer.h b/cds/opt/buffer.h
new file mode 100644 (file)
index 0000000..fe1d081
--- /dev/null
@@ -0,0 +1,243 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OPT_BUFFER_H
+#define __CDS_OPT_BUFFER_H
+
+#include <cds/details/defs.h>
+#include <cds/user_setup/allocator.h>
+#include <cds/details/allocator.h>
+#include <cds/int_algo.h>
+
+namespace cds { namespace opt {
+
+    /// [type-option] Option setter for user-provided plain buffer
+    /**
+        This option is used by some container as a random access array for storing
+        container's item; for example, a bounded queue may use
+        this option to define underlying buffer implementation.
+
+        The template parameter \p Type should be rebindable.
+
+        Implementations:
+            - opt::v::static_buffer
+            - opt::v::dynamic_buffer
+    */
+    template <typename Type>
+    struct buffer {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Type buffer;
+        };
+        //@endcond
+    };
+
+    namespace v {
+
+        /// Static buffer (\ref opt::buffer option)
+        /**
+            One of available type for opt::buffer type-option.
+
+            This buffer maintains static array. No dynamic memory allocation performed.
+
+            \par Template parameters:
+                - \p T - item type the buffer stores
+                - \p Capacity - the capacity of buffer. The value must be power of two if \p Exp2 is \p true
+                - \p Exp2 - a boolean flag. If it is \p true the buffer capacity must be power of two.
+                    Otherwise it can be any positive number. Usually, it is required that the buffer has
+                    size of a power of two.
+        */
+        template <typename T, size_t Capacity, bool Exp2 = true>
+        class static_buffer
+        {
+        public:
+            typedef T   value_type  ;   ///< value type
+            static const size_t c_nCapacity = Capacity ;    ///< Capacity
+            static const bool c_bExp2 = Exp2; ///< \p Exp2 flag
+
+            /// Rebind buffer for other template parameters
+            template <typename Q, size_t Capacity2 = c_nCapacity, bool Exp22 = c_bExp2>
+            struct rebind {
+                typedef static_buffer<Q, Capacity2, Exp22> other   ;   ///< Rebind result type
+            };
+        private:
+            //@cond
+            value_type  m_buffer[c_nCapacity];
+            //@endcond
+        public:
+            /// Construct static buffer
+            static_buffer()
+            {
+                // Capacity must be power of 2
+                static_assert( !c_bExp2 || (c_nCapacity & (c_nCapacity - 1)) == 0, "Capacity must be power of two" );
+            }
+            /// Construct buffer of given capacity
+            /**
+                This ctor ignores \p nCapacity argument. The capacity of static buffer
+                is defined by template argument \p Capacity
+            */
+            static_buffer( size_t nCapacity )
+            {
+                // Capacity must be power of 2
+                static_assert( !c_bExp2 || (c_nCapacity & (c_nCapacity - 1)) == 0,  "Capacity must be power of two");
+                //assert( c_nCapacity == nCapacity );
+            }
+
+            /// Get item \p i
+            value_type& operator []( size_t i )
+            {
+                assert( i < capacity() );
+                return m_buffer[i];
+            }
+
+            /// Get item \p i, const version
+            const value_type& operator []( size_t i ) const
+            {
+                assert( i < capacity() );
+                return m_buffer[i];
+            }
+
+            /// Returns buffer capacity
+            CDS_CONSTEXPR size_t capacity() const CDS_NOEXCEPT
+            {
+                return c_nCapacity;
+            }
+
+            /// Zeroize the buffer
+            void zeroize()
+            {
+                memset( m_buffer, 0, capacity() * sizeof(m_buffer[0]) );
+            }
+
+            /// Returns pointer to buffer array
+            value_type * buffer()
+            {
+                return m_buffer;
+            }
+
+            /// Returns pointer to buffer array (const version)
+            value_type * buffer() const
+            {
+                return m_buffer;
+            }
+
+        private:
+            //@cond
+            // non-copyable
+            static_buffer(const static_buffer&);
+            void operator =(const static_buffer&);
+            //@endcond
+        };
+
+
+        /// Dynamically allocated buffer
+        /**
+            One of available opt::buffer type-option.
+
+            This buffer maintains dynamically allocated array.
+            Allocation is performed at construction time.
+
+            \par Template parameters:
+                - \p T - item type storing in the buffer
+                - \p Alloc - an allocator used for allocating internal buffer (\p std::allocator interface)
+                - \p Exp2 - a boolean flag. If it is \p true the buffer capacity must be power of two.
+                    Otherwise it can be any positive number. Usually, it is required that the buffer has
+                    size of a power of two.
+        */
+        template <typename T, class Alloc = CDS_DEFAULT_ALLOCATOR, bool Exp2 = true>
+        class dynamic_buffer
+        {
+        public:
+            typedef T   value_type  ;   ///< Value type
+            static CDS_CONSTEXPR_CONST bool c_bExp2 = Exp2; ///< \p Exp2 flag
+
+            /// Rebind buffer for other template parameters
+            template <typename Q, typename Alloc2=Alloc, bool Exp22 = c_bExp2>
+            struct rebind {
+                typedef dynamic_buffer<Q, Alloc2, Exp22> other   ;  ///< Rebinding result type
+            };
+
+            //@cond
+            typedef cds::details::Allocator<value_type, Alloc>   allocator_type;
+            //@endcond
+
+        private:
+            //@cond
+            value_type *    m_buffer;
+            size_t const    m_nCapacity;
+            //@endcond
+        public:
+            /// Allocates dynamic buffer of given \p nCapacity
+            /**
+                If \p Exp2 class template parameter is \p true then actual capacity
+                of allocating buffer is nearest upper to \p nCapacity power of two.
+            */
+            dynamic_buffer( size_t nCapacity )
+                : m_nCapacity( c_bExp2 ? beans::ceil2(nCapacity) : nCapacity )
+            {
+                assert( m_nCapacity >= 2 );
+                // Capacity must be power of 2
+                assert( !c_bExp2 || (m_nCapacity & (m_nCapacity - 1)) == 0 );
+
+                allocator_type a;
+                m_buffer = a.NewArray( m_nCapacity );
+            }
+
+            /// Destroys dynamically allocated buffer
+            ~dynamic_buffer()
+            {
+                allocator_type a;
+                a.Delete( m_buffer, m_nCapacity );
+            }
+
+            /// Get item \p i
+            value_type& operator []( size_t i )
+            {
+                assert( i < capacity() );
+                return m_buffer[i];
+            }
+
+            /// Get item \p i, const version
+            const value_type& operator []( size_t i ) const
+            {
+                assert( i < capacity() );
+                return m_buffer[i];
+            }
+
+            /// Returns buffer capacity
+            size_t capacity() const CDS_NOEXCEPT
+            {
+                return m_nCapacity;
+            }
+
+            /// Zeroize the buffer
+            void zeroize()
+            {
+                memset( m_buffer, 0, capacity() * sizeof(m_buffer[0]) );
+            }
+
+            /// Returns pointer to buffer array
+            value_type * buffer()
+            {
+                return m_buffer;
+            }
+
+            /// Returns pointer to buffer array (const version)
+            value_type * buffer() const
+            {
+                return m_buffer;
+            }
+
+        private:
+            //@cond
+            // non-copyable
+            dynamic_buffer(const dynamic_buffer&);
+            void operator =(const dynamic_buffer&);
+            //@endcond
+        };
+
+    }   // namespace v
+
+}}  // namespace cds::opt
+
+#endif // #ifndef __CDS_OPT_BUFFER_H
diff --git a/cds/opt/compare.h b/cds/opt/compare.h
new file mode 100644 (file)
index 0000000..f18940f
--- /dev/null
@@ -0,0 +1,264 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OPT_COMPARE_H
+#define __CDS_OPT_COMPARE_H
+
+/*
+    Editions:
+        2011.05.05 khizmax  Created
+*/
+
+#include <cds/opt/options.h>
+
+#include <functional>
+#include <string>
+#include <cds/details/std/type_traits.h>
+
+namespace cds { namespace opt {
+
+    /// [type-option] Option setter for key comparing
+    /**
+        The option sets a type of a functor to compare keys.
+        For comparing two keys \p k1 and \p k2 the functor must return:
+        - 1 if k1 > k2
+        - 0 if k1 == k2
+        - -1 if k1 < k2
+
+        \p Functor is a functor with following interface:
+        \code
+        template <typename T>
+        struct Comparator {
+            int operator ()(const T& r1, const T& r2)
+            {
+                // Comparator body
+            }
+        };
+        \endcode
+        Note that the functor must return \p int, not a \p bool value.
+
+        There are predefined type for \p Functor:
+        - the functor v::less_comparator that implements comparing functor through \p std::less predicate.
+        - the specialization of v::less_comparator functor intended for the string comparison
+
+        You may implement your own comparing functor that satisfies \p Functor interface.
+
+        About relation between \ref opt::less and \ref opt::compare option setters see opt::less description.
+    */
+    template <typename Functor>
+    struct compare {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Functor compare;
+        };
+        //@endcond
+    };
+
+    namespace v {
+
+        /// Comparator based on \p std::less predicate
+        /**
+            This functor is predefined type for \p opt::compare option setter.
+            It is based on \p std::less predicate.
+        */
+        template <typename T>
+        struct less_comparator {
+            /// Operator that compares two value of type \p T
+            int operator()(T const& v1, T const& v2)
+            {
+                if ( std::less<T>()( v1, v2 ) )
+                    return -1;
+                if ( std::less<T>()( v2, v1 ))
+                    return 1;
+                return 0;
+            }
+        };
+
+        /// Comparator specialization for \p std::string
+        /**
+            This functor uses \p std::string::compare method instead of \p std::less predicate.
+        */
+        template <typename T, typename Traits, typename Alloc>
+        struct less_comparator< std::basic_string<T, Traits, Alloc> >
+        {
+            //@cond
+            typedef std::basic_string<T, Traits, Alloc> string_type;
+            int operator()(string_type const& v1, string_type const& v2)
+            {
+                return v1.compare( v2 );
+            }
+            //@endcond
+        };
+    }   // namespace v
+
+    /// [type-option] Option setter for \p less predicate
+    /**
+        The option sets a binary predicate that tests whether a value of a specified type is less than another value of that type.
+        \p Functor interface is similar to \p std::less predicate interface.
+        The standard predicate \p std::less can act as \p Functor:
+        \code typedef cds::opt::less< std::less< int > > opt_less \endcode
+
+        In addition, the option setter may sets non-standard 2-type predicate (\p std::binary_function):
+        \code
+
+        struct foo {
+            int n;
+        };
+
+        template <typename T, typename Q>
+        struct pred_less {
+            bool operator ()( const T& t, const Q& q )
+            { return t.n < q ; }
+            bool operator ()( const Q& q, const T& t )
+            { return q < t.n ; }
+            bool operator ()( const T& t1, const T& t2 )
+            { return t1.n < t2.n ; }
+            bool operator ()( const Q& q1, const Q& q2 )
+            { return q1 < q2 ; }
+        };
+
+        typedef cds::opt::less< pred_less< foo, int > > opt_less;
+        \endcode
+
+        Generally, the default type for \p Functor is \p std::less but it depends on the container used.
+
+        \par Relation between \p opt::less and opt::compare option setters
+        Unless otherwise specified, \p compare option setter has high priority. If opt::compare and opt::less options are specified
+        for a container, the opt::compare option is used:
+        \code
+        // Suppose, hypothetical map_type allows to specify
+        // cds::opt::less and cds::opt::compare options
+
+        typedef map_type< std::string, int,
+            cds::opt::compare< cds::opt::v::less_comparator< std::string > >,
+            cds::opt::less< std::less< std::string > >
+        > my_map_type;
+
+        // For my_map_type, the cds::opt::compare comparator will be used,
+        // the cds::opt::less option is ignored without any warnings.
+        \endcode
+    */
+    template <typename Functor>
+    struct less {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Functor less;
+        };
+        //@endcond
+    };
+
+    //@cond
+    namespace details {
+        template <typename Less>
+        struct make_comparator_from_less
+        {
+            typedef Less less_functor;
+
+            template <typename T, typename Q>
+            int operator ()( T const& t, Q const& q ) const
+            {
+                less_functor f;
+                if ( f( t, q ) )
+                    return -1;
+                if ( f( q, t ) )
+                    return 1;
+                return 0;
+            }
+        };
+
+        template <typename T, typename Traits, bool Forced = true >
+        struct make_comparator
+        {
+            typedef typename Traits::compare compare;
+            typedef typename Traits::less less;
+
+            typedef typename std::conditional<
+                std::is_same< compare, opt::none >::value,
+                typename std::conditional<
+                    std::is_same< less, opt::none >::value,
+                    typename std::conditional< Forced, make_comparator_from_less< std::less<T> >, opt::none >::type,
+                    make_comparator_from_less< less >
+                >::type,
+                compare
+            >::type type;
+        };
+
+        template <typename T, CDS_DECL_OPTIONS>
+        struct make_comparator_from_option_list
+        {
+            struct default_traits {
+                typedef opt::none   compare;
+                typedef opt::none   less;
+            };
+
+            typedef typename make_comparator< T,
+                typename opt::make_options<
+                    typename opt::find_type_traits< default_traits, CDS_OPTIONS >::type
+                    ,CDS_OPTIONS
+                >::type
+            >::type type;
+        };
+    }   // namespace details
+    //@endcond
+
+    /// [type-option] Option setter for \p equal_to predicate
+    /**
+        The option sets a binary predicate that tests whether a value of a specified type is equal to another value of that type.
+        \p Functor interface is similar to \p std::equal_to predicate interface.
+        The standard predicate \p std::equal_to can act as \p Functor:
+        \code typedef cds::opt::equal_to< std::equal_to< int > > opt_equal_to \endcode
+
+        In addition, the option setter may sets non-standard 2-type (or even N-type) predicate (\p std::binary_function):
+        \code
+
+        struct foo {
+            int n;
+        };
+
+        template <typename T, typename Q>
+        struct pred_equal_to {
+            bool operator ()( const T& t, const Q& q )
+            { return t.n == q ; }
+            bool operator ()( const Q& q, const T& t )
+            { return q == t.n ; }
+            bool operator ()( const T& t1, const T& t2 )
+            { return t1.n == t2.n ; }
+            bool operator ()( const Q& q1, const Q& q2 )
+            { return q1 == q2 ; }
+        };
+
+        typedef cds::opt::equal_to< pred_equal_to< foo, int > > opt_equal_to;
+        \endcode
+
+        Generally, the default type for \p Functor is \p std::equal_to but it depends on the container used.
+    */
+    template <typename Functor>
+    struct equal_to {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Functor equal_to;
+        };
+        //@endcond
+    };
+
+    //@cond
+    namespace details {
+        template <typename T, typename Traits, bool Forced = true>
+        struct make_equal_to
+        {
+            typedef typename Traits::equal_to equal_to;
+
+            typedef typename std::conditional<
+                std::is_same< equal_to, opt::none >::value,
+                typename std::conditional< Forced, std::equal_to<T>, opt::none >::type,
+                equal_to
+            >::type type;
+        };
+    }
+    //@endcond
+
+}}  // namespace cds::opt
+
+#endif // #ifndef __CDS_OPT_COMPARE_H
diff --git a/cds/opt/hash.h b/cds/opt/hash.h
new file mode 100644 (file)
index 0000000..643f52d
--- /dev/null
@@ -0,0 +1,571 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OPT_HASH_H
+#define __CDS_OPT_HASH_H
+
+#include <cds/opt/options.h>
+#include <cds/details/hash_functor_selector.h>
+#include <cds/details/std/tuple.h>
+
+namespace cds { namespace opt {
+
+    /// [type-option] Option setter for a hash function
+    /**
+        This option setter specifies hash functor used in unordered containers.
+
+        The default value  of template argument \p Functor is \p cds::opt::v::hash
+        that is synonym for <tt>std::hash</tt> implementation of standard library.
+        If standard C++ library of the compiler you use does not provide TR1 implementation
+        the \p cds library automatically selects <tt>boost::hash</tt>.
+    */
+    template <typename Functor>
+    struct hash {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Functor hash;
+        };
+        //@endcond
+    };
+
+    namespace v {
+        //@cond
+        using cds::details::hash;
+
+        /// Metafunction selecting default hash implementation
+        /**
+            The metafunction selects appropriate hash functor implementation.
+            If \p Hash is not equal to opt::none, then result of metafunction is \p Hash.
+            Otherwise, the result is <tt> std::hash<Q> </tt> or <tt> boost::hash<Q> </tt>
+            depending of compiler you use.
+
+            Note that default hash function like <tt> std::hash<Q> </tt> or <tt> boost::hash<Q> </tt>
+            is generally not suitable for complex type \p Q and its derivatives.
+            You should manually provide particular hash functor for such types.
+        */
+        template <typename Hash>
+        struct hash_selector
+        {
+            typedef Hash    type    ;   ///< resulting implementation of hash functor
+        };
+
+        template <>
+        struct hash_selector<opt::none>
+        {
+            struct type {
+                template <typename Q>
+                size_t operator()( Q const& key ) const
+                {
+                    return hash<Q>()( key );
+                }
+            };
+        };
+        //@endcond
+    }   // namespace v
+
+#ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+    //@cond
+    namespace details {
+        template <class> struct hash_list;
+        template <typename... Functors>
+        struct hash_list< std::tuple<Functors...> >
+        {
+            static size_t const size = sizeof...(Functors);
+            typedef size_t values[size];
+            typedef std::tuple<Functors...> hash_tuple_type;
+
+            hash_tuple_type hash_tuple;
+
+            hash_list()
+            {}
+
+            hash_list( hash_tuple_type const& t)
+                : hash_tuple( t )
+            {}
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            hash_list( hash_tuple_type&& t)
+                : hash_tuple( std::forward<hash_tuple_type>(t) )
+            {}
+#       endif
+
+            template <size_t I, typename T>
+            typename std::enable_if< (I == sizeof...(Functors)) >::type apply( size_t * dest, T const& v ) const
+            {}
+
+            template <size_t I, typename T>
+            typename std::enable_if< (I < sizeof...(Functors)) >::type apply( size_t * dest, T const& v ) const
+            {
+                dest[I] = std::get<I>( hash_tuple )( v );
+                apply<I+1>( dest, v );
+            }
+
+            template <typename T>
+            void operator()( size_t * dest, T const& v ) const
+            {
+                apply<0>( dest, v );
+            }
+        };
+    } // namespace details
+    //@endcond
+
+    //@cond
+    // At least, two functors must be provided. Single functor is not supported
+//#if CDS_COMPILER != CDS_COMPILER_INTEL
+    // Intel C++ compiler does not support
+    template <typename Functor> struct hash< std::tuple<Functor> >;
+//#endif
+    //@endcond
+
+    /// Multi-functor hash option setter - specialization for std::tuple
+    template <typename... Functors>
+    struct hash< std::tuple<Functors...> >
+    {
+//#   if CDS_COMPILER == CDS_COMPILER_INTEL
+        //static_assert( sizeof...(Functors) > 1, "At least, two functors must be provided. Single functor is not supported" );
+//#   endif
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef details::hash_list< std::tuple<Functors...> >  hash;
+        };
+        //@endcond
+    };
+
+#else   // no variadic template support
+    namespace details {
+        template <typename T> struct hash_list;
+        template <typename F1, typename F2>
+        struct hash_list< std::tuple<F1, F2> >
+        {
+            static size_t const size = 2;
+            typedef size_t values[size];
+            typedef std::tuple<F1, F2>  hash_tuple_type;
+
+            hash_tuple_type hash_tuple;
+
+            hash_list()
+            {}
+            hash_list( hash_tuple_type const& t)
+                : hash_tuple( t )
+            {}
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            hash_list( hash_tuple_type&& t)
+                : hash_tuple( t )
+            {}
+#       endif
+
+            template <typename T>
+            void operator()( size_t * dest, T const& v ) const
+            {
+                dest[0] = std::get<0>( hash_tuple )( v );
+                dest[1] = std::get<1>( hash_tuple )( v );
+            }
+        };
+
+        template <typename F1, typename F2, typename F3>
+        struct hash_list< std::tuple<F1, F2, F3> >
+        {
+            static size_t const size = 3;
+            typedef size_t values[size];
+            typedef std::tuple<F1, F2, F3> hash_tuple_type;
+
+            hash_tuple_type hash_tuple;
+
+            hash_list()
+            {}
+            hash_list( hash_tuple_type const& t)
+                : hash_tuple( t )
+            {}
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            hash_list( hash_tuple_type&& t)
+                : hash_tuple( t )
+            {}
+#       endif
+
+            template <typename T>
+            void operator()( size_t * dest, T const& v ) const
+            {
+                dest[0] = std::get<0>( hash_tuple )( v );
+                dest[1] = std::get<1>( hash_tuple )( v );
+                dest[2] = std::get<2>( hash_tuple )( v );
+            }
+        };
+
+        template <typename F1, typename F2, typename F3, typename F4>
+        struct hash_list< std::tuple<F1, F2, F3, F4> >
+        {
+            static size_t const size = 4;
+            typedef size_t values[size];
+            typedef std::tuple<F1, F2, F3, F4> hash_tuple_type;
+
+            hash_tuple_type hash_tuple;
+
+            hash_list()
+            {}
+            hash_list( hash_tuple_type const& t)
+                : hash_tuple( t )
+            {}
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            hash_list( hash_tuple_type&& t)
+                : hash_tuple( t )
+            {}
+#       endif
+
+            template <typename T>
+            void operator()( size_t * dest, T const& v ) const
+            {
+                dest[0] = std::get<0>( hash_tuple )( v );
+                dest[1] = std::get<1>( hash_tuple )( v );
+                dest[2] = std::get<2>( hash_tuple )( v );
+                dest[3] = std::get<3>( hash_tuple )( v );
+            }
+        };
+
+        template <typename F1, typename F2, typename F3, typename F4, typename F5>
+        struct hash_list< std::tuple<F1, F2, F3, F4, F5> >
+        {
+            static size_t const size = 5;
+            typedef size_t values[size];
+            typedef std::tuple<F1, F2, F3, F4, F5> hash_tuple_type;
+
+            hash_tuple_type hash_tuple;
+
+            hash_list()
+            {}
+            hash_list( hash_tuple_type const& t)
+                : hash_tuple( t )
+            {}
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            hash_list( hash_tuple_type&& t)
+                : hash_tuple( t )
+            {}
+#       endif
+
+            template <typename T>
+            void operator()( size_t * dest, T const& v ) const
+            {
+                dest[0] = std::get<0>( hash_tuple )( v );
+                dest[1] = std::get<1>( hash_tuple )( v );
+                dest[2] = std::get<2>( hash_tuple )( v );
+                dest[3] = std::get<3>( hash_tuple )( v );
+                dest[4] = std::get<4>( hash_tuple )( v );
+            }
+        };
+
+        template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6>
+        struct hash_list< std::tuple<F1, F2, F3, F4, F5, F6> >
+        {
+            static size_t const size = 6;
+            typedef size_t values[size];
+            typedef std::tuple<F1, F2, F3, F4, F5, F6> hash_tuple_type;
+
+            hash_tuple_type hash_tuple;
+
+            hash_list()
+            {}
+            hash_list( hash_tuple_type const& t)
+                : hash_tuple( t )
+            {}
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            hash_list( hash_tuple_type&& t)
+                : hash_tuple( t )
+            {}
+#       endif
+
+            template <typename T>
+            void operator()( size_t * dest, T const& v ) const
+            {
+                dest[0] = std::get<0>( hash_tuple )( v );
+                dest[1] = std::get<1>( hash_tuple )( v );
+                dest[2] = std::get<2>( hash_tuple )( v );
+                dest[3] = std::get<3>( hash_tuple )( v );
+                dest[4] = std::get<4>( hash_tuple )( v );
+                dest[5] = std::get<5>( hash_tuple )( v );
+            }
+        };
+
+        template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7>
+        struct hash_list< std::tuple<F1, F2, F3, F4, F5, F6, F7> >
+        {
+            static size_t const size = 7;
+            typedef size_t values[size];
+            typedef std::tuple<F1, F2, F3, F4, F5, F6, F7> hash_tuple_type;
+
+            hash_tuple_type hash_tuple;
+
+            hash_list()
+            {}
+            hash_list( hash_tuple_type const& t)
+                : hash_tuple( t )
+            {}
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            hash_list( hash_tuple_type&& t)
+                : hash_tuple( t )
+            {}
+#       endif
+
+            template <typename T>
+            void operator()( size_t * dest, T const& v ) const
+            {
+                dest[0] = std::get<0>( hash_tuple )( v );
+                dest[1] = std::get<1>( hash_tuple )( v );
+                dest[2] = std::get<2>( hash_tuple )( v );
+                dest[3] = std::get<3>( hash_tuple )( v );
+                dest[4] = std::get<4>( hash_tuple )( v );
+                dest[5] = std::get<5>( hash_tuple )( v );
+                dest[6] = std::get<6>( hash_tuple )( v );
+            }
+        };
+
+        template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8>
+        struct hash_list< std::tuple<F1, F2, F3, F4, F5, F6, F7, F8> >
+        {
+            static size_t const size = 8;
+            typedef size_t values[size];
+            typedef std::tuple<F1, F2, F3, F4, F5, F6, F7, F8> hash_tuple_type;
+
+            hash_tuple_type hash_tuple;
+
+            hash_list()
+            {}
+            hash_list( hash_tuple_type const& t)
+                : hash_tuple( t )
+            {}
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            hash_list( hash_tuple_type&& t)
+                : hash_tuple( t )
+            {}
+#       endif
+
+            template <typename T>
+            void operator()( size_t * dest, T const& v ) const
+            {
+                dest[0] = std::get<0>( hash_tuple )( v );
+                dest[1] = std::get<1>( hash_tuple )( v );
+                dest[2] = std::get<2>( hash_tuple )( v );
+                dest[3] = std::get<3>( hash_tuple )( v );
+                dest[4] = std::get<4>( hash_tuple )( v );
+                dest[5] = std::get<5>( hash_tuple )( v );
+                dest[6] = std::get<6>( hash_tuple )( v );
+                dest[7] = std::get<7>( hash_tuple )( v );
+            }
+        };
+
+#if !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1700)
+        // MSVC 11: max count of argument is 8
+
+        template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9>
+        struct hash_list< std::tuple<F1, F2, F3, F4, F5, F6, F7, F8, F9> >
+        {
+            static size_t const size = 9;
+            typedef size_t values[size];
+            typedef std::tuple<F1, F2, F3, F4, F5, F6, F7, F8, F9> hash_tuple_type;
+
+            hash_tuple_type hash_tuple;
+
+            hash_list()
+            {}
+            hash_list( hash_tuple_type const& t)
+                : hash_tuple( t )
+            {}
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            hash_list( hash_tuple_type&& t)
+                : hash_tuple( t )
+            {}
+#       endif
+
+            template <typename T>
+            void operator()( size_t * dest, T const& v ) const
+            {
+                dest[0] = std::get<0>( hash_tuple )( v );
+                dest[1] = std::get<1>( hash_tuple )( v );
+                dest[2] = std::get<2>( hash_tuple )( v );
+                dest[3] = std::get<3>( hash_tuple )( v );
+                dest[4] = std::get<4>( hash_tuple )( v );
+                dest[5] = std::get<5>( hash_tuple )( v );
+                dest[6] = std::get<6>( hash_tuple )( v );
+                dest[7] = std::get<7>( hash_tuple )( v );
+                dest[8] = std::get<8>( hash_tuple )( v );
+            }
+        };
+
+        template <typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9,
+                  typename F10>
+        struct hash_list< std::tuple<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10> >
+        {
+            static size_t const size = 10;
+            typedef size_t values[size];
+            typedef std::tuple<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10> hash_tuple_type;
+
+            hash_tuple_type hash_tuple;
+
+            hash_list()
+            {}
+            hash_list( hash_tuple_type const& t)
+                : hash_tuple( t )
+            {}
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            hash_list( hash_tuple_type&& t)
+                : hash_tuple( t )
+            {}
+#       endif
+
+            template <typename T>
+            void operator()( size_t * dest, T const& v ) const
+            {
+                dest[0] = std::get<0>( hash_tuple )( v );
+                dest[1] = std::get<1>( hash_tuple )( v );
+                dest[2] = std::get<2>( hash_tuple )( v );
+                dest[3] = std::get<3>( hash_tuple )( v );
+                dest[4] = std::get<4>( hash_tuple )( v );
+                dest[5] = std::get<5>( hash_tuple )( v );
+                dest[6] = std::get<6>( hash_tuple )( v );
+                dest[7] = std::get<7>( hash_tuple )( v );
+                dest[8] = std::get<8>( hash_tuple )( v );
+                dest[9] = std::get<9>( hash_tuple )( v );
+            }
+        };
+#endif
+    } // namespace details
+
+    template< typename F1, typename F2 >
+    struct hash< std::tuple< F1, F2 > >
+    {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef details::hash_list< std::tuple<F1, F2> >  hash;
+        };
+        //@endcond
+    };
+    template< typename F1, typename F2, typename F3 >
+    struct hash< std::tuple< F1, F2, F3 > >
+    {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef details::hash_list< std::tuple<F1, F2, F3> >  hash;
+        };
+        //@endcond
+    };
+    template< typename F1, typename F2, typename F3, typename F4 >
+    struct hash< std::tuple< F1, F2, F3, F4 > >
+    {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef details::hash_list< std::tuple<F1, F2, F3, F4> >  hash;
+        };
+        //@endcond
+    };
+    template< typename F1, typename F2, typename F3, typename F4, typename F5 >
+    struct hash< std::tuple< F1, F2, F3, F4, F5 > >
+    {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef details::hash_list< std::tuple<F1, F2, F3, F4, F5> >  hash;
+        };
+        //@endcond
+    };
+    template< typename F1, typename F2, typename F3, typename F4, typename F5, typename F6 >
+    struct hash< std::tuple< F1, F2, F3, F4, F5, F6 > >
+    {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef details::hash_list< std::tuple<F1, F2, F3, F4, F5, F6> >  hash;
+        };
+        //@endcond
+    };
+    template< typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7 >
+    struct hash< std::tuple< F1, F2, F3, F4, F5, F6, F7 > >
+    {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef details::hash_list< std::tuple<F1, F2, F3, F4, F5, F6, F7> >  hash;
+        };
+        //@endcond
+    };
+    template< typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8 >
+    struct hash< std::tuple< F1, F2, F3, F4, F5, F6, F7, F8 > >
+    {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef details::hash_list< std::tuple<F1, F2, F3, F4, F5, F6, F7, F8> >  hash;
+        };
+        //@endcond
+    };
+
+#if !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1700)
+    // MSVC 11: max count of argument is 8
+
+    template< typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9 >
+    struct hash< std::tuple< F1, F2, F3, F4, F5, F6, F7, F8, F9 > >
+    {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef details::hash_list< std::tuple<F1, F2, F3, F4, F5, F6, F7, F8, F9> >  hash;
+        };
+        //@endcond
+    };
+    template< typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9,
+              typename F10 >
+    struct hash< std::tuple< F1, F2, F3, F4, F5, F6, F7, F8, F9, F10 > >
+    {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef details::hash_list< std::tuple<F1, F2, F3, F4, F5, F6, F7, F8, F9, F10> >  hash;
+        };
+        //@endcond
+    };
+#endif  // !MSVC11
+#endif  // #ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+
+    //@cond
+    namespace details {
+
+        template <class HashList, typename WrappedType, typename Wrapper>
+        struct hash_list_wrapper {
+            typedef HashList                            hash_list;
+            typedef WrappedType                         wrapped_type;
+            typedef Wrapper                             wrapper_type;
+
+            typedef typename hash_list::hash_tuple_type hash_tuple_type;
+            static size_t const size = hash_list::size;
+
+            hash_list   m_wrappedList;
+
+            hash_list_wrapper()
+            {}
+            hash_list_wrapper( hash_tuple_type const& t)
+                : m_wrappedList( t )
+            {}
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            hash_list_wrapper( hash_tuple_type&& t)
+                : m_wrappedList( std::forward<hash_tuple_type>(t) )
+            {}
+#       endif
+
+            void operator()( size_t * dest, wrapped_type const& what ) const
+            {
+                m_wrappedList( dest, wrapper_type()( what ));
+            }
+
+            template <typename Q>
+            void operator()( size_t * dest, Q const& what) const
+            {
+                m_wrappedList( dest, what );
+            }
+        };
+
+    } // namespace details
+    //@endcond
+
+}} // namespace cds::opt
+
+#endif // #ifndef __CDS_OPT_HASH_H
diff --git a/cds/opt/make_options_std.h b/cds/opt/make_options_std.h
new file mode 100644 (file)
index 0000000..77260d3
--- /dev/null
@@ -0,0 +1,535 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OPT_MAKE_OPTIONS_STD_H
+#define __CDS_OPT_MAKE_OPTIONS_STD_H
+
+#ifndef __CDS_OPT_OPTIONS_H
+#   error <cds/opt/options.h> must be included instead of <cds/opt/make_options_std.h>
+#endif
+
+#include <cds/details/void_selector.h>
+
+// @cond
+
+#define CDS_DECL_OPTIONS1   typename O1=cds::opt::none
+#define CDS_DECL_OPTIONS2   CDS_DECL_OPTIONS1,typename O2=cds::opt::none
+#define CDS_DECL_OPTIONS3   CDS_DECL_OPTIONS2,typename O3=cds::opt::none
+#define CDS_DECL_OPTIONS4   CDS_DECL_OPTIONS3,typename O4=cds::opt::none
+#define CDS_DECL_OPTIONS5   CDS_DECL_OPTIONS4,typename O5=cds::opt::none
+#define CDS_DECL_OPTIONS6   CDS_DECL_OPTIONS5,typename O6=cds::opt::none
+#define CDS_DECL_OPTIONS7   CDS_DECL_OPTIONS6,typename O7=cds::opt::none
+#define CDS_DECL_OPTIONS8   CDS_DECL_OPTIONS7,typename O8=cds::opt::none
+#define CDS_DECL_OPTIONS9   CDS_DECL_OPTIONS8,typename O9=cds::opt::none
+#define CDS_DECL_OPTIONS10  CDS_DECL_OPTIONS9,typename O10=cds::opt::none
+#define CDS_DECL_OPTIONS11  CDS_DECL_OPTIONS10,typename O11=cds::opt::none
+#define CDS_DECL_OPTIONS12  CDS_DECL_OPTIONS11,typename O12=cds::opt::none
+#define CDS_DECL_OPTIONS13  CDS_DECL_OPTIONS12,typename O13=cds::opt::none
+#define CDS_DECL_OPTIONS14  CDS_DECL_OPTIONS13,typename O14=cds::opt::none
+#define CDS_DECL_OPTIONS15  CDS_DECL_OPTIONS14,typename O15=cds::opt::none
+#define CDS_DECL_OPTIONS16  CDS_DECL_OPTIONS15,typename O16=cds::opt::none
+
+#define CDS_DECL_OPTIONS    CDS_DECL_OPTIONS16
+
+#define CDS_DECL_OTHER_OPTIONS1   typename OO1=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS2   CDS_DECL_OTHER_OPTIONS1,typename OO2=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS3   CDS_DECL_OTHER_OPTIONS2,typename OO3=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS4   CDS_DECL_OTHER_OPTIONS3,typename OO4=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS5   CDS_DECL_OTHER_OPTIONS4,typename OO5=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS6   CDS_DECL_OTHER_OPTIONS5,typename OO6=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS7   CDS_DECL_OTHER_OPTIONS6,typename OO7=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS8   CDS_DECL_OTHER_OPTIONS7,typename OO8=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS9   CDS_DECL_OTHER_OPTIONS8,typename OO9=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS10  CDS_DECL_OTHER_OPTIONS9,typename OO10=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS11  CDS_DECL_OTHER_OPTIONS10,typename OO11=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS12  CDS_DECL_OTHER_OPTIONS11,typename OO12=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS13  CDS_DECL_OTHER_OPTIONS12,typename OO13=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS14  CDS_DECL_OTHER_OPTIONS13,typename OO14=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS15  CDS_DECL_OTHER_OPTIONS14,typename OO15=cds::opt::none
+#define CDS_DECL_OTHER_OPTIONS16  CDS_DECL_OTHER_OPTIONS15,typename OO16=cds::opt::none
+
+// for template specializations
+#define CDS_SPEC_OPTIONS1   typename O1
+#define CDS_SPEC_OPTIONS2   CDS_SPEC_OPTIONS1,typename O2
+#define CDS_SPEC_OPTIONS3   CDS_SPEC_OPTIONS2,typename O3
+#define CDS_SPEC_OPTIONS4   CDS_SPEC_OPTIONS3,typename O4
+#define CDS_SPEC_OPTIONS5   CDS_SPEC_OPTIONS4,typename O5
+#define CDS_SPEC_OPTIONS6   CDS_SPEC_OPTIONS5,typename O6
+#define CDS_SPEC_OPTIONS7   CDS_SPEC_OPTIONS6,typename O7
+#define CDS_SPEC_OPTIONS8   CDS_SPEC_OPTIONS7,typename O8
+#define CDS_SPEC_OPTIONS9   CDS_SPEC_OPTIONS8,typename O9
+#define CDS_SPEC_OPTIONS10  CDS_SPEC_OPTIONS9,typename O10
+#define CDS_SPEC_OPTIONS11  CDS_SPEC_OPTIONS10,typename O11
+#define CDS_SPEC_OPTIONS12  CDS_SPEC_OPTIONS11,typename O12
+#define CDS_SPEC_OPTIONS13  CDS_SPEC_OPTIONS12,typename O13
+#define CDS_SPEC_OPTIONS14  CDS_SPEC_OPTIONS13,typename O14
+#define CDS_SPEC_OPTIONS15  CDS_SPEC_OPTIONS14,typename O15
+#define CDS_SPEC_OPTIONS16  CDS_SPEC_OPTIONS15,typename O16
+
+#define CDS_SPEC_OPTIONS    CDS_SPEC_OPTIONS16
+
+#define CDS_OPTIONS1    O1
+#define CDS_OPTIONS2    O1,O2
+#define CDS_OPTIONS3    O1,O2,O3
+#define CDS_OPTIONS4    O1,O2,O3,O4
+#define CDS_OPTIONS5    O1,O2,O3,O4,O5
+#define CDS_OPTIONS6    O1,O2,O3,O4,O5,O6
+#define CDS_OPTIONS7    O1,O2,O3,O4,O5,O6,O7
+#define CDS_OPTIONS8    O1,O2,O3,O4,O5,O6,O7,O8
+#define CDS_OPTIONS9    O1,O2,O3,O4,O5,O6,O7,O8,O9
+#define CDS_OPTIONS10   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10
+#define CDS_OPTIONS11   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11
+#define CDS_OPTIONS12   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12
+#define CDS_OPTIONS13   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13
+#define CDS_OPTIONS14   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14
+#define CDS_OPTIONS15   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15
+#define CDS_OPTIONS16   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15,O16
+//#define CDS_OPTIONS17   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15,O16,O17
+//#define CDS_OPTIONS18   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15,O16,O17,O18
+//#define CDS_OPTIONS19   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15,O16,O17,O18,O19
+//#define CDS_OPTIONS20   O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15,O16,O17,O18,O19,O20
+
+#define CDS_OPTIONS     CDS_OPTIONS16
+
+#define CDS_OTHER_OPTIONS1    OO1
+#define CDS_OTHER_OPTIONS2    OO1,OO2
+#define CDS_OTHER_OPTIONS3    OO1,OO2,OO3
+#define CDS_OTHER_OPTIONS4    OO1,OO2,OO3,OO4
+#define CDS_OTHER_OPTIONS5    OO1,OO2,OO3,OO4,OO5
+#define CDS_OTHER_OPTIONS6    OO1,OO2,OO3,OO4,OO5,OO6
+#define CDS_OTHER_OPTIONS7    OO1,OO2,OO3,OO4,OO5,OO6,OO7
+#define CDS_OTHER_OPTIONS8    OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8
+#define CDS_OTHER_OPTIONS9    OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9
+#define CDS_OTHER_OPTIONS10   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10
+#define CDS_OTHER_OPTIONS11   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11
+#define CDS_OTHER_OPTIONS12   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11,OO12
+#define CDS_OTHER_OPTIONS13   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11,OO12,OO13
+#define CDS_OTHER_OPTIONS14   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11,OO12,OO13,OO14
+#define CDS_OTHER_OPTIONS15   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11,OO12,OO13,OO14,OO15
+#define CDS_OTHER_OPTIONS16   OO1,OO2,OO3,OO4,OO5,OO6,OO7,OO8,OO9,OO10,OO11,OO12,OO13,OO14,OO15,OO16
+
+namespace cds { namespace opt {
+
+    template<typename OptionList, typename Option>
+    struct do_pack
+    {
+        // Use "pack" member template to pack options
+        typedef typename Option::template pack<OptionList> type;
+    };
+
+    template <
+        typename DefaultOptions
+        ,typename O1 = none
+        ,typename O2 = none
+        ,typename O3 = none
+        ,typename O4 = none
+        ,typename O5 = none
+        ,typename O6 = none
+        ,typename O7 = none
+        ,typename O8 = none
+        ,typename O9 = none
+        ,typename O10 = none
+        ,typename O11 = none
+        ,typename O12 = none
+        ,typename O13 = none
+        ,typename O14 = none
+        ,typename O15 = none
+        ,typename O16 = none
+    >
+    struct make_options {
+        /*
+        typedef
+            typename do_pack<
+                typename do_pack<
+                    typename do_pack<
+                        typename do_pack<
+                            typename do_pack<
+                                typename do_pack<
+                                    typename do_pack<
+                                        typename do_pack<
+                                            typename do_pack<
+                                                typename do_pack<
+                                                    typename do_pack<
+                                                        typename do_pack<
+                                                            typename do_pack<
+                                                                typename do_pack<
+                                                                    typename do_pack<
+                                                                        typename do_pack<
+                                                                            DefaultOptions
+                                                                            ,O16
+                                                                        >::type
+                                                                        ,O15
+                                                                    >::type
+                                                                    ,O14
+                                                                >::type
+                                                                ,O13
+                                                            >::type
+                                                            ,O12
+                                                        >::type
+                                                        ,O11
+                                                    >::type
+                                                    ,O10
+                                                >::type
+                                                ,O9
+                                            >::type
+                                            ,O8
+                                        >::type
+                                        ,O7
+                                    >::type
+                                    ,O6
+                                >::type
+                                ,O5
+                            >::type
+                            ,O4
+                        >::type
+                        ,O3
+                    >::type
+                    ,O2
+                >::type
+                ,O1
+            >::type
+        type;
+        */
+        struct type: public 
+            do_pack<
+                typename do_pack<
+                    typename do_pack<
+                        typename do_pack<
+                            typename do_pack<
+                                typename do_pack<
+                                    typename do_pack<
+                                        typename do_pack<
+                                            typename do_pack<
+                                                typename do_pack<
+                                                    typename do_pack<
+                                                        typename do_pack<
+                                                            typename do_pack<
+                                                                typename do_pack<
+                                                                    typename do_pack<
+                                                                        typename do_pack<
+                                                                            DefaultOptions
+                                                                            ,O16
+                                                                        >::type
+                                                                        ,O15
+                                                                    >::type
+                                                                    ,O14
+                                                                >::type
+                                                                ,O13
+                                                            >::type
+                                                            ,O12
+                                                        >::type
+                                                        ,O11
+                                                    >::type
+                                                    ,O10
+                                                >::type
+                                                ,O9
+                                            >::type
+                                            ,O8
+                                        >::type
+                                        ,O7
+                                    >::type
+                                    ,O6
+                                >::type
+                                ,O5
+                            >::type
+                            ,O4
+                        >::type
+                        ,O3
+                    >::type
+                    ,O2
+                >::type
+                ,O1
+            >::type
+        {};
+    };
+
+
+    // *****************************************************************
+    // find_type_traits metafunction
+    // *****************************************************************
+
+    namespace details {
+        template <typename T, typename DefaultOptions>
+        struct find_type_traits_option {
+            typedef DefaultOptions type;
+        };
+
+        template <typename T, typename DefaultOptions>
+        struct find_type_traits_option< cds::opt::type_traits<T>, DefaultOptions> {
+            typedef T  type;
+        };
+    }
+
+    template <
+        typename DefaultOptions
+        ,typename O1 = none
+        ,typename O2 = none
+        ,typename O3 = none
+        ,typename O4 = none
+        ,typename O5 = none
+        ,typename O6 = none
+        ,typename O7 = none
+        ,typename O8 = none
+        ,typename O9 = none
+        ,typename O10 = none
+        ,typename O11 = none
+        ,typename O12 = none
+        ,typename O13 = none
+        ,typename O14 = none
+        ,typename O15 = none
+        ,typename O16 = none
+    >
+    struct find_type_traits {
+        /*
+        typedef typename details::find_type_traits_option< O1,
+            typename details::find_type_traits_option< O2,
+                typename details::find_type_traits_option< O3,
+                    typename details::find_type_traits_option< O4,
+                        typename details::find_type_traits_option< O5,
+                            typename details::find_type_traits_option< O6,
+                                typename details::find_type_traits_option< O7,
+                                    typename details::find_type_traits_option< O8,
+                                        typename details::find_type_traits_option< O9,
+                                            typename details::find_type_traits_option< O10,
+                                                typename details::find_type_traits_option< O11,
+                                                    typename details::find_type_traits_option< O12,
+                                                        typename details::find_type_traits_option< O13,
+                                                            typename details::find_type_traits_option< O14,
+                                                                typename details::find_type_traits_option< O15,
+                                                                    typename details::find_type_traits_option< O16, DefaultOptions>::type
+                                                                >::type
+                                                            >::type
+                                                        >::type
+                                                    >::type
+                                                >::type
+                                            >::type
+                                        >::type
+                                    >::type
+                                >::type
+                            >::type
+                        >::type
+                    >::type
+                >::type
+            >::type
+        >::type type;
+        */
+        struct type: public details::find_type_traits_option< O1,
+            typename details::find_type_traits_option< O2,
+                typename details::find_type_traits_option< O3,
+                    typename details::find_type_traits_option< O4,
+                        typename details::find_type_traits_option< O5,
+                            typename details::find_type_traits_option< O6,
+                                typename details::find_type_traits_option< O7,
+                                    typename details::find_type_traits_option< O8,
+                                        typename details::find_type_traits_option< O9,
+                                            typename details::find_type_traits_option< O10,
+                                                typename details::find_type_traits_option< O11,
+                                                    typename details::find_type_traits_option< O12,
+                                                        typename details::find_type_traits_option< O13,
+                                                            typename details::find_type_traits_option< O14,
+                                                                typename details::find_type_traits_option< O15,
+                                                                    typename details::find_type_traits_option< O16, DefaultOptions>::type
+                                                                >::type
+                                                            >::type
+                                                        >::type
+                                                    >::type
+                                                >::type
+                                            >::type
+                                        >::type
+                                    >::type
+                                >::type
+                            >::type
+                        >::type
+                    >::type
+                >::type
+            >::type
+        >::type
+        {};
+    };
+
+
+    // *****************************************************************
+    // find_option metafunction
+    // *****************************************************************
+    namespace details {
+
+        template <typename A, typename B>
+        struct select_option
+        {
+            typedef void type;
+        };
+
+        template <template <typename> class What, typename Option, typename Default>
+        struct select_option< What<Option>, What<Default> >
+        {
+            typedef What<Option>   type;
+        };
+
+        // Specializations for integral type of option
+#define _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION( _type ) template <template <_type> class What, _type Option, _type Default> \
+        struct select_option< What<Option>, What<Default> > { typedef What<Option>   type    ; };
+
+// For user-defined enum types
+#define CDS_DECLARE_FIND_OPTION_INTEGRAL_SPECIALIZATION( _type ) namespace cds { namespace opt { namespace details { _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(_type ) }}}
+
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(bool)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(char)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned char)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(signed char)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(short int)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned short int)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(int)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned int)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(long)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned long)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(long long)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned long long)
+
+
+        template <typename What, typename Opt, typename Result>
+        struct find_option
+        {
+            typedef typename cds::details::void_selector< typename select_option< Opt, What >::type, Result >::type type;
+        };
+
+        template <typename What, typename Opt>
+        struct find_option< What, Opt, void>
+        {
+            typedef typename select_option< Opt, What >::type  type;
+        };
+
+        template <typename What, typename Result>
+        struct find_option_decision
+        {
+            typedef Result type;
+        };
+
+        template <typename What>
+        struct find_option_decision<What, void>
+        {
+            typedef What type;
+        };
+
+
+    } // namespace details
+
+    template <
+        typename What
+        ,typename O1 = none
+        ,typename O2 = none
+        ,typename O3 = none
+        ,typename O4 = none
+        ,typename O5 = none
+        ,typename O6 = none
+        ,typename O7 = none
+        ,typename O8 = none
+        ,typename O9 = none
+        ,typename O10 = none
+        ,typename O11 = none
+        ,typename O12 = none
+        ,typename O13 = none
+        ,typename O14 = none
+        ,typename O15 = none
+        ,typename O16 = none
+    >
+    struct find_option {
+        typedef typename details::find_option_decision< What,
+             typename details::find_option< What, O1,
+                typename details::find_option< What, O2,
+                    typename details::find_option< What, O3,
+                        typename details::find_option< What, O4,
+                            typename details::find_option< What, O5,
+                                typename details::find_option< What, O6,
+                                    typename details::find_option< What, O7,
+                                        typename details::find_option< What, O8,
+                                            typename details::find_option< What, O9,
+                                                typename details::find_option< What, O10,
+                                                    typename details::find_option< What, O11,
+                                                        typename details::find_option< What, O12,
+                                                            typename details::find_option< What, O13,
+                                                                typename details::find_option< What, O14,
+                                                                    typename details::find_option< What, O15,
+                                                                        typename details::find_option< What, O16, void >::type
+                                                                    >::type
+                                                                >::type
+                                                            >::type
+                                                        >::type
+                                                    >::type
+                                                >::type
+                                            >::type
+                                        >::type
+                                    >::type
+                                >::type
+                            >::type
+                        >::type
+                    >::type
+                >::type
+            >::type
+        >::type type;
+    };
+
+
+    // *****************************************************************
+    // select metafunction
+    // *****************************************************************
+
+    namespace details {
+
+        template <typename What, typename Tag, typename Value, typename Others>
+        struct select
+        {
+            typedef typename Others   type;
+        };
+
+        template <typename What, typename Value, typename Others>
+        struct select< What, What, Value, Others>
+        {
+            typedef Value   type;
+        };
+
+        template <typename What, typename Tag, typename Value>
+        struct select< What, Tag, Value, void>
+        {
+            typedef What    type;
+        };
+
+        template <typename What, typename Value>
+        struct select< What, What, Value, void>
+        {
+            typedef Value    type;
+        };
+    }   // namespace details
+
+    template <typename What,
+        typename Tag1, typename Value1,
+        typename Tag2 = none, typename Value2 = none,
+        typename Tag3 = none, typename Value3 = none,
+        typename Tag4 = none, typename Value4 = none,
+        typename Tag5 = none, typename Value5 = none,
+        typename Tag6 = none, typename Value6 = none,
+        typename Tag7 = none, typename Value7 = none,
+        typename Tag8 = none, typename Value8 = none
+    >
+    struct select {
+        typedef typename details::select< What, Tag1, Value1,
+            typename details::select< What, Tag2, Value2,
+                typename details::select< What, Tag3, Value3,
+                    typename details::select< What, Tag4, Value4,
+                        typename details::select< What, Tag5, Value5,
+                            typename details::select< What, Tag6, Value6,
+                                typename details::select< What, Tag7, Value7,
+                                    typename details::select< What, Tag8, Value8, void
+                                    >::type
+                                >::type
+                            >::type
+                        >::type
+                    >::type
+                >::type
+            >::type
+        >::type type;
+    };
+
+
+}}  // namespace cds::opt
+//@endcond
+
+#endif // #ifndef __CDS_OPT_MAKE_OPTIONS_STD_H
diff --git a/cds/opt/make_options_var.h b/cds/opt/make_options_var.h
new file mode 100644 (file)
index 0000000..8669e83
--- /dev/null
@@ -0,0 +1,398 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OPT_MAKE_OPTIONS_VAR_H
+#define __CDS_OPT_MAKE_OPTIONS_VAR_H
+
+#ifndef __CDS_OPT_OPTIONS_H
+#   error <cds/opt/options.h> must be included instead of <cds/opt/make_options_var.h>
+#endif
+
+#define CDS_DECL_OPTIONS1   typename... Options
+#define CDS_DECL_OPTIONS2   typename... Options
+#define CDS_DECL_OPTIONS3   typename... Options
+#define CDS_DECL_OPTIONS4   typename... Options
+#define CDS_DECL_OPTIONS5   typename... Options
+#define CDS_DECL_OPTIONS6   typename... Options
+#define CDS_DECL_OPTIONS7   typename... Options
+#define CDS_DECL_OPTIONS8   typename... Options
+#define CDS_DECL_OPTIONS9   typename... Options
+#define CDS_DECL_OPTIONS10  typename... Options
+#define CDS_DECL_OPTIONS11  typename... Options
+#define CDS_DECL_OPTIONS12  typename... Options
+#define CDS_DECL_OPTIONS13  typename... Options
+#define CDS_DECL_OPTIONS14  typename... Options
+#define CDS_DECL_OPTIONS15  typename... Options
+#define CDS_DECL_OPTIONS16  typename... Options
+
+#define CDS_DECL_OPTIONS    typename... Options
+
+
+#define CDS_DECL_OTHER_OPTIONS1   typename... Options2
+#define CDS_DECL_OTHER_OPTIONS2   typename... Options2
+#define CDS_DECL_OTHER_OPTIONS3   typename... Options2
+#define CDS_DECL_OTHER_OPTIONS4   typename... Options2
+#define CDS_DECL_OTHER_OPTIONS5   typename... Options2
+#define CDS_DECL_OTHER_OPTIONS6   typename... Options2
+#define CDS_DECL_OTHER_OPTIONS7   typename... Options2
+#define CDS_DECL_OTHER_OPTIONS8   typename... Options2
+#define CDS_DECL_OTHER_OPTIONS9   typename... Options2
+#define CDS_DECL_OTHER_OPTIONS10  typename... Options2
+#define CDS_DECL_OTHER_OPTIONS11  typename... Options2
+#define CDS_DECL_OTHER_OPTIONS12  typename... Options2
+#define CDS_DECL_OTHER_OPTIONS13  typename... Options2
+#define CDS_DECL_OTHER_OPTIONS14  typename... Options2
+#define CDS_DECL_OTHER_OPTIONS15  typename... Options2
+#define CDS_DECL_OTHER_OPTIONS16  typename... Options2
+
+// for template specializations
+#define CDS_SPEC_OPTIONS1   typename... Options
+#define CDS_SPEC_OPTIONS2   typename... Options
+#define CDS_SPEC_OPTIONS3   typename... Options
+#define CDS_SPEC_OPTIONS4   typename... Options
+#define CDS_SPEC_OPTIONS5   typename... Options
+#define CDS_SPEC_OPTIONS6   typename... Options
+#define CDS_SPEC_OPTIONS7   typename... Options
+#define CDS_SPEC_OPTIONS8   typename... Options
+#define CDS_SPEC_OPTIONS9   typename... Options
+#define CDS_SPEC_OPTIONS10  typename... Options
+#define CDS_SPEC_OPTIONS11  typename... Options
+#define CDS_SPEC_OPTIONS12  typename... Options
+#define CDS_SPEC_OPTIONS13  typename... Options
+#define CDS_SPEC_OPTIONS14  typename... Options
+#define CDS_SPEC_OPTIONS15  typename... Options
+#define CDS_SPEC_OPTIONS16  typename... Options
+
+#define CDS_SPEC_OPTIONS    typename... Options
+
+#define CDS_OPTIONS1    Options...
+#define CDS_OPTIONS2    Options...
+#define CDS_OPTIONS3    Options...
+#define CDS_OPTIONS4    Options...
+#define CDS_OPTIONS5    Options...
+#define CDS_OPTIONS6    Options...
+#define CDS_OPTIONS7    Options...
+#define CDS_OPTIONS8    Options...
+#define CDS_OPTIONS9    Options...
+#define CDS_OPTIONS10   Options...
+#define CDS_OPTIONS11   Options...
+#define CDS_OPTIONS12   Options...
+#define CDS_OPTIONS13   Options...
+#define CDS_OPTIONS14   Options...
+#define CDS_OPTIONS15   Options...
+#define CDS_OPTIONS16   Options...
+//#define CDS_OPTIONS17   Options...
+//#define CDS_OPTIONS18   Options...
+//#define CDS_OPTIONS19   Options...
+//#define CDS_OPTIONS20   Options...
+
+#define CDS_OPTIONS     Options...
+
+#define CDS_OTHER_OPTIONS1    Options2...
+#define CDS_OTHER_OPTIONS2    Options2...
+#define CDS_OTHER_OPTIONS3    Options2...
+#define CDS_OTHER_OPTIONS4    Options2...
+#define CDS_OTHER_OPTIONS5    Options2...
+#define CDS_OTHER_OPTIONS6    Options2...
+#define CDS_OTHER_OPTIONS7    Options2...
+#define CDS_OTHER_OPTIONS8    Options2...
+#define CDS_OTHER_OPTIONS9    Options2...
+#define CDS_OTHER_OPTIONS10   Options2...
+#define CDS_OTHER_OPTIONS11   Options2...
+#define CDS_OTHER_OPTIONS12   Options2...
+#define CDS_OTHER_OPTIONS13   Options2...
+#define CDS_OTHER_OPTIONS14   Options2...
+#define CDS_OTHER_OPTIONS15   Options2...
+#define CDS_OTHER_OPTIONS16   Options2...
+
+namespace cds { namespace opt {
+
+    //@cond
+    namespace details {
+        template <typename OptionList, typename Option>
+        struct do_pack
+        {
+            // Use "pack" member template to pack options
+            typedef typename Option::template pack<OptionList> type;
+        };
+
+        template <typename ...T> class typelist;
+
+        template <typename Typelist> struct typelist_head;
+        template <typename Head, typename ...Tail>
+        struct typelist_head< typelist<Head, Tail...> > {
+            typedef Head type;
+        };
+        template <typename Head>
+        struct typelist_head< typelist<Head> > {
+            typedef Head type;
+        };
+
+        template <typename Typelist> struct typelist_tail;
+        template <typename Head, typename ...Tail>
+        struct typelist_tail< typelist<Head, Tail...> > {
+            typedef typelist<Tail...> type;
+        };
+        template <typename Head>
+        struct typelist_tail< typelist<Head> > {
+            typedef typelist<> type;
+        };
+
+        template <typename OptionList, typename Typelist>
+        struct make_options_impl {
+            typedef typename make_options_impl<
+                typename do_pack<
+                    OptionList,
+                    typename typelist_head< Typelist >::type
+                >::type,
+                typename typelist_tail<Typelist>::type
+            >::type type;
+        };
+
+        template <typename OptionList>
+        struct make_options_impl<OptionList, typelist<> > {
+            typedef OptionList type;
+        };
+    }   // namespace details
+    //@endcond
+
+    /// make_options metafunction
+    /** @headerfile cds/opt/options.h
+
+        The metafunction converts option list \p Options to traits structure.
+        The result of metafunction is \p type.
+
+        Template parameter \p OptionList is default option set (default traits).
+        \p Options is option list.
+    */
+    template <typename OptionList, typename... Options>
+    struct make_options {
+#ifdef CDS_DOXYGEN_INVOKED
+        typedef implementation_defined type ;   ///< Result of the metafunction
+#else
+        typedef typename details::make_options_impl< OptionList, details::typelist<Options...> >::type type;
+#endif
+    };
+
+
+    // *****************************************************************
+    // find_type_traits metafunction
+    // *****************************************************************
+
+    //@cond
+    namespace details {
+        template <typename... Options>
+        struct find_type_traits_option;
+
+        template <>
+        struct find_type_traits_option<> {
+            typedef cds::opt::none  type;
+        };
+
+        template <typename Any>
+        struct find_type_traits_option< Any > {
+            typedef cds::opt::none type;
+        };
+
+        template <typename Any>
+        struct find_type_traits_option< cds::opt::type_traits< Any > > {
+            typedef Any type;
+        };
+
+        template <typename Any, typename... Options>
+        struct find_type_traits_option< cds::opt::type_traits< Any >, Options... > {
+            typedef Any type;
+        };
+
+        template <typename Any, typename... Options>
+        struct find_type_traits_option< Any, Options... > {
+            typedef typename find_type_traits_option< Options... >::type type;
+        };
+    } // namespace details
+    //@endcond
+
+    /// Metafunction to find opt::type_traits option in \p Options list
+    /** @headerfile cds/opt/options.h
+
+        If \p Options contains opt::type_traits option then it is the metafunction result.
+        Otherwise the result is \p DefaultOptons.
+    */
+    template <typename DefaultOptions, typename... Options>
+    struct find_type_traits {
+        typedef typename select_default< typename details::find_type_traits_option<Options...>::type, DefaultOptions>::type type ;  ///< Metafunction result
+    };
+
+
+    // *****************************************************************
+    // find_option metafunction
+    // *****************************************************************
+
+    //@cond
+    namespace details {
+        template <typename What, typename... Options>
+        struct find_option;
+
+        struct compare_ok;
+        struct compare_fail;
+
+        template <typename A, typename B>
+        struct compare_option
+        {
+            typedef compare_fail type;
+        };
+
+        template <template <typename> class Opt, typename A, typename B>
+        struct compare_option< Opt<A>, Opt<B> >
+        {
+            typedef compare_ok   type;
+        };
+
+        // Specializations for integral type of option
+#define _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION( _type ) template <template <_type> class What, _type A, _type B> \
+        struct compare_option< What<A>, What<B> > { typedef compare_ok type ; };
+
+        // For user-defined enum types
+#define CDS_DECLARE_FIND_OPTION_INTEGRAL_SPECIALIZATION( _type ) namespace cds { namespace opt { namespace details { _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(_type ) }}}
+
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(bool)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(char)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned char)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(signed char)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(short int)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned short int)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(int)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned int)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(long)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned long)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(long long)
+        _CDS_FIND_OPTION_INTEGRAL_SPECIALIZATION(unsigned long long)
+
+
+        template <typename CompResult, typename Ok, typename Fail>
+        struct select_option
+        {
+            typedef Fail    type;
+        };
+
+        template <typename Ok, typename Fail>
+        struct select_option< compare_ok, Ok, Fail >
+        {
+            typedef Ok      type;
+        };
+
+        template <typename What>
+        struct find_option< What > {
+            typedef What    type;
+        };
+
+        template <typename What, typename Opt>
+        struct find_option< What, Opt > {
+            typedef typename select_option<
+                typename compare_option< What, Opt >::type
+                ,Opt
+                ,What
+            >::type type;
+        };
+
+        template <typename What, typename Opt, typename... Options>
+        struct find_option< What, Opt, Options... > {
+            typedef typename select_option<
+                typename compare_option< What, Opt >::type
+                ,Opt
+                ,typename find_option< What, Options... >::type
+            >::type type;
+        };
+    } // namespace details
+    //@endcond
+
+    /// Metafunction to find \p What option in \p Options list
+    /** @headerfile cds/opt/options.h
+
+        If \p Options contains \p What< Val > option for any \p Val then the result is \p What< Val >
+        Otherwise the result is \p What.
+
+        Example:
+        \code
+        #include <cds/opt/options.h>
+        namespace co = cds::opt;
+
+        struct default_tag;
+        struct tag_a;
+        struct tag_b;
+
+        // Find option co::tag.
+
+        // res1 is co::tag< tag_a >
+        typedef co::find_option< co::tag< default_tag >, co::gc< cds::gc::HP >, co::tag< tag_a > >::type res1;
+
+        // res2 is default co::tag< default_tag >
+        typedef co::find_option< co::tag< default_tag >, co::less< x >, co::hash< H > >::type res2;
+
+        // Multiple option co::tag. The first option is selected
+        // res3 is default co::tag< tag_a >
+        typedef co::find_option< co::tag< default_tag >, co::tag< tag_a >, co::tag< tag_b > >::type res3;
+
+        \endcode
+    */
+    template <typename What, typename... Options>
+    struct find_option {
+        typedef typename details::find_option<What, Options...>::type   type ;  ///< Metafunction result
+    };
+
+
+    // *****************************************************************
+    // select metafunction
+    // *****************************************************************
+
+    //@cond
+    namespace details {
+
+        template <typename What, typename... Pairs>
+        struct select;
+
+        template <typename What, typename Value>
+        struct select< What, What, Value>
+        {
+            typedef Value   type;
+        };
+
+        template <typename What, typename Tag, typename Value>
+        struct select<What, Tag, Value>
+        {
+            typedef What    type;
+        };
+
+        template <typename What, typename Value, typename... Pairs>
+        struct select< What, What, Value, Pairs...>
+        {
+            typedef Value   type;
+        };
+
+        template <typename What, typename Tag, typename Value, typename... Pairs>
+        struct select< What, Tag, Value, Pairs...>
+        {
+            typedef typename select<What, Pairs...>::type   type;
+        };
+    }   // namespace details
+    //@endcond
+
+    /// Select option metafunction
+    /** @headerfile cds/opt/options.h
+
+        Pseudocode:
+        \code
+        select <What, T1, R1, T2, R2, ... Tn, Rn> ::=
+            if What == T1 then return R1
+            if What == T2 then return R2
+            ...
+            if What == Tn then return Rn
+            else return What
+        \endcode
+    */
+    template <typename What, typename... Pairs>
+    struct select {
+        typedef typename details::select< What, Pairs...>::type  type    ;   ///< Metafunction result
+    };
+
+}}  // namespace cds::opt
+
+#endif // #ifndef __CDS_OPT_MAKE_OPTIONS_STD_H
diff --git a/cds/opt/options.h b/cds/opt/options.h
new file mode 100644 (file)
index 0000000..184a241
--- /dev/null
@@ -0,0 +1,713 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OPT_OPTIONS_H
+#define __CDS_OPT_OPTIONS_H
+
+/*
+    Framework to define template options
+
+    Editions:
+        2011.01.23 khizmax  Created
+*/
+
+#include <cds/details/aligned_type.h>
+#include <cds/user_setup/allocator.h>
+#include <cds/user_setup/cache_line.h>
+#include <cds/cxx11_atomic.h>
+#include <cds/details/void_selector.h>
+#include <stdlib.h> // rand, srand
+
+namespace cds {
+
+/// Framework to define template options
+/**
+    There are two kind of options:
+    - \p type-option - option that determines a data type. The template argument \p Type of the option is a type.
+    - \p value-option - option that determines a value. The template argument \p Value of the option is a value.
+*/
+namespace opt {
+
+    /// Predefined options value (generally, for the options that determine the data types)
+    namespace v {}
+
+    /// Type indicates that an option is not specified and the default one should be used
+    struct none
+    {
+        //@cond
+        template <class Base> struct pack: public Base
+        {};
+        //@endcond
+    };
+
+    /// Metafunction for selecting default option value
+    /**
+        Template parameters:
+        - \p Option - option value
+        - \p Default - default option value
+        - \p Value - option value if \p Option is not opt::none
+
+        If \p Option is opt::none, the metafunction result is \p Default, otherwise
+        the result is \p Value.
+
+        Examples:
+        \code
+        // default_spin is cds::lock::Spin
+        typedef typename cds::opt::select_default< cds::opt::none, cds::lock::Spin >::type  default_spin;
+
+        // spin_32bit is cds::lock::Spin32
+        typedef typename cds::opt::select_default< cds::lock::Spin32, cds::lock::Spin >::type  spin_32bit;
+        \endcode
+    */
+    template <typename Option, typename Default, typename Value = Option>
+    struct select_default
+    {
+        typedef Value type ;   ///< metafunction result
+    };
+    //@cond
+    template <typename Default>
+    struct select_default< none, Default >
+    {
+        typedef Default type;
+    };
+    //@endcond
+
+    /// Metafunction to select option value
+    /**
+        This metafunction is intended for extracting the value of the \p Option option.
+        For example,
+        \code
+        #include <cds/opt/options.h>
+        #include <type_traits> // only for testing purpose (static_assert)
+
+        struct tag_a;
+
+        // Define option
+        typedef cds::opt::tag< tag_a >  tag_option;
+
+        // What is the value of the tag_option?
+        // How we can extract tag_a from tag_option?
+        // Here is a solution:
+        typedef cds::opt::value< tag_option >::tag  tag_option_value;
+
+        // tag_option_value is the same as tag_a
+        static_assert( std::is_same< tag_option_value, tag_a >::value, "Error: tag_option_value != tag_a" );
+
+        \endcode
+    */
+    template <typename Option>
+    struct value: public Option::template pack<none>
+    {};
+
+
+    /// [type-option] Option setter specifies a tag
+    /**
+        Suppose, you have a struct
+        \code
+        struct Feature
+        {  .... };
+        \endcode
+        and you want that your class \p X would be derived from several \p Feature:
+        \code
+            class X: public Feature, public Feature
+            { .... };
+        \endcode
+
+        How can you distinguish one \p Feature from another?
+        You may use a tag option:
+        \code
+            template <typename Tag>
+            struct Feature
+            { .... };
+
+            class tag_a;
+            class tag_b;
+            class X: public Feature< tag_a >, public Feature< tag_b >
+            { .... };
+        \endcode
+        Now you can distinguish one \p Feature from another:
+        \code
+            X x;
+            Feature<tag_a>& fa = static_cast< Feature<tag_a> >( x );
+            Feature<tag_b>& fb = static_cast< Feature<tag_b> >( x );
+        \endcode
+
+        \p tag option setter allows you to do things like this for an option-centric approach:
+        \code
+        template <typename ...Options>
+        struct Feature
+        { .... };
+
+        class tag_a;
+        class tag_b;
+        class X: public Feature< tag<tag_a> >, public Feature< tag<tag_b> >
+        { .... };
+        \endcode
+
+        This option setter is widely used in cds::intrusive containers to distinguish
+        between different intrusive part of container's node.
+
+        An incomplete type can serve as a \p Tag.
+    */
+    template <typename Tag>
+    struct tag {
+        //@cond
+        template<class Base> struct pack: public Base
+        {
+            typedef Tag tag;
+        };
+        //@endcond
+    };
+
+    /// [type-option] Option setter specifies lock class
+    /**
+        Specification of the \p Type class is:
+        \code
+        struct Lock {
+            void lock();
+            void unlock();
+        };
+        \endcode
+    */
+    template <typename Type>
+    struct lock_type {
+        //@cond
+        template<class Base> struct pack: public Base
+        {
+            typedef Type lock_type;
+        };
+        //@endcond
+    };
+
+    /// [type-option] Back-off strategy option setter
+    /**
+        Back-off strategy used in some algorithm.
+        See cds::backoff namespace for back-off explanation and supported interface.
+    */
+    template <typename Type>
+    struct back_off {
+        //@cond
+        template <class Base> struct pack: public Base
+        {
+            typedef Type back_off;
+        };
+        //@endcond
+    };
+
+    /// [type-option] Option setter for garbage collecting schema used
+    /**
+        Possible values of \p GC template parameter are:
+        - cds::gc::HP - Hazard Pointer garbage collector
+        - cds::gc::HRC - Gidenstam's garbage collector
+        - cds::gc::PTB - Pass-the-Buck garbage collector
+        - cds::gc::none::GC - No garbage collector (not supported for some containers)
+    */
+    template <typename GC>
+    struct gc {
+        //@cond
+        template <class Base> struct pack: public Base
+        {
+            typedef GC gc;
+        };
+        //@endcond
+    };
+
+    /// [type-option] Option setter for an allocator
+    /**
+        \p Type is allocator with \p std::allocator interface. Default is value of macro CDS_DEFAULT_ALLOCATOR
+        that, in turn, is \p std::allocator.
+
+        The \p libcds containers actively use rebinding to convert an allocator of one type to another. Thus,
+        you may specify any valid type as std::allocator's template parameter.
+
+        See also opt::node_allocator
+    */
+    template <typename Type>
+    struct allocator {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Type allocator;
+        };
+        //@endcond
+    };
+
+    /// [type-option] Option setter for node allocator
+    /**
+        \p Type is allocator with \p std::allocator interface. Default is value of macro CDS_DEFAULT_ALLOCATOR
+        that, in turn, is \p std::allocator.
+
+        Many node-base containers require an allocator for maintaining data (container's node) and for internal use.
+        Sometimes, this types of allocator should be different for performance reason.
+        For example, we should like to allocate the node from a pool of preallocated nodes.
+        Such pool can be seen as the node allocator.
+
+        Usually, if a container supports \p opt::allocator and \p %opt::node_allocator options
+        and \p opt::node_allocator is not specified the \p %opt::allocator option is used for maintaining the nodes.
+
+        The \p libcds containers actively use rebinding to convert an allocator of one type to another. Thus,
+        you may specify any valid type as std::allocator's template parameter.
+    */
+    template <typename Type>
+    struct node_allocator {
+        //@cond
+            template <typename Base> struct pack: public Base
+            {
+                typedef Type node_allocator;
+            };
+        //@endcond
+    };
+
+    /// [type-option] Option setter for item counting
+    /**
+        Some data structure (for example, queues) has additional feature for item counting.
+        This option allows to set up appropriate item counting policy for that data structure.
+
+        Predefined option \p Type:
+        - atomicity::empty_item_counter - no item counting performed. It is default policy for many
+            containers
+        - atomicity::item_counter - the class that provides atomically item counting
+        - opt::v::sequential_item_counter - simple non-atomic item counter. This item counter is not intended for
+            concurrent containers and may be used only if it is explicitly noted.
+
+        You may provide other implementation of atomicity::item_counter interface for your needs.
+
+        Note, the item counting in lock-free containers cannot be exact; for example, if
+        item counter for a container returns zero it is not mean that the container is empty.
+        Thus, item counter may be used for statistical purposes only.
+    */
+    template <typename Type>
+    struct item_counter {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Type item_counter;
+        };
+        //@endcond
+    };
+
+    namespace v {
+        /// Sequential non-atomic item counter
+        /**
+            This type of item counter is not intended for concurrent containers
+            and may be used only if it is explicitly noted.
+        */
+        class sequential_item_counter
+        {
+        public:
+            typedef size_t counter_type    ;  ///< Counter type
+        protected:
+            counter_type  m_nCounter ;      ///< Counter
+
+        public:
+            sequential_item_counter()
+                : m_nCounter(0)
+            {}
+
+            /// Returns current value of the counter
+            counter_type    value() const
+            {
+                return m_nCounter;
+            }
+
+            /// Same as \ref value() with relaxed memory ordering
+            operator counter_type() const
+            {
+                return value();
+            }
+
+            /// Increments the counter. Semantics: postincrement
+            counter_type inc()
+            {
+                return m_nCounter++;
+            }
+
+            /// Decrements the counter. Semantics: postdecrement
+            counter_type dec()
+            {
+                return m_nCounter--;
+            }
+
+            /// Preincrement
+            counter_type operator ++()
+            {
+                return inc() + 1;
+            }
+            /// Postincrement
+            counter_type operator ++(int)
+            {
+                return inc();
+            }
+
+            /// Predecrement
+            counter_type operator --()
+            {
+                return dec() - 1;
+            }
+            /// Postdecrement
+            counter_type operator --(int)
+            {
+                return dec();
+            }
+
+            /// Resets count to 0
+            void reset()
+            {
+                m_nCounter = 0;
+            }
+        };
+    } // namespace v
+
+    /// Special alignment constants for \ref cds::opt::alignment option
+    enum special_alignment {
+        no_special_alignment = 0,   ///< no special alignment
+        cache_line_alignment = 1    ///< use cache line size defined in cds/user_setup/cache_line.h
+    };
+
+    /// [value-option] Alignment option setter
+    /**
+        Alignment for some internal data of containers. May be useful to solve false sharing problem.
+        \p Value defines desired alignment and it may be power of two integer or predefined values from
+        \ref special_alignment enum.
+    */
+    template <unsigned int Value>
+    struct alignment {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            enum { alignment = Value };
+        };
+        //@endcond
+    };
+
+    //@cond
+    namespace details {
+        template <typename Type, unsigned int Alignment>
+        struct alignment_setter {
+            typedef typename cds::details::aligned_type< Type, Alignment >::type  type;
+        };
+
+        template <typename Type>
+        struct alignment_setter<Type, no_special_alignment> {
+            typedef Type type;
+        };
+
+        template <typename Type>
+        struct alignment_setter<Type, cache_line_alignment> {
+            typedef typename cds::details::aligned_type< Type, c_nCacheLineSize >::type  type;
+        };
+
+    } // namespace details
+    //@endcond
+
+    /// [type-option] Generic option setter for statisitcs
+    /**
+        This option sets a type to gather statistics.
+        The option is generic - no predefined type(s) is provided.
+        The particular \p Type of statistics depends on internal structure of the object.
+    */
+    template <typename Type>
+    struct stat {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Type stat;
+        };
+        //@endcond
+    };
+
+    /// [type-option] Option setter for C++ memory model
+    /**
+        The <b>cds</b> library supports following memory ordering constraints for atomic operations in container implementation:
+        - v::relaxed_ordering - relaxed C++ memory model. This mode supports full set of memory ordering constraints:
+            \p memory_order_relaxed, \p memory_order_acquire, \p memory_order_release and so on.
+        - v::sequential_consistent - sequentially consistent C++ memory model (default memory ordering for C++). In
+            this mode any memory ordering constraint maps to \p memory_order_seq_cst.
+
+        The \p Type template parameter can be v::relaxed_ordering or v::sequential_consistent.
+
+        You may mix different memory ordering options for different containers: one declare as sequentially consistent,
+        another declare as relaxed.
+        Usually, v::relaxed_ordering is the default memory ordering for <b>cds</b> containers.
+    */
+    template <typename Type>
+    struct memory_model {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Type memory_model;
+        };
+        //@endcond
+    };
+
+    namespace v {
+        /// Relaxed memory ordering model
+        /**
+            In this memory model the memory constraints are defined according to C++ Memory Model specification.
+
+            See opt::memory_model for explanations
+        */
+        struct relaxed_ordering {
+            //@cond
+
+            // For new C++11 (cds-1.1.0)
+            static const CDS_ATOMIC::memory_order memory_order_relaxed    = CDS_ATOMIC::memory_order_relaxed;
+            static const CDS_ATOMIC::memory_order memory_order_consume    = CDS_ATOMIC::memory_order_consume;
+            static const CDS_ATOMIC::memory_order memory_order_acquire    = CDS_ATOMIC::memory_order_acquire;
+            static const CDS_ATOMIC::memory_order memory_order_release    = CDS_ATOMIC::memory_order_release;
+            static const CDS_ATOMIC::memory_order memory_order_acq_rel    = CDS_ATOMIC::memory_order_acq_rel;
+            static const CDS_ATOMIC::memory_order memory_order_seq_cst    = CDS_ATOMIC::memory_order_seq_cst;
+            //@endcond
+        };
+
+        /// Sequential consistent memory ordering model
+        /**
+            In this memory model any memory constraint is equivalent to \p memory_order_seq_cst.
+
+            See opt::memory_model for explanations
+        */
+        struct sequential_consistent {
+            //@cond
+
+            // For new C++11 (cds-1.1.0)
+            static const CDS_ATOMIC::memory_order memory_order_relaxed    = CDS_ATOMIC::memory_order_seq_cst;
+            static const CDS_ATOMIC::memory_order memory_order_consume    = CDS_ATOMIC::memory_order_seq_cst;
+            static const CDS_ATOMIC::memory_order memory_order_acquire    = CDS_ATOMIC::memory_order_seq_cst;
+            static const CDS_ATOMIC::memory_order memory_order_release    = CDS_ATOMIC::memory_order_seq_cst;
+            static const CDS_ATOMIC::memory_order memory_order_acq_rel    = CDS_ATOMIC::memory_order_seq_cst;
+            static const CDS_ATOMIC::memory_order memory_order_seq_cst    = CDS_ATOMIC::memory_order_seq_cst;
+            //@endcond
+        };
+    } // namespace v
+
+    /// [type-option] Base type traits option setter
+    /**
+        This option setter is intended generally for internal use for type rebinding.
+    */
+    template <typename Type>
+    struct type_traits {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Type type_traits;
+        };
+        //@endcond
+    };
+
+    /// Resizing policy option
+    /**
+        This option specifies the resizing policy that decides when to resize a container.
+        Used in some containers, for example, in container::StripedHashSet, intrusive::StripedHashSet.
+
+        The real resizing policy specified by \p Type does strongly depend on a container
+        that supports this option, see container documentation about possibly \p Type values.
+    */
+    template <typename Type>
+    struct resizing_policy {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Type resizing_policy;
+        };
+        //@endcond
+    };
+
+    /// Copy policy option
+    /**
+        The copy policy defines an item copying algorithm which is used, for example, when a container is resized.
+        It is very specific algorithm depending on type of the container.
+    */
+    template <typename Type>
+    struct copy_policy {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Type copy_policy;
+        };
+        //@endcond
+    };
+
+    /// Swap policy option
+    /**
+        The swap policy specifies an algorithm for swapping two objects.
+        Usually, the default policy is \p std::swap (see opt::v::default_swap_policy):
+
+        @code
+        struct std_swap {
+            template <typename T>
+            void operator ()( T& v1, T& v2 )
+            {
+                std::swap( v1, v2 );
+            }
+        };
+        @endcode
+    */
+    template <typename Type>
+    struct swap_policy {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Type swap_policy;
+        };
+        //@endcond
+    };
+
+    namespace v {
+
+        /// Default swap policy (see opt::swap_policy option)
+        /**
+            The default swap policy is wrappr around \p std::swap algorithm.
+        */
+        struct default_swap_policy {
+            /// Performs swapping of \p v1 and \p v2 using \p std::swap algo
+            template <typename T>
+            void operator()( T& v1, T& v2 ) const
+            {
+                std::swap( v1, v2 );
+            }
+        };
+    } // namespace v
+
+    /// Move policy option
+    /**
+        The move policy specifies an algorithm for moving object content.
+        In trivial case, it can be simple assignment.
+
+        The move interface is:
+        \code
+        template <typename T>
+        struct move_policy {
+            void operator()( T& dest, T& src );
+        };
+        \endcode
+
+        Note that in move algorithm the \p src source argument can be changed too.
+        So you can use move semantics.
+
+        Usually, the default move policy is opt::v::assignment_move_policy
+    */
+    template <typename Type>
+    struct move_policy {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Type move_policy;
+        };
+        //@endcond
+    };
+
+    namespace v {
+        /// \ref opt::move_policy "Move policy" based on assignment operator
+        struct assignment_move_policy
+        {
+            /// <tt> dest = src </tt>
+            template <typename T>
+            void operator()( T& dest, T const& src ) const
+            {
+                dest = src;
+            }
+        };
+    } // namespace v
+
+    /// [value-option] Enable sorting
+    /**
+        This option enables (<tt>Enable = true</tt>) or disables (<tt>Enable == false</tt>)
+        sorting of a container.
+    */
+    template <bool Enable>
+    struct sort {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            static bool const sort = Enable;
+        };
+        //@endcond
+    };
+
+    /// [type-option] Concurrent access policy
+    /**
+        This option specifies synchronization strategy for fine-grained lock-based containers.
+        The option has no predefined \p Policy type.
+        For each container that accepts this option the range of available \p Policy types
+        is unique.
+    */
+    template <typename Policy>
+    struct mutex_policy {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Policy mutex_policy;
+        };
+        //@endcond
+    };
+
+
+    /// [type-option] Random number generator
+    /**
+        The option specifies a random number generator.
+        \p Random can be any STL random number generator producing
+        unsigned integer: \p std::linear_congruential_engine,
+        \p std::mersenne_twister_engine, \p std::subtract_with_carry_engine
+        and so on, or opt::v::c_rand.
+
+    */
+    template <typename Random>
+    struct random_engine {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Random random_engine;
+        };
+        //@endcond
+    };
+
+    namespace v {
+        /// \p rand() -base random number generator
+        /**
+            This generator returns a pseudorandom integer in the range 0 to \p RAND_MAX (32767).
+        */
+        struct c_rand {
+            typedef unsigned int result_type; ///< Result type
+
+            /// Constructor initializes object calling \p srand()
+            c_rand()
+            {
+                srand(1);
+            }
+
+            /// Returns next random number calling \p rand()
+            result_type operator()()
+            {
+                return (result_type) rand();
+            }
+        };
+    } // namespace v
+
+    //@cond
+    // For internal use
+    template <typename Accessor>
+    struct key_accessor {
+        template <typename Base> struct pack: public Base
+        {
+            typedef Accessor key_accessor;
+        };
+    };
+
+    template <typename Traits, typename ReplaceWith, typename WhatReplace = none >
+    struct replace_key_accessor {
+        typedef typename std::conditional<
+            std::is_same< typename Traits::key_accessor, WhatReplace >::value,
+            typename opt::key_accessor< ReplaceWith >::template pack< Traits >,
+            Traits
+        >::type type;
+    };
+    //@endcond
+
+}}  // namespace cds::opt
+
+#ifdef CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT
+#   include <cds/opt/make_options_var.h>
+#else
+#   include <cds/opt/make_options_std.h>
+#endif
+
+#endif  // #ifndef __CDS_OPT_OPTIONS_H
diff --git a/cds/opt/permutation.h b/cds/opt/permutation.h
new file mode 100644 (file)
index 0000000..233ced1
--- /dev/null
@@ -0,0 +1,293 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OPT_PERMUTATION_H
+#define __CDS_OPT_PERMUTATION_H
+
+#include <cds/opt/options.h>
+#include <stdlib.h> // rand, srand
+#include <algorithm> // random_shuffle
+
+namespace cds { namespace opt {
+
+    /// [type-option] Random permutation generator option setter
+    /**
+        The class represents permutation generator of unique integers from <tt> [0, nLength) </tt>
+        (\p nLenght is not included) in random order.
+
+        The generator interface is:
+        \code
+        class generator {
+            // Initializes the generator of length nLength
+            generator( size_t nLength );
+
+            // Returns current value
+            operator int();
+
+            // Goes to next value. Returns false if the permutation is exchausted
+            bool next();
+
+            // Resets the generator to produce the new sequence
+            void reset();
+        };
+        \endcode
+
+        Usage example:
+        The permutation generator is intended for <tt>do {} while</tt> loop:
+        \code
+        permutation_generator gen( 16 );
+        int i = gen.begin();
+        do {
+            int i = gen;
+            //...
+        } while ( gen.next() );
+
+        // Get other permutation
+        gen.reset();
+        do {
+            int i = gen;
+            //...
+        } while ( gen.next() );
+        \endcode
+
+        The following \p Generator defined:
+        - opt::v::random_permutation
+        - opt::v::random2_permutation
+        - opt::v::random_shuffle_permutation
+        - opt::v::skew_permutation
+    */
+    template <typename Generator>
+    struct permutation_generator {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Generator permutation_generator;
+        };
+        //@endcond
+    };
+
+    namespace v {
+
+        /// Permutation generator of arbitrary length based on \p rand()
+        /**
+            The class is suitable for opt::permutation_generator option.
+
+            The generator calculates <tt>n = rand()</tt> and produces the sequence
+            <tt>[n % nLen, (n + 1) % nLen, ..., (n + nLen - 1) % nLen]</tt>.
+            The generator does not allocate any memory.
+
+            \p Int template argument specifies the type of generated value, it should be any integer.
+        */
+        template <typename Int=int>
+        class random_permutation
+        {
+        public:
+            typedef Int     integer_type;   ///< Type of generated value
+        protected:
+            //@cond
+            integer_type        m_nCur;
+            integer_type        m_nStart;
+            integer_type const  m_nMod;
+            //@endcond
+
+        public:
+            /// Initializes the generator of arbitrary length \p nLength
+            random_permutation( size_t nLength )
+                : m_nCur(0)
+                , m_nStart(0)
+                , m_nMod( integer_type(nLength) )
+            {
+                reset();
+            }
+
+            /// Returns the curent value
+            operator integer_type() const
+            {
+                return m_nCur % m_nMod;
+            }
+
+            /// Goes to next value. Returns \p false if the sequence is exhausted
+            bool next()
+            {
+                return (++m_nCur % m_nMod) != m_nStart;
+            }
+
+            /// Resets the generator to produce new sequence
+            void reset()
+            {
+                m_nCur = m_nStart = integer_type( rand() ) % m_nMod;
+            }
+        };
+
+        /// Permutation generator of power-of-2 length based on \p rand()
+        /**
+            The class is suitable for opt::permutation_generator option.
+
+            The generator calculates <tt>n = rand()</tt> and produces the sequence
+            <tt>[n % nLen, (n + 1) % nLen, ..., (n + nLen - 1) % nLen]</tt>.
+            The generator does not allocate any memory.
+            \p nLen must be power of two.
+
+            \p Int template argument specifies the type of generated value, it should be any integer.
+        */
+        template <typename Int=int>
+        class random2_permutation
+        {
+        public:
+            typedef Int     integer_type;   ///< Type of generated value
+
+        protected:
+            //@cond
+            integer_type        m_nCur;
+            integer_type        m_nStart;
+            integer_type const  m_nMask;
+            //@endcond
+
+        public:
+            /// Initializes the generator of length \p nLength
+            /**
+                An assertion is raised if \p nLength is not a power of two.
+            */
+            random2_permutation( size_t nLength )
+                : m_nCur(0)
+                , m_nStart(0)
+                , m_nMask( integer_type(nLength) - 1 )
+            {
+                // nLength must be power of two
+                assert( (nLength & (nLength - 1)) == 0 );
+                reset();
+            }
+
+            /// Returns the current value
+            operator integer_type() const
+            {
+                return m_nCur & m_nMask;
+            }
+
+            /// Goes to next value. Returns \p false if the sequence is exhausted
+            bool next()
+            {
+                return (++m_nCur & m_nMask) != m_nStart;
+            }
+
+            /// Resets the generator to produce new sequence
+            void reset()
+            {
+                m_nCur = m_nStart = integer_type( rand() ) & m_nMask;
+            }
+        };
+
+        /// Permutation generator based on \p std::random_shuffle
+        /**
+            The class is suitable for opt::permutation_generator option.
+
+            The generator produces a permutation of [0, nLen) sequence.
+            The generator instance allocates a memory block.
+
+            \p Int template argument specifies the type of generated value, it should be any integer.
+        */
+        template <typename Int=int>
+        class random_shuffle_permutation
+        {
+        public:
+            typedef Int     integer_type;   ///< Type of generated value
+
+        protected:
+            //@cond
+            integer_type *      m_pCur;
+            integer_type *      m_pFirst;
+            integer_type *      m_pLast;
+            //@endcond
+
+        public:
+            /// Initializes the generator of arbitrary length \p nLength
+            random_shuffle_permutation( size_t nLength )
+                : m_pCur( null_ptr<integer_type *>() )
+            {
+                m_pFirst = new integer_type[nLength];
+                m_pLast = m_pFirst + nLength;
+                for ( integer_type i = 0; i < static_cast<integer_type>(nLength); ++i )
+                    m_pFirst[i] = i;
+                reset();
+            }
+
+            ~random_shuffle_permutation()
+            {
+                delete [] m_pFirst;
+            }
+
+            /// Returns the current value
+            operator integer_type() const
+            {
+                return *m_pCur;
+            }
+
+            /// Goes to next value. Returns \p false if the sequence is exhausted
+            bool next()
+            {
+                return ++m_pCur < m_pLast;
+            }
+
+            /// Resets the generator to produce new sequence
+            void reset()
+            {
+                std::random_shuffle( m_pFirst, m_pLast );
+                m_pCur = m_pFirst;
+            }
+        };
+
+        /// Skew permutation generator
+        /**
+            This generator produces offset permutation based on \p Generator:
+                <tt>int(Generator) + nOffset</tt>
+            where \p Generator - a permutation generator.
+
+            The class is suitable for opt::permutation_generator option
+            if the goal sequence should be a permutation of <tt>[nOffset, nOffset + nLength)</tt>
+        */
+        template <typename Generator>
+        class skew_permutation
+        {
+        public:
+            typedef Generator base_generator;   ///< Original permutation generator
+            typedef typename base_generator::integer_type   integer_type; ///< Type of generated value
+
+        protected:
+            //@cond
+            base_generator      m_Gen;
+            integer_type const  m_nOffset;
+            //@endcond
+
+        public:
+            /// Initializes the generator
+            skew_permutation(
+                integer_type nOffset,   ///< The offset, i.e. first value of generated sequence
+                size_t nLength          ///< The length of sequence
+                )
+                : m_Gen( nLength )
+                , m_nOffset( nOffset )
+            {}
+
+            /// Returns the current value
+            operator integer_type() const
+            {
+                return integer_type(m_Gen) + m_nOffset;
+            }
+
+            /// Goes to next value. Returns \p false if the sequence is exhausted
+            bool next()
+            {
+                return m_Gen.next();
+            }
+
+            /// Resets the generator to produce new sequence
+            void reset()
+            {
+                m_Gen.reset();
+            }
+        };
+
+    } // namespace v
+
+}} // namespace cds::opt
+
+#endif // #ifndef __CDS_OPT_PERMUTATION_H
diff --git a/cds/opt/value_cleaner.h b/cds/opt/value_cleaner.h
new file mode 100644 (file)
index 0000000..6dd8e0b
--- /dev/null
@@ -0,0 +1,76 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OPT_ITEM_DISPOSER_H
+#define __CDS_OPT_ITEM_DISPOSER_H
+
+#include <cds/details/defs.h>
+
+namespace cds { namespace opt {
+
+    /// [type-option] value cleaning
+    /**
+        The cleaner is a functor called when an item is removed from a container.
+        Note, the cleaner should not delete (deallocate) the value \p val passed in.
+        However, if the \p value_type type is a structure that contains dynamically allocated
+        field(s), the cleaning functor may deallocate it and iniitalize to default value (usually, \p NULL).
+
+        The interface for type \p value_type is:
+        \code
+        struct myCleaner {
+            void operator ()( value_type& val )
+            {
+                ...
+                // code to cleanup \p val
+            }
+        }
+        \endcode
+
+        Predefined option types:
+            \li opt::v::empty_cleaner
+    */
+    template <typename Type>
+    struct value_cleaner {
+        //@cond
+        template <typename BASE> struct pack: public BASE
+        {
+            typedef Type value_cleaner;
+        };
+        //@endcond
+    };
+
+    namespace v {
+
+        /// Empty cleaner
+        /**
+            One of available type for opt::value_cleaner option.
+            This cleaner is empty, i.e. it does not do any cleaning.
+        */
+        struct empty_cleaner
+        {
+            //@cond
+            template <typename T>
+            void operator()( T& /*val*/ )
+            {}
+            //@endcond
+        };
+
+        /// Cleaner that calls destructor of type \p T
+        /**
+            One of available type for opt::value_cleaner option.
+        */
+        struct destruct_cleaner
+        {
+            //@cond
+            template <typename T>
+            void operator()( T& val )
+            {
+                (&val)->T::~T();
+            }
+            //@endcond
+        };
+
+    }   // namespace v
+
+}}  // namespace cds::opt
+
+#endif // #ifndef __CDS_OPT_ITEM_DISPOSER_H
diff --git a/cds/os/aix/alloc_aligned.h b/cds/os/aix/alloc_aligned.h
new file mode 100644 (file)
index 0000000..3e3d560
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_AIX_ALLOC_ALIGNED_H
+#define __CDS_OS_AIX_ALLOC_ALIGNED_H
+
+#include <cds/os/posix/alloc_aligned.h>
+
+#endif // #ifndef __CDS_OS_AIX_ALLOC_ALIGNED_H
+
diff --git a/cds/os/aix/timer.h b/cds/os/aix/timer.h
new file mode 100644 (file)
index 0000000..3a29675
--- /dev/null
@@ -0,0 +1,92 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_AIX_TIMER_H
+#define __CDS_OS_AIX_TIMER_H
+
+// Source: http://publib16.boulder.ibm.com/doc_link/en_US/a_doc_lib/libs/basetrf2/read_real_time.htm
+
+#ifndef __CDS_OS_TIMER_H
+#   error "<cds/os/timer.h> must be included"
+#endif
+
+#include <sys/time.h>
+#include <sys/systemcfg.h>
+
+//@cond none
+namespace cds { namespace OS {
+    CDS_CXX11_INLINE_NAMESPACE namespace Aix {
+
+        // High resolution timer
+        class Timer {
+            timebasestruct_t    m_tmStart;
+
+        protected:
+            static unsigned long long nano( native_timer_type const& nStart, native_timer_type const& nEnd )
+            {
+                return (((unsigned long long) (nEnd.tb_high - nStart.tb_high)) << 32) + (nEnd.tb_low - nStart.tb_low);
+            }
+
+        public:
+            typedef timebasestruct_t    native_timer_type;
+            typedef long long            native_duration_type;
+
+            Timer() : m_tmStart( current() ) {}
+
+            static native_timer_type    current()
+            {
+                native_timer_type tm;
+                current( &tm );
+                return tm;
+            }
+            static void current( native_timer_type& tmr )
+            {
+                read_real_time( &tmr, sizeof(tmr) );
+                time_base_to_time( &tmr, sizeof(tmr ));
+            }
+
+            double reset()
+            {
+                native_timer_type tt;
+                current( tt );
+                double ret = nano( m_tmStart, tt ) / 1.0E9;
+                m_tmStart = tt;
+                return ret;
+            }
+
+            double duration( native_duration_type dur )
+            {
+                return double( dur ) / 1.0E9;
+            }
+
+            double duration()
+            {
+                return duration( native_duration() );
+            }
+
+            native_duration_type    native_duration()
+            {
+                return native_duration( m_tmStart, current() );
+            }
+
+            static native_duration_type    native_duration( native_timer_type const & nStart, native_timer_type const & nEnd )
+            {
+                return nano( nStart, nEnd );
+            }
+
+            static unsigned long long random_seed()
+            {
+                native_timer_type tmr;
+                read_real_time( &tmr, sizeof(tmr) );
+                return ( ((unsigned long long)(tmr.tb_hight)) << 32 ) + tmr.tb_low;
+            }
+        };
+    }    // namespace Aix
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    typedef Aix::Timer    Timer;
+#endif
+
+}}   // namespace cds::OS
+//@endcond
+
+#endif // #ifndef __CDS_OS_AIX_TIMER_H
diff --git a/cds/os/aix/topology.h b/cds/os/aix/topology.h
new file mode 100644 (file)
index 0000000..8d0570f
--- /dev/null
@@ -0,0 +1,79 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_AIX_TOPOLOGY_H
+#define __CDS_OS_AIX_TOPOLOGY_H
+
+#ifndef __CDS_OS_TOPOLOGY_H
+#   error "<cds/os/topology.h> must be included instead"
+#endif
+
+#include <cds/os/details/fake_topology.h>
+
+#include <unistd.h>
+
+#ifdef _AIX53
+#   include <sys/processor.h>
+#endif
+
+namespace cds { namespace OS {
+
+    ///  IBM AIX specific wrappers
+    CDS_CXX11_INLINE_NAMESPACE namespace Aix {
+
+        /// System topology
+        /**
+            The implementation assumes that the processor IDs are in numerical order
+            from 0 to N - 1, where N - count of processor in the system
+        */
+        struct topology: public OS::details::fake_topology
+        {
+        private:
+            //@cond
+            typedef OS::details::fake_topology  base_class;
+            //@endcond
+        public:
+            /// Logical processor count for the system
+            static unsigned int processor_count()
+            {
+                long nCount = ::sysconf(_SC_NPROCESSORS_ONLN);
+                if ( nCount == -1 )
+                    return  1;
+                return (unsigned int) nCount;
+            }
+
+            /// Get current processor number
+            /**
+                Caveat: AIX has no "get current processor number" system call.
+                The function emulates "current processor number" using thread-specific data.
+            */
+            static unsigned int current_processor()
+            {
+#           if defined(_AIX53) && _AIX53 == 1
+                // AIX 5.3 has undocumented function mycpu() in sys/processor.h
+                return ::mycpu();
+#           else
+                return base_class::current_processor();
+#           endif
+            }
+
+            /// Synonym for \ref current_processor
+            static unsigned int native_current_processor()
+            {
+                return current_processor();
+            }
+
+            //@cond
+            static void init()
+            {}
+            static void fini()
+            {}
+            //@endcond
+        };
+    }   // namespace Aix
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using Aix::topology;
+#endif
+}}  // namespace cds::OS
+
+#endif  // #ifndef __CDS_OS_AIX_TOPOLOGY_H
diff --git a/cds/os/alloc_aligned.h b/cds/os/alloc_aligned.h
new file mode 100644 (file)
index 0000000..06c0e63
--- /dev/null
@@ -0,0 +1,188 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_ALLOC_ALIGNED_H
+#define __CDS_OS_ALLOC_ALIGNED_H
+
+#include <cds/details/defs.h>
+
+#if CDS_OS_TYPE == CDS_OS_WIN32 || CDS_OS_TYPE == CDS_OS_WIN64 || CDS_OS_TYPE == CDS_OS_MINGW
+#   include <cds/os/win/alloc_aligned.h>
+#elif CDS_OS_TYPE == CDS_OS_LINUX
+#   include <cds/os/linux/alloc_aligned.h>
+#elif CDS_OS_TYPE == CDS_OS_SUN_SOLARIS
+#   include <cds/os/sunos/alloc_aligned.h>
+#elif CDS_OS_TYPE == CDS_OS_HPUX
+#   include <cds/os/hpux/alloc_aligned.h>
+#elif CDS_OS_TYPE == CDS_OS_AIX
+#   include <cds/os/aix/alloc_aligned.h>
+#elif CDS_OS_TYPE == CDS_OS_FREE_BSD || CDS_OS_TYPE == CDS_OS_OPEN_BSD || CDS_OS_TYPE == CDS_OS_NET_BSD
+#   include <cds/os/free_bsd/alloc_aligned.h>
+#elif CDS_OS_TYPE == CDS_OS_OSX || CDS_OS_TYPE == CDS_OS_PTHREAD
+#   include <cds/os/posix/alloc_aligned.h>
+#else
+#   error Unknown OS. Compilation aborted
+#endif
+
+#include <memory>
+#include <cds/details/is_aligned.h>
+#include <cds/int_algo.h>
+
+namespace cds {
+    /// OS specific wrappers
+    /**
+        This namespace contains OS-specific implementations.
+        Usually, the sub-namespaces contain OS-specific wrappers for a feature.
+
+        Typical usage pattern:
+        \code
+            namespace cds {
+            namespace OS {
+                namespace Linux {
+                    class Feature {
+                        // ...
+                    };
+                }
+
+                // import Linux::Feature class into cds::OS namespace
+                using Linux::Feature;
+                // now, cds::OS::Feature refers to cds::OS::Linux::Feature
+            }
+            }
+        \endcode
+    */
+    namespace OS {
+        /// Aligned allocator
+        /**
+            This allocator is intended for allocating of an aligned memory block. It uses wrappers around platform-specific
+            function for allocating and deallocating the block of memory:
+            \li \p aligned_malloc for allocating
+            \li \p aligned_free for deallocating
+
+            The \p aligned_malloc function wraps:
+            \li \p for Win: \p _aligned_malloc function
+            \li \p for other OSes: \p posix_memalign / \p memalign function
+
+            The \p aligned_free function wraps:
+            \li \p for Win: \p _aligned_free function
+            \li \p for other OSes: \p free function
+
+            This class should not be used directly. Use cds::details::AlignedAllocator instead.
+        */
+        template <typename T>
+        class aligned_allocator
+        {
+            typedef std::allocator<T>  prototype    ;   ///< prototype (the source of typedefs)
+        public:
+            typedef typename prototype::value_type       value_type      ;  ///< value type
+            typedef typename prototype::pointer          pointer         ;  ///< pointer to value type
+            typedef typename prototype::reference        reference       ;  ///< value reference type
+            typedef typename prototype::const_pointer    const_pointer   ;  ///< const pointer to value type
+            typedef typename prototype::const_reference  const_reference ;  ///< const value reference type
+
+            typedef typename prototype::size_type        size_type       ;  ///< size type
+            typedef typename prototype::difference_type  difference_type ;  ///< difference type
+
+            /// convert an aligned_allocator<T> to an aligned_allocator<OTHER>
+            template<class OTHER>
+            struct rebind
+            {
+                typedef aligned_allocator<OTHER> other; ///< Rebinding result
+            };
+
+        public:
+            /// return address of mutable \p v
+            pointer address(reference v) const
+            {
+                prototype a;
+                return a.address( v );
+            }
+
+            /// return address of nonmutable \p v
+            const_pointer address(const_reference v) const
+            {
+                prototype a;
+                return a.address( v );
+            }
+
+            // construct default allocator (do nothing)
+            aligned_allocator() throw()
+            {}
+
+            /// construct by copying (do nothing)
+            aligned_allocator(const aligned_allocator<T>&) throw()
+            {}
+
+            /// construct from a related allocator (do nothing)
+            template <class OTHER>
+            aligned_allocator(const aligned_allocator<OTHER>&) throw()
+            {}
+
+            /// assign from a related allocator (do nothing)
+            template <class OTHER>
+            aligned_allocator<T>& operator=(const aligned_allocator<OTHER>&)
+            {
+                return (*this);
+            }
+
+            /// deallocate object at \p ptr, ignore size
+            void deallocate(pointer ptr, size_type)
+            {
+                cds::OS::aligned_free( ptr );
+            }
+
+            /// allocate array of \p nCount elements
+            /**
+                The address returned is aligned by \p nAlign boundary.
+                \p nAlign parameter should be power of 2.
+
+                The function guarantees the alignment for first element of array only.
+                To guarantee the alignment for each element of the array the size of an object of type \p T must be multiple of \p nAlign:
+                \code
+                sizeof(T) % nAlign == 0
+                \endcode
+            */
+            pointer allocate( size_type nAlign, size_type nCount )
+            {
+                assert( cds::beans::is_power2( nAlign ) );
+                pointer p = reinterpret_cast<T *>( cds::OS::aligned_malloc( sizeof(T) * nCount, nAlign ) );
+                assert( cds::details::is_aligned( p, nAlign ));
+                return p;
+            }
+
+            /// allocate array of \p nCount elements, ignore hint
+            /**
+                The address returned is aligned by \p nAlign boundary.
+                \p nAlign parameter should be power of 2.
+
+                The function guarantees alignment for first element of array only.
+            */
+            pointer allocate(size_type nAlign, size_type nCount, const void *)
+            {
+                return ( allocate( nAlign, nCount ) );
+            }
+
+            /// construct object at \p ptr with value \p val
+            void construct(pointer ptr, const T& val)
+            {
+                prototype a;
+                a.construct( ptr, val );
+            }
+
+            /// destroy object at \p ptr
+            void destroy(pointer ptr)
+            {
+                prototype a;
+                a.destroy( ptr );
+            }
+
+            /// estimate maximum array size
+            size_type max_size() const throw()
+            {
+                prototype a;
+                return a.max_size();
+            }
+        };
+    }   // namespace OS
+}  // namespace cds
+
+#endif  // #ifndef __CDS_OS_ALLOC_ALIGNED_H
diff --git a/cds/os/details/fake_topology.h b/cds/os/details/fake_topology.h
new file mode 100644 (file)
index 0000000..2c25f52
--- /dev/null
@@ -0,0 +1,39 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_DETAILS_FAKE_TOPOLOGY_H
+#define __CDS_OS_DETAILS_FAKE_TOPOLOGY_H
+
+#include <cds/details/defs.h>
+#include <cds/threading/model.h>
+
+//@cond
+namespace cds { namespace OS { namespace details {
+
+    /// Fake system topology
+    struct fake_topology {
+        /// Logical processor count for the system
+        static unsigned int processor_count()
+        {
+            return 1;
+        }
+
+        /// Get current processor number
+        /**
+            The function emulates "current processor number" using thread-specific data.
+        */
+        static unsigned int current_processor()
+        {
+            // Use fake "current processor number" assigned for current thread
+            return (unsigned int) threading::Manager::fake_current_processor();
+        }
+
+        /// Synonym for \ref current_processor
+        static unsigned int native_current_processor()
+        {
+            return current_processor();
+        }
+    };
+}}}  // namespace cds::OS::details
+//@endcond
+
+#endif  // #ifndef __CDS_OS_DETAILS_FAKE_TOPOLOGY_H
diff --git a/cds/os/free_bsd/alloc_aligned.h b/cds/os/free_bsd/alloc_aligned.h
new file mode 100644 (file)
index 0000000..3186f05
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_FREE_BSD_ALLOC_ALIGNED_H
+#define __CDS_OS_FREE_BSD_ALLOC_ALIGNED_H
+
+#include <cds/os/posix/alloc_aligned.h>
+
+#endif // #ifndef __CDS_OS_FREE_BSD_ALLOC_ALIGNED_H
+
diff --git a/cds/os/free_bsd/timer.h b/cds/os/free_bsd/timer.h
new file mode 100644 (file)
index 0000000..4d6ef00
--- /dev/null
@@ -0,0 +1,96 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_FREE_BSD_TIMER_H
+#define __CDS_OS_FREE_BSD_TIMER_H
+
+#ifndef __CDS_OS_TIMER_H
+#   error "<cds/os/timer.h> must be included"
+#endif
+
+#include <time.h>
+#include <sys/timespec.h>
+
+//@cond none
+namespace cds { namespace OS {
+
+    CDS_CXX11_INLINE_NAMESPACE namespace Free_BSD {
+
+        // High resolution timer
+        class Timer {
+        public:
+            typedef struct timespec native_timer_type;
+            typedef long long       native_duration_type;
+
+        private:
+            native_timer_type    m_tmStart;
+
+        public:
+
+            Timer() { current( m_tmStart ) ; }
+
+            static void current( native_timer_type& tmr )
+            {
+                // faster than gettimeofday() and posix
+#           ifdef CLOCK_REALTIME_FAST
+                ::clock_gettime( CLOCK_REALTIME_FAST, &tmr );
+#           else
+                ::clock_gettime( CLOCK_REALTIME_FAST, &tmr );
+#           endif
+            }
+
+            static native_timer_type    current()
+            {
+                native_timer_type    tmr;
+                current(tmr);
+                return tmr;
+            }
+
+            double reset()
+            {
+                native_timer_type ts;
+                current( ts );
+                double dblRet = ( ts.tv_sec - m_tmStart.tv_sec ) + ( ts.tv_nsec - m_tmStart.tv_nsec ) / 1.0E9;
+                m_tmStart = ts;
+                return dblRet;
+            }
+
+            double duration( native_duration_type dur )
+            {
+                return double( dur ) / 1.0E9;
+            }
+
+            double duration()
+            {
+                return duration( native_duration() );
+            }
+
+            native_duration_type    native_duration()
+            {
+                native_timer_type ts;
+                current( ts );
+                return native_duration( m_tmStart, ts );
+            }
+
+            static native_duration_type    native_duration( const native_timer_type& nStart, const native_timer_type& nEnd )
+            {
+                return native_duration_type( nEnd.tv_sec - nStart.tv_sec ) * 1000000000 + ( nEnd.tv_nsec - nStart.tv_nsec);
+            }
+
+            static unsigned long long random_seed()
+            {
+                native_timer_type tmr;
+                current( tmr );
+                return ( ((unsigned long long)(tmr.tv_sec)) << 32 ) + tmr.tv_nsec;
+            }
+
+        };
+    }   // namespace Free_BSD
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    typedef Free_BSD::Timer    Timer;
+#endif
+
+}}   // namespace cds::OS
+//@endcond
+
+#endif // #ifndef __CDS_OS_FREE_BSD_TIMER_H
diff --git a/cds/os/free_bsd/topology.h b/cds/os/free_bsd/topology.h
new file mode 100644 (file)
index 0000000..f67bb46
--- /dev/null
@@ -0,0 +1,78 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_FREE_BSD_TOPOLOGY_H
+#define __CDS_OS_FREE_BSD_TOPOLOGY_H
+
+#ifndef __CDS_OS_TOPOLOGY_H
+#   error "<cds/os/topology.h> must be included instead"
+#endif
+
+#include <cds/os/details/fake_topology.h>
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+namespace cds { namespace OS {
+
+    /// FreeBSD-specific wrappers
+    CDS_CXX11_INLINE_NAMESPACE namespace Free_BSD {
+
+        /// System topology
+        /**
+            The implementation assumes that processor IDs are in numerical order
+            from 0 to N - 1, where N - count of processor in the system
+        */
+        struct topology: public OS::details::fake_topology
+        {
+        private:
+            //@cond
+            typedef OS::details::fake_topology  base_class;
+            //@endcond
+        public:
+
+            /// Logical processor count for the system
+            static unsigned int processor_count()
+            {
+                int mib[4];
+
+                /* set the mib for hw.ncpu */
+                mib[0] = CTL_HW;
+                mib[1] = HW_NCPU;
+                int nCPU = 0;
+                size_t len = sizeof(nCPU);
+
+                /* get the number of CPUs from the system */
+                return ::sysctl(mib, 2, &nCPU, &len, NULL, 0) == 0 && nCPU > 0 ? (unsigned int) nCPU : 1;
+            }
+
+            /// Get current processor number
+            /**
+                Caveat: FreeBSD has no "get current processor number" system call.
+                The function emulates "current processor number" using thread-specific data.
+            */
+            static unsigned int current_processor()
+            {
+                return base_class::current_processor();
+            }
+
+            /// Synonym for \ref current_processor
+            static unsigned int native_current_processor()
+            {
+                return current_processor();
+            }
+
+            //@cond
+            static void init()
+            {}
+            static void fini()
+            {}
+            //@endcond
+        };
+    }   // namespace Free_BSD
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using Free_BSD::topology;
+#endif
+}}  // namespace cds::OS
+
+#endif  // #ifndef __CDS_OS_FREE_BSD_TOPOLOGY_H
diff --git a/cds/os/hpux/alloc_aligned.h b/cds/os/hpux/alloc_aligned.h
new file mode 100644 (file)
index 0000000..29308c8
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_HPUX_ALLOC_ALIGNED_H
+#define __CDS_OS_HPUX_ALLOC_ALIGNED_H
+
+#include <cds/os/libc/alloc_aligned.h>
+
+#endif // #ifndef __CDS_OS_HPUX_ALLOC_ALIGNED_H
+
diff --git a/cds/os/hpux/timer.h b/cds/os/hpux/timer.h
new file mode 100644 (file)
index 0000000..e7f870c
--- /dev/null
@@ -0,0 +1,8 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_HPUX_TIMER_H
+#define __CDS_OS_HPUX_TIMER_H
+
+#include <cds/os/sunos/timer.h>
+
+#endif // #ifndef __CDS_OS_HPUX_TIMER_H
diff --git a/cds/os/hpux/topology.h b/cds/os/hpux/topology.h
new file mode 100644 (file)
index 0000000..9d79971
--- /dev/null
@@ -0,0 +1,80 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_HPUX_TOPOLOGY_H
+#define __CDS_OS_HPUX_TOPOLOGY_H
+
+#ifndef __CDS_OS_TOPOLOGY_H
+#   error "<cds/os/topology.h> must be included instead"
+#endif
+
+#include <sys/mpctl.h>
+
+namespace cds { namespace OS {
+    /// HP-UX-specific wrappers
+    CDS_CXX11_INLINE_NAMESPACE namespace Hpux {
+
+        /// System topology
+        struct topology {
+        public:
+            /// Logical processor count for the system
+            static unsigned int processor_count()
+            {
+                return ::mpctl( MPC_GETNUMSPUS_SYS, 0, 0 );
+            }
+
+            /// Get current processor number
+            /**
+                In HP-UX, processor and locality domain IDs are not guaranteed to exist
+                in numerical order. There may be holes in a sequential list of IDs.
+
+                This function guarantees sequence of processor numbers using internal processor ID mapping.
+                It returns sequential processor number, ie a number from 0 to N - 1, where N - processor count.
+            */
+            static unsigned int current_processor()
+            {
+                unsigned int nProc = native_current_processor();
+                if ( nProc < s_nProcMapSize )
+                    return s_procMap[ nProc ].nProcNo;
+                assert( false );
+                return 0;
+            }
+
+            /// Get OS-specific current processor number
+            /**
+                The function returns OS-provided processor number.
+                Processor and locality domain IDs are not guaranteed to exist
+                in numerical order.  There may be holes in a sequential list of IDs.
+            */
+            static unsigned int native_current_processor()
+            {
+                return ::mpctl( MPC_GETCURRENTSPU, 0, 0 );
+            }
+
+            //@cond
+            static void init();
+            static void fini();
+            //@endcond
+
+        private:
+            //@cond
+            struct processor_map {
+                unsigned int    nProcNo;
+                spu_t           nNativeProcNo;
+                unsigned int    nCell;
+
+            };
+            static processor_map *  s_procMap;
+            static size_t           s_nProcMapSize;
+
+            static void make_processor_map();
+
+            //@endcond
+        };
+    }   // namespace Hpux
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using Hpux::topology;
+#endif
+}}  // namespace cds::OS
+
+#endif  // #ifndef __CDS_OS_HPUX_TOPOLOGY_H
diff --git a/cds/os/libc/alloc_aligned.h b/cds/os/libc/alloc_aligned.h
new file mode 100644 (file)
index 0000000..4079dae
--- /dev/null
@@ -0,0 +1,36 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_LIBC_ALLOC_ALIGNED_H
+#define __CDS_OS_LIBC_ALLOC_ALIGNED_H
+
+#include <stdlib.h>
+
+//@cond none
+namespace cds { namespace OS {
+    namespace libc {
+        /// Allocates memory on a specified alignment boundary
+        static inline void * aligned_malloc(
+            size_t nSize,       ///< Size of the requested memory allocation
+            size_t nAlignment   ///< The alignment value, which must be an integer power of 2
+            )
+        {
+            return ::memalign( nAlignment, nSize );
+        }
+
+        /// Frees a block of memory that was allocated with aligned_malloc.
+        static inline void aligned_free(
+            void * pBlock   ///< A pointer to the memory block that was returned to the aligned_malloc function
+            )
+        {
+            ::free( pBlock );
+        }
+    }   // namespace libc
+
+    using libc::aligned_malloc;
+    using libc::aligned_free;
+
+}} // namespace cds::OS
+//@endcond
+
+#endif // #ifndef __CDS_OS_LIBC_ALLOC_ALIGNED_H
+
diff --git a/cds/os/linux/alloc_aligned.h b/cds/os/linux/alloc_aligned.h
new file mode 100644 (file)
index 0000000..f41773e
--- /dev/null
@@ -0,0 +1,15 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_LINUX_ALLOC_ALIGNED_H
+#define __CDS_OS_LINUX_ALLOC_ALIGNED_H
+
+//@cond
+#ifdef __ANDROID__
+#   include <cds/os/libc/alloc_aligned.h>
+#else
+#   include <cds/os/posix/alloc_aligned.h>
+#endif
+//@endcond
+
+#endif // #ifndef __CDS_OS_LINUX_ALLOC_ALIGNED_H
+
diff --git a/cds/os/linux/timer.h b/cds/os/linux/timer.h
new file mode 100644 (file)
index 0000000..f8a03fb
--- /dev/null
@@ -0,0 +1,90 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_LINUX_TIMER_H
+#define __CDS_OS_LINUX_TIMER_H
+
+#ifndef __CDS_OS_TIMER_H
+#   error "<cds/os/timer.h> must be included"
+#endif
+
+#include <time.h>
+//#include <sys/time.h>
+
+//@cond none
+namespace cds { namespace OS {
+    CDS_CXX11_INLINE_NAMESPACE namespace Linux {
+
+        // High resolution timer
+        class Timer {
+        public:
+            typedef struct timespec native_timer_type;
+            typedef long long       native_duration_type;
+
+        private:
+            native_timer_type    m_tmStart;
+
+        public:
+
+            Timer() { current( m_tmStart ) ; }
+
+            static void current( native_timer_type& tmr )
+            {
+                // faster than gettimeofday() and posix
+                clock_gettime( CLOCK_REALTIME, &tmr );
+            }
+
+            static native_timer_type    current()
+            {
+                native_timer_type    tmr;
+                current(tmr);
+                return tmr;
+            }
+
+            double reset()
+            {
+                native_timer_type ts;
+                current( ts );
+                double dblRet = ( ts.tv_sec - m_tmStart.tv_sec ) + ( ts.tv_nsec - m_tmStart.tv_nsec ) / 1.0E9;
+                m_tmStart = ts;
+                return dblRet;
+            }
+
+            double duration( native_duration_type dur )
+            {
+                return double( dur ) / 1.0E9;
+            }
+
+            double duration()
+            {
+                return duration( native_duration() );
+            }
+
+            native_duration_type    native_duration()
+            {
+                native_timer_type ts;
+                current( ts );
+                return native_duration( m_tmStart, ts );
+            }
+
+            static native_duration_type    native_duration( const native_timer_type& nStart, const native_timer_type& nEnd )
+            {
+                return native_duration_type( nEnd.tv_sec - nStart.tv_sec ) * 1000000000 + ( nEnd.tv_nsec - nStart.tv_nsec);
+            }
+
+            static unsigned long long random_seed()
+            {
+                native_timer_type tmr;
+                current( tmr );
+                return ( ((unsigned long long)(tmr.tv_sec)) << 32 ) + tmr.tv_nsec;
+            }
+        };
+    }    // namespace Linux
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    typedef Linux::Timer    Timer;
+#endif
+
+}}    // namespace cds::OS
+//@endcond
+
+#endif // #ifndef __CDS_OS_LINUX_TIMER_H
diff --git a/cds/os/linux/topology.h b/cds/os/linux/topology.h
new file mode 100644 (file)
index 0000000..45b5b38
--- /dev/null
@@ -0,0 +1,92 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_LINUX_TOPOLOGY_H
+#define __CDS_OS_LINUX_TOPOLOGY_H
+
+#ifndef __CDS_OS_TOPOLOGY_H
+#   error "<cds/os/topology.h> must be included instead"
+#endif
+
+#include <cds/details/defs.h>
+#include <cds/threading/model.h>
+
+#include <sys/syscall.h>
+#include <sched.h>
+
+namespace cds { namespace OS {
+    /// Linux-specific wrappers
+    CDS_CXX11_INLINE_NAMESPACE namespace Linux {
+
+        /// System topology
+        /**
+            The implementation assumes that processor IDs are in numerical order
+            from 0 to N - 1, where N - count of processor in the system
+        */
+        struct topology {
+        private:
+            //@cond
+            static unsigned int     s_nProcessorCount;
+            //@endcond
+        public:
+
+            /// Logical processor count for the system
+            static unsigned int processor_count()
+            {
+                return s_nProcessorCount;
+            }
+
+            /// Get current processor number
+            /**
+                Caveat: \p current_processor calls system \p sched_getcpu function
+                that may not be defined for target system (\p sched_getcpu is available since glibc 2.6).
+                If \p sched_getcpu is not defined the function emulates "current processor number" using
+                thread-specific data. You may manually disable the \p sched_getcpu usage compiling with
+                <tt>-DCDS_LINUX_NO_sched_getcpu</tt>.
+            */
+            static unsigned int current_processor()
+            {
+            // Compile libcds with -DCDS_LINUX_NO_sched_getcpu if your linux does not have sched_getcpu (glibc version less than 2.6)
+#           if !defined(CDS_LINUX_NO_sched_getcpu) && defined(SYS_getcpu)
+                int nProcessor = ::sched_getcpu();
+                return nProcessor == -1 ? 0 : (unsigned int) nProcessor;
+#           else
+                // Use fake "current processor number" assigned for current thread
+                return (unsigned int) threading::Manager::fake_current_processor();
+
+                /*
+                Another way (for x86/amd64 only)
+
+                Using cpuid and APIC ID (http://www.scss.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm)
+                for x86 and amd64
+                {
+                    _asm {mov eax, 1}
+                    _asm {cpuid}
+                    _asm {shr ebx, 24}
+                    _asm {mov eax, ebx}
+                }
+                However:
+                    - cpuid is full sync barrier
+                    - it is only for x86/amd64 architecture
+                */
+#           endif
+            }
+
+            /// Synonym for \ref current_processor
+            static unsigned int native_current_processor()
+            {
+                return current_processor();
+            }
+
+            //@cond
+            static void init();
+            static void fini();
+            //@endcond
+        };
+    }   // namespace Linux
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using Linux::topology;
+#endif
+}}  // namespace cds::OS
+
+#endif  // #ifndef __CDS_OS_LINUX_TOPOLOGY_H
diff --git a/cds/os/osx/timer.h b/cds/os/osx/timer.h
new file mode 100644 (file)
index 0000000..b9c9c8e
--- /dev/null
@@ -0,0 +1,103 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_OSX_TIMER_H
+#define __CDS_OS_OSX_TIMER_H
+
+#ifndef __CDS_OS_TIMER_H
+#   error "<cds/os/timer.h> must be included"
+#endif
+
+#include <time.h>
+#include <sys/time.h>
+#include <mach/clock.h>
+#include <mach/mach.h>
+
+// From http://stackoverflow.com/questions/11680461/monotonic-clock-on-osx
+
+//@cond none
+namespace cds { namespace OS {
+    CDS_CXX11_INLINE_NAMESPACE namespace OS_X {
+
+        // High resolution timer
+        class Timer {
+        public:
+            typedef mach_timespec_t native_timer_type;
+            typedef long long       native_duration_type;
+
+        private:
+            native_timer_type    m_tmStart;
+            clock_serv_t         m_Service;
+
+        public:
+
+            Timer()
+            {
+                host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &m_Service);
+                current( m_tmStart );
+            }
+            ~Timer()
+            {
+                mach_port_deallocate(mach_task_self(), m_Service);
+            }
+
+            void current( native_timer_type& tmr )
+            {
+                clock_get_time(m_Service, &tmr);
+            }
+
+            native_timer_type    current()
+            {
+                native_timer_type    tmr;
+                current(tmr);
+                return tmr;
+            }
+
+            double reset()
+            {
+                native_timer_type ts;
+                current( ts );
+                double dblRet = ( ts.tv_sec - m_tmStart.tv_sec ) + ( ts.tv_nsec - m_tmStart.tv_nsec ) / 1.0E9;
+                m_tmStart = ts;
+                return dblRet;
+            }
+
+            double duration( native_duration_type dur )
+            {
+                return double( dur ) / 1.0E9;
+            }
+
+            double duration()
+            {
+                return duration( native_duration() );
+            }
+
+            native_duration_type    native_duration()
+            {
+                native_timer_type ts;
+                current( ts );
+                return native_duration( m_tmStart, ts );
+            }
+
+            static native_duration_type    native_duration( const native_timer_type& nStart, const native_timer_type& nEnd )
+            {
+                return native_duration_type( nEnd.tv_sec - nStart.tv_sec ) * 1000000000 + ( nEnd.tv_nsec - nStart.tv_nsec);
+            }
+
+            static unsigned long long random_seed()
+            {
+                native_timer_type tmr;
+                Timer tm;
+                tm.current( tmr );
+                return ( ((unsigned long long)(tmr.tv_sec)) << 32 ) + tmr.tv_nsec;
+            }
+        };
+    }    // namespace OS_X
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    typedef OS_X::Timer    Timer;
+#endif
+
+}}    // namespace cds::OS
+//@endcond
+
+#endif // #ifndef __CDS_OS_LINUX_TIMER_H
diff --git a/cds/os/osx/topology.h b/cds/os/osx/topology.h
new file mode 100644 (file)
index 0000000..a1a84e9
--- /dev/null
@@ -0,0 +1,60 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_OSX_TOPOLOGY_H
+#define __CDS_OS_OSX_TOPOLOGY_H
+
+#ifndef __CDS_OS_TOPOLOGY_H
+#   error "<cds/os/topology.h> must be included instead"
+#endif
+
+#include <cds/os/details/fake_topology.h>
+
+namespace cds { namespace OS {
+    /// Linux-specific wrappers
+    CDS_CXX11_INLINE_NAMESPACE namespace OS_X {
+
+        /// System topology
+        /**
+            The implementation assumes that processor IDs are in numerical order
+            from 0 to N - 1, where N - count of processor in the system
+        */
+        struct topology: public OS::details::fake_topology
+        {
+        private:
+            //@cond
+            typedef OS::details::fake_topology  base_class;
+            static unsigned int     s_nProcessorCount;
+            //@endcond
+        public:
+
+            /// Logical processor count for the system
+            static unsigned int processor_count()
+            {
+                return s_nProcessorCount;
+            }
+
+            /// Get current processor number
+            static unsigned int current_processor()
+            {
+                return base_class::current_processor();
+            }
+
+            /// Synonym for \ref current_processor
+            static unsigned int native_current_processor()
+            {
+                return current_processor();
+            }
+
+            //@cond
+            static void init();
+            static void fini();
+            //@endcond
+        };
+    }   // namespace OS_X
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using OS_X::topology;
+#endif
+}}  // namespace cds::OS
+
+#endif  // #ifndef __CDS_OS_OSX_TOPOLOGY_H
diff --git a/cds/os/posix/alloc_aligned.h b/cds/os/posix/alloc_aligned.h
new file mode 100644 (file)
index 0000000..b5c5320
--- /dev/null
@@ -0,0 +1,45 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_POSIX_ALLOC_ALIGNED_H
+#define __CDS_OS_POSIX_ALLOC_ALIGNED_H
+
+#ifndef _GNU_SOURCE
+#   define _GNU_SOURCE
+#endif
+#ifndef _XOPEN_SOURCE
+#   define _XOPEN_SOURCE 600
+#endif
+
+#include <stdlib.h>
+
+//@cond none
+namespace cds { namespace OS {
+    namespace posix {
+        /// Allocates memory on a specified alignment boundary
+        static inline void * aligned_malloc(
+            size_t nSize,       ///< Size of the requested memory allocation
+            size_t nAlignment   ///< The alignment value, which must be an integer power of 2
+            )
+        {
+            void * pMem;
+            return ::posix_memalign( &pMem, nAlignment, nSize ) == 0 ? pMem : NULL;
+        }
+
+        /// Frees a block of memory that was allocated with aligned_malloc.
+        static inline void aligned_free(
+            void * pBlock   ///< A pointer to the memory block that was returned to the aligned_malloc function
+            )
+        {
+            ::free( pBlock );
+        }
+    }   // namespace posix
+
+    using posix::aligned_malloc;
+    using posix::aligned_free;
+
+}} // namespace cds::OS
+//@endcond
+
+
+#endif // #ifndef __CDS_OS_POSIX_ALLOC_ALIGNED_H
+
diff --git a/cds/os/posix/fake_topology.h b/cds/os/posix/fake_topology.h
new file mode 100644 (file)
index 0000000..c5f91c5
--- /dev/null
@@ -0,0 +1,50 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_POSIX_FAKE_TOPOLOGY_H
+#define __CDS_OS_POSIX_FAKE_TOPOLOGY_H
+
+#ifndef __CDS_OS_TOPOLOGY_H
+#   error "<cds/os/topology.h> must be included instead"
+#endif
+
+#include <cds/os/details/fake_topology.h>
+#include <unistd.h>
+
+namespace cds { namespace OS {
+    namespace posix {
+        /// Fake system topology
+        struct topology {
+            /// Logical processor count for the system. Always returns 1
+            static unsigned int processor_count()
+            {
+                return 1;
+            }
+
+            /// Get current processor number
+            /**
+                Always returns 0
+            */
+            static unsigned int current_processor()
+            {
+                return 0;
+            }
+
+            /// Synonym for \ref current_processor
+            static unsigned int native_current_processor()
+            {
+                return current_processor();
+            }
+
+            //@cond
+            static void init()
+            {}
+            static void fini()
+            {}
+            //@endcond
+        };
+    }   // namespace posix
+
+    using posix::topology;
+}}  // namespace cds::OS
+
+#endif  // #ifndef __CDS_OS_POSIX_FAKE_TOPOLOGY_H
diff --git a/cds/os/posix/syserror.h b/cds/os/posix/syserror.h
new file mode 100644 (file)
index 0000000..2929e01
--- /dev/null
@@ -0,0 +1,40 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_POSIX_SYSERROR_H
+#define __CDS_OS_POSIX_SYSERROR_H
+
+#include <stdlib.h>     // system
+#include <pthread.h>
+#include <sched.h>
+#include <cerrno>
+#include <cstdlib>
+#include <string>
+#include <string.h>
+
+namespace cds { namespace OS {
+    namespace posix {
+        /// Posix error code type
+        typedef int                error_code;
+
+        /// Get text for system error \p nCode
+        static inline std::string getSystemErrorText( error_code nCode )
+        {
+            char *msg = strerror( nCode );
+            return std::string( msg );
+        }
+
+        /// Get curent error code (returns \p errno)
+        static inline error_code  getErrorCode()
+        {
+            return errno;
+        }
+
+    }    // namespace posix
+
+    using posix::error_code;
+    using posix::getErrorCode;
+    using posix::getSystemErrorText;
+}} // namespace cds::OS
+
+
+#endif // #ifndef __CDS_OS_POSIX_SYSERROR_H
diff --git a/cds/os/posix/thread.h b/cds/os/posix/thread.h
new file mode 100644 (file)
index 0000000..c84f237
--- /dev/null
@@ -0,0 +1,55 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_POSIX_THREAD_H
+#define __CDS_OS_POSIX_THREAD_H
+
+#include <stdlib.h>     // system
+#include <pthread.h>
+#include <sched.h>
+#include <signal.h>
+#include <cerrno>
+#include <cstdlib>
+#include <string>
+#include <string.h>
+
+namespace cds { namespace OS {
+    /// posix-related wrappers
+    namespace posix {
+        /// Posix thread id type
+        typedef pthread_t       ThreadId;
+
+        /// Null thread id constant
+        CDS_CONSTEXPR static inline ThreadId nullThreadId()   { return 0 ; }
+
+        /// Get current thread id
+        static inline ThreadId getCurrentThreadId()    { return pthread_self() ; }
+
+        /// Checks if thread \p id is alive
+        static inline bool isThreadAlive( ThreadId id )
+        {
+            // if sig is zero, error checking is performed but no signal is actually sent.
+            // ESRCH - No thread could be found corresponding to that specified by the given thread ID
+            // Unresolved problem: Linux may crash on dead thread_id.  Workaround unknown (except signal handler...)
+            return pthread_kill( id, 0 ) != ESRCH;
+        }
+
+        /// Yield thread
+        static inline void yield()      { sched_yield(); }
+
+        /// Default back-off thread strategy (yield)
+        static inline void backoff()    { sched_yield(); }
+
+    }    // namespace posix
+
+    using posix::ThreadId;
+
+    using posix::nullThreadId;
+    using posix::getCurrentThreadId;
+    using posix::isThreadAlive;
+    using posix::yield;
+    using posix::backoff;
+
+}} // namespace cds::OS
+
+
+#endif // #ifndef __CDS_OS_POSIX_THREAD_H
diff --git a/cds/os/posix/timer.h b/cds/os/posix/timer.h
new file mode 100644 (file)
index 0000000..9275a24
--- /dev/null
@@ -0,0 +1,87 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_POSIX_TIMER_H
+#define __CDS_OS_POSIX_TIMER_H
+
+#ifndef __CDS_OS_TIMER_H
+#   error "<cds/os/timer.h> must be included"
+#endif
+
+#include <time.h>
+
+//@cond none
+namespace cds { namespace OS {
+    namespace posix {
+
+        // High resolution timer
+        // From Linux as an example
+        class Timer {
+        public:
+            typedef struct timespec native_timer_type;
+            typedef long long       native_duration_type;
+
+        private:
+            native_timer_type    m_tmStart;
+
+        public:
+            Timer() { current( m_tmStart ) ; }
+
+            static void current( native_timer_type& tmr )
+            {
+                // faster than gettimeofday() and posix
+                clock_gettime( CLOCK_REALTIME, &tmr );
+            }
+
+            static native_timer_type    current()
+            {
+                native_timer_type    tmr;
+                current(tmr);
+                return tmr;
+            }
+
+            double reset()
+            {
+                native_timer_type ts;
+                current( ts );
+                double dblRet = ( ts.tv_sec - m_tmStart.tv_sec ) + ( ts.tv_nsec - m_tmStart.tv_nsec ) / 1.0E9;
+                m_tmStart = ts;
+                return dblRet;
+            }
+
+            double duration( native_duration_type dur )
+            {
+                return double( dur ) / 1.0E9;
+            }
+
+            double duration()
+            {
+                return duration( native_duration() );
+            }
+
+            native_duration_type    native_duration()
+            {
+                native_timer_type ts;
+                current( ts );
+                return native_duration( m_tmStart, ts );
+            }
+
+            static native_duration_type    native_duration( const native_timer_type& nStart, const native_timer_type& nEnd )
+            {
+                return native_duration_type( nEnd.tv_sec - nStart.tv_sec ) * 1000000000 + ( nEnd.tv_nsec - nStart.tv_nsec);
+            }
+
+            static unsigned long long random_seed()
+            {
+                native_timer_type tmr;
+                current( tmr );
+                return ( ((unsigned long long)(tmr.tv_sec)) << 32 ) + tmr.tv_nsec;
+            }
+        };
+    }    // namespace posix
+
+    using posix::Timer;
+
+}}    // namespace cds::OS
+//@endcond
+
+#endif // #ifndef __CDS_OS_POSIX_TIMER_H
diff --git a/cds/os/sunos/alloc_aligned.h b/cds/os/sunos/alloc_aligned.h
new file mode 100644 (file)
index 0000000..6c1a161
--- /dev/null
@@ -0,0 +1,9 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_SUNOS_ALLOC_ALIGNED_H
+#define __CDS_OS_SUNOS_ALLOC_ALIGNED_H
+
+#include <cds/os/libc/alloc_aligned.h>
+
+#endif // #ifndef __CDS_OS_SUNOS_ALLOC_ALIGNED_H
+
diff --git a/cds/os/sunos/timer.h b/cds/os/sunos/timer.h
new file mode 100644 (file)
index 0000000..ce6084b
--- /dev/null
@@ -0,0 +1,71 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_SUNOS_TIMER_H
+#define __CDS_OS_SUNOS_TIMER_H
+
+#ifndef __CDS_OS_TIMER_H
+#   error "<cds/os/timer.h> must be included"
+#endif
+
+#include <sys/time.h>
+
+//@cond none
+namespace cds { namespace OS {
+    CDS_CXX11_INLINE_NAMESPACE namespace Sun {
+
+        // High resolution timer
+        class Timer {
+            hrtime_t    m_tmStart;
+        public:
+            typedef hrtime_t    native_timer_type;
+            typedef long long    native_duration_type;
+
+            Timer() : m_tmStart( current() ) {}
+
+            static native_timer_type    current()            { return gethrtime();    }
+            static void current( native_timer_type& tmr )    { tmr = gethrtime();    }
+
+            double reset()
+            {
+                native_timer_type tt = current();
+                double ret = (tt - m_tmStart) / 1.0E9;  //gethrtime() freq = nanoseconds
+                m_tmStart = tt;
+                return ret;
+            }
+
+            double duration( native_duration_type dur )
+            {
+                return double( dur ) / 1.0E9;
+            }
+
+            double duration()
+            {
+                return duration( native_duration() );
+            }
+
+            native_duration_type    native_duration()
+            {
+                return native_duration( m_tmStart, current() );
+            }
+
+            static native_duration_type    native_duration( native_timer_type nStart, native_timer_type nEnd )
+            {
+                return native_duration_type( nEnd - nStart );
+            }
+
+            static unsigned long long random_seed()
+            {
+                return (unsigned long long) current();
+            }
+        };
+
+    }   // namespace Sun
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    typedef Sun::Timer    Timer;
+#endif
+
+}}  // namespace cds::OS
+//@endcond
+
+#endif // #ifndef __CDS_OS_SUNOS_TIMER_H
diff --git a/cds/os/sunos/topology.h b/cds/os/sunos/topology.h
new file mode 100644 (file)
index 0000000..5799d89
--- /dev/null
@@ -0,0 +1,60 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_SUNOS_TOPOLOGY_H
+#define __CDS_OS_SUNOS_TOPOLOGY_H
+
+#ifndef __CDS_OS_TOPOLOGY_H
+#   error "<cds/os/topology.h> must be included instead"
+#endif
+
+#include <sys/processor.h>
+#include <unistd.h>
+
+namespace cds { namespace OS {
+
+    /// Sun Solaris-specific wrappers
+    CDS_CXX11_INLINE_NAMESPACE namespace Sun {
+
+        /// System topology
+        /**
+            The implementation assumes that the processor IDs are in numerical order
+            from 0 to N - 1, where N - count of processor in the system
+        */
+        struct topology {
+            /// Logical processor count for the system
+            static unsigned int processor_count()
+            {
+                // Maybe, _SC_NPROCESSORS_ONLN? But _SC_NPROCESSORS_ONLN may change dynamically...
+                long nCount = ::sysconf(_SC_NPROCESSORS_CONF);
+                if ( nCount == -1 )
+                    return  1;
+                return (unsigned int) nCount;
+            }
+
+            /// Get current processor number
+            static unsigned int current_processor()
+            {
+                return  ::getcpuid();
+            }
+
+            /// Synonym for \ref current_processor
+            static unsigned int native_current_processor()
+            {
+                return current_processor();
+            }
+
+            //@cond
+            static void init()
+            {}
+            static void fini()
+            {}
+            //@endcond
+        };
+    }   // namespace Sun
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using Sun::topology;
+#endif
+}}  // namespace cds::OS
+
+#endif  // #ifndef __CDS_OS_SUNOS_TOPOLOGY_H
diff --git a/cds/os/syserror.h b/cds/os/syserror.h
new file mode 100644 (file)
index 0000000..05474b2
--- /dev/null
@@ -0,0 +1,14 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_SYSERROR_H
+#define __CDS_OS_SYSERROR_H
+
+#include <cds/details/defs.h>
+
+#if CDS_OS_TYPE == CDS_OS_WIN32 || CDS_OS_TYPE == CDS_OS_WIN64 || CDS_OS_TYPE == CDS_OS_MINGW
+#    include <cds/os/win/syserror.h>
+#else
+#    include <cds/os/posix/syserror.h>
+#endif
+
+#endif    // #ifndef __CDS_OS_SYSERROR_H
diff --git a/cds/os/thread.h b/cds/os/thread.h
new file mode 100644 (file)
index 0000000..f592194
--- /dev/null
@@ -0,0 +1,14 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_THREAD_H
+#define __CDS_OS_THREAD_H
+
+#include <cds/details/defs.h>
+
+#if CDS_OS_TYPE == CDS_OS_WIN32 || CDS_OS_TYPE == CDS_OS_WIN64 || CDS_OS_TYPE == CDS_OS_MINGW
+#    include <cds/os/win/thread.h>
+#else
+#    include <cds/os/posix/thread.h>
+#endif
+
+#endif    // #ifndef __CDS_OS_THREAD_H
diff --git a/cds/os/timer.h b/cds/os/timer.h
new file mode 100644 (file)
index 0000000..d1bdcc2
--- /dev/null
@@ -0,0 +1,31 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_TIMER_H
+#define __CDS_OS_TIMER_H
+
+#include <cds/details/defs.h>
+
+#if CDS_OS_TYPE == CDS_OS_WIN32 || CDS_OS_TYPE == CDS_OS_WIN64 || CDS_OS_TYPE == CDS_OS_MINGW
+#    include <cds/os/win/timer.h>
+#elif CDS_OS_TYPE == CDS_OS_LINUX
+#    include <cds/os/linux/timer.h>
+#elif CDS_OS_TYPE == CDS_OS_SUN_SOLARIS
+#    include <cds/os/sunos/timer.h>
+#elif CDS_OS_TYPE == CDS_OS_HPUX
+#    include <cds/os/hpux/timer.h>
+#elif CDS_OS_TYPE == CDS_OS_AIX
+#    include <cds/os/aix/timer.h>
+#elif CDS_OS_TYPE == CDS_OS_FREE_BSD
+#   include <cds/os/free_bsd/timer.h>
+#elif CDS_OS_TYPE == CDS_OS_OSX
+#   include <cds/os/osx/timer.h>
+#elif CDS_OS_TYPE == CDS_OS_PTHREAD || CDS_OS_INTERFACE == CDS_OSI_UNIX
+#   include <cds/os/posix/timer.h>
+#else
+//************************************************************************
+// Other OSes
+//************************************************************************
+#    error Unknown operating system. Compilation aborted.
+#endif
+
+#endif    // #ifndef __CDS_OS_TIMER_H
diff --git a/cds/os/topology.h b/cds/os/topology.h
new file mode 100644 (file)
index 0000000..be6d33e
--- /dev/null
@@ -0,0 +1,28 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_TOPOLOGY_H
+#define __CDS_OS_TOPOLOGY_H
+
+#include <cds/details/defs.h>
+
+#if CDS_OS_TYPE == CDS_OS_WIN32 || CDS_OS_TYPE == CDS_OS_WIN64 || CDS_OS_TYPE == CDS_OS_MINGW
+#   include <cds/os/win/topology.h>
+#elif CDS_OS_TYPE == CDS_OS_LINUX
+#   include <cds/os/linux/topology.h>
+#elif CDS_OS_TYPE == CDS_OS_SUN_SOLARIS
+#   include <cds/os/sunos/topology.h>
+#elif CDS_OS_TYPE == CDS_OS_HPUX
+#   include <cds/os/hpux/topology.h>
+#elif CDS_OS_TYPE == CDS_OS_AIX
+#   include <cds/os/aix/topology.h>
+#elif CDS_OS_TYPE == CDS_OS_FREE_BSD || CDS_OS_TYPE == CDS_OS_OPEN_BSD || CDS_OS_TYPE == CDS_OS_NET_BSD
+#   include <cds/os/free_bsd/topology.h>
+#elif CDS_OS_TYPE == CDS_OS_OSX
+#   include <cds/os/osx/topology.h>
+#elif CDS_OS_TYPE == CDS_OS_PTHREAD || CDS_OS_INTERFACE == CDS_OSI_UNIX
+#   include <cds/os/posix/fake_topology.h>
+#else
+#   error Unknown OS. Compilation aborted
+#endif
+
+#endif  // #ifndef __CDS_OS_TOPOLOGY_H
diff --git a/cds/os/win/alloc_aligned.h b/cds/os/win/alloc_aligned.h
new file mode 100644 (file)
index 0000000..061afc4
--- /dev/null
@@ -0,0 +1,36 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_WIN_ALLOC_ALIGNED_H
+#define __CDS_OS_WIN_ALLOC_ALIGNED_H
+
+#include <malloc.h>
+
+//@cond none
+namespace cds { namespace OS {
+    namespace Win32 {
+        /// Allocates memory on a specified alignment boundary
+        static inline void * aligned_malloc(
+            size_t nSize,       ///< Size of the requested memory allocation
+            size_t nAlignment   ///< The alignment value, which must be an integer power of 2
+            )
+        {
+            return ::_aligned_malloc( nSize, nAlignment );
+        }
+
+        /// Frees a block of memory that was allocated with aligned_malloc.
+        static inline void aligned_free(
+            void * pBlock   ///< A pointer to the memory block that was returned to the aligned_malloc function
+            )
+        {
+            ::_aligned_free( pBlock );
+        }
+    }   // namespace Win32
+
+    using Win32::aligned_malloc;
+    using Win32::aligned_free;
+
+}} // namespace cds::OS
+//@endcond
+
+#endif // #ifndef __CDS_OS_WIN_ALLOC_ALIGNED_H
+
diff --git a/cds/os/win/syserror.h b/cds/os/win/syserror.h
new file mode 100644 (file)
index 0000000..31c6048
--- /dev/null
@@ -0,0 +1,48 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_WIN_SYSERROR_H
+#define __CDS_OS_WIN_SYSERROR_H
+
+#include <windows.h>
+#include <string>
+
+namespace cds { namespace OS {
+    namespace Win32 {
+
+        /// OS-specific type of error code
+        typedef DWORD            error_code;
+
+        /// Get system error code
+        static inline error_code  getErrorCode()
+        {
+            return ::GetLastError();
+        }
+
+        /// Get system error text
+        static inline std::string getSystemErrorText( error_code nCode )
+        {
+            char *ptmp = 0;
+            if ( !FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+                NULL,
+                nCode,
+                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                (LPTSTR) &ptmp, 0, 0  )
+                )
+            {
+                if ( ptmp )
+                    LocalFree( ptmp );
+                return std::string();
+            }
+            std::string str( ptmp );
+            LocalFree( ptmp );
+            return str;
+        }
+    }    // namespace Win32
+
+    using Win32::error_code;
+    using Win32::getErrorCode;
+    using Win32::getSystemErrorText;
+}} // namespace cds::OS
+
+#endif // #ifndef __CDS_OS_WIN_SYSERROR_H
+
diff --git a/cds/os/win/thread.h b/cds/os/win/thread.h
new file mode 100644 (file)
index 0000000..09e9154
--- /dev/null
@@ -0,0 +1,68 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_WIN_THREAD_H
+#define __CDS_OS_WIN_THREAD_H
+
+#include <windows.h>
+
+namespace cds { namespace OS {
+    /// Windows-specific functions
+    namespace Win32 {
+
+        /// OS-specific type of thread identifier
+        typedef DWORD           ThreadId;
+
+        /// OS-specific type of thread handle
+        typedef HANDLE            ThreadHandle;
+
+        /// Get null thread id
+        CDS_CONSTEXPR static inline ThreadId nullThreadId()
+        {
+            return 0;
+        }
+
+        /// Get current thread id
+        static inline ThreadId getCurrentThreadId()
+        {
+            return ::GetCurrentThreadId();
+        }
+
+        /// Tests whether the thread is alive
+        static inline bool isThreadAlive( ThreadId id )
+        {
+            HANDLE h = ::OpenThread( SYNCHRONIZE, FALSE, id );
+            if ( h == NULL )
+                return false;
+            ::CloseHandle( h );
+            return true;
+        }
+
+        /// Yield current thread, switch to another
+        static inline void yield()
+        {
+    #    if _WIN32_WINNT >= 0x0400
+            ::SwitchToThread();
+    #   else
+            ::Sleep(0);
+    #   endif
+        }
+
+        /// Default backoff::yield implementation
+        static inline void    backoff()
+        {
+            yield();
+        }
+    }    // namespace Win32
+
+    using Win32::ThreadId;
+    using Win32::ThreadHandle;
+
+    using Win32::nullThreadId;
+    using Win32::getCurrentThreadId;
+    using Win32::isThreadAlive;
+    using Win32::yield;
+    using Win32::backoff;
+
+}} // namespace cds::OS
+
+#endif // #ifndef __CDS_OS_WIN_THREAD_H
diff --git a/cds/os/win/timer.h b/cds/os/win/timer.h
new file mode 100644 (file)
index 0000000..84b8159
--- /dev/null
@@ -0,0 +1,103 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_WIN_TIMER_H
+#define __CDS_OS_WIN_TIMER_H
+
+#ifndef __CDS_OS_TIMER_H
+#   error "<cds/os/timer.h> must be included"
+#endif
+
+#include <windows.h>
+
+//@cond none
+namespace cds { namespace OS {
+    CDS_CXX11_INLINE_NAMESPACE namespace Win32 {
+
+        /// High resolution timer
+        /**
+            Implementation of high resolution timer for Windows platforms.
+            The implementation build on QueryPerformanceCounter API.
+        */
+        class Timer {
+        public:
+            typedef LARGE_INTEGER    native_timer_type        ;    ///< Native timer type
+            typedef long long        native_duration_type    ;    ///< Native duration type
+
+        private:
+            native_timer_type    m_nFrequency;
+            native_timer_type    m_nStart;
+
+        public:
+            Timer()
+            {
+                ::QueryPerformanceFrequency( &m_nFrequency );
+                current( m_nStart );
+            }
+
+            /// Places into \p tmr the current time in native Windows format
+            static void current( native_timer_type& tmr )
+            {
+                ::QueryPerformanceCounter( &tmr );
+            }
+
+            /// Returns current time in native Windows format
+            static native_timer_type current()
+            {
+                native_timer_type    tmr;
+                current(tmr);
+                return tmr;
+            }
+
+            /// Sets internal start time to current time. Returns duration from prevoius start time to current.
+            double reset()
+            {
+                native_timer_type nCur;
+                current( nCur );
+                double dblRet = double(nCur.QuadPart - m_nStart.QuadPart) / m_nFrequency.QuadPart;
+                m_nStart.QuadPart = nCur.QuadPart;
+                return dblRet;
+            }
+
+            /// Translates \p dur from native format to seconds
+            double duration( native_duration_type dur )
+            {
+                return double( dur ) / m_nFrequency.QuadPart;
+            }
+
+            /// Returns duration (in seconds) from start time to current
+            double duration()
+            {
+                return duration( native_duration() );
+            }
+
+            /// Returns duration (in native format) from start time to current
+            native_duration_type    native_duration()
+            {
+                native_timer_type ts;
+                current( ts );
+                return native_duration( m_nStart, ts );
+            }
+
+            /// Calculates duration (in native format) between \p nEnd and \p nStart
+            static native_duration_type    native_duration( const native_timer_type& nStart, const native_timer_type& nEnd )
+            {
+                return nEnd.QuadPart - nStart.QuadPart;
+            }
+
+            static unsigned long long random_seed()
+            {
+                return current().QuadPart;
+            }
+        };
+
+
+    }   // namespace Win32
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    typedef Win32::Timer    Timer;
+#endif
+
+}}  // namespae cds::OS
+//@endcond
+
+#endif // #ifndef __CDS_OS_WIN_TIMER_H
diff --git a/cds/os/win/topology.h b/cds/os/win/topology.h
new file mode 100644 (file)
index 0000000..437539d
--- /dev/null
@@ -0,0 +1,69 @@
+//$$CDS-header$$
+
+#ifndef __CDS_OS_WIN_TOPOLOGY_H
+#define __CDS_OS_WIN_TOPOLOGY_H
+
+#ifndef __CDS_OS_TOPOLOGY_H
+#   error "<cds/os/topology.h> must be included instead"
+#endif
+
+#include <cds/details/defs.h>
+#include <windows.h>
+
+namespace cds { namespace OS {
+
+    /// Windows-specific wrappers
+    CDS_CXX11_INLINE_NAMESPACE namespace Win32 {
+
+        /// System topology
+        /**
+            The implementation assumes that:
+                \li the system has no more than 64 logical processors;
+                \li processor IDs are in numerical order from 0 to N - 1, where N - count of processor in the system
+        */
+        struct CDS_EXPORT_API topology
+        {
+#   if _WIN32_WINNT >= 0x0601       // >= Windows 7
+            static unsigned int    processor_count()
+            {
+                return ::GetActiveProcessorCount( ALL_PROCESSOR_GROUPS );
+            }
+#   else    // < Windows 7
+            /// Logical processor count for the system
+            static unsigned int processor_count();
+#   endif
+
+#   if _WIN32_WINNT >= 0x0600   // >= Windows Vista
+            static unsigned int current_processor()
+            {
+                return ::GetCurrentProcessorNumber();
+            }
+#   else    // < Windows Vista
+            /// Get current processor number
+            static unsigned int current_processor();
+#   endif
+
+            /// Synonym for \ref current_processor
+            static unsigned int native_current_processor()
+            {
+                return current_processor();
+            }
+
+            //@cond
+            static void init()
+            {}
+            static void fini()
+            {}
+            //@endcond
+        };
+
+    }   // namespace Win32
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+    using Win32::topology;
+#endif
+}}  // namespace cds::OS
+
+
+
+#endif  // #ifndef __CDS_OS_WIN_TOPOLOGY_H
diff --git a/cds/ref.h b/cds/ref.h
new file mode 100644 (file)
index 0000000..d03650e
--- /dev/null
+++ b/cds/ref.h
@@ -0,0 +1,54 @@
+//$$CDS-header$$
+
+#ifndef __CDS_REF_H
+#define __CDS_REF_H
+
+#include <cds/details/defs.h>
+#include <boost/ref.hpp>
+
+//@cond
+namespace cds {
+
+    using boost::ref;
+
+    namespace details {
+        template <typename T>
+        struct unwrap_reference
+        {
+            typedef T type;
+            static T apply(T f)
+            {
+                return f;
+            }
+        };
+
+        template <typename T>
+        struct unwrap_reference<T&>
+        {
+            typedef T& type;
+            static T& apply( T& f )
+            {
+                return f;
+            }
+        };
+
+        template <typename T>
+        struct unwrap_reference<boost::reference_wrapper<T> >
+        {
+            typedef T& type;
+            static T& apply( boost::reference_wrapper<T> f )
+            {
+                return f.get();
+            }
+        };
+    }
+
+    template <typename T>
+    static inline typename details::unwrap_reference<T>::type unref( T f )
+    {
+        return cds::details::unwrap_reference<T>::apply(f);
+    }
+}
+//@endcond
+
+#endif // #ifndef __CDS_REF_H
diff --git a/cds/refcounter.h b/cds/refcounter.h
new file mode 100644 (file)
index 0000000..bce9805
--- /dev/null
@@ -0,0 +1,84 @@
+//$$CDS-header$$
+
+#ifndef __CDS_REFCOUNTER_H
+#define __CDS_REFCOUNTER_H
+
+/*
+    Refernce counting primitives
+
+    Editions:
+*/
+
+#include <cds/cxx11_atomic.h>
+
+namespace cds {
+
+    /// Simple reference counter
+    /**
+        Thread-safe reference counter build on atomic primitives.
+        \p T is one of integer types
+    */
+    template <typename T>
+    class ref_counter
+    {
+        CDS_ATOMIC::atomic<T>   m_nRefCount    ;        ///< The reference counter
+
+    public:
+        typedef T   ref_counter_type  ; ///< The reference counter type
+
+    public:
+        /// Construct reference counter with specified value \p initValue
+        ref_counter( T initValue = 0 ) CDS_NOEXCEPT
+            : m_nRefCount(initValue)
+        {}
+
+        /// Get current value of reference counter.
+        T   value() const CDS_NOEXCEPT
+        {
+            return m_nRefCount.load( CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Current value of reference counter
+        operator T() const CDS_NOEXCEPT
+        {
+            return value();
+        }
+
+        /// Atomic increment
+        void    inc() CDS_NOEXCEPT
+        {
+            m_nRefCount.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+        }
+
+        /// Atomic decrement. Return \p true if reference counter is 0, otherwise \p false
+        bool    dec() CDS_NOEXCEPT
+        {
+            if ( m_nRefCount.fetch_sub( 1, CDS_ATOMIC::memory_order_relaxed ) == 1 ) {
+                CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_release );
+                return true;
+            }
+            return false;
+        }
+
+        /// Atomic increment
+        void operator ++() CDS_NOEXCEPT
+        {
+            inc();
+        }
+
+        /// Atomic decrement
+        bool operator--() CDS_NOEXCEPT
+        {
+            return dec();
+        }
+    };
+
+    /// Signed 32bit reference counter
+    typedef ref_counter<cds::int32_t>       signed_ref_counter;
+
+    /// Unsigned 32bit reference counter
+    typedef ref_counter<cds::uint32_t>      unsigned_ref_counter;
+
+} // namespace cds
+
+#endif    // #ifndef __CDS_REFCOUNTER_H
diff --git a/cds/threading/details/_common.h b/cds/threading/details/_common.h
new file mode 100644 (file)
index 0000000..7c11fc3
--- /dev/null
@@ -0,0 +1,278 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING__COMMON_H
+#define __CDS_THREADING__COMMON_H
+
+#include <cds/gc/hp_decl.h>
+#include <cds/gc/hrc_decl.h>
+#include <cds/gc/ptb_decl.h>
+
+#include <cds/urcu/details/gp_decl.h>
+#include <cds/urcu/details/sh_decl.h>
+#include <cds/algo/elimination_tls.h>
+
+namespace cds {
+    /// Threading support
+    /** \anchor cds_threading
+        The \p CDS library requires support from the threads.
+        Each garbage collector manages a control structure on the per-thread basis.
+        The library does not dictate any thread model. To embed the library to your application you should choose
+        appropriate implementation of \p cds::threading::Manager interface
+        or should provide yourself.
+        The \p %cds::threading::Manager interface manages \p ñds::threading::ThreadData structure that contains GC's thread specific data.
+
+        Any \p cds::threading::Manager implementation is a singleton and it must be accessible from any thread and from any point of
+        your application. Note that you should not mix different implementation of the \p cds::threading::Manager in your application.
+
+        Before compiling of your application you may define one of \p CDS_THREADING_xxx macro in cds/user_setup/threading.h file:
+            - \p CDS_THREADING_AUTODETECT - auto-detect appropriate threading model for your platform and compiler. This is
+                predefined value of threading model in <tt>cds/user_setup/threading.h</tt>.
+            - \p CDS_THREADING_WIN_TLS - use <tt>cds::threading::wintls::Manager</tt> implementation based on Windows TLS API.
+                Intended for Windows and Microsoft Visual C++ only. This is default threading model for Windows and MS Visual C++.
+            - \p CDS_THREADING_MSVC - use <tt>cds::threading::msvc::Manager</tt> implementation based on Microsoft Visual C++ <tt>__declspec(thread)</tt>
+                declaration. Intended for Windows and Microsoft Visual C++ only.
+                This macro should be explicitly specified if you want to use <tt>__declspec(thread)</tt> keyword.
+            - \p CDS_THREADING_PTHREAD - use <tt>cds::threading::pthread::Manager</tt> implementation based on pthread thread-specific
+                data functions \p pthread_getspecific / \p pthread_setspecific. Intended for GCC and clang compilers.
+                This is default threading model for GCC and clang.
+            - \p CDS_THREADING_GCC - use <tt>cds::threading::gcc::Manager</tt> implementation based on GCC \p __thread
+                keyword. Intended for GCC compiler only. Note, that GCC compiler supports \p __thread keyword properly
+                not for all platforms and even not for all GCC version.
+                This macro should be explicitly specified if you want to use \p __thread keyword.
+            - \p CDS_THREADING_CXX11 - use <tt>cds::threading::cxx11::Manager</tt> implementation based on \p thread_local
+                keyword introduced in C++11 standard. May be used only if your compiler supports C++11 thread-local storage.
+            - \p CDS_THREADING_USER_DEFINED - use user-provided threading model.
+
+        These macros select appropriate implementation of \p cds::threading::Manager class. The child namespaces of cds::threading
+        provide suitable implementation and import it to cds::threading by using \p using directive (or by using inline namespace if the compiler
+        supports it). So, if you need to call threading manager functions directly you should refer to \p cds::threading::Manager class.
+
+        @note Usually, you should not use \p cds::threading::Manager instance directly.
+        You may specify \p CDS_THREADING_xxx macro when building, everything else will setup automatically when you initialize the library,
+        see \ref cds_how_to_use "How to use libcds".
+
+        The interface of \p cds::threading::Manager class is the following:
+        \code
+        class Manager {
+        public:
+            // Initialize manager (called by cds::Initialize() )
+            static void init();
+
+            // Terminate manager (called by cds::Terminate() )
+            static void fini();
+
+            // Checks whether current thread is attached to \p libcds feature or not.
+            static bool isThreadAttached();
+
+            // This method must be called in beginning of thread execution
+            // (called by ctor of GC thread object, for example, by ctor of cds::gc::HP::thread_gc)
+            static void attachThread();
+
+            // This method must be called in end of thread execution
+            // (called by dtor of GC thread object, for example, by dtor of cds::gc::HP::thread_gc)
+            static void detachThread();
+
+            // Get cds::gc::HP thread GC implementation for current thread
+            static gc::HP::thread_gc_impl&   getHZPGC();
+
+            // Get cds::gc::HRC thread GC implementation for current thread
+            static gc::HRC::thread_gc_impl&   getHRCGC();
+
+            // Get cds::gc::PTB thread GC implementation for current thread;
+            static gc::PTB::thread_gc_impl&   getPTBGC();
+        };
+        \endcode
+
+        The library's core (dynamic linked library) is free of usage of user-supplied \p cds::threading::Manager code.
+        \p cds::threading::Manager is necessary for header-only part of \p CDS library (for \ref cds::threading::getGC functions).
+
+
+        Each thread that uses \p libcds data structures should be attached to threading::Manager before using
+        lock-free data structs.
+        See \ref cds_how_to_use "How to use" section for details
+
+        <b>Note for Windows</b>
+
+        When you use Garbage Collectors (GC) provided by \p libcds in your dll that dynamically loaded by \p LoadLibrary then there is no way
+        to use \p __declspec(thread) declaration to support threading model for \p libcds. MSDN says:
+
+        \li If a DLL declares any nonlocal data or object as __declspec( thread ), it can cause a protection fault if dynamically loaded.
+            After the DLL is loaded with \p LoadLibrary, it causes system failure whenever the code references the nonlocal __declspec( thread ) data.
+            Because the global variable space for a thread is allocated at run time, the size of this space is based on a calculation of the requirements
+            of the application plus the requirements of all the DLLs that are statically linked. When you use \p LoadLibrary, there is no way to extend
+            this space to allow for the thread local variables declared with __declspec( thread ). Use the TLS APIs, such as TlsAlloc, in your
+            DLL to allocate TLS if the DLL might be loaded with LoadLibrary.
+
+        Thus, in case when \p libcds or a dll that depends on \p libcds is loaded dynamically by calling \p LoadLibrary explicitly,
+        you should not use \p CDS_THREADING_MSVC macro. Instead, you should build your dll projects with \p CDS_THREADING_WIN_TLS only.
+    */
+    namespace threading {
+
+        //@cond
+        /// Thread-specific data
+        struct ThreadData {
+
+            //@cond
+            char CDS_DATA_ALIGNMENT(8) m_hpManagerPlaceholder[sizeof(cds::gc::HP::thread_gc_impl)]   ;   ///< Michael's Hazard Pointer GC placeholder
+            char CDS_DATA_ALIGNMENT(8) m_hrcManagerPlaceholder[sizeof(cds::gc::HRC::thread_gc_impl)]  ;   ///< Gidenstam's GC placeholder
+            char CDS_DATA_ALIGNMENT(8) m_ptbManagerPlaceholder[sizeof(cds::gc::PTB::thread_gc_impl)]  ;   ///< Pass The Buck GC placeholder
+
+            cds::urcu::details::thread_data< cds::urcu::general_instant_tag > *     m_pGPIRCU;
+            cds::urcu::details::thread_data< cds::urcu::general_buffered_tag > *    m_pGPBRCU;
+            cds::urcu::details::thread_data< cds::urcu::general_threaded_tag > *    m_pGPTRCU;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+            cds::urcu::details::thread_data< cds::urcu::signal_buffered_tag > *    m_pSHBRCU;
+            cds::urcu::details::thread_data< cds::urcu::signal_threaded_tag > *    m_pSHTRCU;
+#endif
+
+            //@endcond
+
+            cds::gc::HP::thread_gc_impl  * m_hpManager     ;   ///< Michael's Hazard Pointer GC thread-specific data
+            cds::gc::HRC::thread_gc_impl * m_hrcManager    ;   ///< Gidenstam's GC thread-specific data
+            cds::gc::PTB::thread_gc_impl * m_ptbManager    ;   ///< Pass The Buck GC thread-specific data
+
+            size_t  m_nFakeProcessorNumber  ;   ///< fake "current processor" number
+
+            //@cond
+            size_t  m_nAttachCount;
+            //@endcond
+
+            /// Per-thread elimination record
+            cds::algo::elimination::record   m_EliminationRec;
+
+            //@cond
+            static CDS_EXPORT_API CDS_ATOMIC::atomic<size_t> s_nLastUsedProcNo;
+            static CDS_EXPORT_API size_t                     s_nProcCount;
+            //@endcond
+
+            //@cond
+            ThreadData()
+                : m_pGPIRCU( NULL )
+                , m_pGPBRCU( NULL )
+                , m_pGPTRCU( NULL )
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+                , m_pSHBRCU( NULL )
+                , m_pSHTRCU( NULL )
+#endif
+                , m_nFakeProcessorNumber( s_nLastUsedProcNo.fetch_add(1, CDS_ATOMIC::memory_order_relaxed) % s_nProcCount )
+                , m_nAttachCount(0)
+            {
+                if (cds::gc::HP::isUsed() )
+                    m_hpManager = new (m_hpManagerPlaceholder) cds::gc::HP::thread_gc_impl;
+                else
+                    m_hpManager = null_ptr<cds::gc::HP::thread_gc_impl *>();
+
+                if ( cds::gc::HRC::isUsed() )
+                    m_hrcManager = new (m_hrcManagerPlaceholder) cds::gc::HRC::thread_gc_impl;
+                else
+                    m_hrcManager = null_ptr<cds::gc::HRC::thread_gc_impl *>();
+
+                if ( cds::gc::PTB::isUsed() )
+                    m_ptbManager = new (m_ptbManagerPlaceholder) cds::gc::PTB::thread_gc_impl;
+                else
+                    m_ptbManager = null_ptr<cds::gc::PTB::thread_gc_impl *>();
+            }
+
+            ~ThreadData()
+            {
+                if ( m_hpManager ) {
+                    typedef cds::gc::HP::thread_gc_impl hp_thread_gc_impl;
+                    m_hpManager->~hp_thread_gc_impl();
+                    m_hpManager = null_ptr<cds::gc::HP::thread_gc_impl *>();
+                }
+
+                if ( m_hrcManager ) {
+                    typedef cds::gc::HRC::thread_gc_impl hrc_thread_gc_impl;
+                    m_hrcManager->~hrc_thread_gc_impl();
+                    m_hrcManager = null_ptr<cds::gc::HRC::thread_gc_impl *>();
+                }
+
+                if ( m_ptbManager ) {
+                    typedef cds::gc::PTB::thread_gc_impl ptb_thread_gc_impl;
+                    m_ptbManager->~ptb_thread_gc_impl();
+                    m_ptbManager = null_ptr<cds::gc::PTB::thread_gc_impl *>();
+                }
+
+                assert( m_pGPIRCU == NULL );
+                assert( m_pGPBRCU == NULL );
+                assert( m_pGPTRCU == NULL );
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+                assert( m_pSHBRCU == NULL );
+                assert( m_pSHTRCU == NULL );
+#endif
+            }
+
+            void init()
+            {
+                if ( m_nAttachCount++ == 0 ) {
+                    if ( cds::gc::HP::isUsed() )
+                        m_hpManager->init();
+                    if ( cds::gc::HRC::isUsed() )
+                        m_hrcManager->init();
+                    if ( cds::gc::PTB::isUsed() )
+                        m_ptbManager->init();
+
+                    if ( cds::urcu::details::singleton<cds::urcu::general_instant_tag>::isUsed() )
+                        m_pGPIRCU = cds::urcu::details::singleton<cds::urcu::general_instant_tag>::attach_thread();
+                    if ( cds::urcu::details::singleton<cds::urcu::general_buffered_tag>::isUsed() )
+                        m_pGPBRCU = cds::urcu::details::singleton<cds::urcu::general_buffered_tag>::attach_thread();
+                    if ( cds::urcu::details::singleton<cds::urcu::general_threaded_tag>::isUsed() )
+                        m_pGPTRCU = cds::urcu::details::singleton<cds::urcu::general_threaded_tag>::attach_thread();
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+                    if ( cds::urcu::details::singleton<cds::urcu::signal_buffered_tag>::isUsed() )
+                        m_pSHBRCU = cds::urcu::details::singleton<cds::urcu::signal_buffered_tag>::attach_thread();
+                    if ( cds::urcu::details::singleton<cds::urcu::signal_threaded_tag>::isUsed() )
+                        m_pSHTRCU = cds::urcu::details::singleton<cds::urcu::signal_threaded_tag>::attach_thread();
+#endif
+                }
+            }
+
+            bool fini()
+            {
+                if ( --m_nAttachCount == 0 ) {
+                    if ( cds::gc::PTB::isUsed() )
+                        m_ptbManager->fini();
+                    if ( cds::gc::HRC::isUsed() )
+                        m_hrcManager->fini();
+                    if ( cds::gc::HP::isUsed() )
+                        m_hpManager->fini();
+
+                    if ( cds::urcu::details::singleton<cds::urcu::general_instant_tag>::isUsed() ) {
+                        cds::urcu::details::singleton<cds::urcu::general_instant_tag>::detach_thread( m_pGPIRCU );
+                        m_pGPIRCU = NULL;
+                    }
+                    if ( cds::urcu::details::singleton<cds::urcu::general_buffered_tag>::isUsed() ) {
+                        cds::urcu::details::singleton<cds::urcu::general_buffered_tag>::detach_thread( m_pGPBRCU );
+                        m_pGPBRCU = NULL;
+                    }
+                    if ( cds::urcu::details::singleton<cds::urcu::general_threaded_tag>::isUsed() ) {
+                        cds::urcu::details::singleton<cds::urcu::general_threaded_tag>::detach_thread( m_pGPTRCU );
+                        m_pGPTRCU = NULL;
+                    }
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+                    if ( cds::urcu::details::singleton<cds::urcu::signal_buffered_tag>::isUsed() ) {
+                        cds::urcu::details::singleton<cds::urcu::signal_buffered_tag>::detach_thread( m_pSHBRCU );
+                        m_pSHBRCU = NULL;
+                    }
+                    if ( cds::urcu::details::singleton<cds::urcu::signal_threaded_tag>::isUsed() ) {
+                        cds::urcu::details::singleton<cds::urcu::signal_threaded_tag>::detach_thread( m_pSHTRCU );
+                        m_pSHTRCU = NULL;
+                    }
+#endif
+                    return true;
+                }
+                return false;
+            }
+
+            size_t fake_current_processor()
+            {
+                return m_nFakeProcessorNumber;
+            }
+            //@endcond
+        };
+        //@endcond
+
+    } // namespace threading
+} // namespace cds::threading
+
+#endif // #ifndef __CDS_THREADING__COMMON_H
diff --git a/cds/threading/details/auto_detect.h b/cds/threading/details/auto_detect.h
new file mode 100644 (file)
index 0000000..7a64b21
--- /dev/null
@@ -0,0 +1,45 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_AUTO_DETECT_H
+#define __CDS_THREADING_AUTO_DETECT_H
+
+#if defined(CDS_THREADING_AUTODETECT)
+    // Auto-detect appropriate threading model
+#   if CDS_COMPILER == CDS_COMPILER_MSVC || (CDS_COMPILER == CDS_COMPILER_INTEL && CDS_OS_INTERFACE == CDS_OSI_WINDOWS)
+        // For MSVC, CDS_THREADING_MSVC and CDS_THREADING_WIN_TLS is supported.
+        // CDS_THREADING_MSVC must be explicitly defined if needed
+#       if !defined(CDS_THREADING_MSVC) && !defined(CDS_THREADING_WIN_TLS) && !defined(CDS_THREADING_CXX11)
+#           define CDS_THREADING_WIN_TLS
+#       endif
+#   elif CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG || CDS_COMPILER == CDS_COMPILER_INTEL
+        // For GCC, CDS_THREADING_GCC and CDS_THREADING_PTHREAD is supported
+        // CDS_THREADING_GCC must be explicitly defined if needed
+#       if CDS_OS_INTERFACE == CDS_OSI_WINDOWS
+#           if !defined(CDS_THREADING_GCC) && !defined(CDS_THREADING_WIN_TLS) && !defined(CDS_THREADING_CXX11)
+#               define CDS_THREADING_WIN_TLS
+#           endif
+#       elif !defined(CDS_THREADING_GCC) && !defined(CDS_THREADING_PTHREAD) && !defined(CDS_THREADING_CXX11)
+#           define CDS_THREADING_PTHREAD
+#       endif
+#   else
+#       error "Unknown compiler for cds::threading"
+#   endif
+#endif // #if defined(CDS_THREADING_AUTODETECT)
+
+
+
+#if defined(CDS_THREADING_MSVC)
+#   include <cds/threading/details/msvc.h>
+#elif defined(CDS_THREADING_WIN_TLS)
+#   include <cds/threading/details/wintls.h>
+#elif defined(CDS_THREADING_PTHREAD)
+#   include <cds/threading/details/pthread.h>
+#elif defined(CDS_THREADING_GCC)
+#   include <cds/threading/details/gcc.h>
+#elif defined(CDS_THREADING_CXX11)
+#   include <cds/threading/details/cxx11.h>
+#elif !defined(CDS_THREADING_USER_DEFINED)
+#   error "You must define one of CDS_THREADING_xxx macro before compiling the application"
+#endif
+
+#endif // #ifndef __CDS_THREADING_AUTO_DETECT_H
diff --git a/cds/threading/details/cxx11.h b/cds/threading/details/cxx11.h
new file mode 100644 (file)
index 0000000..06949a5
--- /dev/null
@@ -0,0 +1,16 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_DETAILS_CXX11_H
+#define __CDS_THREADING_DETAILS_CXX11_H
+
+#include <cds/threading/details/cxx11_manager.h>
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+namespace cds { namespace threading {
+
+    using cxx11::Manager;
+
+}} // namespace cds::threading
+#endif
+
+#endif // #ifndef __CDS_THREADING_DETAILS_CXX11_H
diff --git a/cds/threading/details/cxx11_manager.h b/cds/threading/details/cxx11_manager.h
new file mode 100644 (file)
index 0000000..9d34fd1
--- /dev/null
@@ -0,0 +1,147 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_DETAILS_CXX11_MANAGER_H
+#define __CDS_THREADING_DETAILS_CXX11_MANAGER_H
+
+#include <cds/threading/details/_common.h>
+
+#ifndef CDS_CXX11_THREAD_LOCAL_SUPPORT
+#   error "The compiler does not support C++11 thread_local keyword. You cannot use CDS_THREADING_CXX11 threading model."
+#endif
+
+//@cond
+namespace cds { namespace threading {
+
+    //@cond
+    struct cxx11_internal {
+        typedef unsigned char  ThreadDataPlaceholder[ sizeof(ThreadData) ];
+        static thread_local ThreadDataPlaceholder CDS_DATA_ALIGNMENT(8) s_threadData;
+        static thread_local ThreadData * s_pThreadData;
+    };
+    //@endcond
+
+    /// cds::threading::Manager implementation based on c++11 thread_local declaration
+    CDS_CXX11_INLINE_NAMESPACE namespace cxx11 {
+
+        /// Thread-specific data manager based on c++11 thread_local feature
+        class Manager {
+        private :
+            //@cond
+
+            static ThreadData * _threadData()
+            {
+                return cxx11_internal::s_pThreadData;
+            }
+
+            static ThreadData * create_thread_data()
+            {
+                if ( !cxx11_internal::s_pThreadData ) {
+                    cxx11_internal::s_pThreadData = new (cxx11_internal::s_threadData) ThreadData();
+                }
+                return cxx11_internal::s_pThreadData;
+            }
+
+            static void destroy_thread_data()
+            {
+                if ( cxx11_internal::s_pThreadData ) {
+                    ThreadData * p = cxx11_internal::s_pThreadData;
+                    cxx11_internal::s_pThreadData = NULL;
+                    p->ThreadData::~ThreadData();
+                }
+            }
+            //@endcond
+
+        public:
+            /// Initialize manager (empty function)
+            /**
+                This function is automatically called by cds::Initialize
+            */
+            static void init()
+            {}
+
+            /// Terminate manager (empty function)
+            /**
+                This function is automatically called by cds::Terminate
+            */
+            static void fini()
+            {}
+
+            /// Checks whether current thread is attached to \p libcds feature or not.
+            static bool isThreadAttached()
+            {
+                return _threadData() != NULL;
+            }
+
+            /// This method must be called in beginning of thread execution
+            static void attachThread()
+            {
+                create_thread_data()->init();
+            }
+
+            /// This method must be called in end of thread execution
+            static void detachThread()
+            {
+                assert( _threadData() );
+
+                if ( _threadData()->fini() )
+                    destroy_thread_data();
+            }
+
+            /// Returns ThreadData pointer for the current thread
+            static ThreadData * thread_data()
+            {
+                ThreadData * p = _threadData();
+                assert( p );
+                return p;
+            }
+
+            /// Get gc::HP thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::HP.
+                To initialize gc::HP GC you must constuct cds::gc::HP object in the beginning of your application
+            */
+            static gc::HP::thread_gc_impl&   getHZPGC()
+            {
+                assert( _threadData()->m_hpManager != NULL );
+                return *(_threadData()->m_hpManager);
+            }
+
+            /// Get gc::HRC thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::HRC.
+                To initialize gc::HRC GC you must constuct cds::gc::HRC object in the beginning of your application
+            */
+            static gc::HRC::thread_gc_impl&   getHRCGC()
+            {
+                assert( _threadData()->m_hrcManager != NULL );
+                return *(_threadData()->m_hrcManager);
+            }
+
+            /// Get gc::PTB thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::PTB.
+                To initialize gc::PTB GC you must constuct cds::gc::PTB object in the beginning of your application
+            */
+            static gc::PTB::thread_gc_impl&   getPTBGC()
+            {
+                assert( _threadData()->m_ptbManager != NULL );
+                return *(_threadData()->m_ptbManager);
+            }
+
+            //@cond
+            static size_t fake_current_processor()
+            {
+                return _threadData()->fake_current_processor();
+            }
+            //@endcond
+        };
+
+    } // namespace cxx11
+
+}} // namespace cds::threading
+//@endcond
+
+#endif // #ifndef __CDS_THREADING_DETAILS_CXX11_MANAGER_H
diff --git a/cds/threading/details/gcc.h b/cds/threading/details/gcc.h
new file mode 100644 (file)
index 0000000..27ad830
--- /dev/null
@@ -0,0 +1,16 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_DETAILS_GCC_H
+#define __CDS_THREADING_DETAILS_GCC_H
+
+#include <cds/threading/details/gcc_manager.h>
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+namespace cds { namespace threading {
+
+    using gcc::Manager;
+
+}} // namespace cds::threading
+#endif
+
+#endif // #ifndef __CDS_THREADING_DETAILS_GCC_H
diff --git a/cds/threading/details/gcc_manager.h b/cds/threading/details/gcc_manager.h
new file mode 100644 (file)
index 0000000..4baacf0
--- /dev/null
@@ -0,0 +1,147 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_DETAILS_GCC_MANAGER_H
+#define __CDS_THREADING_DETAILS_GCC_MANAGER_H
+
+#if !( CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG || CDS_COMPILER == CDS_COMPILER_INTEL)
+#   error "threading/details/gcc_manager.h may be used only with GCC or Clang C++ compiler"
+#endif
+
+#include <cds/threading/details/_common.h>
+
+//@cond
+namespace cds { namespace threading {
+
+    //@cond
+    struct gcc_internal {
+        typedef unsigned char  ThreadDataPlaceholder[ sizeof(ThreadData) ];
+        static __thread ThreadDataPlaceholder CDS_DATA_ALIGNMENT(8) s_threadData;
+        static __thread ThreadData * s_pThreadData;
+    };
+    //@endcond
+
+    /// cds::threading::Manager implementation based on GCC __thread declaration
+    CDS_CXX11_INLINE_NAMESPACE namespace gcc {
+
+        /// Thread-specific data manager based on GCC __thread feature
+        class Manager {
+        private :
+            //@cond
+
+            static ThreadData * _threadData()
+            {
+                return gcc_internal::s_pThreadData;
+            }
+
+            static ThreadData * create_thread_data()
+            {
+                if ( !gcc_internal::s_pThreadData ) {
+                    gcc_internal::s_pThreadData = new (gcc_internal::s_threadData) ThreadData();
+                }
+                return gcc_internal::s_pThreadData;
+            }
+
+            static void destroy_thread_data()
+            {
+                if ( gcc_internal::s_pThreadData ) {
+                    ThreadData * p = gcc_internal::s_pThreadData;
+                    gcc_internal::s_pThreadData = NULL;
+                    p->ThreadData::~ThreadData();
+                }
+            }
+            //@endcond
+
+        public:
+            /// Initialize manager (empty function)
+            /**
+                This function is automatically called by cds::Initialize
+            */
+            static void init()
+            {}
+
+            /// Terminate manager (empty function)
+            /**
+                This function is automatically called by cds::Terminate
+            */
+            static void fini()
+            {}
+
+            /// Checks whether current thread is attached to \p libcds feature or not.
+            static bool isThreadAttached()
+            {
+                return _threadData() != NULL;
+            }
+
+            /// This method must be called in beginning of thread execution
+            static void attachThread()
+            {
+                create_thread_data()->init();
+            }
+
+            /// This method must be called in end of thread execution
+            static void detachThread()
+            {
+                assert( _threadData() );
+
+                if ( _threadData()->fini() )
+                    destroy_thread_data();
+            }
+
+            /// Returns ThreadData pointer for the current thread
+            static ThreadData * thread_data()
+            {
+                ThreadData * p = _threadData();
+                assert( p );
+                return p;
+            }
+
+            /// Get gc::HP thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::HP.
+                To initialize gc::HP GC you must constuct cds::gc::HP object in the beginning of your application
+            */
+            static gc::HP::thread_gc_impl&   getHZPGC()
+            {
+                assert( _threadData()->m_hpManager != NULL );
+                return *(_threadData()->m_hpManager);
+            }
+
+            /// Get gc::HRC thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::HRC.
+                To initialize gc::HRC GC you must constuct cds::gc::HRC object in the beginning of your application
+            */
+            static gc::HRC::thread_gc_impl&   getHRCGC()
+            {
+                assert( _threadData()->m_hrcManager != NULL );
+                return *(_threadData()->m_hrcManager);
+            }
+
+            /// Get gc::PTB thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::PTB.
+                To initialize gc::PTB GC you must constuct cds::gc::PTB object in the beginning of your application
+            */
+            static gc::PTB::thread_gc_impl&   getPTBGC()
+            {
+                assert( _threadData()->m_ptbManager != NULL );
+                return *(_threadData()->m_ptbManager);
+            }
+
+            //@cond
+            static size_t fake_current_processor()
+            {
+                return _threadData()->fake_current_processor();
+            }
+            //@endcond
+        };
+
+    } // namespace gcc
+
+}} // namespace cds::threading
+//@endcond
+
+#endif // #ifndef __CDS_THREADING_DETAILS_GCC_MANAGER_H
diff --git a/cds/threading/details/msvc.h b/cds/threading/details/msvc.h
new file mode 100644 (file)
index 0000000..2578350
--- /dev/null
@@ -0,0 +1,16 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_DETAILS_MSVC_H
+#define __CDS_THREADING_DETAILS_MSVC_H
+
+#include <cds/threading/details/msvc_manager.h>
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+namespace cds { namespace threading {
+
+    using msvc::Manager;
+
+}} // namespace cds::threading
+#endif
+
+#endif // #ifndef __CDS_THREADING_DETAILS_MSVC_H
diff --git a/cds/threading/details/msvc_manager.h b/cds/threading/details/msvc_manager.h
new file mode 100644 (file)
index 0000000..f6f5a31
--- /dev/null
@@ -0,0 +1,146 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_DETAILS_MSVC_MANAGER_H
+#define __CDS_THREADING_DETAILS_MSVC_MANAGER_H
+
+#if !( CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL )
+#   error "threading/details/msvc_manager.h may be used only with Microsoft Visual C++ / Intel C++ compiler"
+#endif
+
+#include <cds/threading/details/_common.h>
+
+//@cond
+namespace cds { namespace threading {
+
+    //@cond
+    struct msvc_internal {
+        typedef unsigned char  ThreadDataPlaceholder[ sizeof(ThreadData) ];
+        __declspec( thread ) static ThreadDataPlaceholder s_threadData;
+        __declspec( thread ) static ThreadData * s_pThreadData;
+    };
+    //@endcond
+
+    /// cds::threading::Manager implementation based on Microsoft Visual C++ __declspec( thread ) construction
+    CDS_CXX11_INLINE_NAMESPACE namespace msvc {
+
+        /// Thread-specific data manager based on MSVC __declspec( thread ) feature
+        class Manager {
+        private :
+            //@cond
+            static ThreadData * _threadData()
+            {
+                return msvc_internal::s_pThreadData;
+            }
+
+            static ThreadData * create_thread_data()
+            {
+                if ( !msvc_internal::s_pThreadData ) {
+                    msvc_internal::s_pThreadData = new (msvc_internal::s_threadData) ThreadData();
+                }
+                return msvc_internal::s_pThreadData;
+            }
+
+            static void destroy_thread_data()
+            {
+                if ( msvc_internal::s_pThreadData ) {
+                    msvc_internal::s_pThreadData->ThreadData::~ThreadData();
+                    msvc_internal::s_pThreadData = NULL;
+                }
+            }
+
+            //@endcond
+
+        public:
+            /// Initialize manager (empty function)
+            /**
+                This function is automatically called by cds::Initialize
+            */
+            static void init()
+            {}
+
+            /// Terminate manager (empty function)
+            /**
+                This function is automatically called by cds::Terminate
+            */
+            static void fini()
+            {}
+
+            /// Checks whether current thread is attached to \p libcds feature or not.
+            static bool isThreadAttached()
+            {
+                ThreadData * pData = _threadData();
+                return pData != NULL;
+            }
+
+            /// This method must be called in beginning of thread execution
+            static void attachThread()
+            {
+                create_thread_data()->init();
+            }
+
+            /// This method must be called in end of thread execution
+            static void detachThread()
+            {
+                assert( _threadData() );
+
+                if ( _threadData()->fini() )
+                    destroy_thread_data();
+            }
+
+            /// Returns internal ThreadData pointer for the current thread
+            static ThreadData * thread_data()
+            {
+                ThreadData * p = _threadData();
+                assert( p );
+                return p;
+            }
+
+            /// Get gc::HP thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::HP.
+                To initialize gc::HP GC you must constuct cds::gc::HP object in the beginning of your application
+            */
+            static gc::HP::thread_gc_impl&   getHZPGC()
+            {
+                assert( _threadData()->m_hpManager != NULL );
+                return *(_threadData()->m_hpManager);
+            }
+
+            /// Get gc::HRC thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::HRC.
+                To initialize gc::HRC GC you must constuct cds::gc::HRC object in the beginning of your application
+            */
+            static gc::HRC::thread_gc_impl&   getHRCGC()
+            {
+                assert( _threadData()->m_hrcManager != NULL );
+                return *(_threadData()->m_hrcManager);
+            }
+
+            /// Get gc::PTB thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::PTB.
+                To initialize gc::PTB GC you must constuct cds::gc::PTB object in the beginning of your application
+            */
+            static gc::PTB::thread_gc_impl&   getPTBGC()
+            {
+                assert( _threadData()->m_ptbManager != NULL );
+                return *(_threadData()->m_ptbManager);
+            }
+
+            //@cond
+            static size_t fake_current_processor()
+            {
+                return _threadData()->fake_current_processor();
+            }
+            //@endcond
+        };
+
+    } // namespace msvc
+}} // namespace cds::threading
+//@endcond
+
+#endif // #ifndef __CDS_THREADING_DETAILS_MSVC_MANAGER_H
diff --git a/cds/threading/details/pthread.h b/cds/threading/details/pthread.h
new file mode 100644 (file)
index 0000000..16da0b9
--- /dev/null
@@ -0,0 +1,16 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_DETAILS_PTHREAD_H
+#define __CDS_THREADING_DETAILS_PTHREAD_H
+
+#include <cds/threading/details/pthread_manager.h>
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+namespace cds { namespace threading {
+
+    using pthread::Manager;
+
+}} // namespace cds::threading
+#endif
+
+#endif // #ifndef __CDS_THREADING_DETAILS_PTHREAD_H
diff --git a/cds/threading/details/pthread_manager.h b/cds/threading/details/pthread_manager.h
new file mode 100644 (file)
index 0000000..3ed88cc
--- /dev/null
@@ -0,0 +1,242 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_DETAILS_PTHREAD_MANAGER_H
+#define __CDS_THREADING_DETAILS_PTHREAD_MANAGER_H
+
+#include <stdio.h>
+#include <pthread.h>
+#include <cds/threading/details/_common.h>
+
+//@cond
+namespace cds { namespace threading {
+
+    /// cds::threading::Manager implementation based on pthread thread-specific data functions
+    CDS_CXX11_INLINE_NAMESPACE namespace pthread {
+
+        /// Thread-specific data manager based on pthread thread-specific data functions
+        /**
+            Manager throws an exception of Manager::pthread_exception class if an error occurs
+        */
+        class Manager {
+        private :
+            /// pthread error code type
+            typedef int pthread_error_code;
+
+            /// pthread exception
+            class pthread_exception: public cds::Exception {
+            public:
+                const pthread_error_code    m_errCode   ;   ///< pthread error code, -1 if no pthread error code
+            public:
+                /// Exception constructor
+                pthread_exception( pthread_error_code nCode, const char * pszFunction )
+                    : m_errCode( nCode )
+                {
+                    char buf[256];
+                    sprintf( buf, "Pthread error %i [function %s]", nCode, pszFunction );
+                    m_strMsg = buf;
+                }
+            };
+
+            /// pthread TLS key holder
+            struct Holder {
+            //@cond
+                static pthread_key_t   m_key;
+
+                static void key_destructor(void * p)
+                {
+                    if ( p ) {
+                        reinterpret_cast<ThreadData *>(p)->fini();
+                        delete reinterpret_cast<ThreadData *>(p);
+                    }
+                }
+
+                static void init()
+                {
+                    pthread_error_code  nErr;
+                    if ( (nErr = pthread_key_create( &m_key, key_destructor )) != 0 )
+                        throw pthread_exception( nErr, "pthread_key_create" );
+                }
+
+                static void fini()
+                {
+                    pthread_error_code  nErr;
+                    if ( (nErr = pthread_key_delete( m_key )) != 0 )
+                        throw pthread_exception( nErr, "pthread_key_delete" );
+                }
+
+                static ThreadData *    get()
+                {
+                    return reinterpret_cast<ThreadData *>( pthread_getspecific( m_key ) );
+                }
+
+                static void alloc()
+                {
+                    pthread_error_code  nErr;
+                    ThreadData * pData = new ThreadData;
+                    if ( ( nErr = pthread_setspecific( m_key, pData )) != 0 )
+                        throw pthread_exception( nErr, "pthread_setspecific" );
+                }
+                static void free()
+                {
+                    ThreadData * p = get();
+                    pthread_setspecific( m_key, NULL );
+                    if ( p )
+                        delete p;
+                }
+            //@endcond
+            };
+
+            //@cond
+            enum EThreadAction {
+                do_getData,
+                do_attachThread,
+                do_detachThread,
+                do_checkData,
+                init_holder,
+                fini_holder
+            };
+            //@endcond
+
+            //@cond
+            static ThreadData * _threadData( EThreadAction nAction )
+            {
+                switch ( nAction ) {
+                    case do_getData:
+                        return Holder::get();
+                    case do_checkData:
+                        return Holder::get();
+                    case do_attachThread:
+                        if ( Holder::get() == NULL )
+                            Holder::alloc();
+                        return Holder::get();
+                    case do_detachThread:
+                        Holder::free();
+                        return NULL;
+                    case init_holder:
+                    case fini_holder:
+                        break;
+                    default:
+                        assert( false ) ;   // anything forgotten?..
+                }
+                assert(false)   ;   // how did we get here?
+                return NULL;
+            }
+            //@endcond
+
+        public:
+            /// Initialize manager
+            /**
+                This function is automatically called by cds::Initialize
+            */
+            static void init()
+            {
+                Holder::init();
+            }
+
+            /// Terminate manager
+            /**
+                This function is automatically called by cds::Terminate
+            */
+            static void fini()
+            {
+                Holder::fini();
+            }
+
+            /// Checks whether current thread is attached to \p libcds feature or not.
+            static bool isThreadAttached()
+            {
+                return _threadData( do_checkData ) != NULL;
+            }
+
+            /// This method must be called in beginning of thread execution
+            /**
+                If TLS pointer to manager's data is NULL, pthread_exception is thrown
+                with code = -1.
+                If an error occurs in call of pthread API function, pthread_exception is thrown
+                with pthread error code.
+            */
+            static void attachThread()
+            {
+                ThreadData * pData = _threadData( do_attachThread );
+                assert( pData != NULL );
+
+                if ( pData ) {
+                    pData->init();
+                }
+                else
+                    throw pthread_exception( -1, "cds::threading::pthread::Manager::attachThread" );
+            }
+
+            /// This method must be called in end of thread execution
+            /**
+                If TLS pointer to manager's data is NULL, pthread_exception is thrown
+                with code = -1.
+                If an error occurs in call of pthread API function, pthread_exception is thrown
+                with pthread error code.
+            */
+            static void detachThread()
+            {
+                ThreadData * pData = _threadData( do_getData );
+                assert( pData != NULL );
+
+                if ( pData ) {
+                    if ( pData->fini() )
+                        _threadData( do_detachThread );
+                }
+                else
+                    throw pthread_exception( -1, "cds::threading::pthread::Manager::detachThread" );
+            }
+
+            /// Returns ThreadData pointer for the current thread
+            static ThreadData * thread_data()
+            {
+                return _threadData( do_getData );
+            }
+
+            /// Get gc::HP thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::HP.
+                To initialize gc::HP GC you must constuct cds::gc::HP object in the beginning of your application
+            */
+            static gc::HP::thread_gc_impl&   getHZPGC()
+            {
+                return *(_threadData( do_getData )->m_hpManager);
+            }
+
+            /// Get gc::HRC thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::HRC.
+                To initialize gc::HRC GC you must constuct cds::gc::HRC object in the beginning of your application
+            */
+            static gc::HRC::thread_gc_impl&   getHRCGC()
+            {
+                return *(_threadData( do_getData )->m_hrcManager);
+            }
+
+            /// Get gc::PTB thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::PTB.
+                To initialize gc::PTB GC you must constuct cds::gc::PTB object in the beginning of your application
+            */
+            static gc::PTB::thread_gc_impl&   getPTBGC()
+            {
+                return *(_threadData( do_getData )->m_ptbManager);
+            }
+
+            //@cond
+            static size_t fake_current_processor()
+            {
+                return _threadData( do_getData )->fake_current_processor();
+            }
+            //@endcond
+
+        };
+
+    } // namespace pthread
+}} // namespace cds::threading
+//@endcond
+
+#endif // #ifndef __CDS_THREADING_DETAILS_PTHREAD_MANAGER_H
diff --git a/cds/threading/details/wintls.h b/cds/threading/details/wintls.h
new file mode 100644 (file)
index 0000000..2f4a149
--- /dev/null
@@ -0,0 +1,17 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_DETAILS_WINTLS_H
+#define __CDS_THREADING_DETAILS_WINTLS_H
+
+#include <stdio.h>
+#include <cds/threading/details/wintls_manager.h>
+
+#ifndef CDS_CXX11_INLINE_NAMESPACE_SUPPORT
+namespace cds { namespace threading {
+
+    using wintls::Manager;
+
+}} // namespace cds::threading
+#endif
+
+#endif // #ifndef __CDS_THREADING_DETAILS_WINTLS_H
diff --git a/cds/threading/details/wintls_manager.h b/cds/threading/details/wintls_manager.h
new file mode 100644 (file)
index 0000000..18fd32b
--- /dev/null
@@ -0,0 +1,244 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_DETAILS_WINTLS_MANAGER_H
+#define __CDS_THREADING_DETAILS_WINTLS_MANAGER_H
+
+#include <stdio.h>
+#include <cds/threading/details/_common.h>
+
+//@cond
+namespace cds { namespace threading {
+
+    /// cds::threading::Manager implementation based on Windows TLS API
+    CDS_CXX11_INLINE_NAMESPACE namespace wintls {
+
+        /// Thread-specific data manager based on Windows TLS API
+        /**
+            Manager throws an exception of Manager::api_exception class if an error occurs
+        */
+        class Manager {
+        private :
+            /// Windows TLS API error code type
+            typedef DWORD api_error_code;
+
+            /// TLS API exception
+            class api_exception: public cds::Exception {
+            public:
+                const api_error_code    m_errCode   ;   ///< error code
+            public:
+                /// Exception constructor
+                api_exception( api_error_code nCode, const char * pszFunction )
+                    : m_errCode( nCode )
+                {
+                    char buf[256];
+#           if CDS_OS_TYPE == CDS_OS_MINGW
+                    sprintf( buf, "Win32 TLS API error %lu [function %s]", nCode, pszFunction );
+#           else
+                    sprintf_s( buf, sizeof(buf)/sizeof(buf[0]), "Win32 TLS API error %lu [function %s]", nCode, pszFunction );
+#           endif
+                    m_strMsg = buf;
+                }
+            };
+
+            //@cond
+            enum EThreadAction {
+                do_getData,
+                do_attachThread,
+                do_detachThread,
+                do_checkData
+            };
+            //@endcond
+
+            //@cond
+            /// TLS key holder
+            struct Holder {
+                static CDS_EXPORT_API DWORD m_key;
+
+                static void init()
+                {
+                    if ( m_key == TLS_OUT_OF_INDEXES ) {
+                        if ( (m_key = ::TlsAlloc()) == TLS_OUT_OF_INDEXES )
+                            throw api_exception( ::GetLastError(), "TlsAlloc" );
+                    }
+                }
+
+                static void fini()
+                {
+                    if ( m_key != TLS_OUT_OF_INDEXES ) {
+                        if ( ::TlsFree( m_key ) == 0 )
+                            throw api_exception( ::GetLastError(), "TlsFree" );
+                        m_key = TLS_OUT_OF_INDEXES;
+                    }
+                }
+
+                static ThreadData *    get()
+                {
+                    api_error_code  nErr;
+                    void * pData = ::TlsGetValue( m_key );
+                    if ( pData == NULL && (nErr = ::GetLastError()) != ERROR_SUCCESS )
+                        throw api_exception( nErr, "TlsGetValue" );
+                    return reinterpret_cast<ThreadData *>( pData );
+                }
+
+                static void alloc()
+                {
+                    ThreadData * pData = new ThreadData;
+                    if ( !::TlsSetValue( m_key, pData ))
+                        throw api_exception( ::GetLastError(), "TlsSetValue" );
+                }
+                static void free()
+                {
+                    ThreadData * p = get();
+                    ::TlsSetValue( m_key, NULL );
+                    if ( p )
+                        delete p;
+                }
+            };
+            //@endcond
+
+            //@cond
+            static ThreadData * _threadData( EThreadAction nAction )
+            {
+                switch ( nAction ) {
+                    case do_getData:
+#           ifdef _DEBUG
+                        {
+                            ThreadData * p = Holder::get();
+                            assert( p != NULL );
+                            return p;
+                        }
+#           else
+                        return Holder::get();
+#           endif
+                    case do_checkData:
+                        return Holder::get();
+                    case do_attachThread:
+                        if ( Holder::get() == NULL )
+                            Holder::alloc();
+                        return Holder::get();
+                    case do_detachThread:
+                        Holder::free();
+                        return NULL;
+                    default:
+                        assert( false ) ;   // anything forgotten?..
+                }
+                return NULL;
+            }
+            //@endcond
+
+        public:
+            /// Initialize manager
+            /**
+                This function is automatically called by cds::Initialize
+            */
+            static void init()
+            {
+                Holder::init();
+            }
+
+            /// Terminate manager
+            /**
+                This function is automatically called by cds::Terminate
+            */
+            static void fini()
+            {
+                Holder::fini();
+            }
+
+            /// Checks whether current thread is attached to \p libcds feature or not.
+            static bool isThreadAttached()
+            {
+                return _threadData( do_checkData ) != NULL;
+            }
+
+            /// This method must be called in beginning of thread execution
+            /**
+                If TLS pointer to manager's data is NULL, api_exception is thrown
+                with code = -1.
+                If an error occurs in call of Win TLS API function, api_exception is thrown
+                with Windows error code.
+            */
+            static void attachThread()
+            {
+                ThreadData * pData = _threadData( do_attachThread );
+                assert( pData != NULL );
+
+                if ( pData ) {
+                    pData->init();
+                }
+                else
+                    throw api_exception( api_error_code(-1), "cds::threading::wintls::Manager::attachThread" );
+            }
+
+            /// This method must be called in end of thread execution
+            /**
+                If TLS pointer to manager's data is NULL, api_exception is thrown
+                with code = -1.
+                If an error occurs in call of Win TLS API function, api_exception is thrown
+                with Windows error code.
+            */
+            static void detachThread()
+            {
+                ThreadData * pData = _threadData( do_getData );
+                assert( pData != NULL );
+
+                if ( pData ) {
+                    if ( pData->fini() )
+                        _threadData( do_detachThread );
+                }
+                else
+                    throw api_exception( api_error_code(-1), "cds::threading::winapi::Manager::detachThread" );
+            }
+
+            /// Returns ThreadData pointer for the current thread
+            static ThreadData * thread_data()
+            {
+                return _threadData( do_getData );
+            }
+
+            /// Get gc::HP thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::HP.
+                To initialize gc::HP GC you must constuct cds::gc::HP object in the beginning of your application
+            */
+            static gc::HP::thread_gc_impl&   getHZPGC()
+            {
+                return *(_threadData( do_getData )->m_hpManager);
+            }
+
+            /// Get gc::HRC thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::HRC.
+                To initialize gc::HRC GC you must constuct cds::gc::HRC object in the beginning of your application
+            */
+            static gc::HRC::thread_gc_impl&   getHRCGC()
+            {
+                return *(_threadData( do_getData )->m_hrcManager);
+            }
+
+            /// Get gc::PTB thread GC implementation for current thread
+            /**
+                The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+                or if you did not use gc::PTB.
+                To initialize gc::PTB GC you must constuct cds::gc::PTB object in the beginning of your application
+            */
+            static gc::PTB::thread_gc_impl&   getPTBGC()
+            {
+                return *(_threadData( do_getData )->m_ptbManager);
+            }
+
+            //@cond
+            static size_t fake_current_processor()
+            {
+                return _threadData( do_getData )->fake_current_processor();
+            }
+            //@endcond
+        };
+
+    } // namespace wintls
+}} // namespace cds::threading
+//@endcond
+
+#endif // #ifndef __CDS_THREADING_DETAILS_WINTLS_MANAGER_H
diff --git a/cds/threading/model.h b/cds/threading/model.h
new file mode 100644 (file)
index 0000000..620654a
--- /dev/null
@@ -0,0 +1,99 @@
+//$$CDS-header$$
+
+#ifndef __CDS_THREADING_MODEL_H
+#define __CDS_THREADING_MODEL_H
+
+#include <cds/threading/details/_common.h>
+#include <cds/user_setup/threading.h>
+#include <cds/threading/details/auto_detect.h>
+
+namespace cds { namespace threading {
+
+    /// Returns thread specific data of \p GC garbage collector
+    template <class GC> typename GC::thread_gc_impl&  getGC();
+
+    /// Returns RCU thread specific data (thread GC) for current thread
+    /**
+        Template argument \p RCUtag is one of \ref cds_urcu_tags "RCU tags"
+    */
+    template <typename RCUtag> cds::urcu::details::thread_data<RCUtag> * getRCU();
+
+    /// Get cds::gc::HP thread GC implementation for current thread
+    /**
+        The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+        or if you did not use cds::gc::HP.
+        To initialize cds::gc::HP GC you must constuct cds::gc::HP object in the beginning of your application,
+        see \ref cds_how_to_use "How to use libcds"
+    */
+    template <>
+    inline cds::gc::HP::thread_gc_impl&   getGC<cds::gc::HP>()
+    {
+        return Manager::getHZPGC();
+    }
+
+    /// Get cds::gc::HRC thread GC implementation for current thread
+    /**
+        The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+        or if you did not use cds::gc::HRC.
+        To initialize cds::gc::HRC GC you must constuct cds::gc::HRC object in the beginning of your application,
+        see \ref cds_how_to_use "How to use libcds"
+    */
+    template <>
+    inline cds::gc::HRC::thread_gc_impl&   getGC<cds::gc::HRC>()
+    {
+        return Manager::getHRCGC();
+    }
+
+    /// Get cds::gc::PTB thread GC implementation for current thread
+    /**
+        The object returned may be uninitialized if you did not call attachThread in the beginning of thread execution
+        or if you did not use cds::gc::PTB.
+        To initialize cds::gc::PTB GC you must constuct cds::gc::PTB object in the beginning of your application,
+        see \ref cds_how_to_use "How to use libcds"
+    */
+    template <>
+    inline cds::gc::PTB::thread_gc_impl&   getGC<cds::gc::PTB>()
+    {
+        return Manager::getPTBGC();
+    }
+
+    //@cond
+    template<>
+    inline cds::urcu::details::thread_data<cds::urcu::general_instant_tag> * getRCU<cds::urcu::general_instant_tag>()
+    {
+        return Manager::thread_data()->m_pGPIRCU;
+    }
+    template<>
+    inline cds::urcu::details::thread_data<cds::urcu::general_buffered_tag> * getRCU<cds::urcu::general_buffered_tag>()
+    {
+        return Manager::thread_data()->m_pGPBRCU;
+    }
+    template<>
+    inline cds::urcu::details::thread_data<cds::urcu::general_threaded_tag> * getRCU<cds::urcu::general_threaded_tag>()
+    {
+        return Manager::thread_data()->m_pGPTRCU;
+    }
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    template<>
+    inline cds::urcu::details::thread_data<cds::urcu::signal_buffered_tag> * getRCU<cds::urcu::signal_buffered_tag>()
+    {
+        ThreadData * p = Manager::thread_data();
+        return p ? p->m_pSHBRCU : NULL;
+    }
+    template<>
+    inline cds::urcu::details::thread_data<cds::urcu::signal_threaded_tag> * getRCU<cds::urcu::signal_threaded_tag>()
+    {
+        ThreadData * p = Manager::thread_data();
+        return p ? p->m_pSHTRCU : NULL;
+    }
+#endif
+
+    static inline cds::algo::elimination::record& elimination_record()
+    {
+        return Manager::thread_data()->m_EliminationRec;
+    }
+    //@endcond
+
+}} // namespace cds::threading
+
+#endif // #ifndef __CDS_THREADING_MODEL_H
diff --git a/cds/urcu/details/base.h b/cds/urcu/details/base.h
new file mode 100644 (file)
index 0000000..08b638c
--- /dev/null
@@ -0,0 +1,482 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_DETAILS_BASE_H
+#define _CDS_URCU_DETAILS_BASE_H
+
+#include <cds/cxx11_atomic.h>
+#include <cds/gc/details/retired_ptr.h>
+#include <cds/details/allocator.h>
+#include <cds/os/thread.h>
+#include <cds/details/marked_ptr.h>
+
+namespace cds {
+    /// User-space Read-Copy Update (URCU) namespace
+    /** @ingroup cds_garbage_collector
+        @anchor cds_urcu_desc
+
+        This namespace contains declarations for different types of Read-Copy Update (%RCU)
+        synchronization primitive and data structures developed for RCU.
+        In <b>libcds</b> %RCU is used as garbage collector.
+
+        <b>Source papers</b>:
+        - [2009] M.Desnoyers "Low-Impact Operating System Tracing" PhD Thesis,
+          Chapter 6 "User-Level Implementations of Read-Copy Update"
+        - [2011] M.Desnoyers, P.McKenney, A.Stern, M.Dagenias, J.Walpole "User-Level
+          Implementations of Read-Copy Update"
+
+        <b>Informal intruduction to user-space %RCU</b>
+
+        [<i>From Desnoyer's papers</i>] %RCU is a synchronization mechanism that was added to the
+        Linux kernel in October of 2002. %RCU achieves scalability improvements by allowing
+        reads to occur concurrently with updates. In contrast to conventional locking
+        primitives that ensure mutual exclusion among concurrent threads regardless of whether
+        they be readers or updaters, or with reader-writer locks that allow concurrent reads
+        but not in the presence of updates, %RCU supports concurrency between a single updater
+        and multiple readers. %RCU ensures that reads are coherent by maintaining multiple
+        versions of objects and ensuring that they are not freed up until all pre-existing readside
+        critical sections complete. %RCU defines and uses efficient and scalable mechanisms
+        for publishing and reading new versions of an object, and also for deferring reclamation
+        of old versions. These mechanisms distribute the work among read and update
+        paths in such a way as to make read paths extremely fast.
+
+        %RCU readers execute within %RCU read-side critical sections. Each such critical section begins with
+        \p rcu_read_lock(), ends with \p rcu_read_unlock() (in \p libcds these primitives are the methods of
+        GC class and are usually called \p access_lock and \p access_unlock respectively). Read-side
+        critical sections can be nested.
+        The performance benefits of %RCU are due to the fact that \p rcu_read_lock()
+        and \p rcu_read_unlock() are exceedingly fast.
+
+        When a thread is not in an %RCU read-side critical section, it is in a quiescent state.
+        A quiescent state that persists for a significant time period is an extended quiescent state.
+        Any time period during which every thread has been in at least one quiescent state
+        is a grace period; this implies that every %RCU read-side critical section
+        that starts before a grace period must end before that grace period does.
+        Distinct grace periods may overlap, either partially or completely. Any time period
+        that includes a grace period is by definition itself a grace period.
+        Each grace period is guaranteed to complete as long as all read-side critical sections
+        are finite in duration; thus even a constant flow of such critical sections is unable to
+        extend an %RCU grace period indefinitely.
+
+        Suppose that readers enclose each of their data-structure traversals in
+        an %RCU read-side critical section. If an updater first removes an element
+        from such a data structure and then waits for a grace period, there can be
+        no more readers accessing that element. The updater can then carry out destructive
+        operations, for example freeing the element, without disturbing any readers.
+
+        The %RCU update is split into two phases, a removal phase and a reclamation phase.
+        These two phases must be separated by a grace period, for example via the \p synchronize_rcu()
+        primitive, which initiates a grace period and waits for it to finish.
+        During the removal phase, the %RCU update removes elements from a shared data structure.
+        The removed data elements will only be accessible to read-side critical sections
+        that ran concurrently with the removal phase, which are guaranteed to complete before the
+        grace period ends. Therefore the reclamation phase can safely free the data elements
+        removed by the removal phase.
+
+        Desnoyers describes several classes of user-space %RCU implementations:
+        - The Quiescent-State-Based Reclamation (QSBR) %RCU implementation offers
+          the best possible read-side performance, but requires that each thread periodically
+          calls a function to announce that it is in a quiescent state, thus strongly
+          constraining the application design. This type of %RCU is not implemented in \p libcds.
+        - The general-purpose %RCU implementation places almost no constraints on the application\92s
+          design, thus being appropriate for use within a general-purpose library, but it has
+          relatively higher read-side overhead. The \p libcds contains several implementations of general-purpose
+          %RCU: \ref general_instant, \ref general_buffered, \ref general_threaded.
+        - The signal-handling %RCU presents an implementation having low read-side overhead and
+          requiring only that the application give up one POSIX signal to %RCU update processing.
+          The \p libcds contains several implementations if signal-handling %RCU: \ref signal_buffered,
+          \ref signal_threaded.
+
+    @note The signal-handled %RCU is defined only for UNIX-like systems, not for Windows.
+
+    @anchor cds_urcu_type
+    <b>RCU implementation type</b>
+
+        There are several internal implementation of RCU (all declared in \p %cds::urcu namespace):
+        - \ref general_instant - general purpose RCU with immediate reclamation
+        - \ref general_buffered - general purpose RCU with deferred (buffered) reclamation
+        - \ref general_threaded - general purpose RCU with special reclamation thread
+        - \ref signal_buffered - signal-handling RCU with deferred (buffered) reclamation
+        - \ref signal_threaded - signal-handling RCU with special reclamation thread
+
+        You cannot create an object of any of those classes directly.
+        Instead, you should use wrapper classes.
+        The wrapper simplifies creation and usage of RCU singleton objects
+        and has the reacher interface that combines interfaces of wrapped class i.e. RCU global part like
+        \p synchronize, and corresponding RCU thread-specific interface like \p access_lock, \p access_unlock and \p retire_ptr.
+
+    @anchor cds_urcu_gc
+    There are several wrapper classes (all declared in \p %cds::urcu namespace)
+        - \ref cds_urcu_general_instant_gc "gc<general_instant>" - general purpose RCU with immediate reclamation,
+            include file <tt><cds/urcu/general_instant.h></tt>
+        - \ref cds_urcu_general_buffered_gc "gc<general_buffered>" - general purpose RCU with deferred (buffered) reclamation,
+            include file <tt><cds/urcu/general_buffered.h></tt>
+        - \ref cds_urcu_general_threaded_gc "gc<general_threaded>" - general purpose RCU with special reclamation thread
+            include file <tt><cds/urcu/general_threaded.h></tt>
+        - \ref cds_urcu_signal_buffered_gc "gc<signal_buffered>" - signal-handling RCU with deferred (buffered) reclamation
+            include file <tt><cds/urcu/signal_buffered.h></tt>
+        - \ref cds_urcu_signal_threaded_gc "gc<signal_threaded>" - signal-handling RCU with special reclamation thread
+            include file <tt><cds/urcu/signal_threaded.h></tt>
+
+        Any RCU-related container in \p libcds expects that its \p RCU template parameter is one of those wrapper.
+
+    @anchor cds_urcu_tags
+        For simplicity, in some algorithms instead of using RCU implementation type
+        you should specify corresponding RCU tags (all declared in \p %cds::urcu namespace):
+        - \ref general_instant_tag - for \ref general_instant
+        - \ref general_buffered_tag - for \ref general_buffered
+        - \ref general_threaded_tag - for \ref general_threaded
+        - \ref signal_buffered_tag - for \ref signal_buffered
+        - \ref signal_threaded_tag - for \ref signal_threaded
+
+    @anchor cds_urcu_performance
+    <b>Performance</b>
+
+        As a result of our experiments we can range above %RCU implementation in such order,
+        from high to low performance:
+        - <tt>gc<general_buffered></tt> - high
+        - <tt>gc<general_threaded></tt>
+        - <tt>gc<signal_buffered></tt>
+        - <tt>gc<signal_threaded></tt>
+        - <tt>gc<general_instant></tt> - low
+
+        This estimation is very rough and depends on many factors:
+        type of payload - mostly read-only (seeking) or read-write (inserting and deleting), -
+        a hardware, your application, and so on.
+
+    @anchor cds_urcu_howto
+    <b>How to use</b>
+
+        Usually, in your application you use only one \ref cds_urcu_gc "type of RCU" that is the best for your needs.
+        However, the library allows to apply several RCU singleton in one application.
+        The only limitation is that only one object of each RCU type can be instantiated.
+        Since each RCU type is a template class the creation of two object of one RCU type class
+        with different template arguments is an error and is not supported.
+        However, it is correct when your RCU objects relates to different RCU types.
+
+        @note If you want to use \p %signal_buffered and \p %signal_threaded RCU in your application simultaneously,
+        you should specify different signal number for each signal-handled RCU type on construction time,
+        for example, \p SIGUSR1 and \p SIGUSR2 respectively. By default, both signal-handled RCU implementation
+        share \p SIGUSR1 signal and cannot be applied together.
+
+        In \p libcds, many GC-based ordered list, set and map template classes have %RCU-related specializations
+        that hide the %RCU specific details.
+
+        RCU GC is initialized in usual way: you should declare an object of type \p cds::urcu::gc< RCU_type >,
+        for example:
+        \code
+        #include <cds/urcu/general_buffered.h>
+
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >    rcu_gpb;
+
+        int main() {
+            // Initialize libcds
+            cds::Initialize();
+            {
+                // Initialize general_buffered RCU
+                rcu_gpb   gpbRCU;
+
+                // If main thread uses lock-free containers
+                // the main thread should be attached to libcds infrastructure
+                cds::threading::Manager::attachThread();
+
+                // Now you can use RCU-based containers in the main thread
+                //...
+            }
+            // Terminate libcds
+            cds::Terminate();
+        }
+        \endcode
+
+        Each thread that deals with RCU-based container should be initialized first:
+        \code
+        #include <cds/urcu/general_buffered.h>
+        int myThreadEntryPoint(void *)
+        {
+            // Attach the thread to libcds infrastructure
+            cds::threading::Manager::attachThread();
+
+            // Now you can use RCU-based containers in the thread
+            //...
+
+            // Detach thread when terminating
+            cds::threading::Manager::detachThread();
+        }
+        \endcode
+    */
+    namespace urcu {
+
+#   if CDS_OS_INTERFACE == CDS_OSI_UNIX || defined(CDS_DOXYGEN_INVOKED)
+#       define CDS_URCU_SIGNAL_HANDLING_ENABLED 1
+#   endif
+
+        /// General-purpose URCU type
+        struct general_purpose_rcu {
+            //@cond
+            static uint32_t const c_nControlBit = 0x80000000;
+            static uint32_t const c_nNestMask   = c_nControlBit - 1;
+            //@endcond
+        };
+
+#   ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        /// Signal-handling URCU type
+        struct signal_handling_rcu {
+            //@cond
+            static uint32_t const c_nControlBit = 0x80000000;
+            static uint32_t const c_nNestMask   = c_nControlBit - 1;
+            //@endcond
+        };
+#   endif
+
+        /// Tag for general_instant URCU
+        struct general_instant_tag: public general_purpose_rcu {
+            typedef general_purpose_rcu     rcu_class ; ///< The URCU type
+        };
+
+        /// Tag for general_buffered URCU
+        struct general_buffered_tag: public general_purpose_rcu
+        {
+            typedef general_purpose_rcu     rcu_class ; ///< The URCU type
+        };
+
+        /// Tag for general_threaded URCU
+        struct general_threaded_tag: public general_purpose_rcu {
+            typedef general_purpose_rcu     rcu_class ; ///< The URCU type
+        };
+
+#   ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        /// Tag for signal_buffered URCU
+        struct signal_buffered_tag: public signal_handling_rcu {
+                typedef signal_handling_rcu     rcu_class ; ///< The URCU type
+        };
+
+        /// Tag for signal_threaded URCU
+        struct signal_threaded_tag: public signal_handling_rcu {
+            typedef signal_handling_rcu     rcu_class ; ///< The URCU type
+        };
+#   endif
+
+        ///@anchor cds_urcu_retired_ptr Retired pointer, i.e. pointer that ready for reclamation
+        typedef cds::gc::details::retired_ptr   retired_ptr;
+
+        /// Pointer to function to free (destruct and deallocate) retired pointer of specific type
+        typedef cds::gc::details::free_retired_ptr_func free_retired_ptr_func;
+
+        //@cond
+        /// Implementation-specific URCU details
+        namespace details {
+            /// forward declarations
+            template <typename RCUtag>
+            struct thread_data;
+
+            template <typename RCUtag>
+            class thread_gc;
+
+            template <typename RCUtag >
+            class singleton;
+
+            //@cond
+            class singleton_vtbl {
+            protected:
+                virtual ~singleton_vtbl()
+                {}
+            public:
+                virtual void retire_ptr( retired_ptr& p ) = 0;
+            };
+
+            class gc_common
+            {
+            public:
+#       ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
+                template <typename MarkedPtr> using atomic_marked_ptr = CDS_ATOMIC::atomic<MarkedPtr>;
+#       else
+                template <typename MarkedPtr>
+                class atomic_marked_ptr: public CDS_ATOMIC::atomic<MarkedPtr>
+                {
+                    typedef CDS_ATOMIC::atomic<MarkedPtr> base_class;
+                public:
+#           ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
+                    atomic_marked_ptr() CDS_NOEXCEPT_DEFAULTED_( noexcept(base_class()) ) = default;
+#           else
+                    atomic_marked_ptr() CDS_NOEXCEPT_( noexcept(base_class()) )
+                        : base_class()
+                    {}
+#           endif
+                    explicit CDS_CONSTEXPR atomic_marked_ptr(MarkedPtr val) CDS_NOEXCEPT_( noexcept(base_class( val )) )
+                        : base_class( val )
+                    {}
+                    explicit CDS_CONSTEXPR atomic_marked_ptr(typename MarkedPtr::value_type * p) CDS_NOEXCEPT_( noexcept(base_class( p )) )
+                        : base_class( p )
+                    {}
+                };
+#       endif
+            };
+            //@endcond
+
+            //@cond
+            template <typename ThreadData>
+            struct thread_list_record {
+                ThreadData *    m_pNext ;  ///< Next item in thread list
+                CDS_ATOMIC::atomic<OS::ThreadId>    m_idOwner   ; ///< Owner thread id; 0 - the record is free (not owned)
+
+                thread_list_record()
+                    : m_pNext( null_ptr<ThreadData *>() )
+                    , m_idOwner( cds::OS::nullThreadId() )
+                {}
+
+                ~thread_list_record()
+                {}
+            };
+            //@endcond
+
+            //@cond
+            template <typename RCUtag, class Alloc = CDS_DEFAULT_ALLOCATOR >
+            class thread_list {
+            public:
+                typedef thread_data<RCUtag>         thread_record;
+                typedef cds::details::Allocator< thread_record, Alloc >   allocator_type;
+
+            private:
+                CDS_ATOMIC::atomic<thread_record *>   m_pHead;
+
+            public:
+                thread_list()
+                    : m_pHead( null_ptr<thread_record *>())
+                {}
+
+                ~thread_list()
+                {
+                    destroy();
+                }
+
+                thread_record * alloc()
+                {
+                    thread_record * pRec;
+                    cds::OS::ThreadId const nullThreadId = cds::OS::nullThreadId();
+                    cds::OS::ThreadId const curThreadId  = cds::OS::getCurrentThreadId();
+
+                    // First try to reuse a retired (non-active) HP record
+                    for ( pRec = m_pHead.load( CDS_ATOMIC::memory_order_acquire ); pRec; pRec = pRec->m_list.m_pNext ) {
+                        cds::OS::ThreadId thId = nullThreadId;
+                        if ( !pRec->m_list.m_idOwner.compare_exchange_strong( thId, curThreadId, CDS_ATOMIC::memory_order_seq_cst, CDS_ATOMIC::memory_order_relaxed ) )
+                            continue;
+                        return pRec;
+                    }
+
+                    // No records available for reuse
+                    // Allocate and push a new record
+                    pRec = allocator_type().New();
+                    pRec->m_list.m_idOwner.store( curThreadId, CDS_ATOMIC::memory_order_relaxed );
+
+                    CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_release );
+
+                    thread_record * pOldHead = m_pHead.load( CDS_ATOMIC::memory_order_acquire );
+                    do {
+                        pRec->m_list.m_pNext = pOldHead;
+                    } while ( !m_pHead.compare_exchange_weak( pOldHead, pRec, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+
+                    return pRec;
+                }
+
+                void retire( thread_record * pRec )
+                {
+                    assert( pRec != null_ptr<thread_record *>() );
+                    pRec->m_list.m_idOwner.store( cds::OS::nullThreadId(), CDS_ATOMIC::memory_order_release );
+                }
+
+                void detach_all()
+                {
+                    thread_record * pNext = null_ptr<thread_record *>();
+                    cds::OS::ThreadId const nullThreadId = cds::OS::nullThreadId();
+
+                    for ( thread_record * pRec = m_pHead.load(CDS_ATOMIC::memory_order_acquire); pRec; pRec = pNext ) {
+                        pNext = pRec->m_list.m_pNext;
+                        if ( pRec->m_list.m_idOwner.load(CDS_ATOMIC::memory_order_relaxed) != nullThreadId ) {
+                            retire( pRec );
+                        }
+                    }
+                }
+
+                thread_record * head( CDS_ATOMIC::memory_order mo ) const
+                {
+                    return m_pHead.load( mo );
+                }
+
+            private:
+                void destroy()
+                {
+                    allocator_type al;
+                    CDS_DEBUG_DO( cds::OS::ThreadId const nullThreadId = cds::OS::nullThreadId() ;)
+                    CDS_DEBUG_DO( cds::OS::ThreadId const mainThreadId = cds::OS::getCurrentThreadId() ;)
+
+                    thread_record * p = m_pHead.exchange( null_ptr<thread_record *>(), CDS_ATOMIC::memory_order_seq_cst );
+                    while ( p ) {
+                        thread_record * pNext = p->m_list.m_pNext;
+
+                        assert( p->m_list.m_idOwner.load( CDS_ATOMIC::memory_order_relaxed ) == nullThreadId
+                            || p->m_list.m_idOwner.load( CDS_ATOMIC::memory_order_relaxed ) == mainThreadId
+                            || !cds::OS::isThreadAlive( p->m_list.m_idOwner.load( CDS_ATOMIC::memory_order_relaxed ) )
+                            );
+
+                        al.Delete( p );
+                        p = pNext;
+                    }
+                }
+            };
+            //@endcond
+
+            //@cond
+            template <class ThreadGC>
+            class scoped_lock {
+            public:
+                typedef ThreadGC                    thread_gc;
+                typedef typename thread_gc::rcu_tag rcu_tag;
+
+                bool m_bLocked;
+            public:
+                scoped_lock(bool bLock = true)
+                    : m_bLocked( bLock )
+                {
+                    if ( bLock )
+                        thread_gc::access_lock();
+                }
+
+                ~scoped_lock()
+                {
+                    if ( m_bLocked )
+                        thread_gc::access_unlock();
+                }
+            };
+            //@endcond
+        } // namespace details
+        //@endcond
+
+        // forwards
+        //@cond
+        template <typename RCUimpl> class gc;
+        //@endcond
+
+        /// Epoch-based retired ptr
+        /**
+            Retired pointer with additional epoch field that prevents early reclamation.
+            This type of retired pointer is used in buffered RCU implementations.
+        */
+        struct epoch_retired_ptr: public retired_ptr
+        {
+            uint64_t    m_nEpoch ;  ///< The epoch when the object has been retired
+
+            //@cond
+            epoch_retired_ptr()
+            {}
+            //@endcond
+
+            /// Constructor creates a copy of \p rp retired pointer and saves \p nEpoch reclamation epoch.
+            epoch_retired_ptr( retired_ptr const& rp, uint64_t nEpoch )
+                : retired_ptr( rp )
+                , m_nEpoch( nEpoch )
+            {}
+        };
+
+    } // namespace urcu
+} // namespace cds
+
+#endif // #ifndef _CDS_URCU_DETAILS_BASE_H
diff --git a/cds/urcu/details/check_deadlock.h b/cds/urcu/details/check_deadlock.h
new file mode 100644 (file)
index 0000000..f63e425
--- /dev/null
@@ -0,0 +1,41 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_DETAILS_CHECK_DEADLOCK_H
+#define _CDS_URCU_DETAILS_CHECK_DEADLOCK_H
+
+#include <cds/urcu/options.h>
+
+//@cond
+namespace cds { namespace urcu { namespace details {
+
+    template <class RCU, typename PolicyType>
+    struct check_deadlock_policy
+    {
+        static void check()
+        {
+            assert( !RCU::is_locked() );
+            if ( RCU::is_locked() )
+                throw cds::urcu::rcu_deadlock();
+        }
+    };
+
+    template <class RCU>
+    struct check_deadlock_policy< RCU, cds::opt::v::rcu_no_check_deadlock>
+    {
+        static void check()
+        {}
+    };
+
+    template <class RCU>
+    struct check_deadlock_policy< RCU, cds::opt::v::rcu_assert_deadlock>
+    {
+        static void check()
+        {
+            assert( !RCU::is_locked() );
+        }
+    };
+
+}}} // namespace cds::urcu::details
+//@endcond
+
+#endif // #ifndef _CDS_URCU_DETAILS_CHECK_DEADLOCK_H
diff --git a/cds/urcu/details/gp.h b/cds/urcu/details/gp.h
new file mode 100644 (file)
index 0000000..7770980
--- /dev/null
@@ -0,0 +1,101 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_DETAILS_GP_H
+#define _CDS_URCU_DETAILS_GP_H
+
+#include <cds/urcu/details/gp_decl.h>
+#include <cds/threading/model.h>
+
+//@cond
+namespace cds { namespace urcu { namespace details {
+
+    // Inlines
+
+    // gp_thread_gc
+    template <typename RCUtag>
+    inline gp_thread_gc<RCUtag>::gp_thread_gc()
+    {
+        if ( !threading::Manager::isThreadAttached() )
+            cds::threading::Manager::attachThread();
+    }
+
+    template <typename RCUtag>
+    inline gp_thread_gc<RCUtag>::~gp_thread_gc()
+    {
+        cds::threading::Manager::detachThread();
+    }
+
+    template <typename RCUtag>
+    inline typename gp_thread_gc<RCUtag>::thread_record * gp_thread_gc<RCUtag>::get_thread_record()
+    {
+        return cds::threading::getRCU<RCUtag>();
+    }
+
+    template <typename RCUtag>
+    inline void gp_thread_gc<RCUtag>::access_lock()
+    {
+        thread_record * pRec = get_thread_record();
+        assert( pRec != null_ptr<thread_record *>());
+
+        uint32_t tmp = pRec->m_nAccessControl.load( CDS_ATOMIC::memory_order_relaxed );
+        if ( (tmp & rcu_class::c_nNestMask) == 0 ) {
+            pRec->m_nAccessControl.store( gp_singleton<RCUtag>::instance()->global_control_word(CDS_ATOMIC::memory_order_relaxed),
+                CDS_ATOMIC::memory_order_relaxed );
+            CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_acquire );
+            //CDS_COMPILER_RW_BARRIER;
+        }
+        else {
+            pRec->m_nAccessControl.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+        }
+    }
+
+    template <typename RCUtag>
+    inline void gp_thread_gc<RCUtag>::access_unlock()
+    {
+        thread_record * pRec = get_thread_record();
+        assert( pRec != null_ptr<thread_record *>());
+
+        //CDS_COMPILER_RW_BARRIER;
+        pRec->m_nAccessControl.fetch_sub( 1, CDS_ATOMIC::memory_order_release );
+    }
+
+    template <typename RCUtag>
+    inline bool gp_thread_gc<RCUtag>::is_locked()
+    {
+        thread_record * pRec = get_thread_record();
+        assert( pRec != null_ptr<thread_record *>());
+
+        return (pRec->m_nAccessControl.load( CDS_ATOMIC::memory_order_relaxed ) & rcu_class::c_nNestMask) != 0;
+    }
+
+
+    // gp_singleton
+    template <typename RCUtag>
+    inline bool gp_singleton<RCUtag>::check_grace_period( typename gp_singleton<RCUtag>::thread_record * pRec ) const
+    {
+        uint32_t const v = pRec->m_nAccessControl.load( CDS_ATOMIC::memory_order_relaxed );
+        return (v & general_purpose_rcu::c_nNestMask)
+            && ((( v ^ m_nGlobalControl.load( CDS_ATOMIC::memory_order_relaxed )) & ~general_purpose_rcu::c_nNestMask ));
+    }
+
+    template <typename RCUtag>
+    template <class Backoff>
+    inline void gp_singleton<RCUtag>::flip_and_wait( Backoff& bkoff )
+    {
+        OS::ThreadId const nullThreadId = OS::nullThreadId();
+        m_nGlobalControl.fetch_xor( general_purpose_rcu::c_nControlBit, CDS_ATOMIC::memory_order_seq_cst );
+
+        for ( thread_record * pRec = m_ThreadList.head( CDS_ATOMIC::memory_order_acquire); pRec; pRec = pRec->m_list.m_pNext ) {
+            while ( pRec->m_list.m_idOwner.load( CDS_ATOMIC::memory_order_acquire) != nullThreadId && check_grace_period( pRec ) ) {
+                bkoff();
+                CDS_COMPILER_RW_BARRIER;
+            }
+            bkoff.reset();
+        }
+    }
+
+
+}}} // namespace cds:urcu::details
+//@endcond
+
+#endif // #ifndef _CDS_URCU_DETAILS_GP_H
diff --git a/cds/urcu/details/gp_decl.h b/cds/urcu/details/gp_decl.h
new file mode 100644 (file)
index 0000000..f04cf81
--- /dev/null
@@ -0,0 +1,178 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_DETAILS_GP_DECL_H
+#define _CDS_URCU_DETAILS_GP_DECL_H
+
+#include <cds/urcu/details/base.h>
+#include <cds/details/static_functor.h>
+#include <cds/details/lib.h>
+
+//@cond
+namespace cds { namespace urcu { namespace details {
+
+    // We could derive thread_data from thread_list_record
+    // but in this case m_nAccessControl would have offset != 0
+    // that is not so efficiently
+#   define CDS_GPURCU_DECLARE_THREAD_DATA(tag_) \
+    template <> struct thread_data<tag_> { \
+        CDS_ATOMIC::atomic<uint32_t>        m_nAccessControl ; \
+        thread_list_record< thread_data >   m_list ; \
+        thread_data(): m_nAccessControl(0) {} \
+        ~thread_data() {} \
+    }
+
+    CDS_GPURCU_DECLARE_THREAD_DATA( general_instant_tag );
+    CDS_GPURCU_DECLARE_THREAD_DATA( general_buffered_tag );
+    CDS_GPURCU_DECLARE_THREAD_DATA( general_threaded_tag );
+
+#   undef CDS_GPURCU_DECLARE_THREAD_DATA
+
+    template <typename RCUtag>
+    struct gp_singleton_instance
+    {
+        static CDS_EXPORT_API singleton_vtbl *     s_pRCU;
+    };
+#if !( CDS_COMPILER == CDS_COMPILER_MSVC || (CDS_COMPILER == CDS_COMPILER_INTEL && CDS_OS_INTERFACE == CDS_OSI_WINDOWS))
+    template<> CDS_EXPORT_API singleton_vtbl * gp_singleton_instance< general_instant_tag >::s_pRCU;
+    template<> CDS_EXPORT_API singleton_vtbl * gp_singleton_instance< general_buffered_tag >::s_pRCU;
+    template<> CDS_EXPORT_API singleton_vtbl * gp_singleton_instance< general_threaded_tag >::s_pRCU;
+#endif
+
+    template <typename GPRCUtag>
+    class gp_thread_gc
+    {
+    public:
+        typedef GPRCUtag                    rcu_tag;
+        typedef typename rcu_tag::rcu_class rcu_class;
+        typedef thread_data< rcu_tag >      thread_record;
+        typedef cds::urcu::details::scoped_lock< gp_thread_gc > scoped_lock;
+
+    protected:
+        static thread_record * get_thread_record();
+
+    public:
+        gp_thread_gc();
+        ~gp_thread_gc();
+    public:
+        static void access_lock();
+        static void access_unlock();
+        static bool is_locked();
+
+        /// Retire pointer \p by the disposer \p Disposer
+        template <typename Disposer, typename T>
+        static void retire( T * p )
+        {
+            retire( p, cds::details::static_functor<Disposer, T>::call );
+        }
+
+        /// Retire pointer \p by the disposer \p pFunc
+        template <typename T>
+        static void retire( T * p, void (* pFunc)(T *) )
+        {
+            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ) );
+            retire( rp );
+        }
+
+        /// Retire pointer \p
+        static void retire( retired_ptr& p )
+        {
+            assert( gp_singleton_instance< rcu_tag >::s_pRCU );
+            gp_singleton_instance< rcu_tag >::s_pRCU->retire_ptr( p );
+        }
+    };
+
+#   define CDS_GP_RCU_DECLARE_THREAD_GC( tag_ ) template <> class thread_gc<tag_>: public gp_thread_gc<tag_> {}
+
+    CDS_GP_RCU_DECLARE_THREAD_GC( general_instant_tag  );
+    CDS_GP_RCU_DECLARE_THREAD_GC( general_buffered_tag );
+    CDS_GP_RCU_DECLARE_THREAD_GC( general_threaded_tag );
+
+#   undef CDS_GP_RCU_DECLARE_THREAD_GC
+
+    template <class RCUtag>
+    class gp_singleton: public singleton_vtbl
+    {
+    public:
+        typedef RCUtag  rcu_tag;
+        typedef cds::urcu::details::thread_gc< rcu_tag >   thread_gc;
+
+    protected:
+        typedef typename thread_gc::thread_record   thread_record;
+        typedef gp_singleton_instance< rcu_tag >    rcu_instance;
+
+    protected:
+        CDS_ATOMIC::atomic<uint32_t>    m_nGlobalControl;
+        thread_list< rcu_tag >          m_ThreadList;
+
+    protected:
+        gp_singleton()
+            : m_nGlobalControl(1)
+        {}
+
+        ~gp_singleton()
+        {}
+
+    public:
+        static gp_singleton * instance()
+        {
+            return static_cast< gp_singleton *>( rcu_instance::s_pRCU );
+        }
+
+        static bool isUsed()
+        {
+            return rcu_instance::s_pRCU != NULL;
+        }
+
+    public:
+        virtual void retire_ptr( retired_ptr& p ) = 0;
+
+    public: // thread_gc interface
+        thread_record * attach_thread()
+        {
+            return m_ThreadList.alloc();
+        }
+
+        void detach_thread( thread_record * pRec )
+        {
+            m_ThreadList.retire( pRec );
+        }
+
+        uint32_t global_control_word( CDS_ATOMIC::memory_order mo ) const
+        {
+            return m_nGlobalControl.load( mo );
+        }
+
+    protected:
+        bool check_grace_period( thread_record * pRec ) const;
+
+        template <class Backoff>
+        void flip_and_wait( Backoff& bkoff );
+    };
+
+#   define CDS_GP_RCU_DECLARE_SINGLETON( tag_ ) \
+    template <> class singleton< tag_ > { \
+    public: \
+        typedef tag_  rcu_tag ; \
+        typedef cds::urcu::details::thread_gc< rcu_tag >   thread_gc ; \
+    protected: \
+        typedef thread_gc::thread_record            thread_record ; \
+        typedef gp_singleton_instance< rcu_tag >    rcu_instance  ; \
+        typedef gp_singleton< rcu_tag >             rcu_singleton ; \
+    public: \
+        static bool isUsed() { return rcu_singleton::isUsed() ; } \
+        static rcu_singleton * instance() { assert( rcu_instance::s_pRCU ); return static_cast<rcu_singleton *>( rcu_instance::s_pRCU ); } \
+        static thread_record * attach_thread() { return instance()->attach_thread() ; } \
+        static void detach_thread( thread_record * pRec ) { return instance()->detach_thread( pRec ) ; } \
+        static uint32_t global_control_word( CDS_ATOMIC::memory_order mo ) { return instance()->global_control_word( mo ) ; } \
+    }
+
+    CDS_GP_RCU_DECLARE_SINGLETON( general_instant_tag  );
+    CDS_GP_RCU_DECLARE_SINGLETON( general_buffered_tag );
+    CDS_GP_RCU_DECLARE_SINGLETON( general_threaded_tag );
+
+#   undef CDS_GP_RCU_DECLARE_SINGLETON
+
+}}} // namespace cds::urcu::details
+//@endcond
+
+#endif // #ifndef _CDS_URCU_DETAILS_GP_DECL_H
diff --git a/cds/urcu/details/gpb.h b/cds/urcu/details/gpb.h
new file mode 100644 (file)
index 0000000..89bae00
--- /dev/null
@@ -0,0 +1,222 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_DETAILS_GPB_H
+#define _CDS_URCU_DETAILS_GPB_H
+
+#include <cds/urcu/details/gp.h>
+#include <cds/backoff_strategy.h>
+#include <cds/container/vyukov_mpmc_cycle_queue.h>
+
+#include <cds/details/std/mutex.h>
+
+namespace cds { namespace urcu {
+
+    /// User-space general-purpose RCU with deferred (buffered) reclamation
+    /**
+        @headerfile cds/urcu/general_buffered.h
+
+        This URCU implementation contains an internal buffer where retired objects are
+        accumulated. When the buffer becomes full, the RCU \p synchronize function is called
+        that waits until all reader/updater threads end up their read-side critical sections,
+        i.e. until the RCU quiescent state will come. After that the buffer and all retired objects are freed.
+        This synchronization cycle may be called in any thread that calls \p retire_ptr function.
+
+        The \p Buffer contains items of \ref cds_urcu_retired_ptr "retired_ptr" type and it should support a queue interface with
+        three function:
+        - <tt> bool push( retired_ptr& p ) </tt> - places the retired pointer \p p into queue. If the function
+            returns \p false it means that the buffer is full and RCU synchronization cycle must be processed.
+        - <tt>bool pop( retired_ptr& p ) </tt> - pops queue's head item into \p p parameter; if the queue is empty
+            this function must return \p false
+        - <tt>size_t size()</tt> - returns queue's item count.
+
+        The buffer is considered as full if \p push returns \p false or the buffer size reaches the RCU threshold.
+
+        There is a wrapper \ref cds_urcu_general_buffered_gc "gc<general_buffered>" for \p %general_buffered class
+        that provides unified RCU interface. You should use this wrapper class instead \p %general_buffered
+
+        Template arguments:
+        - \p Buffer - buffer type. Default is cds::container::VyukovMPMCCycleQueue
+        - \p Lock - mutex type, default is \p std::mutex
+        - \p Backoff - back-off schema, default is cds::backoff::Default
+    */
+    template <
+        class Buffer = cds::container::VyukovMPMCCycleQueue<
+            epoch_retired_ptr
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< epoch_retired_ptr > >
+        >
+        ,class Lock = cds_std::mutex
+        ,class Backoff = cds::backoff::Default
+    >
+    class general_buffered: public details::gp_singleton< general_buffered_tag >
+    {
+        //@cond
+        typedef details::gp_singleton< general_buffered_tag > base_class;
+        //@endcond
+    public:
+        typedef general_buffered_tag rcu_tag ;  ///< RCU tag
+        typedef Buffer  buffer_type ;   ///< Buffer type
+        typedef Lock    lock_type   ;   ///< Lock type
+        typedef Backoff back_off    ;   ///< Back-off type
+
+        typedef base_class::thread_gc thread_gc ;   ///< Thread-side RCU part
+        typedef typename thread_gc::scoped_lock scoped_lock ; ///< Access lock class
+
+        static bool const c_bBuffered = true ; ///< This RCU buffers disposed elements
+
+    protected:
+        //@cond
+        typedef details::gp_singleton_instance< rcu_tag >    singleton_ptr;
+        //@endcond
+
+    protected:
+        //@cond
+        buffer_type                     m_Buffer;
+        CDS_ATOMIC::atomic<uint64_t>    m_nCurEpoch;
+        lock_type                       m_Lock;
+        size_t const                    m_nCapacity;
+        //@endcond
+
+    public:
+        /// Returns singleton instance
+        static general_buffered * instance()
+        {
+            return static_cast<general_buffered *>( base_class::instance() );
+        }
+        /// Checks if the singleton is created and ready to use
+        static bool isUsed()
+        {
+            return singleton_ptr::s_pRCU != null_ptr<singleton_vtbl *>();
+        }
+
+    protected:
+        //@cond
+        general_buffered( size_t nBufferCapacity )
+            : m_Buffer( nBufferCapacity )
+            , m_nCurEpoch(0)
+            , m_nCapacity( nBufferCapacity )
+        {}
+
+        ~general_buffered()
+        {
+            clear_buffer( (uint64_t) -1 );
+        }
+
+        void flip_and_wait()
+        {
+            back_off bkoff;
+            base_class::flip_and_wait( bkoff );
+        }
+
+        void clear_buffer( uint64_t nEpoch )
+        {
+            epoch_retired_ptr p;
+            while ( m_Buffer.pop( p )) {
+                if ( p.m_nEpoch <= nEpoch )
+                    p.free();
+                else {
+                    push_buffer( p );
+                    break;
+                }
+            }
+        }
+
+        // Return: true - synchronize has been called, false - otherwise
+        bool push_buffer( epoch_retired_ptr& ep )
+        {
+            bool bPushed = m_Buffer.push( ep );
+            if ( !bPushed || m_Buffer.size() >= capacity() ) {
+                synchronize();
+                if ( !bPushed )
+                    ep.free();
+                return true;
+            }
+            return false;
+        }
+        //@endcond
+
+    public:
+        /// Creates singleton object
+        /**
+            The \p nBufferCapacity parameter defines RCU threshold.
+        */
+        static void Construct( size_t nBufferCapacity = 256 )
+        {
+            if ( !singleton_ptr::s_pRCU )
+                singleton_ptr::s_pRCU = new general_buffered( nBufferCapacity );
+        }
+
+        /// Destroys singleton object
+        static void Destruct( bool bDetachAll = false )
+        {
+            if ( isUsed() ) {
+                instance()->clear_buffer( (uint64_t) -1 );
+                if ( bDetachAll )
+                    instance()->m_ThreadList.detach_all();
+                delete instance();
+                singleton_ptr::s_pRCU = null_ptr<singleton_vtbl *>();
+            }
+        }
+
+    public:
+        /// Retire \p p pointer
+        /**
+            The method pushes \p p pointer to internal buffer.
+            When the buffer becomes full \ref synchronize function is called
+            to wait for the end of grace period and then to free all pointers from the buffer.
+        */
+        virtual void retire_ptr( retired_ptr& p )
+        {
+            if ( p.m_p ) {
+                epoch_retired_ptr ep( p, m_nCurEpoch.load( CDS_ATOMIC::memory_order_relaxed ));
+                push_buffer( ep );
+            }
+        }
+
+        /// Retires the pointer chain [\p itFirst, \p itLast)
+        template <typename ForwardIterator>
+        void batch_retire( ForwardIterator itFirst, ForwardIterator itLast )
+        {
+            uint64_t nEpoch = m_nCurEpoch.load( CDS_ATOMIC::memory_order_relaxed );
+            while ( itFirst != itLast ) {
+                epoch_retired_ptr ep( *itFirst, nEpoch );
+                ++itFirst;
+                push_buffer( ep );
+            }
+        }
+
+        /// Wait to finish a grace period and then clear the buffer
+        void synchronize()
+        {
+            epoch_retired_ptr ep( retired_ptr(), m_nCurEpoch.load( CDS_ATOMIC::memory_order_relaxed ));
+            synchronize( ep );
+        }
+
+        //@cond
+        bool synchronize( epoch_retired_ptr& ep )
+        {
+            uint64_t nEpoch;
+            CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_acquire );
+            {
+                cds::lock::scoped_lock<lock_type> sl( m_Lock );
+                if ( ep.m_p && m_Buffer.push( ep ) )
+                    return false;
+                nEpoch = m_nCurEpoch.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+                flip_and_wait();
+                flip_and_wait();
+            }
+            clear_buffer( nEpoch );
+            CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_release );
+            return true;
+        }
+        //@endcond
+
+        /// Returns internal buffer capacity
+        size_t capacity() const
+        {
+            return m_nCapacity;
+        }
+    };
+
+}} // namespace cds::urcu
+
+#endif // #ifndef _CDS_URCU_DETAILS_GPB_H
diff --git a/cds/urcu/details/gpi.h b/cds/urcu/details/gpi.h
new file mode 100644 (file)
index 0000000..4d512b7
--- /dev/null
@@ -0,0 +1,158 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_DETAILS_GPI_H
+#define _CDS_URCU_DETAILS_GPI_H
+
+#include <cds/urcu/details/gp.h>
+#include <cds/backoff_strategy.h>
+#include <cds/lock/scoped_lock.h>
+
+#include <cds/details/std/mutex.h>
+
+namespace cds { namespace urcu {
+
+    /// User-space general-purpose RCU with immediate reclamation
+    /**
+        @headerfile cds/urcu/general_instant.h
+
+        This is simplest general-purpose RCU implementation. When a thread calls \ref retire_ptr function
+        the RCU \p synchronize function is called that waits until all reader/updater threads end up
+        their read-side critical sections, i.e. until the RCU quiescent state will come.
+        After that the retired object is freed immediately.
+        Thus, the implementation blocks for any retired object
+
+        There is a wrapper \ref cds_urcu_general_instant_gc "gc<general_instant>" for \p %general_instant class
+        that provides unified RCU interface. You should use this wrapper class instead \p %general_instant
+
+        Template arguments:
+        - \p Lock - mutex type, default is \p std::mutex
+        - \p Backoff - back-off schema, default is cds::backoff::Default
+    */
+    template <
+        class Lock = cds_std::mutex
+       ,class Backoff = cds::backoff::Default
+    >
+    class general_instant: public details::gp_singleton< general_instant_tag >
+    {
+        //@cond
+        typedef details::gp_singleton< general_instant_tag > base_class;
+        //@endcond
+
+    public:
+        typedef general_instant_tag rcu_tag ;   ///< RCU tag
+        typedef Lock    lock_type   ;           ///< Lock type
+        typedef Backoff back_off    ;           ///< Back-off schema type
+
+        typedef typename base_class::thread_gc  thread_gc ;   ///< Thread-side RCU part
+        typedef typename thread_gc::scoped_lock scoped_lock ; ///< Access lock class
+
+        static bool const c_bBuffered = false ; ///< This RCU does not buffer disposed elements
+
+    protected:
+        //@cond
+        typedef details::gp_singleton_instance< rcu_tag >    singleton_ptr;
+        //@endcond
+
+    protected:
+        //@cond
+        lock_type   m_Lock;
+        //@endcond
+
+    public:
+        /// Returns singleton instance
+        static general_instant * instance()
+        {
+            return static_cast<general_instant *>( base_class::instance() );
+        }
+
+        /// Checks if the singleton is created and ready to use
+        static bool isUsed()
+        {
+            return singleton_ptr::s_pRCU != null_ptr<singleton_vtbl *>();
+        }
+
+    protected:
+        //@cond
+        general_instant()
+        {}
+        ~general_instant()
+        {}
+
+        void flip_and_wait()
+        {
+            back_off bkoff;
+            base_class::flip_and_wait( bkoff );
+        }
+        //@endcond
+
+    public:
+        /// Creates singleton object
+        static void Construct()
+        {
+            if ( !singleton_ptr::s_pRCU )
+                singleton_ptr::s_pRCU = new general_instant();
+        }
+
+        /// Destroys singleton object
+        static void Destruct( bool bDetachAll = false )
+        {
+            if ( isUsed() ) {
+                if ( bDetachAll )
+                    instance()->m_ThreadList.detach_all();
+                delete instance();
+                singleton_ptr::s_pRCU = null_ptr<singleton_vtbl *>();
+            }
+        }
+
+    public:
+        /// Retires \p p pointer
+        /**
+            The method calls \ref synchronize to wait for the end of grace period
+            and calls \p p disposer.
+        */
+        virtual void retire_ptr( retired_ptr& p )
+        {
+            synchronize();
+            if ( p.m_p )
+                p.free();
+        }
+
+        /// Retires the pointer chain [\p itFirst, \p itLast)
+        template <typename ForwardIterator>
+        void batch_retire( ForwardIterator itFirst, ForwardIterator itLast )
+        {
+            if ( itFirst != itLast ) {
+                synchronize();
+                while ( itFirst != itLast ) {
+                    retired_ptr p( *itFirst );
+                    ++itFirst;
+                    if ( p.m_p )
+                        p.free();
+                }
+            }
+        }
+
+        /// Waits to finish a grace period
+        void synchronize()
+        {
+            CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_acquire );
+            {
+                cds::lock::scoped_lock<lock_type> sl( m_Lock );
+                flip_and_wait();
+                flip_and_wait();
+            }
+            CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_release );
+        }
+
+        //@cond
+        // Added for uniformity
+        size_t CDS_CONSTEXPR capacity() const
+        {
+            return 1;
+        }
+        //@endcond
+    };
+
+}} // namespace cds::urcu
+
+#endif // #ifndef _CDS_URCU_DETAILS_GPI_H
diff --git a/cds/urcu/details/gpt.h b/cds/urcu/details/gpt.h
new file mode 100644 (file)
index 0000000..427aa82
--- /dev/null
@@ -0,0 +1,225 @@
+//$$CDS-header$$1
+
+#ifndef _CDS_URCU_DETAILS_GPT_H
+#define _CDS_URCU_DETAILS_GPT_H
+
+#include <cds/urcu/details/gp.h>
+#include <cds/urcu/dispose_thread.h>
+#include <cds/backoff_strategy.h>
+#include <cds/container/vyukov_mpmc_cycle_queue.h>
+
+namespace cds { namespace urcu {
+
+    /// User-space general-purpose RCU with deferred threaded reclamation
+    /**
+        @headerfile cds/urcu/general_threaded.h
+
+        This implementation is similar to \ref general_buffered but separate thread is created
+        for deleting the retired objects. Like \p %general_buffered, the class contains an internal buffer
+        where retired objects are accumulated. When the buffer becomes full,
+        the RCU \p synchronize function is called that waits until all reader/updater threads end up their read-side critical sections,
+        i.e. until the RCU quiescent state will come. After that the "work ready" message is sent to reclamation tread.
+        The reclamation thread frees the buffer.
+        This synchronization cycle may be called in any thread that calls \ref retire_ptr function.
+
+        There is a wrapper \ref cds_urcu_general_threaded_gc "gc<general_threaded>" for \p %general_threaded class
+        that provides unified RCU interface. You should use this wrapper class instead \p %general_threaded
+
+        Template arguments:
+        - \p Buffer - buffer type with FIFO semantics. Default is cds::container::VyukovMPMCCycleQueue. See \ref general_buffered
+            for description of buffer's interface. The buffer contains the objects of \ref epoch_retired_ptr
+            type that contains additional \p m_nEpoch field. This field specifies an epoch when the object
+            has been placed into the buffer. The \p %general_threaded object has a global epoch counter
+            that is incremented on each \p synchronize call. The epoch is used internally to prevent early deletion.
+        - \p Lock - mutex type, default is \p std::mutex
+        - \p DisposerThread - the reclamation thread class. Default is \ref cds::urcu::dispose_thread,
+            see the description of this class for required interface.
+        - \p Backoff - back-off schema, default is cds::backoff::Default
+    */
+    template <
+        class Buffer = cds::container::VyukovMPMCCycleQueue<
+            epoch_retired_ptr
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< epoch_retired_ptr > >
+        >
+        ,class Lock = cds_std::mutex
+        ,class DisposerThread = dispose_thread<Buffer>
+        ,class Backoff = cds::backoff::Default
+    >
+    class general_threaded: public details::gp_singleton< general_threaded_tag >
+    {
+        //@cond
+        typedef details::gp_singleton< general_threaded_tag > base_class;
+        //@endcond
+    public:
+        typedef Buffer          buffer_type ;   ///< Buffer type
+        typedef Lock            lock_type   ;   ///< Lock type
+        typedef Backoff         back_off    ;   ///< Back-off scheme
+        typedef DisposerThread  disposer_thread ;   ///< Disposer thread type
+
+        typedef general_threaded_tag    rcu_tag ;       ///< Thread-side RCU part
+        typedef base_class::thread_gc   thread_gc ;     ///< Access lock class
+        typedef typename thread_gc::scoped_lock scoped_lock ; ///< Access lock class
+
+        static bool const c_bBuffered = true ; ///< This RCU buffers disposed elements
+
+    protected:
+        //@cond
+        typedef details::gp_singleton_instance< rcu_tag >    singleton_ptr;
+
+        struct scoped_disposer {
+            void operator ()( general_threaded * p )
+            {
+                delete p;
+            }
+        };
+        //@endcond
+
+    protected:
+        //@cond
+        buffer_type                     m_Buffer;
+        CDS_ATOMIC::atomic<uint64_t>    m_nCurEpoch;
+        lock_type                       m_Lock;
+        size_t const                    m_nCapacity;
+        disposer_thread                 m_DisposerThread;
+        //@endcond
+
+    public:
+        /// Returns singleton instance
+        static general_threaded * instance()
+        {
+            return static_cast<general_threaded *>( base_class::instance() );
+        }
+        /// Checks if the singleton is created and ready to use
+        static bool isUsed()
+        {
+            return singleton_ptr::s_pRCU != null_ptr<singleton_vtbl *>();
+        }
+
+    protected:
+        //@cond
+        general_threaded( size_t nBufferCapacity )
+            : m_Buffer( nBufferCapacity )
+            , m_nCurEpoch( 1 )
+            , m_nCapacity( nBufferCapacity )
+        {}
+
+        void flip_and_wait()
+        {
+            back_off bkoff;
+            base_class::flip_and_wait( bkoff );
+        }
+
+        // Return: true - synchronize has been called, false - otherwise
+        bool push_buffer( epoch_retired_ptr& p )
+        {
+            bool bPushed = m_Buffer.push( p );
+            if ( !bPushed || m_Buffer.size() >= capacity() ) {
+                synchronize();
+                if ( !bPushed )
+                    p.free();
+                return true;
+            }
+            return false;
+        }
+
+        //@endcond
+
+    public:
+        //@cond
+        ~general_threaded()
+        {}
+        //@endcond
+
+        /// Creates singleton object and starts reclamation thread
+        /**
+            The \p nBufferCapacity parameter defines RCU threshold.
+        */
+        static void Construct( size_t nBufferCapacity = 256 )
+        {
+            if ( !singleton_ptr::s_pRCU ) {
+                std::unique_ptr< general_threaded, scoped_disposer > pRCU( new general_threaded( nBufferCapacity ) );
+                pRCU->m_DisposerThread.start();
+
+                singleton_ptr::s_pRCU = pRCU.release();
+            }
+        }
+
+        /// Destroys singleton object and terminates internal reclamation thread
+        static void Destruct( bool bDetachAll = false )
+        {
+            if ( isUsed() ) {
+                general_threaded * pThis = instance();
+                if ( bDetachAll )
+                    pThis->m_ThreadList.detach_all();
+
+                pThis->m_DisposerThread.stop( pThis->m_Buffer, pThis->m_nCurEpoch.load( CDS_ATOMIC::memory_order_acquire ));
+
+                delete pThis;
+                singleton_ptr::s_pRCU = null_ptr<singleton_vtbl *>();
+            }
+        }
+
+    public:
+        /// Retires \p p pointer
+        /**
+            The method pushes \p p pointer to internal buffer.
+            When the buffer becomes full \ref synchronize function is called
+            to wait for the end of grace period and then
+            a message is sent to the reclamation thread.
+        */
+        virtual void retire_ptr( retired_ptr& p )
+        {
+            if ( p.m_p ) {
+                epoch_retired_ptr ep( p, m_nCurEpoch.load( CDS_ATOMIC::memory_order_acquire ) );
+                push_buffer( ep );
+            }
+        }
+
+        /// Retires the pointer chain [\p itFirst, \p itLast)
+        template <typename ForwardIterator>
+        void batch_retire( ForwardIterator itFirst, ForwardIterator itLast )
+        {
+            uint64_t nEpoch = m_nCurEpoch.load( CDS_ATOMIC::memory_order_relaxed );
+            while ( itFirst != itLast ) {
+                epoch_retired_ptr p( *itFirst, nEpoch );
+                ++itFirst;
+                push_buffer( p );
+            }
+        }
+
+        /// Waits to finish a grace period and calls disposing thread
+        void synchronize()
+        {
+            synchronize( false );
+        }
+
+        //@cond
+        void synchronize( bool bSync )
+        {
+            uint64_t nPrevEpoch = m_nCurEpoch.fetch_add( 1, CDS_ATOMIC::memory_order_release );
+
+            CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_acquire );
+            {
+                cds::lock::scoped_lock<lock_type> sl( m_Lock );
+                flip_and_wait();
+                flip_and_wait();
+
+                m_DisposerThread.dispose( m_Buffer, nPrevEpoch, bSync );
+            }
+            CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_release );
+        }
+        void force_dispose()
+        {
+            synchronize( true );
+        }
+        //@endcond
+
+        /// Returns the threshold of internal buffer
+        size_t capacity() const
+        {
+            return m_nCapacity;
+        }
+    };
+}} // namespace cds::urcu
+
+#endif // #ifndef _CDS_URCU_DETAILS_GPT_H
diff --git a/cds/urcu/details/sh.h b/cds/urcu/details/sh.h
new file mode 100644 (file)
index 0000000..4e752f8
--- /dev/null
@@ -0,0 +1,169 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_DETAILS_SH_H
+#define _CDS_URCU_DETAILS_SH_H
+
+#include <cds/urcu/details/sh_decl.h>
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#include <cds/threading/model.h>
+
+//@cond
+namespace cds { namespace urcu { namespace details {
+
+    // Inlines
+
+    // sh_thread_gc
+    template <typename RCUtag>
+    inline sh_thread_gc<RCUtag>::sh_thread_gc()
+    {
+        if ( !threading::Manager::isThreadAttached() )
+            cds::threading::Manager::attachThread();
+    }
+
+    template <typename RCUtag>
+    inline sh_thread_gc<RCUtag>::~sh_thread_gc()
+    {
+        cds::threading::Manager::detachThread();
+    }
+
+    template <typename RCUtag>
+    inline typename sh_thread_gc<RCUtag>::thread_record * sh_thread_gc<RCUtag>::get_thread_record()
+    {
+        return cds::threading::getRCU<RCUtag>();
+    }
+
+    template <typename RCUtag>
+    inline void sh_thread_gc<RCUtag>::access_lock()
+    {
+        thread_record * pRec = get_thread_record();
+        assert( pRec != null_ptr<thread_record *>());
+
+        uint32_t tmp = pRec->m_nAccessControl.load( CDS_ATOMIC::memory_order_relaxed );
+        if ( (tmp & rcu_class::c_nNestMask) == 0 ) {
+            pRec->m_nAccessControl.store(
+                sh_singleton<RCUtag>::instance()->global_control_word(CDS_ATOMIC::memory_order_acquire),
+                CDS_ATOMIC::memory_order_release
+            );
+        }
+        else {
+            pRec->m_nAccessControl.fetch_add( 1, CDS_ATOMIC::memory_order_release );
+        }
+        CDS_COMPILER_RW_BARRIER;
+    }
+
+    template <typename RCUtag>
+    inline void sh_thread_gc<RCUtag>::access_unlock()
+    {
+        thread_record * pRec = get_thread_record();
+        assert( pRec != null_ptr<thread_record *>());
+
+        CDS_COMPILER_RW_BARRIER;
+        pRec->m_nAccessControl.fetch_sub( 1, CDS_ATOMIC::memory_order_release );
+    }
+
+    template <typename RCUtag>
+    inline bool sh_thread_gc<RCUtag>::is_locked()
+    {
+        thread_record * pRec = get_thread_record();
+        assert( pRec != null_ptr<thread_record *>());
+
+        return (pRec->m_nAccessControl.load( CDS_ATOMIC::memory_order_relaxed ) & rcu_class::c_nNestMask) != 0;
+    }
+
+
+    // sh_singleton
+    template <typename RCUtag>
+    inline void sh_singleton<RCUtag>::set_signal_handler()
+    {
+        //TODO: OS-specific code must be moved to cds::OS namespace
+        struct sigaction sigact;
+        memset( &sigact, 0, sizeof(sigact));
+        sigact.sa_sigaction = signal_handler;
+        sigact.sa_flags = SA_SIGINFO;
+        sigemptyset( &sigact.sa_mask );
+        //sigaddset( &sigact.sa_mask, m_nSigNo );
+        sigaction( m_nSigNo, &sigact, null_ptr<struct sigaction *>() );
+
+        sigaddset( &sigact.sa_mask, m_nSigNo );
+        pthread_sigmask( SIG_UNBLOCK, &sigact.sa_mask, NULL );
+    }
+
+    template <typename RCUtag>
+    inline void sh_singleton<RCUtag>::clear_signal_handler()
+    {}
+
+    template <typename RCUtag>
+    void sh_singleton<RCUtag>::signal_handler( int signo, siginfo_t * sigInfo, void * context )
+    {
+        thread_record * pRec = cds::threading::getRCU<RCUtag>();
+        if ( pRec ) {
+            CDS_ATOMIC::atomic_signal_fence( CDS_ATOMIC::memory_order_acquire );
+            pRec->m_bNeedMemBar.store( false, CDS_ATOMIC::memory_order_relaxed );
+            CDS_ATOMIC::atomic_signal_fence( CDS_ATOMIC::memory_order_release );
+        }
+    }
+
+    template <typename RCUtag>
+    inline void sh_singleton<RCUtag>::raise_signal( cds::OS::ThreadId tid )
+    {
+        pthread_kill( tid, m_nSigNo );
+    }
+
+    template <typename RCUtag>
+    template <class Backoff>
+    inline void sh_singleton<RCUtag>::force_membar_all_threads( Backoff& bkOff )
+    {
+        OS::ThreadId const nullThreadId = OS::nullThreadId();
+
+        // Send "need membar" signal to all RCU threads
+        for ( thread_record * pRec = m_ThreadList.head( CDS_ATOMIC::memory_order_acquire); pRec; pRec = pRec->m_list.m_pNext ) {
+            OS::ThreadId tid = pRec->m_list.m_idOwner.load( CDS_ATOMIC::memory_order_acquire);
+            if ( tid != nullThreadId ) {
+                pRec->m_bNeedMemBar.store( true, CDS_ATOMIC::memory_order_release );
+                raise_signal( tid );
+            }
+        }
+
+        // Wait while all RCU threads process the signal
+        for ( thread_record * pRec = m_ThreadList.head( CDS_ATOMIC::memory_order_acquire); pRec; pRec = pRec->m_list.m_pNext ) {
+            OS::ThreadId tid = pRec->m_list.m_idOwner.load( CDS_ATOMIC::memory_order_acquire);
+            if ( tid != nullThreadId ) {
+                bkOff.reset();
+                while ( (tid = pRec->m_list.m_idOwner.load( CDS_ATOMIC::memory_order_acquire )) != nullThreadId
+                     && pRec->m_bNeedMemBar.load( CDS_ATOMIC::memory_order_acquire ))
+                {
+                    // Some versions of OSes can lose signals
+                    // So, we resend the signal
+                    raise_signal( tid );
+                    bkOff();
+                }
+            }
+        }
+    }
+
+    template <typename RCUtag>
+    bool sh_singleton<RCUtag>::check_grace_period( thread_record * pRec ) const
+    {
+        uint32_t const v = pRec->m_nAccessControl.load( CDS_ATOMIC::memory_order_acquire );
+        return (v & signal_handling_rcu::c_nNestMask)
+            && ((( v ^ m_nGlobalControl.load( CDS_ATOMIC::memory_order_relaxed )) & ~signal_handling_rcu::c_nNestMask ));
+    }
+
+    template <typename RCUtag>
+    template <class Backoff>
+    void sh_singleton<RCUtag>::wait_for_quiescent_state( Backoff& bkOff )
+    {
+        OS::ThreadId const nullThreadId = OS::nullThreadId();
+
+        for ( thread_record * pRec = m_ThreadList.head( CDS_ATOMIC::memory_order_acquire); pRec; pRec = pRec->m_list.m_pNext ) {
+            while ( pRec->m_list.m_idOwner.load( CDS_ATOMIC::memory_order_acquire) != nullThreadId && check_grace_period( pRec ))
+                bkOff();
+        }
+    }
+
+}}} // namespace cds:urcu::details
+//@endcond
+
+#endif // #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#endif // #ifndef _CDS_URCU_DETAILS_SH_H
diff --git a/cds/urcu/details/sh_decl.h b/cds/urcu/details/sh_decl.h
new file mode 100644 (file)
index 0000000..1386e60
--- /dev/null
@@ -0,0 +1,203 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_DETAILS_SH_DECL_H
+#define _CDS_URCU_DETAILS_SH_DECL_H
+
+#include <cds/urcu/details/base.h>
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#include <cds/details/static_functor.h>
+#include <cds/details/lib.h>
+
+#include <signal.h>
+
+//@cond
+namespace cds { namespace urcu { namespace details {
+
+    // We could derive thread_data from thread_list_record
+    // but in this case m_nAccessControl would have offset != 0
+    // that is not so efficiently
+#   define CDS_SHURCU_DECLARE_THREAD_DATA(tag_) \
+    template <> struct thread_data<tag_> { \
+        CDS_ATOMIC::atomic<uint32_t>        m_nAccessControl ; \
+        CDS_ATOMIC::atomic<bool>            m_bNeedMemBar    ; \
+        thread_list_record< thread_data >   m_list ; \
+        thread_data(): m_nAccessControl(0), m_bNeedMemBar(false) {} \
+        ~thread_data() {} \
+    }
+
+    CDS_SHURCU_DECLARE_THREAD_DATA( signal_buffered_tag );
+    CDS_SHURCU_DECLARE_THREAD_DATA( signal_threaded_tag );
+
+#   undef CDS_SHURCU_DECLARE_THREAD_DATA
+
+    template <typename RCUtag>
+    struct sh_singleton_instance
+    {
+        static CDS_EXPORT_API singleton_vtbl *     s_pRCU;
+    };
+#if CDS_COMPILER != CDS_COMPILER_MSVC
+    template<> CDS_EXPORT_API singleton_vtbl * sh_singleton_instance< signal_buffered_tag >::s_pRCU;
+    template<> CDS_EXPORT_API singleton_vtbl * sh_singleton_instance< signal_threaded_tag >::s_pRCU;
+#endif
+
+    template <typename SigRCUtag>
+    class sh_thread_gc
+    {
+    public:
+        typedef SigRCUtag                   rcu_tag;
+        typedef typename rcu_tag::rcu_class rcu_class;
+        typedef thread_data< rcu_tag >      thread_record;
+        typedef cds::urcu::details::scoped_lock< sh_thread_gc > scoped_lock;
+
+    protected:
+        static thread_record * get_thread_record();
+
+    public:
+        sh_thread_gc();
+        ~sh_thread_gc();
+    public:
+        static void access_lock();
+        static void access_unlock();
+        static bool is_locked();
+
+        /// Retire pointer \p by the disposer \p Disposer
+        template <typename Disposer, typename T>
+        static void retire( T * p )
+        {
+            retire( p, cds::details::static_functor<Disposer, T>::call );
+        }
+
+        /// Retire pointer \p by the disposer \p pFunc
+        template <typename T>
+        static void retire( T * p, void (* pFunc)(T *) )
+        {
+            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ) );
+            retire( rp );
+        }
+
+        /// Retire pointer \p
+        static void retire( retired_ptr& p )
+        {
+            assert( sh_singleton_instance< rcu_tag >::s_pRCU );
+            sh_singleton_instance< rcu_tag >::s_pRCU->retire_ptr( p );
+        }
+    };
+
+#   define CDS_SH_RCU_DECLARE_THREAD_GC( tag_ ) template <> class thread_gc<tag_>: public sh_thread_gc<tag_> {}
+
+    CDS_SH_RCU_DECLARE_THREAD_GC( signal_buffered_tag  );
+    CDS_SH_RCU_DECLARE_THREAD_GC( signal_threaded_tag );
+
+#   undef CDS_SH_RCU_DECLARE_THREAD_GC
+
+    template <class RCUtag>
+    class sh_singleton: public singleton_vtbl
+    {
+    public:
+        typedef RCUtag  rcu_tag;
+        typedef cds::urcu::details::thread_gc< rcu_tag >   thread_gc;
+
+    protected:
+        typedef typename thread_gc::thread_record   thread_record;
+        typedef sh_singleton_instance< rcu_tag >    rcu_instance;
+
+    protected:
+        CDS_ATOMIC::atomic<uint32_t>    m_nGlobalControl;
+        thread_list< rcu_tag >          m_ThreadList;
+        int const                       m_nSigNo;
+
+    protected:
+        sh_singleton( int nSignal )
+            : m_nGlobalControl(1)
+            , m_nSigNo( nSignal )
+        {
+            set_signal_handler();
+        }
+
+        ~sh_singleton()
+        {
+            clear_signal_handler();
+        }
+
+    public:
+        static sh_singleton * instance()
+        {
+            return static_cast< sh_singleton *>( rcu_instance::s_pRCU );
+        }
+
+        static bool isUsed()
+        {
+            return rcu_instance::s_pRCU != NULL;
+        }
+
+        int signal_no() const
+        {
+            return m_nSigNo;
+        }
+
+    public:
+        virtual void retire_ptr( retired_ptr& p ) = 0;
+
+    public: // thread_gc interface
+        thread_record * attach_thread()
+        {
+            return m_ThreadList.alloc();
+        }
+
+        void detach_thread( thread_record * pRec )
+        {
+            m_ThreadList.retire( pRec );
+        }
+
+        uint32_t global_control_word( CDS_ATOMIC::memory_order mo ) const
+        {
+            return m_nGlobalControl.load( mo );
+        }
+
+    protected:
+        void set_signal_handler();
+        void clear_signal_handler();
+        static void signal_handler( int signo, siginfo_t * sigInfo, void * context );
+        void raise_signal( cds::OS::ThreadId tid );
+
+        template <class Backoff>
+        void force_membar_all_threads( Backoff& bkOff );
+
+        void switch_next_epoch()
+        {
+            m_nGlobalControl.fetch_xor( rcu_tag::c_nControlBit, CDS_ATOMIC::memory_order_seq_cst );
+        }
+        bool check_grace_period( thread_record * pRec ) const;
+
+        template <class Backoff>
+        void wait_for_quiescent_state( Backoff& bkOff );
+    };
+
+#   define CDS_SIGRCU_DECLARE_SINGLETON( tag_ ) \
+    template <> class singleton< tag_ > { \
+    public: \
+        typedef tag_  rcu_tag ; \
+        typedef cds::urcu::details::thread_gc< rcu_tag >   thread_gc ; \
+    protected: \
+        typedef thread_gc::thread_record            thread_record ; \
+        typedef sh_singleton_instance< rcu_tag >    rcu_instance  ; \
+        typedef sh_singleton< rcu_tag >             rcu_singleton ; \
+    public: \
+        static bool isUsed() { return rcu_singleton::isUsed() ; } \
+        static rcu_singleton * instance() { assert( rcu_instance::s_pRCU ); return static_cast<rcu_singleton *>( rcu_instance::s_pRCU ); } \
+        static thread_record * attach_thread() { return instance()->attach_thread() ; } \
+        static void detach_thread( thread_record * pRec ) { return instance()->detach_thread( pRec ) ; } \
+        static uint32_t global_control_word( CDS_ATOMIC::memory_order mo ) { return instance()->global_control_word( mo ) ; } \
+    }
+
+    CDS_SIGRCU_DECLARE_SINGLETON( signal_buffered_tag  );
+    CDS_SIGRCU_DECLARE_SINGLETON( signal_threaded_tag );
+
+#   undef CDS_SIGRCU_DECLARE_SINGLETON
+
+}}} // namespace cds::urcu::details
+//@endcond
+
+#endif // #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#endif // #ifndef _CDS_URCU_DETAILS_SH_DECL_H
diff --git a/cds/urcu/details/sig_buffered.h b/cds/urcu/details/sig_buffered.h
new file mode 100644 (file)
index 0000000..4aa89f8
--- /dev/null
@@ -0,0 +1,235 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_DETAILS_SIG_BUFFERED_H
+#define _CDS_URCU_DETAILS_SIG_BUFFERED_H
+
+#include <cds/urcu/details/sh.h>
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+
+#include <cds/backoff_strategy.h>
+#include <cds/container/vyukov_mpmc_cycle_queue.h>
+
+#include <cds/details/std/mutex.h>
+
+namespace cds { namespace urcu {
+
+    /// User-space signal-handled RCU with deferred (buffered) reclamation
+    /**
+        @headerfile cds/urcu/signal_buffered.h
+
+        This URCU implementation contains an internal buffer where retired objects are
+        accumulated. When the buffer becomes full, the RCU \p synchronize function is called
+        that waits until all reader/updater threads end up their read-side critical sections,
+        i.e. until the RCU quiescent state will come. After that the buffer and all retired objects are freed.
+        This synchronization cycle may be called in any thread that calls \p retire_ptr function.
+
+        The \p Buffer contains items of \ref cds_urcu_retired_ptr "retired_ptr" type and it should support a queue interface with
+        three function:
+        - <tt> bool push( retired_ptr& p ) </tt> - places the retired pointer \p p into queue. If the function
+            returns \p false it means that the buffer is full and RCU synchronization cycle must be processed.
+        - <tt>bool pop( retired_ptr& p ) </tt> - pops queue's head item into \p p parameter; if the queue is empty
+            this function must return \p false
+        - <tt>size_t size()</tt> - returns queue's item count.
+
+        The buffer is considered as full if \p push returns \p false or the buffer size reaches the RCU threshold.
+
+        There is a wrapper \ref cds_urcu_signal_buffered_gc "gc<signal_buffered>" for \p %signal_buffered class
+        that provides unified RCU interface. You should use this wrapper class instead \p %signal_buffered
+
+        Template arguments:
+        - \p Buffer - buffer type. Default is cds::container::VyukovMPMCCycleQueue
+        - \p Lock - mutex type, default is \p std::mutex
+        - \p Backoff - back-off schema, default is cds::backoff::Default
+    */
+    template <
+        class Buffer = cds::container::VyukovMPMCCycleQueue<
+            epoch_retired_ptr
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< epoch_retired_ptr > >
+        >
+        ,class Lock = cds_std::mutex
+        ,class Backoff = cds::backoff::Default
+    >
+    class signal_buffered: public details::sh_singleton< signal_buffered_tag >
+    {
+        //@cond
+        typedef details::sh_singleton< signal_buffered_tag > base_class;
+        //@endcond
+    public:
+        typedef signal_buffered_tag rcu_tag ;  ///< RCU tag
+        typedef Buffer  buffer_type ;   ///< Buffer type
+        typedef Lock    lock_type   ;   ///< Lock type
+        typedef Backoff back_off    ;   ///< Back-off type
+
+        typedef base_class::thread_gc thread_gc ;   ///< Thread-side RCU part
+        typedef typename thread_gc::scoped_lock scoped_lock ; ///< Access lock class
+
+        static bool const c_bBuffered = true ; ///< This RCU buffers disposed elements
+
+    protected:
+        //@cond
+        typedef details::sh_singleton_instance< rcu_tag >    singleton_ptr;
+        //@endcond
+
+    protected:
+        //@cond
+        buffer_type                     m_Buffer;
+        CDS_ATOMIC::atomic<uint64_t>    m_nCurEpoch;
+        lock_type                       m_Lock;
+        size_t const                    m_nCapacity;
+        //@endcond
+
+    public:
+        /// Returns singleton instance
+        static signal_buffered * instance()
+        {
+            return static_cast<signal_buffered *>( base_class::instance() );
+        }
+        /// Checks if the singleton is created and ready to use
+        static bool isUsed()
+        {
+            return singleton_ptr::s_pRCU != null_ptr<singleton_vtbl *>();
+        }
+
+    protected:
+        //@cond
+        signal_buffered( size_t nBufferCapacity, int nSignal = SIGUSR1 )
+            : base_class( nSignal )
+            , m_Buffer( nBufferCapacity )
+            , m_nCurEpoch(0)
+            , m_nCapacity( nBufferCapacity )
+        {}
+
+        ~signal_buffered()
+        {
+            clear_buffer( (uint64_t) -1 );
+        }
+
+        void clear_buffer( uint64_t nEpoch )
+        {
+            epoch_retired_ptr p;
+            while ( m_Buffer.pop( p )) {
+                if ( p.m_nEpoch <= nEpoch )
+                    p.free();
+                else {
+                    push_buffer( p );
+                    break;
+                }
+            }
+        }
+
+        bool push_buffer( epoch_retired_ptr& ep )
+        {
+            bool bPushed = m_Buffer.push( ep );
+            if ( !bPushed || m_Buffer.size() >= capacity() ) {
+                synchronize();
+                if ( !bPushed )
+                    ep.free();
+                return true;
+            }
+            return false;
+        }
+        //@endcond
+
+    public:
+        /// Creates singleton object
+        /**
+            The \p nBufferCapacity parameter defines RCU threshold.
+
+            The \p nSignal parameter defines a signal number stated for RCU, default is \p SIGUSR1
+        */
+        static void Construct( size_t nBufferCapacity = 256, int nSignal = SIGUSR1 )
+        {
+            if ( !singleton_ptr::s_pRCU )
+                singleton_ptr::s_pRCU = new signal_buffered( nBufferCapacity, nSignal );
+        }
+
+        /// Destroys singleton object
+        static void Destruct( bool bDetachAll = false )
+        {
+            if ( isUsed() ) {
+                instance()->clear_buffer( (uint64_t) -1 );
+                if ( bDetachAll )
+                    instance()->m_ThreadList.detach_all();
+                delete instance();
+                singleton_ptr::s_pRCU = null_ptr<singleton_vtbl *>();
+            }
+        }
+
+    public:
+        /// Retire \p p pointer
+        /**
+            The method pushes \p p pointer to internal buffer.
+            When the buffer becomes full \ref synchronize function is called
+            to wait for the end of grace period and then to free all pointers from the buffer.
+        */
+        virtual void retire_ptr( retired_ptr& p )
+        {
+            if ( p.m_p ) {
+                epoch_retired_ptr ep( p, m_nCurEpoch.load( CDS_ATOMIC::memory_order_relaxed ));
+                push_buffer( ep );
+            }
+        }
+
+        /// Retires the pointer chain [\p itFirst, \p itLast)
+        template <typename ForwardIterator>
+        void batch_retire( ForwardIterator itFirst, ForwardIterator itLast )
+        {
+            uint64_t nEpoch = m_nCurEpoch.load( CDS_ATOMIC::memory_order_relaxed );
+            while ( itFirst != itLast ) {
+                epoch_retired_ptr ep( *itFirst, nEpoch );
+                ++itFirst;
+                push_buffer( ep );
+            }
+        }
+
+        /// Wait to finish a grace period and then clear the buffer
+        void synchronize()
+        {
+            epoch_retired_ptr ep( retired_ptr(), m_nCurEpoch.load( CDS_ATOMIC::memory_order_relaxed ));
+            synchronize( ep );
+        }
+
+        //@cond
+        bool synchronize( epoch_retired_ptr& ep )
+        {
+            uint64_t nEpoch;
+            CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_acquire );
+            {
+                cds::lock::scoped_lock<lock_type> sl( m_Lock );
+                if ( ep.m_p && m_Buffer.push( ep ) && m_Buffer.size() < capacity())
+                    return false;
+                nEpoch = m_nCurEpoch.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+
+                back_off bkOff;
+                base_class::force_membar_all_threads( bkOff );
+                base_class::switch_next_epoch();
+                bkOff.reset();
+                base_class::wait_for_quiescent_state( bkOff );
+                base_class::switch_next_epoch();
+                bkOff.reset();
+                base_class::wait_for_quiescent_state( bkOff );
+                base_class::force_membar_all_threads( bkOff );
+            }
+
+            clear_buffer( nEpoch );
+            return true;
+        }
+        //@endcond
+
+        /// Returns the threshold of internal buffer
+        size_t capacity() const
+        {
+            return m_nCapacity;
+        }
+
+        /// Returns the signal number stated for RCU
+        int signal_no() const
+        {
+            return base_class::signal_no();
+        }
+    };
+
+}} // namespace cds::urcu
+
+#endif // #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#endif // #ifndef _CDS_URCU_DETAILS_SIG_BUFFERED_H
diff --git a/cds/urcu/details/sig_threaded.h b/cds/urcu/details/sig_threaded.h
new file mode 100644 (file)
index 0000000..57da168
--- /dev/null
@@ -0,0 +1,238 @@
+//$$CDS-header$$1
+
+#ifndef _CDS_URCU_DETAILS_SIG_THREADED_H
+#define _CDS_URCU_DETAILS_SIG_THREADED_H
+
+#include <cds/urcu/details/sh.h>
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+
+#include <cds/urcu/dispose_thread.h>
+#include <cds/backoff_strategy.h>
+#include <cds/container/vyukov_mpmc_cycle_queue.h>
+
+namespace cds { namespace urcu {
+
+    /// User-space signal-handled RCU with deferred threaded reclamation
+    /**
+        @headerfile cds/urcu/signal_threaded.h
+
+        This implementation is similar to \ref signal_buffered but separate thread is created
+        for deleting the retired objects. Like \p %signal_buffered, the class contains an internal buffer
+        where retired objects are accumulated. When the buffer becomes full,
+        the RCU \p synchronize function is called that waits until all reader/updater threads end up their read-side critical sections,
+        i.e. until the RCU quiescent state will come. After that the "work ready" message is sent to reclamation thread.
+        The reclamation thread frees the buffer.
+        This synchronization cycle may be called in any thread that calls \ref retire_ptr function.
+
+        There is a wrapper \ref cds_urcu_signal_threaded_gc "gc<signal_threaded>" for \p %signal_threaded class
+        that provides unified RCU interface. You should use this wrapper class instead \p %signal_threaded
+
+        Template arguments:
+        - \p Buffer - buffer type with FIFO semantics. Default is cds::container::VyukovMPMCCycleQueue. See \ref signal_buffered
+            for description of buffer's interface. The buffer contains the objects of \ref epoch_retired_ptr
+            type that contains additional \p m_nEpoch field. This field specifies an epoch when the object
+            has been placed into the buffer. The \p %signal_threaded object has a global epoch counter
+            that is incremented on each \p synchronize call. The epoch is used internally to prevent early deletion.
+        - \p Lock - mutex type, default is \p std::mutex
+        - \p DisposerThread - the reclamation thread class. Default is \ref cds::urcu::dispose_thread,
+            see the description of this class for required interface.
+        - \p Backoff - back-off schema, default is cds::backoff::Default
+    */
+    template <
+        class Buffer = cds::container::VyukovMPMCCycleQueue<
+            epoch_retired_ptr
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< epoch_retired_ptr > >
+        >
+        ,class Lock = cds_std::mutex
+        ,class DisposerThread = dispose_thread<Buffer>
+        ,class Backoff = cds::backoff::Default
+    >
+    class signal_threaded: public details::sh_singleton< signal_threaded_tag >
+    {
+        //@cond
+        typedef details::sh_singleton< signal_threaded_tag > base_class;
+        //@endcond
+    public:
+        typedef Buffer          buffer_type ;   ///< Buffer type
+        typedef Lock            lock_type   ;   ///< Lock type
+        typedef Backoff         back_off    ;   ///< Back-off scheme
+        typedef DisposerThread  disposer_thread ;   ///< Disposer thread type
+
+        typedef signal_threaded_tag     rcu_tag ;       ///< Thread-side RCU part
+        typedef base_class::thread_gc   thread_gc ;     ///< Access lock class
+        typedef typename thread_gc::scoped_lock scoped_lock ; ///< Access lock class
+
+        static bool const c_bBuffered = true ; ///< This RCU buffers disposed elements
+
+    protected:
+        //@cond
+        typedef details::sh_singleton_instance< rcu_tag >    singleton_ptr;
+
+        struct scoped_disposer {
+            void operator ()( signal_threaded * p )
+            {
+                delete p;
+            }
+        };
+        //@endcond
+
+    protected:
+        //@cond
+        buffer_type                     m_Buffer;
+        CDS_ATOMIC::atomic<uint64_t>    m_nCurEpoch;
+        lock_type                       m_Lock;
+        size_t const                    m_nCapacity;
+        disposer_thread                 m_DisposerThread;
+        //@endcond
+
+    public:
+        /// Returns singleton instance
+        static signal_threaded * instance()
+        {
+            return static_cast<signal_threaded *>( base_class::instance() );
+        }
+        /// Checks if the singleton is created and ready to use
+        static bool isUsed()
+        {
+            return singleton_ptr::s_pRCU != null_ptr<singleton_vtbl *>();
+        }
+
+    protected:
+        //@cond
+        signal_threaded( size_t nBufferCapacity, int nSignal = SIGUSR1 )
+            : base_class( nSignal )
+            , m_Buffer( nBufferCapacity )
+            , m_nCurEpoch( 1 )
+            , m_nCapacity( nBufferCapacity )
+        {}
+
+        // Return: true - synchronize has been called, false - otherwise
+        bool push_buffer( epoch_retired_ptr& p )
+        {
+            bool bPushed = m_Buffer.push( p );
+            if ( !bPushed || m_Buffer.size() >= capacity() ) {
+                synchronize();
+                if ( !bPushed )
+                    p.free();
+                return true;
+            }
+            return false;
+        }
+
+        //@endcond
+
+    public:
+        //@cond
+        ~signal_threaded()
+        {}
+        //@endcond
+
+        /// Creates singleton object and starts reclamation thread
+        /**
+            The \p nBufferCapacity parameter defines RCU threshold.
+
+            The \p nSignal parameter defines a signal number stated for RCU, default is \p SIGUSR1
+        */
+        static void Construct( size_t nBufferCapacity = 256, int nSignal = SIGUSR1 )
+        {
+            if ( !singleton_ptr::s_pRCU ) {
+                std::unique_ptr< signal_threaded, scoped_disposer > pRCU( new signal_threaded( nBufferCapacity, nSignal ) );
+                pRCU->m_DisposerThread.start();
+
+                singleton_ptr::s_pRCU = pRCU.release();
+            }
+        }
+
+        /// Destroys singleton object and terminates internal reclamation thread
+        static void Destruct( bool bDetachAll = false )
+        {
+            if ( isUsed() ) {
+                signal_threaded * pThis = instance();
+                if ( bDetachAll )
+                    pThis->m_ThreadList.detach_all();
+
+                pThis->m_DisposerThread.stop( pThis->m_Buffer, pThis->m_nCurEpoch.load( CDS_ATOMIC::memory_order_acquire ));
+
+                delete pThis;
+                singleton_ptr::s_pRCU = null_ptr<singleton_vtbl *>();
+            }
+        }
+
+    public:
+        /// Retires \p p pointer
+        /**
+            The method pushes \p p pointer to internal buffer.
+            When the buffer becomes full \ref synchronize function is called
+            to wait for the end of grace period and then
+            a message is sent to the reclamation thread.
+        */
+        virtual void retire_ptr( retired_ptr& p )
+        {
+            if ( p.m_p ) {
+                epoch_retired_ptr ep( p, m_nCurEpoch.load( CDS_ATOMIC::memory_order_acquire ) );
+                push_buffer( ep );
+            }
+        }
+
+        /// Retires the pointer chain [\p itFirst, \p itLast)
+        template <typename ForwardIterator>
+        void batch_retire( ForwardIterator itFirst, ForwardIterator itLast )
+        {
+            uint64_t nEpoch = m_nCurEpoch.load( CDS_ATOMIC::memory_order_relaxed );
+            while ( itFirst != itLast ) {
+                epoch_retired_ptr p( *itFirst, nEpoch );
+                ++itFirst;
+                push_buffer( p );
+            }
+        }
+
+        /// Waits to finish a grace period and calls disposing thread
+        void synchronize()
+        {
+            synchronize( false );
+        }
+
+        //@cond
+        void synchronize( bool bSync )
+        {
+            uint64_t nPrevEpoch = m_nCurEpoch.fetch_add( 1, CDS_ATOMIC::memory_order_release );
+
+            CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_acquire );
+            {
+                cds::lock::scoped_lock<lock_type> sl( m_Lock );
+
+                back_off bkOff;
+                base_class::force_membar_all_threads( bkOff );
+                base_class::switch_next_epoch();
+                bkOff.reset();
+                base_class::wait_for_quiescent_state( bkOff );
+                base_class::switch_next_epoch();
+                bkOff.reset();
+                base_class::wait_for_quiescent_state( bkOff );
+                base_class::force_membar_all_threads( bkOff );
+
+                m_DisposerThread.dispose( m_Buffer, nPrevEpoch, bSync );
+            }
+        }
+        void force_dispose()
+        {
+            synchronize( true );
+        }
+        //@endcond
+
+        /// Returns the threshold of internal buffer
+        size_t capacity() const
+        {
+            return m_nCapacity;
+        }
+
+        /// Returns the signal number stated for RCU
+        int signal_no() const
+        {
+            return base_class::signal_no();
+        }
+    };
+}} // namespace cds::urcu
+
+#endif // #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#endif // #ifndef _CDS_URCU_DETAILS_SIG_THREADED_H
diff --git a/cds/urcu/dispose_thread.h b/cds/urcu/dispose_thread.h
new file mode 100644 (file)
index 0000000..25c73af
--- /dev/null
@@ -0,0 +1,199 @@
+//$$CDS-header$$1
+
+#ifndef _CDS_URCU_DISPOSE_THREAD_H
+#define _CDS_URCU_DISPOSE_THREAD_H
+
+//#include <cds/backoff_strategy.h>
+#include <cds/details/std/thread.h>
+#include <cds/details/std/mutex.h>
+#include <cds/details/std/condition_variable.h>
+#include <cds/details/std/memory.h>     // unique_ptr
+#include <cds/details/aligned_type.h>
+
+namespace cds { namespace urcu {
+
+    /// Reclamation thread for \p general_threaded and \p signal_threaded URCU
+    /**
+        The object of this class contains a reclamation thread object and
+        necessary synchronization object(s). The object manages reclamation thread
+        and defines a set of messages (i.e. methods) to communicate with the thread.
+
+        Template argument \p Buffer defines the buffer type of \ref general_threaded (or \ref signal_threaded) URCU.
+    */
+    template <class Buffer>
+    class dispose_thread
+    {
+    public:
+        typedef Buffer  buffer_type ;   ///< Buffer type
+    private:
+        //@cond
+        typedef cds_std::thread                     thread_type;
+        typedef cds_std::mutex                      mutex_type;
+        typedef cds_std::condition_variable         condvar_type;
+        typedef cds_std::unique_lock< mutex_type >  unique_lock;
+
+        class dispose_thread_starter: public thread_type
+        {
+            static void thread_func( dispose_thread * pThis )
+            {
+                pThis->execute();
+            }
+
+        public:
+            dispose_thread_starter( dispose_thread * pThis )
+                : thread_type( thread_func, pThis )
+            {}
+        };
+
+        typedef char thread_placeholder[ sizeof(dispose_thread_starter) ];
+        typename cds::details::aligned_type< thread_placeholder, alignof( dispose_thread_starter ) >::type  m_threadPlaceholder;
+        dispose_thread_starter *                m_DisposeThread;
+
+        // synchronization with disposing thread
+        mutex_type      m_Mutex;
+        condvar_type    m_cvDataReady;
+
+        // Task for thread (dispose cycle)
+        buffer_type * volatile  m_pBuffer;
+        uint64_t volatile       m_nCurEpoch;
+
+        // Quit flag
+        bool volatile           m_bQuit;
+
+        // disposing pass sync
+        condvar_type            m_cvReady;
+        bool volatile           m_bReady;
+        //@endcond
+
+    private: // methods called from disposing thread
+        //@cond
+        void execute()
+        {
+            buffer_type *   pBuffer;
+            uint64_t        nCurEpoch;
+            bool            bQuit = false;
+
+            while ( !bQuit ) {
+                {
+                    unique_lock lock( m_Mutex );
+
+                    // signal that we are ready to dispose
+                    m_bReady = true;
+                    m_cvReady.notify_one();
+
+                    // wait new data portion
+                    while ( !m_pBuffer )
+                        m_cvDataReady.wait( lock );
+
+                    // New work is ready
+                    m_bReady = false ;   // we are busy
+
+                    bQuit = m_bQuit;
+                    nCurEpoch = m_nCurEpoch;
+                    pBuffer = m_pBuffer;
+                    m_pBuffer = null_ptr<buffer_type *>();
+                }
+
+                if ( pBuffer )
+                    dispose_buffer( pBuffer, nCurEpoch );
+            }
+        }
+
+        void dispose_buffer( buffer_type * pBuf, uint64_t nCurEpoch )
+        {
+            epoch_retired_ptr p;
+            while ( pBuf->pop( p ) ) {
+                if ( p.m_nEpoch <= nCurEpoch )
+                    p.free();
+                else {
+                    pBuf->push( p );
+                    break;
+                }
+            }
+        }
+        //@endcond
+
+    public:
+        //@cond
+        dispose_thread()
+            : m_pBuffer( null_ptr<buffer_type *>() )
+            , m_nCurEpoch(0)
+            , m_bQuit( false )
+            , m_bReady( false )
+        {}
+        //@endcond
+
+    public: // methods called from any thread
+        /// Start reclamation thread
+        /**
+            This function is called by \ref general_threaded object to start
+            internal reclamation thread.
+        */
+        void start()
+        {
+            m_DisposeThread = new (m_threadPlaceholder) dispose_thread_starter( this );
+        }
+
+        /// Stop reclamation thread
+        /**
+            This function is called by \ref general_threaded object to
+            start reclamation cycle and then to terminate reclamation thread.
+
+            \p buf buffer contains retired objects ready to free.
+        */
+        void stop( buffer_type& buf, uint64_t nCurEpoch )
+        {
+            {
+                unique_lock lock( m_Mutex );
+
+                // wait while retiring pass done
+                while ( !m_bReady )
+                    m_cvReady.wait( lock );
+
+                // give a new work and set stop flag
+                m_pBuffer = &buf;
+                m_nCurEpoch = nCurEpoch;
+                m_bQuit = true;
+            }
+            m_cvDataReady.notify_one();
+
+            m_DisposeThread->join();
+        }
+
+        /// Start reclamation cycle
+        /**
+            This function is called by \ref general_threaded object
+            to notify the reclamation thread about new work.
+            \p buf buffer contains retired objects ready to free.
+            The reclamation thread should free all \p buf objects
+            \p m_nEpoch field of which is no more than \p nCurEpoch.
+
+            If \p bSync parameter is \p true the calling thread should
+            wait until disposing done.
+        */
+        void dispose( buffer_type& buf, uint64_t nCurEpoch, bool bSync )
+        {
+            unique_lock lock( m_Mutex );
+
+            // wait while disposing pass done
+            while ( !m_bReady )
+                m_cvReady.wait( lock );
+
+            if ( bSync )
+                m_bReady = false;
+
+            // new work
+            m_nCurEpoch = nCurEpoch;
+            m_pBuffer = &buf;
+
+            m_cvDataReady.notify_one();
+
+            if ( bSync ) {
+                while ( !m_bReady )
+                    m_cvReady.wait( lock );
+            }
+        }
+    };
+}} // namespace cds::urcu
+
+#endif // #ifdef _CDS_URCU_DISPOSE_THREAD_H
diff --git a/cds/urcu/exempt_ptr.h b/cds/urcu/exempt_ptr.h
new file mode 100644 (file)
index 0000000..3b4eed3
--- /dev/null
@@ -0,0 +1,216 @@
+//$$CDS-header$$
+
+#ifndef __CDS_URCU_EXEMPT_PTR_H
+#define __CDS_URCU_EXEMPT_PTR_H
+
+#include <cds/details/defs.h>
+
+namespace cds { namespace urcu {
+
+    //@cond
+    namespace details {
+        template <typename Node, typename Value>
+        struct conventional_exempt_member_cast
+        {
+            Value * operator()( Node * p ) const
+            {
+                return &p->m_Value;
+            }
+        };
+
+        template <typename Node, typename Value>
+        struct conventional_exempt_pair_cast
+        {
+            Value * operator()( Node * p ) const
+            {
+                return &p->m_Data;
+            }
+        };
+    } // namespace details
+    //@endcond
+
+    /// Exempt pointer for RCU
+    /**
+        This special pointer class is intended for returning extracted node from RCU-based container.
+        The destructor (and \p release() member function) invokes <tt>RCU::retire_ptr< Disposer >()</tt> function to dispose the node.
+        For non-intrusive containers from \p cds::container namespace \p Disposer is an invocation
+        of node deallocator. For intrusive containers the disposer can be empty or it can trigger an event "node can be reused safely".
+        In any case, the exempt pointer concept keeps RCU semantics.
+
+        You don't need use this helper class directly. Any RCU-based container defines a proper typedef for this template.
+
+        Template arguments:
+        - \p RCU - one of \ref cds_urcu_gc "RCU type"
+        - \p NodeType - container's node type
+        - \p ValueType - value type stored in container's node. For intrusive containers it is the same as \p NodeType
+        - \p Disposer - a disposer functor
+        - \p Cast - a functor for casting from \p NodeType to \p ValueType. Usually, for intrusive containers \p Cast may be \p void.
+    */
+    template <
+        class RCU,
+        typename NodeType,
+        typename ValueType,
+        typename Disposer,
+#ifdef CDS_DOXYGEN_INVOKED
+        typename Cast
+#else
+        typename Cast=details::conventional_exempt_member_cast<NodeType, ValueType>
+#endif
+    >
+    class exempt_ptr
+    {
+        //TODO: use move semantics and explicit operator bool!
+    public:
+        typedef RCU         rcu         ;   ///< RCU type - one of <tt>cds::urcu::gc< ... ></tt>
+        typedef NodeType    node_type   ;   ///< Node type
+        typedef ValueType   value_type  ;   ///< Value type
+        typedef Disposer    disposer    ;   ///< Disposer calling when release
+        typedef Cast        node_to_value_cast  ;   ///< Functor converting \p node_type to \p value_type
+
+    private:
+        //@cond
+        node_type *     m_pNode;
+        //@endcond
+
+    private:
+        //@cond
+        // No copy-constructible
+        exempt_ptr( exempt_ptr const& );
+        exempt_ptr& operator=( exempt_ptr const& );
+        //@endcond
+
+    public:
+        /// Constructs empty pointer
+        exempt_ptr() CDS_NOEXCEPT
+            : m_pNode( null_ptr<node_type *>())
+        {}
+
+        /// Releases the pointer
+        ~exempt_ptr()
+        {
+            release();
+        }
+
+        /// Checks if the pointer is \p NULL
+        bool empty() const CDS_NOEXCEPT
+        {
+            return m_pNode == null_ptr<node_type *>();
+        }
+
+        /// Dereference operator
+        value_type * operator->() const CDS_NOEXCEPT
+        {
+            return !empty() ? node_to_value_cast()( m_pNode ) : null_ptr<value_type *>();
+        }
+
+        /// Returns a reference to the value
+        value_type& operator *() CDS_NOEXCEPT
+        {
+            assert( !empty());
+            return *node_to_value_cast()( m_pNode );
+        }
+
+        //@cond
+        /// Assignment operator, the object should be empty. For internal use only
+        exempt_ptr& operator =( node_type * pNode )
+        {
+            // release() cannot be called in this point since RCU should be locked
+            assert( empty() );
+            assert( rcu::is_locked() );
+            m_pNode = pNode;
+            return *this;
+        }
+        //@endcond
+
+        /// Disposes the pointer. Should be called only outside of RCU critical section
+        void release()
+        {
+            assert( !rcu::is_locked() );
+            if ( !empty() ) {
+                rcu::template retire_ptr<disposer>( m_pNode );
+                m_pNode = null_ptr<node_type *>();
+            }
+        }
+    };
+
+    //@cond
+    // Intrusive container specialization
+    template <
+        class RCU,
+            typename NodeType,
+            typename Disposer
+    >
+    class exempt_ptr< RCU, NodeType, NodeType, Disposer, void >
+    {
+        //TODO: use move semantics and explicit operator bool!
+    public:
+        typedef RCU         rcu         ;   ///< RCU type - one of <tt>cds::urcu::gc< ... ></tt>
+        typedef NodeType    node_type   ;   ///< Node type
+        typedef NodeType    value_type  ;   ///< Node type
+        typedef Disposer    disposer    ;   ///< Disposer calling when release
+        typedef void        node_to_value_cast; ///< No casting is needed
+
+    private:
+        node_type *     m_pNode;
+
+    private:
+        // No copy-constructible
+        exempt_ptr( exempt_ptr const& );
+        exempt_ptr& operator=( exempt_ptr const& );
+
+    public:
+        /// Constructs empty pointer
+        exempt_ptr() CDS_NOEXCEPT
+            : m_pNode( null_ptr<node_type *>())
+        {}
+
+        /// Releases the pointer
+        ~exempt_ptr()
+        {
+            release();
+        }
+
+        /// Checks if the pointer is \p NULL
+        bool empty() const CDS_NOEXCEPT
+        {
+            return m_pNode == null_ptr<node_type *>();
+        }
+
+        /// Dereference operator.
+        value_type * operator->() const CDS_NOEXCEPT
+        {
+            return !empty() ? m_pNode : null_ptr<value_type *>();
+        }
+
+        /// Returns a reference to the value
+        value_type& operator *() CDS_NOEXCEPT
+        {
+            assert( !empty());
+            return *m_pNode;
+        }
+
+        /// Assignment operator, the object should be empty. For internal use only
+        exempt_ptr& operator =( node_type * pNode )
+        {
+            // release() cannot be called in this point since RCU should be locked
+            assert( empty() );
+            assert( rcu::is_locked() );
+            m_pNode = pNode;
+            return *this;
+        }
+
+        /// Disposes the pointer. Should be called only outside of RCU critical section
+        void release()
+        {
+            assert( !rcu::is_locked() );
+            if ( !empty() ) {
+                rcu::template retire_ptr<disposer>( m_pNode );
+                m_pNode = null_ptr<node_type *>();
+            }
+        }
+    };
+    //@endcond
+
+}} // namespace cds::urcu
+
+#endif //#ifndef __CDS_URCU_EXEMPT_PTR_H
diff --git a/cds/urcu/general_buffered.h b/cds/urcu/general_buffered.h
new file mode 100644 (file)
index 0000000..a68dfce
--- /dev/null
@@ -0,0 +1,153 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_GENERAL_BUFFERED_H
+#define _CDS_URCU_GENERAL_BUFFERED_H
+
+#include <cds/urcu/details/gpb.h>
+
+namespace cds { namespace urcu {
+
+    /// User-space general-purpose RCU with deferred buffered reclamation
+    /** @anchor cds_urcu_general_buffered_gc
+
+        This is a wrapper around general_buffered class used for metaprogramming.
+
+        Template arguments:
+        - \p Buffer - lock-free queue or lock-free bounded queue.
+            Default is cds::container::VyukovMPMCCycleQueue< retired_ptr >
+        - \p Lock - mutex type, default is \p std::mutex
+        - \p Backoff - back-off schema, default is cds::backoff::Default
+    */
+    template <
+#ifdef CDS_DOXGEN_INVOKED
+        class Buffer = cds::container::VyukovMPMCCycleQueue<
+            retired_ptr
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< retired_ptr > >
+        >
+        ,class Lock = cds_std::mutex
+        ,class Backoff = cds::backoff::Default
+#else
+        class Buffer
+       ,class Lock
+       ,class Backoff
+#endif
+    >
+    class gc< general_buffered< Buffer, Lock, Backoff > >: public details::gc_common
+    {
+    public:
+        typedef general_buffered< Buffer, Lock, Backoff >  rcu_implementation   ;    ///< Wrapped URCU implementation
+
+        typedef typename rcu_implementation::rcu_tag     rcu_tag     ;   ///< URCU tag
+        typedef typename rcu_implementation::thread_gc   thread_gc   ;   ///< Thread-side RCU part
+        typedef typename rcu_implementation::scoped_lock scoped_lock ;   ///< Access lock class
+
+        using details::gc_common::atomic_marked_ptr;
+
+    public:
+        /// Creates URCU \p %general_buffered singleton.
+        gc( size_t nBufferCapacity = 256 )
+        {
+            rcu_implementation::Construct( nBufferCapacity );
+        }
+
+        /// Destroys URCU \p %general_instant singleton
+        ~gc()
+        {
+            rcu_implementation::Destruct( true );
+        }
+
+    public:
+        /// Waits to finish a grace period and clears the buffer
+        /**
+            After grace period finished the function frees all retired pointer
+            from internal buffer.
+        */
+        static void synchronize()
+        {
+            rcu_implementation::instance()->synchronize();
+        }
+
+        /// Places retired pointer <\p p, \p pFunc> to internal buffer
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        template <typename T>
+        static void retire_ptr( T * p, void (* pFunc)(T *) )
+        {
+            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ) );
+            retire_ptr( rp );
+        }
+
+        /// Places retired pointer \p p with \p Disposer to internal buffer
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        template <typename Disposer, typename T>
+        static void retire_ptr( T * p )
+        {
+            retire_ptr( p, cds::details::static_functor<Disposer, T>::call );
+        }
+
+        /// Places retired pointer \p p to internal buffer
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        static void retire_ptr( retired_ptr& p )
+        {
+            rcu_implementation::instance()->retire_ptr(p);
+        }
+
+        /// Frees chain [ \p itFirst, \p itLast) in one synchronization cycle
+        template <typename ForwardIterator>
+        static void batch_retire( ForwardIterator itFirst, ForwardIterator itLast )
+        {
+            rcu_implementation::instance()->batch_retire( itFirst, itLast );
+        }
+
+         /// Acquires access lock (so called RCU reader-side lock)
+        /**
+            For safety reasons, it is better to use \ref scoped_lock class for locking/unlocking
+        */
+        static void access_lock()
+        {
+            thread_gc::access_lock();
+        }
+
+        /// Releases access lock (so called RCU reader-side lock)
+        /**
+            For safety reasons, it is better to use \ref scoped_lock class for locking/unlocking
+        */
+        static void access_unlock()
+        {
+            thread_gc::access_unlock();
+        }
+
+        /// Returns the threshold of internal buffer
+        static size_t capacity()
+        {
+            return rcu_implementation::instance()->capacity();
+        }
+
+        /// Checks if the thread is inside read-side critical section (i.e. the lock is acquired)
+        /**
+            Usually, this function is used internally to be convinced
+            that subsequent remove action is not lead to a deadlock.
+        */
+        static bool is_locked()
+        {
+            return thread_gc::is_locked();
+        }
+
+        /// Forces retired object removal
+        /**
+            This function calls \ref synchronize
+        */
+        static void force_dispose()
+        {
+            synchronize();
+        }
+    };
+
+}} // namespace cds::urcu
+
+#endif // #ifndef _CDS_URCU_GENERAL_BUFFERED_H
diff --git a/cds/urcu/general_instant.h b/cds/urcu/general_instant.h
new file mode 100644 (file)
index 0000000..49f5cec
--- /dev/null
@@ -0,0 +1,138 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_GENERAL_INSTANT_H
+#define _CDS_URCU_GENERAL_INSTANT_H
+
+#include <cds/urcu/details/gpi.h>
+
+namespace cds { namespace urcu {
+
+    /// User-space general-purpose RCU with immediate reclamation
+    /** @anchor cds_urcu_general_instant_gc
+
+        This is a wrapper around general_instant class used for metaprogramming.
+
+        Template arguments:
+        - \p Lock - mutex type, default is \p std::mutex
+        - \p Backoff - back-off schema, default is cds::backoff::Default
+    */
+    template <
+#ifdef CDS_DOXGEN_INVOKED
+        class Lock = cds_std::mutex
+       ,class Backoff = cds::backoff::Default
+#else
+        class Lock
+       ,class Backoff
+#endif
+    >
+    class gc< general_instant< Lock, Backoff > >: public details::gc_common
+    {
+    public:
+        typedef general_instant< Lock, Backoff >        rcu_implementation   ;   ///< Wrapped URCU implementation
+
+        typedef typename rcu_implementation::rcu_tag     rcu_tag     ;   ///< URCU tag
+        typedef typename rcu_implementation::thread_gc   thread_gc   ;   ///< Thread-side RCU part
+        typedef typename rcu_implementation::scoped_lock scoped_lock ;   ///< Access lock class
+
+        using details::gc_common::atomic_marked_ptr;
+
+    public:
+        /// Creates URCU \p %general_instant singleton
+        gc()
+        {
+            rcu_implementation::Construct();
+        }
+
+        /// Destroys URCU \p %general_instant singleton
+        ~gc()
+        {
+            rcu_implementation::Destruct( true );
+        }
+
+    public:
+        /// Waits to finish a grace period
+        static void synchronize()
+        {
+            rcu_implementation::instance()->synchronize();
+        }
+
+        /// Frees the pointer \p p invoking \p pFunc after end of grace period
+        /**
+            The function calls \ref synchronize to wait for end of grace period
+            and then evaluates disposing expression <tt>pFunc( p )</tt>
+        */
+        template <typename T>
+        static void retire_ptr( T * p, void (* pFunc)(T *) )
+        {
+            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ) );
+            retire_ptr( rp );
+        }
+
+        /// Frees the pointer \p using \p Disposer after end of grace period
+        /**
+            The function calls \ref synchronize to wait for end of grace period
+            and then evaluates disposing expression <tt>Disposer()( p )</tt>
+        */
+        template <typename Disposer, typename T>
+        static void retire_ptr( T * p )
+        {
+            retire_ptr( p, cds::details::static_functor<Disposer, T>::call );
+        }
+
+        /// Frees the pointer \p after the end of grace period
+        /**
+            The function calls \ref synchronize to wait for end of grace period
+            and then evaluates disposing expression <tt>p.m_funcFree( p.m_p )</tt>
+        */
+        static void retire_ptr( retired_ptr& p )
+        {
+            rcu_implementation::instance()->retire_ptr(p);
+        }
+
+        /// Frees chain [ \p itFirst, \p itLast) in one synchronization cycle
+        template <typename ForwardIterator>
+        static void batch_retire( ForwardIterator itFirst, ForwardIterator itLast )
+        {
+            rcu_implementation::instance()->batch_retire( itFirst, itLast );
+        }
+
+        /// Acquires access lock (so called RCU reader-side lock)
+        /**
+            For safety reasons, it is better to use \ref scoped_lock class for locking/unlocking
+        */
+        static void access_lock()
+        {
+            thread_gc::access_lock();
+        }
+
+        /// Releases access lock (so called RCU reader-side lock)
+        /**
+            For safety reasons, it is better to use \ref scoped_lock class for locking/unlocking
+        */
+        static void access_unlock()
+        {
+            thread_gc::access_unlock();
+        }
+
+        /// Checks if the thread is inside read-side critical section (i.e. the lock is acquired)
+        /**
+            Usually, this function is used internally to be convinced
+            that subsequent remove action is not lead to a deadlock.
+        */
+        static bool is_locked()
+        {
+            return thread_gc::is_locked();
+        }
+
+        /// Forced GC cycle call.
+        /**
+            This method does nothing and is introduced only for uniformity with other
+            garbage collectors.
+        */
+        static void force_dispose()
+        {}
+    };
+
+}} // namespace cds::urcu
+
+#endif // #ifndef _CDS_URCU_GENERAL_INSTANT_H
diff --git a/cds/urcu/general_threaded.h b/cds/urcu/general_threaded.h
new file mode 100644 (file)
index 0000000..324017f
--- /dev/null
@@ -0,0 +1,160 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_GENERAL_THREADED_H
+#define _CDS_URCU_GENERAL_THREADED_H
+
+#include <cds/urcu/details/gpt.h>
+
+namespace cds { namespace urcu {
+
+    /// User-space general-purpose RCU with special thread for deferred reclamation
+    /** @anchor cds_urcu_general_threaded_gc
+
+        This is a wrapper around general_threaded class used for metaprogramming.
+
+        Template arguments:
+        - \p Buffer - lock-free queue or lock-free bounded queue.
+            Default is cds::container::VyukovMPMCCycleQueue< retired_ptr >
+        - \p Lock - mutex type, default is \p std::mutex
+        - \p DisposerThread - reclamation thread class, default is \p cds::urcu::dispose_thread
+            See \ref cds::urcu::dispose_thread for class interface.
+        - \p Backoff - back-off schema, default is cds::backoff::Default
+
+    */
+    template <
+#ifdef CDS_DOXGEN_INVOKED
+        class Buffer = cds::container::VyukovMPMCCycleQueue<
+            epoch_retired_ptr
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< epoch_retired_ptr > >
+        >
+        ,class Lock = cds_std::mutex
+        ,class DisposerThread = dispose_thread<Buffer>
+        ,class Backoff = cds::backoff::Default
+#else
+        class Buffer
+       ,class Lock
+       ,class DisposerThread
+       ,class Backoff
+#endif
+    >
+    class gc< general_threaded< Buffer, Lock, DisposerThread, Backoff > >: public details::gc_common
+    {
+    public:
+        typedef general_threaded< Buffer, Lock, DisposerThread, Backoff >  rcu_implementation   ;    ///< Wrapped URCU implementation
+
+        typedef typename rcu_implementation::rcu_tag     rcu_tag     ;   ///< URCU tag
+        typedef typename rcu_implementation::thread_gc   thread_gc   ;   ///< Thread-side RCU part
+        typedef typename rcu_implementation::scoped_lock scoped_lock ;   ///< Access lock class
+
+        using details::gc_common::atomic_marked_ptr;
+
+    public:
+        /// Creates URCU \p %general_threaded singleton.
+        gc( size_t nBufferCapacity = 256 )
+        {
+            rcu_implementation::Construct( nBufferCapacity );
+        }
+
+        /// Destroys URCU \p %general_threaded singleton
+        ~gc()
+        {
+            rcu_implementation::Destruct( true );
+        }
+
+    public:
+        /// Waits to finish a grace period and calls disposing thread
+        /**
+            After grace period finished the function gives new task to disposing thread.
+            Unlike \ref force_dispose the \p %synchronize function does not wait for
+            task ending. Only a "task ready" message is sent to disposing thread.
+        */
+        static void synchronize()
+        {
+            rcu_implementation::instance()->synchronize();
+        }
+
+        /// Retires pointer \p p by the disposer \p pFunc
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        template <typename T>
+        static void retire_ptr( T * p, void (* pFunc)(T *) )
+        {
+            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ) );
+            retire_ptr( rp );
+        }
+
+        /// Retires pointer \p p using \p Disposer
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        template <typename Disposer, typename T>
+        static void retire_ptr( T * p )
+        {
+            retire_ptr( p, cds::details::static_functor<Disposer, T>::call );
+        }
+
+        /// Retires pointer \p p of type \ref cds_urcu_retired_ptr "retired_ptr"
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        static void retire_ptr( retired_ptr& p )
+        {
+            rcu_implementation::instance()->retire_ptr(p);
+        }
+
+        /// Frees chain [ \p itFirst, \p itLast) in one synchronization cycle
+        template <typename ForwardIterator>
+        static void batch_retire( ForwardIterator itFirst, ForwardIterator itLast )
+        {
+            rcu_implementation::instance()->batch_retire( itFirst, itLast );
+        }
+
+         /// Acquires access lock (so called RCU reader-side lock)
+        /**
+            For safety reasons, it is better to use \ref scoped_lock class for locking/unlocking
+        */
+        static void access_lock()
+        {
+            thread_gc::access_lock();
+        }
+
+        /// Releases access lock (so called RCU reader-side lock)
+        /**
+            For safety reasons, it is better to use \ref scoped_lock class for locking/unlocking
+        */
+        static void access_unlock()
+        {
+            thread_gc::access_unlock();
+        }
+
+        /// Checks if the thread is inside read-side critical section (i.e. the lock is acquired)
+        /**
+            Usually, this function is used internally to be convinced
+            that subsequent remove action is not lead to a deadlock.
+        */
+        static bool is_locked()
+        {
+            return thread_gc::is_locked();
+        }
+
+        /// Returns the threshold of internal buffer
+        static size_t capacity()
+        {
+            return rcu_implementation::instance()->capacity();
+        }
+
+        /// Forces retired object removal (synchronous version of \ref synchronize)
+        /**
+            The function calls \ref synchronize and waits until reclamation thread
+            frees retired objects.
+        */
+        static void force_dispose()
+        {
+            rcu_implementation::instance()->force_dispose();
+        }
+    };
+
+}} // namespace cds::urcu
+
+#endif // #ifndef _CDS_URCU_GENERAL_THREADED_H
diff --git a/cds/urcu/options.h b/cds/urcu/options.h
new file mode 100644 (file)
index 0000000..c38e7c6
--- /dev/null
@@ -0,0 +1,66 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_OPTIONS_H
+#define _CDS_URCU_OPTIONS_H
+
+#include <cds/details/defs.h>
+
+namespace cds { namespace urcu {
+    /// Exception "RCU deadlock detected"
+    /**@anchor cds_urcu_rcu_deadlock
+        This exception is raised when \p cds::opt::v::rcu_throw_deadlock deadlock checking policy
+        is used, see \p cds::opt::rcu_check_deadlock option.
+    */
+    class rcu_deadlock: public cds::Exception
+    {
+        //@cond
+        typedef cds::Exception base_class;
+    public:
+        rcu_deadlock()
+            : base_class( "RCU deadlock detected")
+        {}
+        //@endcond
+    };
+}} // namespace cds::urcu
+
+
+namespace cds { namespace opt {
+
+    /// [type-option] RCU check deadlock option setter
+    /**
+        The RCU containers can check if a deadlock between read-side critical section
+        and \p synchronize call is possible.
+        This option specifies a policy for checking this situation.
+        Possible \p Type is:
+        - \p opt::v::rcu_no_check_deadlock - no deadlock checking
+        - \p opt::v::rcu_assert_deadlock - call \p assert in debug mode only
+        - \p opt::v::rcu_throw_deadlock - throw an \p cds::urcu::rcu_deadlock exception when a deadlock
+            is encountered
+
+        Usually, the default \p Type for this option is \p opt::v::rcu_throw_deadlock.
+    */
+    template <typename Type>
+    struct rcu_check_deadlock
+    {
+        //@cond
+        template <typename Base> struct pack: public Base
+        {
+            typedef Type rcu_check_deadlock;
+        };
+        //@endcond
+    };
+
+    namespace v {
+        /// \ref opt::rcu_check_deadlock option value: no deadlock checking
+        struct rcu_no_check_deadlock {};
+
+        /// \ref opt::rcu_check_deadlock option value: call \p assert in debug mode only
+        struct rcu_assert_deadlock {};
+
+        /// \ref opt::rcu_check_deadlock option value: throw a cds::urcu::rcu_deadlock exception when a deadlock detected
+        struct rcu_throw_deadlock {};
+    }
+}}  // namespace cds::opt
+
+
+#endif  // #ifndef _CDS_URCU_OPTIONS_H
diff --git a/cds/urcu/signal_buffered.h b/cds/urcu/signal_buffered.h
new file mode 100644 (file)
index 0000000..640606d
--- /dev/null
@@ -0,0 +1,166 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_SIGNAL_BUFFERED_H
+#define _CDS_URCU_SIGNAL_BUFFERED_H
+
+#include <cds/urcu/details/sig_buffered.h>
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+
+namespace cds { namespace urcu {
+
+    /// User-space signal-handled RCU with deferred buffered reclamation
+    /** @anchor cds_urcu_signal_buffered_gc
+
+        This is a wrapper around signal_buffered class used for metaprogramming.
+
+        Template arguments:
+        - \p Buffer - lock-free queue or lock-free bounded queue.
+            Default is cds::container::VyukovMPMCCycleQueue< retired_ptr >
+        - \p Lock - mutex type, default is \p std::mutex
+        - \p Backoff - back-off schema, default is cds::backoff::Default
+    */
+    template <
+#ifdef CDS_DOXGEN_INVOKED
+        class Buffer = cds::container::VyukovMPMCCycleQueue<
+            retired_ptr
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< retired_ptr > >
+        >
+        ,class Lock = cds_std::mutex
+        ,class Backoff = cds::backoff::Default
+#else
+        class Buffer
+       ,class Lock
+       ,class Backoff
+#endif
+    >
+    class gc< signal_buffered< Buffer, Lock, Backoff > >: public details::gc_common
+    {
+    public:
+        typedef signal_buffered< Buffer, Lock, Backoff >  rcu_implementation   ;    ///< Wrapped URCU implementation
+
+        typedef typename rcu_implementation::rcu_tag     rcu_tag     ;   ///< URCU tag
+        typedef typename rcu_implementation::thread_gc   thread_gc   ;   ///< Thread-side RCU part
+        typedef typename rcu_implementation::scoped_lock scoped_lock ;   ///< Access lock class
+
+        using details::gc_common::atomic_marked_ptr;
+
+    public:
+        /// Creates URCU \p %signal_buffered singleton.
+        /**
+            The \p nBufferCapacity parameter defines RCU threshold.
+
+            The \p nSignal parameter defines a signal number stated for RCU, default is \p SIGUSR1
+        */
+        gc( size_t nBufferCapacity = 256, int nSignal = SIGUSR1 )
+        {
+            rcu_implementation::Construct( nBufferCapacity, nSignal );
+        }
+
+        /// Destroys URCU \p %general_instant singleton
+        ~gc()
+        {
+            rcu_implementation::Destruct( true );
+        }
+
+    public:
+        /// Waits to finish a grace period and clears the buffer
+        /**
+            After grace period finished the function frees all retired pointer
+            from internal buffer.
+        */
+        static void synchronize()
+        {
+            rcu_implementation::instance()->synchronize();
+        }
+
+        /// Places retired pointer <\p p, \p pFunc> to internal buffer
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        template <typename T>
+        static void retire_ptr( T * p, void (* pFunc)(T *) )
+        {
+            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ) );
+            retire_ptr( rp );
+        }
+
+        /// Places retired pointer \p p with \p Disposer to internal buffer
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        template <typename Disposer, typename T>
+        static void retire_ptr( T * p )
+        {
+            retire_ptr( p, cds::details::static_functor<Disposer, T>::call );
+        }
+
+        /// Places retired pointer \p p to internal buffer
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        static void retire_ptr( retired_ptr& p )
+        {
+            rcu_implementation::instance()->retire_ptr(p);
+        }
+
+        /// Frees chain [ \p itFirst, \p itLast) in one synchronization cycle
+        template <typename ForwardIterator>
+        static void batch_retire( ForwardIterator itFirst, ForwardIterator itLast )
+        {
+            rcu_implementation::instance()->batch_retire( itFirst, itLast );
+        }
+
+         /// Acquires access lock (so called RCU reader-side lock)
+        /**
+            For safety reasons, it is better to use \ref scoped_lock class for locking/unlocking
+        */
+        static void access_lock()
+        {
+            thread_gc::access_lock();
+        }
+
+        /// Releases access lock (so called RCU reader-side lock)
+        /**
+            For safety reasons, it is better to use \ref scoped_lock class for locking/unlocking
+        */
+        static void access_unlock()
+        {
+            thread_gc::access_unlock();
+        }
+
+        /// Returns the threshold of internal buffer
+        static size_t capacity()
+        {
+            return rcu_implementation::instance()->capacity();
+        }
+
+        /// Returns the signal number stated for RCU
+        static int signal_no()
+        {
+            return rcu_implementation::instance()->signal_no();
+        }
+
+        /// Checks if the thread is inside read-side critical section (i.e. the lock is acquired)
+        /**
+            Usually, this function is used internally to be convinced
+            that subsequent remove action is not lead to a deadlock.
+        */
+        static bool is_locked()
+        {
+            return thread_gc::is_locked();
+        }
+
+        /// Forces retired object removal
+        /**
+            This function calls \ref synchronize
+        */
+        static void force_dispose()
+        {
+            synchronize();
+        }
+    };
+
+}} // namespace cds::urcu
+
+#endif // #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#endif // #ifndef _CDS_URCU_SIGNAL_BUFFERED_H
diff --git a/cds/urcu/signal_threaded.h b/cds/urcu/signal_threaded.h
new file mode 100644 (file)
index 0000000..68a3adf
--- /dev/null
@@ -0,0 +1,174 @@
+//$$CDS-header$$
+
+#ifndef _CDS_URCU_SIGNAL_THREADED_H
+#define _CDS_URCU_SIGNAL_THREADED_H
+
+#include <cds/urcu/details/sig_threaded.h>
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+
+namespace cds { namespace urcu {
+
+    /// User-space signal-handled RCU with special thread for deferred reclamation
+    /** @anchor cds_urcu_signal_threaded_gc
+
+        This is a wrapper around signal_threaded class used for metaprogramming.
+
+        Template arguments:
+        - \p Buffer - lock-free queue or lock-free bounded queue.
+            Default is cds::container::VyukovMPMCCycleQueue< retired_ptr >
+        - \p Lock - mutex type, default is \p std::mutex
+        - \p DisposerThread - reclamation thread class, default is \p %general_threaded_dispose_thread
+            See \ref cds::urcu::dispose_thread for class interface.
+        - \p Backoff - back-off schema, default is cds::backoff::Default
+
+    */
+    template <
+#ifdef CDS_DOXGEN_INVOKED
+        class Buffer = cds::container::VyukovMPMCCycleQueue<
+            epoch_retired_ptr
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< epoch_retired_ptr > >
+        >
+        ,class Lock = cds_std::mutex
+        ,class DisposerThread = dispose_thread<Buffer>
+        ,class Backoff = cds::backoff::Default
+#else
+        class Buffer
+       ,class Lock
+       ,class DisposerThread
+       ,class Backoff
+#endif
+    >
+    class gc< signal_threaded< Buffer, Lock, DisposerThread, Backoff > >: public details::gc_common
+    {
+    public:
+        typedef signal_threaded< Buffer, Lock, DisposerThread, Backoff >  rcu_implementation   ;    ///< Wrapped URCU implementation
+
+        typedef typename rcu_implementation::rcu_tag     rcu_tag     ;   ///< URCU tag
+        typedef typename rcu_implementation::thread_gc   thread_gc   ;   ///< Thread-side RCU part
+        typedef typename rcu_implementation::scoped_lock scoped_lock ;   ///< Access lock class
+
+        using details::gc_common::atomic_marked_ptr;
+
+    public:
+        /// Creates URCU \p %general_threaded singleton.
+        /**
+            The \p nBufferCapacity parameter defines RCU threshold.
+
+            The \p nSignal parameter defines a signal number stated for RCU, default is \p SIGUSR1
+        */
+        gc( size_t nBufferCapacity = 256, int nSignal = SIGUSR1 )
+        {
+            rcu_implementation::Construct( nBufferCapacity, nSignal );
+        }
+
+        /// Destroys URCU \p %signal_threaded singleton
+        ~gc()
+        {
+            rcu_implementation::Destruct( true );
+        }
+
+    public:
+        /// Waits to finish a grace period and calls disposing thread
+        /**
+            After grace period finished the function gives new task to disposing thread.
+            Unlike \ref force_dispose the \p %synchronize function does not wait for
+            task ending. Only a "task ready" message is sent to disposing thread.
+        */
+        static void synchronize()
+        {
+            rcu_implementation::instance()->synchronize();
+        }
+
+        /// Retires pointer \p p by the disposer \p pFunc
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        template <typename T>
+        static void retire_ptr( T * p, void (* pFunc)(T *) )
+        {
+            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ) );
+            retire_ptr( rp );
+        }
+
+        /// Retires pointer \p p using \p Disposer
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        template <typename Disposer, typename T>
+        static void retire_ptr( T * p )
+        {
+            retire_ptr( p, cds::details::static_functor<Disposer, T>::call );
+        }
+
+        /// Retires pointer \p p of type \ref cds_urcu_retired_ptr "retired_ptr"
+        /**
+            If the buffer is full, \ref synchronize function is invoked.
+        */
+        static void retire_ptr( retired_ptr& p )
+        {
+            rcu_implementation::instance()->retire_ptr(p);
+        }
+
+        /// Frees chain [ \p itFirst, \p itLast) in one synchronization cycle
+        template <typename ForwardIterator>
+        static void batch_retire( ForwardIterator itFirst, ForwardIterator itLast )
+        {
+            rcu_implementation::instance()->batch_retire( itFirst, itLast );
+        }
+
+         /// Acquires access lock (so called RCU reader-side lock)
+        /**
+            For safety reasons, it is better to use \ref scoped_lock class for locking/unlocking
+        */
+        static void access_lock()
+        {
+            thread_gc::access_lock();
+        }
+
+        /// Releases access lock (so called RCU reader-side lock)
+        /**
+            For safety reasons, it is better to use \ref scoped_lock class for locking/unlocking
+        */
+        static void access_unlock()
+        {
+            thread_gc::access_unlock();
+        }
+
+        /// Checks if the thread is inside read-side critical section (i.e. the lock is acquired)
+        /**
+            Usually, this function is used internally to be convinced
+            that subsequent remove action is not lead to a deadlock.
+        */
+        static bool is_locked()
+        {
+            return thread_gc::is_locked();
+        }
+
+        /// Returns the threshold of internal buffer
+        static size_t capacity()
+        {
+            return rcu_implementation::instance()->capacity();
+        }
+
+        /// Returns the signal number stated for RCU
+        static int signal_no()
+        {
+            return rcu_implementation::instance()->signal_no();
+        }
+
+        /// Forces retired object removal (synchronous version of \ref synchronize)
+        /**
+            The function calls \ref synchronize and waits until reclamation thread
+            frees retired objects.
+        */
+        static void force_dispose()
+        {
+            rcu_implementation::instance()->force_dispose();
+        }
+    };
+
+}} // namespace cds::urcu
+
+#endif // #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#endif // #ifndef _CDS_URCU_SIGNAL_THREADED_H
diff --git a/cds/user_setup/allocator.h b/cds/user_setup/allocator.h
new file mode 100644 (file)
index 0000000..ec3814a
--- /dev/null
@@ -0,0 +1,42 @@
+//$$CDS-header$$
+
+#ifndef __CDS_USER_SETUP_ALLOCATOR_H
+#define __CDS_USER_SETUP_ALLOCATOR_H
+
+/** \file
+    \brief Default implementation of allocator classes.
+
+    If you want to use your allocator implementation you should define all or one of the following macro before
+    including CDS library headers:
+    \li CDS_DEFAULT_ALLOCATOR
+    \li CDS_DEFAULT_ALIGNED_ALLOCATOR
+*/
+
+#ifndef CDS_DEFAULT_ALLOCATOR
+
+    /** \def CDS_DEFAULT_ALLOCATOR
+        The macro defines standard allocator implementation. Default is std::allocator.
+
+        The CDS library uses \p std::allocator<int> to emulate template template parameter.
+        The library uses the <tt> std::allocator<int>::rebind<Q>::other </tt> to redefine allocator's type to proper type \p Q.
+    */
+#define CDS_DEFAULT_ALLOCATOR        std::allocator<int>
+
+#    include <memory>
+#endif
+
+
+#ifndef CDS_DEFAULT_ALIGNED_ALLOCATOR
+
+    /** \def CDS_DEFAULT_ALIGNED_ALLOCATOR
+        The macro defines aligned allocator implementation.
+
+        The default is \ref cds::OS::aligned_allocator "cds::OS::aligned_allocator<int>".
+        The library uses the <tt> cds::OS::aligned_allocator<int>::rebind<Q>::other </tt> to redefine allocator's type \p int to proper type \p Q.
+    */
+#define CDS_DEFAULT_ALIGNED_ALLOCATOR    cds::OS::aligned_allocator<int>
+
+#   include <cds/os/alloc_aligned.h>
+#endif
+
+#endif // #ifndef __CDS_USER_SETUP_ALLOCATOR_H
diff --git a/cds/user_setup/cache_line.h b/cds/user_setup/cache_line.h
new file mode 100644 (file)
index 0000000..18669ec
--- /dev/null
@@ -0,0 +1,30 @@
+//$$CDS-header$$
+
+#ifndef __CDS_USER_SETUP_CACHE_LINE_H
+#define __CDS_USER_SETUP_CACHE_LINE_H
+
+/** \file
+    \brief Cache-line size definition
+
+    This file defines cache-line size constant. The constant is used many \p libcds algorithm
+    to solve false-sharing problem.
+
+    The value of cache-line size must be power of two.
+    You may define your cache-line size by defining macro -DCDS_CACHE_LINE_SIZE=xx
+    (where \p xx is 2**N: 32, 64, 128,...) at compile-time or you may define your constant
+    value just editing \p cds/user_setup/cache_line.h file.
+
+    The default value is 64.
+*/
+
+//@cond
+namespace cds {
+#ifndef CDS_CACHE_LINE_SIZE
+    static const size_t c_nCacheLineSize = 64;
+#else
+    static const size_t c_nCacheLineSize = CDS_CACHE_LINE_SIZE;
+#endif
+}   // namespace cds
+//@endcond
+
+#endif // #ifndef __CDS_USER_SETUP_CACHE_LINE_H
diff --git a/cds/user_setup/threading.h b/cds/user_setup/threading.h
new file mode 100644 (file)
index 0000000..b6bca44
--- /dev/null
@@ -0,0 +1,24 @@
+//$$CDS-header$$
+
+#ifndef __CDS_USER_SETUP_THREADING_MODEL_H
+#define __CDS_USER_SETUP_THREADING_MODEL_H
+
+/**
+    CDS threading model
+
+    CDS_THREADING_AUTODETECT - auto-detect appropriate threading model (default)
+
+    CDS_THREADING_MSVC - use MS Visual C++ declspec( thread ) declaration to mantain thread-specific data
+
+    CDS_THREADING_WIN_TLS - use Windows TLS API to mantain thread-specific data
+
+    CDS_THREADING_GCC - use GCC __thread keyword to mantain thread-specific data
+
+    CDS_THREADING_PTHREAD - use cds::Threading::Manager implementation based on pthread thread-specific
+    data functions pthread_getspecific/pthread_setspecific
+
+    CDS_THREADING_USER_DEFINED - use user-defined threading model
+*/
+#define CDS_THREADING_AUTODETECT
+
+#endif    // #ifndef __CDS_USER_SETUP_THREADING_MODEL_H
diff --git a/cds/version.h b/cds/version.h
new file mode 100644 (file)
index 0000000..5169ec9
--- /dev/null
@@ -0,0 +1,18 @@
+//$$CDS-header$$
+
+#ifndef __CDS_VERSION_H
+#define __CDS_VERSION_H
+
+// cds library version
+
+#define CDS_VERSION        0x010600
+
+#define CDS_VERSION_MAJOR  ((CDS_VERSION & 0xFF0000)>> 16)
+#define CDS_VERSION_MINOR  ((CDS_VERSION & 0x00FF00) >> 8)
+#define CDS_VERSION_PATCH  (CDS_VERSION & 0x0000FF)
+
+// CDS_VERSION == CDS_VERSION_MAJOR '.' CDS_VERSION_MINOR '.' CDS_VERSION_PATCH
+#define CDS_VERSION_STRING        "1.6.0"
+
+#endif  // #ifndef __CDS_VERSION_H
+
diff --git a/change.log b/change.log
new file mode 100644 (file)
index 0000000..8ba3e37
--- /dev/null
@@ -0,0 +1,230 @@
+1.6.0
+    General release
+    - Add flat combining (FC) technique and FC-based containers: FCStack, FCQueue, 
+      FCDeque, FCPriorityQueue
+    - Add elimination back-off feature to TreiberStack class
+    - Add SegmentedQueue - an unfair queue implementation
+    - New member functions for sets and maps:
+      Functions get() and get_with() search a key and return the pointer to item found 
+      in safe manner.
+      Function extract() searches a key, unlinks the item found from the container 
+      and returns pointer to item in safe manner.
+      The functions get, get_with, extract, extract_with extract_min, extract_max 
+      has been added to the following container:
+        SkipListSet, SkipListMap
+        EllenBinTree, EllenBinTreeSet, EllenBinTreeMap
+      The functions get, get_with, extract, extract_with has been added 
+      to the following container:
+        MichaelList, LazyList
+        MichaelHashSet, MichaelHashMap
+        SplitListSet, SplitListMap
+    - Fix a serious bug in cds::gc::HRC
+    - Changed MSPriorityQueue to simplify interface and to fix possible pop() deadlock
+    - Fix a bug in BasketQueue
+    - Fix EllenBinTree crash under high contention
+    - Changed: the thread manager detach order to prevent crashing of signal-handled RCU
+      in some case.
+    - Changed: cds::gc::HP calls Scan() when a thread is detached.
+      This prevents accumulating retired data.
+    - Changed: minimal boost version is 1.51
+    - Removed: file cds/lock/rwlock.h
+
+1.5.0 29.12.2013
+    General release
+    1. Added: EllenBinTree - an implementation of unbalanced binary search
+      tree based on paper [2010] F.Ellen, P.Fatourou, E.Ruppert, F.van Breugel 
+      "Non-blocking Binary Search Tree".
+    2. Added: MSPriorityQueue - an array-based lock-based priority queue heap, 
+      see [1996] G.Hunt, M.Michael, S. Parthasarathy, M.Scott "An efficient 
+      algorithm for concurrent priority queue heaps"
+    3. Added support for boost.atomic for boost 1.54 and above. 
+      Now, libcds supports processor architecture like ARM, PowerPC and any other
+      that are supported by boost.atomic or by C++11 compiler. Any feedbacks are appreciated.
+      To use boost.atomic you should specify -DCDS_USE_BOOST_ATOMIC in compiler's command line.
+    4. Added: a new CDS_USE_LIBCDS_ATOMIC preprocessor flag has been added to direct
+      the compiler to use libcds atomic unconditionally.
+    5. build.sh has been modified to relax processor architecture and OS requirements. 
+      This allows to use libcds with native compiler atomic support (or boost.atomic) 
+      for a processor architecture that has not been tested by libcds's developers.
+    6. Added support for CLang 3.3
+    7. Added support for MS VC++ 2013
+    8. Added support for Mac OS X, see build/sample/build-osx-clang-libc++.sh, 
+      build/sample/build-osx-gcc.sh for example.
+    9. Fixed: SkipListSet::erase_with does not take into account "less" predicate parameter.
+    10.Fixed: some bugs in SkipListSet leading to deadloop
+    11.Fixed: MichaelMap bug: computing hash value for type Q different from key type.
+
+1.4.0 20.05.2013
+    General release
+    1. Added: user-space RCU garbage collector (5 different implementations), 
+       see cds::urcu namespace
+    2. Added: RCU-related set/map container specializations
+    3. Added: Skip-list specialization for cds::gc::nogc (undeletable skip-list)
+    4. For set/map classes: find_with and erase_with member functions have been added.
+       These functions allow to use different predicates for searching.
+    5. Added: threading model based on Ñ++11 thread_local keyword (CDS_THREADING_CXX11).
+       At present, only gcc 4.8 supports such model.
+    6. Fixed: bug #11 "ABA bug in libcds 1.3.1 cds/intrusive/msqueue.h"
+       Thanks to Jelle van den Hooff.
+    7. Added support for GCC 4.8
+
+1.3.1 27.01.2013
+    Bugfix release
+    - Bug fixed: building libcds with boost versions before 1.48
+      Thanks Lucas Larsch who points me to this problem.
+  
+1.3.0 29.12.2012
+    General release
+    1. Added: StripedSet, StripedMap - hash set and hash map 
+        implementation based on fine-grained lock-striping technique
+    2. Added: CuckooSet, CuckooMap - implementation of cuckoo hashing algorithm
+        based on fine-grained lock-striping technique
+    3. Added: SkipListSet, SkipListMap - implementation of lock-free skip list
+    4. Added: template <typename... Args> emplace(Args&&... args) member function 
+        for all containers in cds::container namespace. This function is available 
+        only if the compiler supports new C++11 features - variadic
+        templates and move semantics.
+    5. Changed: lambda functions are used internally instead of wrapping functors.
+        If the compiler does not support C++11 lambdas the old-style wrapping functors are used.
+    6. Changed: test projects has been splitted for optimizing compile time.
+    7. Breaking change: class cds::lock::Auto has been renamed to cds::lock::scoped_lock,
+        class cds::lock::AutoUnlock has been removed
+    8. Added: support for MinGW (tested with TDM-GCC 64bit, gcc 4.7)
+    
+1.2.0 20.08.2012 (beta)
+    General release
+    1. Added: MichaelDeque - deque lock-free algo discovered by Maged Michael
+    2. Added: BasketQueue - Michael's queue modification discovered by Nir Shavit et al.
+    3. Added: support of Clang 3.0, 3.1 compiler (tested on Linux with boost 1.49)
+    4. Fixed: solving problem of 8-byte atomic data alignment on 32-bit platforms
+    5. Fixed bug 3536393: OptimisticQueue core dump 
+
+1.1.0 17.04.2012 (beta)
+    General release
+    1. Added: C++11 atomic operations support. The library has been rewritten
+        for using std::atomic class and operations proposed in C++11 Standard.
+        If the compiler does not support the standard <atomic> library, 
+        own partial implementation declared in cds/cxx11_atomic.h is used. 
+        cxx11_atomic.h contains implementation for lock-free part of C++11 
+        <atomic> header needed for libcds.
+    2. Added: support for C++11 feature (if applicable):
+       - inline namespace (for GCC 4.4+)
+       - function =default and =delete specifiers (for GCC 4.4+)
+    3. Changed: the main reclamation cycle ("liberate" function) of cds::gc::PTB 
+       memory reclamation schema has been optimized. Previous implementation
+       could lead to unbounded memory consumption under high contention.
+    4. Changed: the internal structure of cds::intrusive::OptimisticQueue is greatly simplified. 
+       The interface of the class is slightly changed.
+    5. Fixed: some problem with cds::gc::HRC memory reclamation schema that
+       could be the cause of occasional program crash.
+    6. Fixed: an error in node reclamation algo in queue implementation (MSQueue, MoirQueue, 
+       OptimisticQueue). As an result of the error, some items could be lost with memory leaks.
+    7. Changed: cds::concept namespace and its content has been removed
+    8. Added support for Microsoft Visual C++ 11 Beta
+    9. Added support for GCC 4.7
+    
+1.0.0  31.12.2011 (beta)
+    This version is completely rewritten to support intrusive version of lock-free containers
+    and more lightweight garbage collectors interface.
+    The class hierarchy and interfaces have been completely reimplemented from scratch.
+
+    1. Added: intrusive containers. Many lock-free containers in libcds have the intrusive
+       counterparts. The library is fully refactored to support intrusive containers.
+       Class hierarchy is changed: almost all non-intrusive container classes are based 
+       on their intrusive versions.
+       Two new namespace is added:
+        cds::intrusive - for intrusive containers
+        cds::container - for non-intrusive containers
+       Namespaces by container type (cds::queue, cds::map and so on) have been removed.
+    2. Added: New option-based approach is used for class declaration instead
+       old traits-based one. This approach allows to declare template arguments
+       in position-independent manner that is very useful for complex template declarations.
+       Option-based declarations use C++0x variadic templates if compiler supports it (GCC),
+       otherwise (MS VC) an emulation is used.
+    3. Changed: garbage collectors interface is generalized. cds::gc::GC (where GC is
+       one of HP, HRC, PTB) classes has been added.
+    4. Removed: tagged pointer GC. This GC
+       - unsafe for complex data structure
+       - x86-specific since it requires double-width CAS primitive
+       - memory-consuming since it requires separate free-list for each type stored in the containers
+    5. Default threading model is changed (see doc for cds::threading namespace):
+       - for Windows and MSVC++, CDS_THREADING_WIN_TLS is the default now
+       - for *nix and GCC, CDS_THREADING_PTHREAD is the default now
+    6. Added GCC 4.6 support (constexpr)
+    7. Added Microsoft Visual Studio 2010 (vc10) solution
+
+0.8.0  28.03.2011 (beta)
+    1. Added: cds::Initialize and cds::Terminate functions that initializes and frees library's
+       internal structures.
+    2. Added: cds::memory::michael::Heap - Michael's lock-free allocator
+    3. Added: Exponential back-off strategy for spinning
+    4. Added: cds::queue::vyukov_mpmc_bounded - bounded queue
+       developed by Dmitry Vyukov (http://www.1024cores.net)
+    5. Added: support for FreeBSD amd64, x86
+
+0.7.2  27.02.2011 (beta)
+    1. [Bug 3157201] Added implementation of threading manager based on Windows TLS API, see
+       cds::threading::wintls::Manager. Added CDS_THREADING_WIN_TLS macro. See docs for
+       cds::threading namespace for details.
+    2. Fixed bug in cds::threading::pthread::Manager: ptb_gc has not been initialized properly.
+    3. New function
+            template <typename T, typename FUNC>
+            bool erase( const key_type& key, T& dest, FUNC func ) ;
+       has been added to all map classes.
+    4. New function
+            template <typename T, typename FUNC>
+            bool insert( const key_type& key, T& val, FUNC func ) ;
+       has been added to all map classes.
+    5. Added new argument "bNew" to functor "func" of map's "ensure" member function:
+            void func( VALUE& itemValue, const VALUE& val, bool bNew ) ;
+        bNew = true if new item has been added
+        bNew = false if key is found
+    6. Fixed bug in cds::map::SplitOrderedList: LSB of dummy node's hash should be zero
+    7. Changed: thread liveliness checking on *nix has been changed to pthread_kill(id, 0).
+    8. Fixed: in map template member functions the functor may be passed by value
+       or by reference; use boost::ref( yourFunctor ) to pass your functor by reference
+    9. Fixed: cds::gc::tagged GC and all classes based on this GC has been rewritten
+       to solve stability problems.
+
+0.7.1  30.12.2010 (beta)
+    1. [Bug 3130852] cds::queue::TZCyclicQueue::empty() has been corrected
+    2. [Bug 3128161] It seems, GCC 4.4 has a bug in __thread on x86 and x86_64. New "threading model"
+       CDS_THREADING_AUTODETECT has been added. See docs of cds::threading namespace for details
+    3. Fixed errors in the "Pass-the-Buck" garbage collector (namespace cds::gc::ptb)
+    4. [Bug 3128148] The code is aligned with the C++ standard (minor violations has been removed)
+    5. [Bug 3141654] missing break statement for atomic store - fixed
+    6. Added in-place scan strategy to cds::gc::hzp::GarbageCollector that does not allocate any memory.
+    7. Fixed bugs in HRC and tagged GC
+
+0.7.0 05.12.2010 (beta)
+    1. Preliminary support for "Pass The Buck" memory manager is added. See cds::gc::ptb namespace.
+    2. Many part of library is rewritten to generalize the usage of various GCs
+    3. The new class cds::details::aligned_allocator has been added for allocating aligned memory
+       blocks. It is useful for Tagged Pointer memory reclamation schema (cds::gc::tagged_gc).
+    4. [Break change] New argument has been added to the member functions "ensure" and "find"
+       for ordered list and map classes
+    5. New member function "emplace" has been added to ordered list and map classes. This member function
+       allows change the value (or a part of it) of list/map item.
+    6. The internal structure of class cds::map::MichaelHashMap is completely refactored to support
+       cds::gc::no_gc correctly
+    7. The classes RecursiveSpinT, RecursiveSpin32, RecursiveSpin64, and RecursiveSpin from cds::lock
+       namespace have been renamed to ReentrantSpinT, ReentrantSpin32, ReentrantSpin64, and ReentrantSpin
+       respectively
+    8. Compiler support: GCC version below 4.3.0 is not supported
+    9. Fixed memory leak in cds::map::SplitOrderedList
+   10. Added compiler barrier to spin-lock release primitive for x86 and amd64
+   11. Makefile script is changed to resolve the problem when an user calls 'make clean' directly.
+       Thanks to Tamas Lengyel to point me to this bug.
+   12. The file dictionary.txt is exluded from distributive. This file is used for testing purposes only.
+       You may create dictionary.txt in this way:
+        cd ./tests/data
+        perl -X split.pl
+
+0.6.0 26.03.2010 (beta)
+    1. The library is rewritten using atomic primitives with explicit memory ordering (based on C++
+       memory model proposal). The implementation of atomic primitives for supported architectures
+       is developed from scratch.
+    2. Total refactoring
+
+0.5.0 31.12.2009  (beta)
+    First release
\ No newline at end of file
diff --git a/doxygen/cds.doxy b/doxygen/cds.doxy
new file mode 100644 (file)
index 0000000..29cd2aa
--- /dev/null
@@ -0,0 +1,1758 @@
+# Doxyfile 1.8.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file 
+# that follow. The default is UTF-8 which is also the encoding used for all 
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
+# iconv built into libc) for the transcoding. See 
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = utf-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = cds
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 1.6.0
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = $(DOXYPRJ_ROOT)/doc
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, 
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+MARKDOWN_SUPPORT = NO
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = $(DOXYPRJ_ROOT)
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = $(DOXYPRJ_ROOT)
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = "member{1}=\section \1 \1"
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
+# sources. Doxygen will then generate output that is tailored for 
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it 
+# parses. With this tag you can assign which parser to use for a given extension. 
+# Doxygen has a built-in mapping, but you can override or extend it using this 
+# tag. The format is ext=language, where ext is a file extension, and language 
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, 
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make 
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C 
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions 
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      = 
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = YES
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to 
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
+# and setter methods for a property. Setting this option to YES (the default) 
+# will make doxygen to replace the get and set methods by a property in the 
+# documentation. This will only work if the methods are indeed getting or 
+# setting a simple type. If this is not the case, or you want to show the 
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
+# is documented as struct, union, or enum with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code in case the coding convention dictates that all compound 
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
+# determine which symbols to keep in memory and which to flush to disk. 
+# When the cache is full, less often used symbols will be written to disk. 
+# For small to medium size projects (<1000 input files) the default value is 
+# probably good enough. For larger projects a too small cache size can cause 
+# doxygen to be busy swapping symbols to and from disk most of the time 
+# causing a significant performance penality. 
+# If the system has enough physical memory increasing the cache will improve the 
+# performance by keeping more symbols in memory. Note that the value works on 
+# a logarithmic scale so increasing the size by one will rougly double the 
+# memory usage. The cache size is given by this formula: 
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+#SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = NO
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be 
+# extracted and appear in the documentation as a namespace called 
+# 'anonymous_namespace{file}', where file will be replaced with the base 
+# name of the file that contains the anonymous namespace. By default 
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen 
+# will list include files with double quotes in the documentation 
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen 
+# will sort the (brief and detailed) documentation of class members so that 
+# constructors and destructors are listed first. If set to NO (the default) 
+# the constructors will appear in the respective orders defined by 
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. 
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO 
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
+# hierarchy of group names into alphabetical order. If set to NO (the default) 
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+# Obsolete in 1.8.1
+#SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
+# This will remove the Files entry from the Quick Index and from the 
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
+# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 
+# by doxygen. The layout file controls the global structure of the generated 
+# output files in an output format independent way. The create the layout file 
+# that represents doxygen's defaults, run doxygen with the -l option. 
+# You can optionally specify a file name after the option, if omitted 
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = $(DOXYPRJ_ROOT)/cds
+
+# This tag can be used to specify the character encoding of the source files 
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
+# the list of possible encodings.
+
+INPUT_ENCODING         = windows-1251
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.d \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.cs \
+                         *.php \
+                         *.php3 \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.f90 \
+                         *.f \
+                         *.vhd \
+                         *.vhdl
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = __to_delete \
+                         ToDo
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the 
+# output. The symbol name can be a fully qualified name, a word, or if the 
+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
+# link to the source code.  Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = cds-api
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = $(DOXYPRJ_ROOT)/doxygen/footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. 
+# Doxygen will adjust the colors in the stylesheet and background images 
+# according to this color. Hue is specified as an angle on a colorwheel, 
+# see http://en.wikipedia.org/wiki/Hue for more information. 
+# For instance the value 0 represents red, 60 is yellow, 120 is green, 
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. 
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of 
+# the colors in the HTML output. For a value of 0 the output will use 
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to 
+# the luminance component of the colors in the HTML output. Values below 
+# 100 gradually make the output lighter, whereas values above 100 make 
+# the output darker. The value divided by 100 is the actual gamma applied, 
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
+# page will contain the date and time when the page was generated. Setting 
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+# Obsolete in 1.8.1
+#HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files 
+# will be generated that can be used as input for Apple's Xcode 3 
+# integrated development environment, introduced with OSX 10.5 (Leopard). 
+# To create a documentation set, doxygen will generate a Makefile in the 
+# HTML output directory. Running make will produce the docset in that 
+# directory and running "make install" will install the docset in 
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
+# it at startup. 
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
+# feed. A documentation feed provides an umbrella under which multiple 
+# documentation sets from a single provider (such as a company or product suite) 
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
+# should uniquely identify the documentation set bundle. This should be a 
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify 
+# the documentation publisher. This should be a reverse domain-name style 
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
+# content.
+
+CHM_INDEX_ENCODING     = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated 
+# that can be used as input for Qt's qhelpgenerator to generate a 
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
+# be used to specify the file name of the resulting .qch file. 
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to 
+# add. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   = 
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the 
+# custom filter to add. For more information please see 
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> 
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
+# project's 
+# filter section matches. 
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> 
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  = 
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
+# be used to specify the location of Qt's qhelpgenerator. 
+# If non-empty doxygen will try to run qhelpgenerator on the generated 
+# .qhp file.
+
+QHG_LOCATION           = 
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files  
+# will be generated, which together with the HTML files, form an Eclipse help 
+# plugin. To install this plugin and make it available under the help contents 
+# menu in Eclipse, the contents of the directory containing the HTML and XML 
+# files needs to be copied into the plugins directory of eclipse. The name of 
+# the directory within the plugins directory should be the same as 
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before 
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin 
+# the directory name containing the HTML and XML files should also have 
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
+# structure should be generated to display hierarchical information. 
+# If the tag value is set to YES, a side panel will be generated 
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = NO
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, 
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+# Obsolete in 1.8.1
+#USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open 
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included 
+# as images in the HTML documentation. The default is 10. Note that 
+# when you change the font size after a successful doxygen run you need 
+# to manually remove any form_*.png images from the HTML output directory 
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images 
+# generated for formulas are transparent PNGs. Transparent PNGs are 
+# not supported properly for IE 6.0, but are supported on all modern browsers. 
+# Note that when changing this option you need to delete any form_*.png files 
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box 
+# for the HTML output. The underlying search engine uses javascript 
+# and DHTML and should work on any modern browser. Note that when using 
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets 
+# (GENERATE_DOCSET) there is already a search function so this one should 
+# typically be disabled. For large projects the javascript based search engine 
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be 
+# implemented using a PHP enabled web server instead of at the web client 
+# using Javascript. Doxygen will generate the search PHP script and index 
+# file to put on the web server. The advantage of the server 
+# based approach is that it scales better to large projects and allows 
+# full text search. The disadvances is that it is more difficult to setup 
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name. 
+# Note that when enabling USE_PDFLATEX this option is only used for 
+# generating bitmaps for formulas in the HTML output, but not in the 
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include 
+# source code with syntax highlighting in the LaTeX output. 
+# Note that which sources are shown also depends on other settings 
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = CDS_BUILD_BITS=32 \
+                         CDS_DOXYGEN_INVOKED \
+                         cds_std=std \
+                         CDS_URCU_SIGNAL_HANDLING_ENABLED \
+                         CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT \
+                         CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT \
+                         CDS_CXX11_DELETE_DEFINITION_SUPPORT \
+                         CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT \
+                         CDS_CXX11_INLINE_NAMESPACE_SUPPORT \
+                         CDS_CXX11_INLINE_NAMESPACE=inline \
+                         CDS_CXX11_TEMPLATE_ALIAS_SUPPORT \
+                         CDS_CXX11_EXPLICIT_CONVERSION_OPERATOR_SUPPORT \
+                         CDS_CXX11_DECLTYPE_SUPPORT \
+                         CDS_RVALUE_SUPPORT \
+                         CDS_MOVE_SEMANTICS_SUPPORT \
+                         CDS_NOEXCEPT=noexcept() \
+                         CDS_CONSTEXPR=constexpr \
+                         CDS_ATOMIC=std \
+                         CDS_DELETE_SPECIFIER="=delete"\
+                         CDS_DEFAULT_SPECIFIER="=default"  \
+                         CDS_EMPLACE_SUPPORT \
+                         CDS_DECL_OPTIONS="typename... Options" \
+                         CDS_DECL_OPTIONS1="typename... Options" \
+                         CDS_DECL_OPTIONS2="typename... Options" \
+                         CDS_DECL_OPTIONS3="typename... Options" \
+                         CDS_DECL_OPTIONS4="typename... Options" \
+                         CDS_DECL_OPTIONS5="typename... Options" \
+                         CDS_DECL_OPTIONS6="typename... Options" \
+                         CDS_DECL_OPTIONS7="typename... Options" \
+                         CDS_DECL_OPTIONS8="typename... Options" \
+                         CDS_DECL_OPTIONS9="typename... Options" \
+                         CDS_DECL_OPTIONS10="typename... Options" \
+                         CDS_DECL_OPTIONS11="typename... Options" \
+                         CDS_DECL_OPTIONS12="typename... Options" \
+                         CDS_DECL_OPTIONS13="typename... Options" \
+                         CDS_DECL_OPTIONS14="typename... Options" \
+                         CDS_DECL_OPTIONS15="typename... Options" \
+                         CDS_DECL_OPTIONS16="typename... Options" \
+                         CDS_SPEC_OPTIONS="typename... Options" \
+                         CDS_SPEC_OPTIONS1="typename... Options" \
+                         CDS_SPEC_OPTIONS2="typename... Options" \
+                         CDS_SPEC_OPTIONS3="typename... Options" \
+                         CDS_SPEC_OPTIONS4="typename... Options" \
+                         CDS_SPEC_OPTIONS5="typename... Options" \
+                         CDS_SPEC_OPTIONS6="typename... Options" \
+                         CDS_SPEC_OPTIONS7="typename... Options" \
+                         CDS_SPEC_OPTIONS8="typename... Options" \
+                         CDS_SPEC_OPTIONS9="typename... Options" \
+                         CDS_SPEC_OPTIONS10="typename... Options" \
+                         CDS_SPEC_OPTIONS11="typename... Options" \
+                         CDS_SPEC_OPTIONS12="typename... Options" \
+                         CDS_SPEC_OPTIONS13="typename... Options" \
+                         CDS_SPEC_OPTIONS14="typename... Options" \
+                         CDS_SPEC_OPTIONS15="typename... Options" \
+                         CDS_SPEC_OPTIONS16="typename... Options" \
+                                                CDS_OPTIONS="Options..." \
+                         CDS_OPTIONS1="Options..." \
+                         CDS_OPTIONS2="Options..." \
+                         CDS_OPTIONS3="Options..." \
+                         CDS_OPTIONS4="Options..." \
+                         CDS_OPTIONS5="Options..." \
+                         CDS_OPTIONS6="Options..." \
+                         CDS_OPTIONS7="Options..." \
+                         CDS_OPTIONS8="Options..." \
+                         CDS_OPTIONS9="Options..." \
+                         CDS_OPTIONS10="Options..." \
+                         CDS_OPTIONS11="Options..." \
+                         CDS_OPTIONS12="Options..." \
+                         CDS_OPTIONS13="Options..." \
+                         CDS_OPTIONS14="Options..." \
+                         CDS_OPTIONS15="Options..." \
+                         CDS_OPTIONS16="Options..." \
+                         CDS_DECL_OTHER_OPTIONS1="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS2="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS3="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS4="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS5="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS6="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS7="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS8="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS9="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS10="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS11="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS12="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS13="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS14="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS15="typename... Options2" \
+                         CDS_DECL_OTHER_OPTIONS16="typename... Options2" \
+                         CDS_OTHER_OPTIONS1="Options2..." \
+                         CDS_OTHER_OPTIONS2="Options2..." \
+                         CDS_OTHER_OPTIONS3="Options2..." \
+                         CDS_OTHER_OPTIONS4="Options2..." \
+                         CDS_OTHER_OPTIONS5="Options2..." \
+                         CDS_OTHER_OPTIONS6="Options2..." \
+                         CDS_OTHER_OPTIONS7="Options2..." \
+                         CDS_OTHER_OPTIONS8="Options2..." \
+                         CDS_OTHER_OPTIONS9="Options2..." \
+                         CDS_OTHER_OPTIONS10="Options2..." \
+                         CDS_OTHER_OPTIONS11="Options2..." \
+                         CDS_OTHER_OPTIONS12="Options2..." \
+                         CDS_OTHER_OPTIONS13="Options2..." \
+                         CDS_OTHER_OPTIONS14="Options2..." \
+                         CDS_OTHER_OPTIONS15="Options2..." \
+                         CDS_OTHER_OPTIONS16="Options2..."
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+#EXPAND_AS_DEFINED      = 
+                         
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links. 
+# Note that each tag file must have a unique name 
+# (where the name does NOT include the path) 
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see 
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is 
+# allowed to run in parallel. When set to 0 (the default) doxygen will 
+# base this on the number of processors available in the system. You can set it 
+# explicitly to a value larger than 0 to get control over the balance 
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will write a font called FreeSans.ttf to the output 
+# directory and reference it in all dot files that doxygen generates. This 
+# font does not include all possible unicode characters however, so when you need 
+# these (or just want a differently looking font) you can specify the font name 
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
+# which can be done by putting it in a standard location or by setting the 
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
+# containing the font.
+
+#DOT_FONTNAME           = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
+# The default size is 10pt.
+
+#DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the 
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
+# different font using DOT_FONTNAME you can set the path where dot 
+# can find it using this tag.
+
+#DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include 
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif 
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the 
+# number of direct children of the root node in a graph is already larger than 
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 1000
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, because dot on Windows does not 
+# seem to support this out of the box. Warning: Depending on the platform used, 
+# enabling this option may lead to badly anti-aliased labels on the edges of 
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = YES
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/doxygen/doxygen.log b/doxygen/doxygen.log
new file mode 100644 (file)
index 0000000..56220a8
--- /dev/null
@@ -0,0 +1,15 @@
+C:/works/libs/cds/cds/compiler/gcc/amd64/cxx11_atomic.h:208: warning: Reached end of file while still inside a (nested) comment. Nesting level 1 (probable line reference: 207)\r
+C:/works/libs/cds/cds/compiler/gcc/ia64/cxx11_atomic.h:655: warning: Reached end of file while still inside a (nested) comment. Nesting level 1 (probable line reference: 653)\r
+C:/works/libs/cds/cds/compiler/gcc/sparc/cxx11_atomic.h:614: warning: Reached end of file while still inside a (nested) comment. Nesting level 1 (probable line reference: 612)\r
+C:/works/libs/cds/cds/compiler/gcc/x86/cxx11_atomic.h:188: warning: Reached end of file while still inside a (nested) comment. Nesting level 1 (probable line reference: 186)\r
+C:/works/libs/cds/cds/compiler/gcc/x86/cxx11_atomic32.h:477: warning: Reached end of file while still inside a (nested) comment. Nesting level 1 (probable line reference: 475)\r
+C:/works/libs/cds/cds/compiler/vc/amd64/cxx11_atomic.h:588: warning: Reached end of file while still inside a (nested) comment. Nesting level 1 (probable line reference: 586)\r
+C:/works/libs/cds/cds/compiler/vc/x86/cxx11_atomic.h:562: warning: Reached end of file while still inside a (nested) comment. Nesting level 1 (probable line reference: 560)\r
+C:/works/libs/cds/cds/details/defs.h:547: warning: Reached end of file while still inside a (nested) comment. Nesting level 1 (probable line reference: 411)\r
+C:/works/libs/cds/cds/intrusive/details/ellen_bintree_base.h:702: warning: Reached end of file while still inside a (nested) comment. Nesting level 2 (probable line reference: 330, 326)\r
+C:/works/libs/cds/cds/intrusive/ellen_bintree_hp.h:10: warning: Reached end of file while still inside a (nested) comment. Nesting level 2 (probable line reference: )\r
+C:/works/libs/cds/cds/memory/michael/allocator.h:1102: warning: Found ';' while parsing initializer list! (doxygen could be confused by a macro call without semicolon)\r
+C:/works/libs/cds/cds/os/timer.h:34: warning: Reached end of file while still inside a (nested) comment. Nesting level 1 (probable line reference: 32)\r
+<Construct>:1: warning: unable to resolve reference to `ContainerNode' for \ref command\r
+C:/works/libs/cds/cds/container/striped_map.h:526: warning: explicit link request to 'type' could not be resolved\r
+C:/works/libs/cds/cds/container/striped_set.h:40: warning: explicit link request to 'type' could not be resolved\r
diff --git a/doxygen/footer.html b/doxygen/footer.html
new file mode 100644 (file)
index 0000000..9b1287d
--- /dev/null
@@ -0,0 +1,9 @@
+<hr/>\r
+<div align="right">\r
+  <b>$projectname</b> <b>$projectnumber</b> \r
+  Developed by <i>Maxim Khiszinsky aka khizmax</i> 2007 - 2014\r
+  <br/>\r
+  <i>Autogenerated $datetime by Doxygen $doxygenversion</i>\r
+</div>\r
+</body>\r
+</html>\r
diff --git a/doxygen/index.html b/doxygen/index.html
new file mode 100644 (file)
index 0000000..c875c5f
--- /dev/null
@@ -0,0 +1,10 @@
+<html>\r
+<head>\r
+  <meta http-equiv="refresh" content="0; URL=cds-api/index.html" />\r
+  <title></title>\r
+</head>\r
+\r
+<body>\r
+  Automatic redirection failed, please go to <a href="cds-api/index.html">index.html</a>.\r
+</body>\r
+</html>\r
diff --git a/license.txt b/license.txt
new file mode 100644 (file)
index 0000000..3b99361
--- /dev/null
@@ -0,0 +1,21 @@
+Copyright (c) 2011, Maxim Khiszinsky. All rights reserved.\r
+\r
+Redistribution and use in source and binary forms, with or without modification, \r
+are permitted provided that the following conditions are met:\r
+\r
+  1. Redistributions of source code must retain the above copyright notice, \r
+     this list of conditions and the following disclaimer.\r
+  2. Redistributions in binary form must reproduce the above copyright notice, \r
+     this list of conditions and the following disclaimer in the documentation and/or \r
+     other materials provided with the distribution.\r
+\r
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND \r
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \r
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \r
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \r
+OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/make_distrib.pl b/make_distrib.pl
new file mode 100644 (file)
index 0000000..cfd084d
--- /dev/null
@@ -0,0 +1,187 @@
+#!/usr/bin/perl\r
+\r
+my $version ;\r
+\r
+my $svnRelPath  ;\r
+getRelPath()    ;\r
+print "Relative path: $svnRelPath\n"    ;\r
+my $upToRoot ;\r
+if ( $svnRelPath =~ /trunk/ ) {\r
+    $upToRoot = '..' ;\r
+}\r
+else {\r
+    $upToRoot = '..\\..' ;\r
+}\r
+# my $upToRoot = $svnRelPath      ;\r
+# $upToRoot =~ s/([^\/]+)/../g    ;\r
+# $upToRoot = "../$upToRoot"      ;\r
+print "upToRoot: $upToRoot\n"    ;\r
+\r
+getVersion()   ;\r
+print "Version $version\n"     ;\r
+\r
+my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);\r
+$year += 1900  ;\r
+\r
+my $distrPath = "cds-distrib/cds-$version" ;\r
+my $relDistrPath = "$upToRoot/$distrPath"   ;\r
+\r
+print "export SVN...\n" ;\r
+exportSVN()    ;\r
+\r
+my $nTabsFound = 0 ;\r
+\r
+print "make copyright...\n" ;\r
+makeCopyright()        ;\r
+patchFile("$relDistrPath/build/Makefile", 'VERSION=\d+\.\d+\.\d+', "VERSION=$version" ) ;\r
+patchFile("$relDistrPath/doxygen/cds.doxy", 'PROJECT_NUMBER\s*=\s*\d+\.\d+\.\d+', "PROJECT_NUMBER = $version" ) ;\r
+patchFile("$relDistrPath/projects/Win/vc2008/cds.2008.vcproj", 'CDS_USE_VLD', 'xCDS_USE_VLD' ) ;\r
+patchFile("$relDistrPath/projects/Win/vc2008/unit.2008.vcproj", 'CDS_USE_VLD', 'xCDS_USE_VLD' ) ;\r
+patchFile("$relDistrPath/projects/android/jni/Android.mk", 'CDS_LIBRARY_VERSION\s*:=\s*\d+\.\d+\.\d+', \r
+   "CDS_LIBRARY_VERSION := $version" );\r
+\r
+print "Tabs found: $nTabsFound\n" ;\r
+\r
+print "make docs...\n" ;\r
+`cd $relDistrPath && make_docs.bat` ;\r
+`rm -f $relDistrPath/make_distrib.pl`  ;\r
+`rm -fr $relDistrPath/scripts` ;\r
+`rm -f $relDistrPath/doxygen/doxygen.log`      ;\r
+\r
+print "make zip...\n" ;\r
+`rm -f $relDistrPath/../cds-$version.zip` ;\r
+`cd $relDistrPath/.. && 7za a cds-$version.zip cds-$version` ;\r
+\r
+print "Done\n" ;\r
+\r
+exit ;\r
+\r
+sub getVersion()\r
+{\r
+       open( my $fh, 'cds/version.h' ) or die "ERROR: Cannot find cds/version.h file";\r
+       binmode $fh ;\r
+       \r
+       while (<$fh>) {\r
+               if ( /CDS_VERSION_STRING.+(\d+\.\d+\.\d+)/ ) {\r
+                       $version = $1 ;\r
+                       last    ;\r
+               }\r
+       }\r
+       close $fh ;\r
+       die "ERROR: cannot find version in cds/version.h" unless $version ;\r
+}\r
+\r
+sub getRelPath()\r
+{\r
+    my $svn = `svn info` ;\r
+    ($svnRelPath) = $svn =~ /Working\sCopy\sRoot\sPath:\s+(.+)/ ;\r
+\r
+    # my ($curDir) = $svn =~ /URL:\s+(.+)/ ;\r
+    # my ($rootDir) = $svn =~ /Repository\s+Root:\s+(.+)/ ;\r
+    # $rootDir =~ s/\+/\\\+/g ;\r
+    \r
+    # ($svnRelPath) = $curDir =~ /$rootDir\/(.+)/ ;\r
+}\r
+\r
+sub exportSVN()\r
+{\r
+       `cd $upToRoot && rm -fr $distrPath && svn export $svnRelPath $distrPath` ;\r
+}\r
+\r
+sub makeCopyright() \r
+{\r
+       processDir( "$relDistrPath/cds" ) ;\r
+       processDir( "$relDistrPath/src" ) ;\r
+       processDir( "$relDistrPath/tests/test-hdr" ) ;\r
+       processDir( "$relDistrPath/tests/unit" ) ;\r
+       processDir( "$relDistrPath/tests/cppunit" ) ;\r
+}\r
+\r
+sub processDir( $ )\r
+{\r
+       my $dirName = shift ;\r
+       \r
+       opendir(my $dh, $dirName) || die "can't opendir $dirName: $!";\r
+    my @files = grep { /^[^\.]/ } readdir($dh);\r
+    closedir $dh;\r
+       \r
+       foreach my $file ( @files ) {\r
+               if ( -d "$dirName/$file" ) {\r
+                       processDir("$dirName/$file")    ;\r
+               }\r
+               elsif ( $file =~ /\.(h|cpp)$/ ) {\r
+                       processFile( "$dirName/$file" ) ;\r
+               }\r
+       }\r
+}\r
+\r
+sub processFile( $ ) \r
+{\r
+       my $file = shift        ;\r
+\r
+       \r
+       if ( open( my $fh, $file )) {\r
+               binmode $fh     ;\r
+               my $str = ''            ;\r
+               while (<$fh>) {\r
+                       if ( /^\/\/\$\$CDS-header\$\$/ ) {\r
+                               $str .= \r
+"/*\r
+    This file is a part of libcds - Concurrent Data Structures library\r
+    See http://libcds.sourceforge.net/\r
+\r
+    (C) Copyright Maxim Khiszinsky (libcds.sf\@gmail.com) 2006-$year\r
+    Distributed under the BSD license (see accompanying file license.txt)\r
+\r
+    Version $version\r
+*/\n\n" ;\r
+                       }\r
+                       elsif ( /^\/\/\$\$CDS-\/\*\$\$/ ) {\r
+                               $str .= "/*\n" ;\r
+                       }\r
+                       elsif ( /^\/\/\$\$CDS-\*\/\$\$/ ) {\r
+                               $str .= "*/\n" ;\r
+                       }\r
+                       else {\r
+                $nTabsFound += $_ =~ s/\t/    /g;\r
+                $_ =~ s/\s+$//  ;\r
+                               $_ =~ s/\s+;$/;/;\r
+                               $str .= $_      ;\r
+                $str .= "\n"    ;\r
+                       }\r
+               }\r
+               close $fh       ;\r
+               \r
+               if ( open( my $fh, ">$file" )) {\r
+                       binmode $fh     ;\r
+                       print $fh $str  ;\r
+                       close $fh               ;\r
+               }\r
+       }\r
+}\r
+\r
+sub patchFile(@) {\r
+       my $file = shift        ;\r
+       my $seek = shift        ;\r
+       my $repl = shift        ;\r
+       \r
+       if ( open( my $fh, $file )) {\r
+               binmode $fh     ;\r
+               \r
+               my $str = ''    ;\r
+               $str .= $_ while <$fh>  ;\r
+               close $fh ;\r
+               \r
+               $str =~ s/$seek/$repl/g ;\r
+               \r
+               if ( open( my $fh, ">$file" )) {\r
+                       binmode $fh     ;\r
+                       print $fh $str  ;\r
+                       close $fh               ;\r
+               }\r
+       }\r
+}\r
+\r
+\r
+\r
+\r
diff --git a/make_docs.bat b/make_docs.bat
new file mode 100644 (file)
index 0000000..2db6c01
--- /dev/null
@@ -0,0 +1,6 @@
+rm -fr doc\r
+md doc\r
+set DOXYPRJ_ROOT=.\r
+%DOXYGEN_PATH%\bin\doxygen doxygen\cds.doxy > doxygen\doxygen.log 2>&1\r
+cp -f doxygen/index.html doc/index.html\r
+\r
diff --git a/projects/Win/build-msbuild.cmd b/projects/Win/build-msbuild.cmd
new file mode 100644 (file)
index 0000000..6e89a00
--- /dev/null
@@ -0,0 +1,14 @@
+:: Command line arguments:\r
+:: %1 - Visual C++ version: vc10 (2010), vc11 (2012), vc12 (2013)\r
+:: %2 - configuration to build (Release, Debug etc)\r
+:: %3,%4,...%9 - [optional] additional MSBuild options\r
+\r
+set vcXX=%1\r
+set cfg=%2 \r
+set MSBUILD=msbuild\r
+\r
+:make\r
+for %%A in (x64 Win32) do (\r
+  %MSBUILD% %vcXX%\cds.sln /t:Clean /p:Configuration=%cfg% /p:Platform=%%A %3 %4 %5 %6 %7 %8 %9\r
+  %MSBUILD% %vcXX%\cds.sln /t:Build /p:Configuration=%cfg% /p:Platform=%%A /fl /flp:LogFile=%vcXX%_%%A.log;Encoding=UTF-8;Verbosity=minimal /v:minimal /maxcpucount %3 %4 %5 %6 %7 %8 %9\r
+)\r
diff --git a/projects/Win/build-vc10.cmd b/projects/Win/build-vc10.cmd
new file mode 100644 (file)
index 0000000..75ce241
--- /dev/null
@@ -0,0 +1,2 @@
+call %VS100COMNTOOLS%\vsvars32.bat\r
+call build-msbuild.cmd vc10 Release /tv:4.0\r
diff --git a/projects/Win/build-vc11.cmd b/projects/Win/build-vc11.cmd
new file mode 100644 (file)
index 0000000..a4893ac
--- /dev/null
@@ -0,0 +1,2 @@
+call %VS110COMNTOOLS%\vsvars32.bat\r
+call build-msbuild.cmd vc11 Release /tv:4.0\r
diff --git a/projects/Win/build-vc12.cmd b/projects/Win/build-vc12.cmd
new file mode 100644 (file)
index 0000000..b642037
--- /dev/null
@@ -0,0 +1,2 @@
+call %VS120COMNTOOLS%\vsvars32.bat\r
+call build-msbuild.cmd vc12 Release /tv:12.0 /m\r
diff --git a/projects/Win/build-vc9.cmd b/projects/Win/build-vc9.cmd
new file mode 100644 (file)
index 0000000..2ae9d9b
--- /dev/null
@@ -0,0 +1,9 @@
+call %VS90COMNTOOLS%\vsvars32.bat\r
+\r
+set cfg=Release\r
+\r
+devenv /clean "%cfg%|x64" vc9\cds.sln\r
+devenv vc9\cds.sln /build "%cfg%|x64" 2>&1 |tee vc9_x64.log\r
+\r
+devenv /clean "%cfg%|Win32" vc9\cds.sln\r
+devenv vc9\cds.sln /build "%cfg%|Win32" 2>&1 |tee vc9_win32.log
\ No newline at end of file
diff --git a/projects/Win/vc10/cds.sln b/projects/Win/vc10/cds.sln
new file mode 100644 (file)
index 0000000..b0b105e
--- /dev/null
@@ -0,0 +1,618 @@
+Microsoft Visual Studio Solution File, Format Version 11.00\r
+# Visual Studio 2010\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cds", "cds.vcxproj", "{408FE9BC-44F0-4E6A-89FA-D6F952584239}"\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unit-test", "unit-test", "{9BA2772D-DFC6-4157-A3A1-ACFCAD6AB881}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-prerequisites", "unit-prerequisites.vcxproj", "{61179F2F-07E1-490D-B64D-D85A90B6EF81}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-misc", "unit-misc.vcxproj", "{77350FDC-9E51-438B-9A8F-D2FEA11D46B2}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-queue", "unit-queue.vcxproj", "{6C15AF8A-4A99-49F9-BCF0-1BF36771099A}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-stack", "unit-stack.vcxproj", "{E29DE1F7-AE8D-4AE6-98B1-147E5103D974}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hdr-test", "hdr-test", "{13E58F73-EB8F-41B7-874B-2D29D65C405E}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\test-hdr\size_check.h = ..\..\..\tests\test-hdr\size_check.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-deque", "hdr-test-deque.vcxproj", "{CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-map", "hdr-test-map.vcxproj", "{282E9A9A-386A-40FB-A483-994BACE24830}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-misc", "hdr-test-misc.vcxproj", "{C5E76975-B87B-4B9E-8596-B01DDA683FCA}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-ordered-list", "hdr-test-ordered-list.vcxproj", "{EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-queue", "hdr-test-queue.vcxproj", "{33664E63-8D24-4FF4-A744-9782EB711509}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-set", "hdr-test-set.vcxproj", "{E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-striped-set", "hdr-test-striped-set.vcxproj", "{81A87B2D-4F17-474E-95A7-9B06804F5063}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-stack", "hdr-test-stack.vcxproj", "{E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-tree", "hdr-test-tree.vcxproj", "{6F834EAD-7B94-4979-A0F1-A662E3D30145}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "map", "map", "{8870404E-BE8B-4A0B-B2FD-E1B7813B07D9}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\unit\map2\map_defs.h = ..\..\..\tests\unit\map2\map_defs.h\r
+               ..\..\..\tests\unit\map2\map_types.h = ..\..\..\tests\unit\map2\map_types.h\r
+               ..\..\..\tests\unit\map2\std_hash_map.h = ..\..\..\tests\unit\map2\std_hash_map.h\r
+               ..\..\..\tests\unit\map2\std_hash_map_gcc.h = ..\..\..\tests\unit\map2\std_hash_map_gcc.h\r
+               ..\..\..\tests\unit\map2\std_hash_map_vc.h = ..\..\..\tests\unit\map2\std_hash_map_vc.h\r
+               ..\..\..\tests\unit\map2\std_map.h = ..\..\..\tests\unit\map2\std_map.h\r
+               ..\..\..\tests\unit\map2\std_map_gcc.h = ..\..\..\tests\unit\map2\std_map_gcc.h\r
+               ..\..\..\tests\unit\map2\std_map_vc.h = ..\..\..\tests\unit\map2\std_map_vc.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "set", "set", "{BB8D2051-1482-4869-A170-C0452DB81C9E}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\unit\set2\set_defs.h = ..\..\..\tests\unit\set2\set_defs.h\r
+               ..\..\..\tests\unit\set2\set_types.h = ..\..\..\tests\unit\set2\set_types.h\r
+               ..\..\..\tests\unit\set2\std_hash_set.h = ..\..\..\tests\unit\set2\std_hash_set.h\r
+               ..\..\..\tests\unit\set2\std_hash_set_std.h = ..\..\..\tests\unit\set2\std_hash_set_std.h\r
+               ..\..\..\tests\unit\set2\std_hash_set_vc9.h = ..\..\..\tests\unit\set2\std_hash_set_vc9.h\r
+               ..\..\..\tests\unit\set2\std_set.h = ..\..\..\tests\unit\set2\std_set.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-delodd", "unit-map-delodd.vcxproj", "{3EF80910-0929-4DB7-A887-9548EF8A7A41}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-find", "unit-map-find.vcxproj", "{85F77A9C-D482-4C5E-A383-05601EA8703F}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-insdel", "unit-map-insdel.vcxproj", "{8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-set-delodd", "unit-set-delodd.vcxproj", "{3C5EBF73-1565-4999-89E2-DD97EB89C172}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-set-insdel", "unit-set-insdel.vcxproj", "{F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-priority_queue", "hdr-test-priority_queue.vcxproj", "{FF477D60-02E9-4AA7-BAED-7D04673853A6}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-pqueue", "unit-pqueue.vcxproj", "{20B6C380-E96A-4CFF-BC17-D88AAE581919}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Win32 = Debug|Win32\r
+               Debug|x64 = Debug|x64\r
+               DebugVLD|Win32 = DebugVLD|Win32\r
+               DebugVLD|x64 = DebugVLD|x64\r
+               ICL-Debug|Win32 = ICL-Debug|Win32\r
+               ICL-Debug|x64 = ICL-Debug|x64\r
+               ICL-Release|Win32 = ICL-Release|Win32\r
+               ICL-Release|x64 = ICL-Release|x64\r
+               Release|Win32 = Release|Win32\r
+               Release|x64 = Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|Win32.Build.0 = Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|x64.ActiveCfg = Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|x64.Build.0 = Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|Win32.ActiveCfg = Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|Win32.Build.0 = Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|x64.ActiveCfg = Release|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|x64.Build.0 = Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|Win32.Build.0 = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|x64.ActiveCfg = Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|x64.Build.0 = Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|Win32.ActiveCfg = Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|Win32.Build.0 = Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|x64.ActiveCfg = Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|x64.Build.0 = Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|Win32.Build.0 = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|x64.ActiveCfg = Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|x64.Build.0 = Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|Win32.ActiveCfg = Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|Win32.Build.0 = Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|x64.ActiveCfg = Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|x64.Build.0 = Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|Win32.Build.0 = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|x64.ActiveCfg = Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|x64.Build.0 = Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|Win32.ActiveCfg = Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|Win32.Build.0 = Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|x64.ActiveCfg = Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|x64.Build.0 = Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|x64.Build.0 = Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|Win32.Build.0 = Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|x64.ActiveCfg = Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|x64.Build.0 = Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|Win32.Build.0 = Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|x64.ActiveCfg = Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|x64.Build.0 = Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|Win32.ActiveCfg = Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|Win32.Build.0 = Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|x64.ActiveCfg = Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|x64.Build.0 = Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|Win32.Build.0 = Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|x64.ActiveCfg = Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|x64.Build.0 = Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|Win32.ActiveCfg = Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|Win32.Build.0 = Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|x64.ActiveCfg = Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|x64.Build.0 = Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|Win32.Build.0 = Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|x64.ActiveCfg = Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|x64.Build.0 = Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|Win32.ActiveCfg = Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|Win32.Build.0 = Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|x64.ActiveCfg = Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|x64.Build.0 = Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|Win32.Build.0 = Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|x64.ActiveCfg = Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|x64.Build.0 = Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|Win32.ActiveCfg = Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|Win32.Build.0 = Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|x64.ActiveCfg = Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|x64.Build.0 = Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|Win32.Build.0 = Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|x64.ActiveCfg = Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|x64.Build.0 = Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|Win32.ActiveCfg = Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|Win32.Build.0 = Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|x64.ActiveCfg = Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|x64.Build.0 = Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|x64.Build.0 = Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|Win32.Build.0 = Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|x64.ActiveCfg = Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|x64.Build.0 = Release|x64\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.Debug|Win32.Build.0 = Debug|Win32\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.Debug|x64.ActiveCfg = Debug|x64\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.Debug|x64.Build.0 = Debug|x64\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.Release|Win32.ActiveCfg = Release|Win32\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.Release|Win32.Build.0 = Release|Win32\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.Release|x64.ActiveCfg = Release|x64\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063}.Release|x64.Build.0 = Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|x64.Build.0 = Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|Win32.Build.0 = Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|x64.ActiveCfg = Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|x64.Build.0 = Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|Win32.Build.0 = Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|x64.ActiveCfg = Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|x64.Build.0 = Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|Win32.ActiveCfg = Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|Win32.Build.0 = Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|x64.ActiveCfg = Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|x64.Build.0 = Release|x64\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.Debug|Win32.Build.0 = Debug|Win32\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.Debug|x64.ActiveCfg = Debug|x64\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.Debug|x64.Build.0 = Debug|x64\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.Release|Win32.ActiveCfg = Release|Win32\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.Release|Win32.Build.0 = Release|Win32\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.Release|x64.ActiveCfg = Release|x64\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41}.Release|x64.Build.0 = Release|x64\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.Debug|Win32.Build.0 = Debug|Win32\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.Debug|x64.ActiveCfg = Debug|x64\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.Debug|x64.Build.0 = Debug|x64\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.Release|Win32.ActiveCfg = Release|Win32\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.Release|Win32.Build.0 = Release|Win32\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.Release|x64.ActiveCfg = Release|x64\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F}.Release|x64.Build.0 = Release|x64\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.Debug|Win32.Build.0 = Debug|Win32\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.Debug|x64.ActiveCfg = Debug|x64\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.Debug|x64.Build.0 = Debug|x64\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.Release|Win32.ActiveCfg = Release|Win32\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.Release|Win32.Build.0 = Release|Win32\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.Release|x64.ActiveCfg = Release|x64\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7}.Release|x64.Build.0 = Release|x64\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.Debug|Win32.Build.0 = Debug|Win32\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.Debug|x64.ActiveCfg = Debug|x64\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.Debug|x64.Build.0 = Debug|x64\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.Release|Win32.ActiveCfg = Release|Win32\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.Release|Win32.Build.0 = Release|Win32\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.Release|x64.ActiveCfg = Release|x64\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172}.Release|x64.Build.0 = Release|x64\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.Debug|Win32.Build.0 = Debug|Win32\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.Debug|x64.ActiveCfg = Debug|x64\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.Debug|x64.Build.0 = Debug|x64\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.Release|Win32.ActiveCfg = Release|Win32\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.Release|Win32.Build.0 = Release|Win32\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.Release|x64.ActiveCfg = Release|x64\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F}.Release|x64.Build.0 = Release|x64\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.Debug|Win32.Build.0 = Debug|Win32\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.Debug|x64.ActiveCfg = Debug|x64\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.Debug|x64.Build.0 = Debug|x64\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.Release|Win32.ActiveCfg = Release|Win32\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.Release|Win32.Build.0 = Release|Win32\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.Release|x64.ActiveCfg = Release|x64\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6}.Release|x64.Build.0 = Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|Win32.Build.0 = Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|x64.ActiveCfg = Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|x64.Build.0 = Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|Win32.ActiveCfg = Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|Win32.Build.0 = Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|x64.ActiveCfg = Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|x64.Build.0 = Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+       GlobalSection(NestedProjects) = preSolution\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {9BA2772D-DFC6-4157-A3A1-ACFCAD6AB881}\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2} = {9BA2772D-DFC6-4157-A3A1-ACFCAD6AB881}\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A} = {9BA2772D-DFC6-4157-A3A1-ACFCAD6AB881}\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974} = {9BA2772D-DFC6-4157-A3A1-ACFCAD6AB881}\r
+               {8870404E-BE8B-4A0B-B2FD-E1B7813B07D9} = {9BA2772D-DFC6-4157-A3A1-ACFCAD6AB881}\r
+               {BB8D2051-1482-4869-A170-C0452DB81C9E} = {9BA2772D-DFC6-4157-A3A1-ACFCAD6AB881}\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919} = {9BA2772D-DFC6-4157-A3A1-ACFCAD6AB881}\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026} = {13E58F73-EB8F-41B7-874B-2D29D65C405E}\r
+               {282E9A9A-386A-40FB-A483-994BACE24830} = {13E58F73-EB8F-41B7-874B-2D29D65C405E}\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA} = {13E58F73-EB8F-41B7-874B-2D29D65C405E}\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805} = {13E58F73-EB8F-41B7-874B-2D29D65C405E}\r
+               {33664E63-8D24-4FF4-A744-9782EB711509} = {13E58F73-EB8F-41B7-874B-2D29D65C405E}\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7} = {13E58F73-EB8F-41B7-874B-2D29D65C405E}\r
+               {81A87B2D-4F17-474E-95A7-9B06804F5063} = {13E58F73-EB8F-41B7-874B-2D29D65C405E}\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18} = {13E58F73-EB8F-41B7-874B-2D29D65C405E}\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145} = {13E58F73-EB8F-41B7-874B-2D29D65C405E}\r
+               {FF477D60-02E9-4AA7-BAED-7D04673853A6} = {13E58F73-EB8F-41B7-874B-2D29D65C405E}\r
+               {3EF80910-0929-4DB7-A887-9548EF8A7A41} = {8870404E-BE8B-4A0B-B2FD-E1B7813B07D9}\r
+               {85F77A9C-D482-4C5E-A383-05601EA8703F} = {8870404E-BE8B-4A0B-B2FD-E1B7813B07D9}\r
+               {8F691043-C5B1-4C8B-9BA6-83023A0FF0C7} = {8870404E-BE8B-4A0B-B2FD-E1B7813B07D9}\r
+               {3C5EBF73-1565-4999-89E2-DD97EB89C172} = {BB8D2051-1482-4869-A170-C0452DB81C9E}\r
+               {F7E5E798-D46B-4FB9-925A-4ECFE5A47C9F} = {BB8D2051-1482-4869-A170-C0452DB81C9E}\r
+       EndGlobalSection\r
+       GlobalSection(DPCodeReviewSolutionGUID) = preSolution\r
+               DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/projects/Win/vc10/cds.vcxproj b/projects/Win/vc10/cds.vcxproj
new file mode 100644 (file)
index 0000000..91804c6
--- /dev/null
@@ -0,0 +1,1047 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{408FE9BC-44F0-4E6A-89FA-D6F952584239}</ProjectGuid>\r
+    <RootNamespace>cds</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</GenerateManifest>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</GenerateManifest>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">true</GenerateManifest>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</PostBuildEventUseInBuild>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</PostBuildEventUseInBuild>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</PostBuildEventUseInBuild>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">true</GenerateManifest>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</PostBuildEventUseInBuild>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</PostBuildEventUseInBuild>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</PostBuildEventUseInBuild>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">true</GenerateManifest>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">true</GenerateManifest>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">libcds-x86-vc10_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">libcds-x86-vc10_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">libcds-x86-vc10</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">libcds-x86-icl</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">libcds-x86-icl</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">libcds-amd64-vc10_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">libcds-amd64-vc10_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">libcds-amd64-vc10</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">libcds-amd64-icl</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">libcds-amd64-icl</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>false</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+      <SuppressStartupBanner>false</SuppressStartupBanner>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>false</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+      <SuppressStartupBanner>false</SuppressStartupBanner>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>false</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+      <SuppressStartupBanner>false</SuppressStartupBanner>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\src\dllmain.cpp" />\r
+    <ClCompile Include="..\..\..\src\hrc_gc.cpp" />\r
+    <ClCompile Include="..\..\..\src\hzp_gc.cpp" />\r
+    <ClCompile Include="..\..\..\src\init.cpp" />\r
+    <ClCompile Include="..\..\..\src\michael_heap.cpp" />\r
+    <ClCompile Include="..\..\..\src\ptb_gc.cpp" />\r
+    <ClCompile Include="..\..\..\src\topology_hpux.cpp" />\r
+    <ClCompile Include="..\..\..\src\topology_linux.cpp" />\r
+    <ClCompile Include="..\..\..\src\topology_osx.cpp" />\r
+    <ClCompile Include="..\..\..\src\urcu_gp.cpp" />\r
+    <ClCompile Include="..\..\..\src\urcu_sh.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\cds\algo\base.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\elimination.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_opt.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_tls.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\flat_combining.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\cxx11_atomic_prepatches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_boost.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_std.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_patches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_prepatches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_macro.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\cxx11_atomic_patches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\compiler_barriers.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\cxx11_atomic_patches_win.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\container\basket_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\guarded_ptr_cast.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_refinable_hash_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_deque.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\mspriority_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_flat_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_slist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_unordered_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_std.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_vc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\adapter.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_flat_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_slist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_stable_vector.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_unordered_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_vector.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_std.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_vc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_vector.h" />\r
+    <ClInclude Include="..\..\..\cds\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\details\binary_functor_wrapper.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bit_reverse_counter.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bounded_container.h" />\r
+    <ClInclude Include="..\..\..\cds\details\cxx11_features.h" />\r
+    <ClInclude Include="..\..\..\cds\details\hash_functor_selector.h" />\r
+    <ClInclude Include="..\..\..\cds\details\lib.h" />\r
+    <ClInclude Include="..\..\..\cds\details\static_functor.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\condition_variable.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\memory.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\mutex.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\chrono.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\tuple.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\type_traits.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\all.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\exception.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\gc_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\guarded_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hp_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hp_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\basket_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\deque_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\dummy_node_holder.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\ellen_bintree_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_deque.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\mspriority_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\node_traits.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\options.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\adapter.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_avl_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_list.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_sg_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_slist.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_splay_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_treap_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_unordered_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\resizing_policy.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\striping_policy.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\mapper.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\pool_allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\vyukov_queue_pool.h" />\r
+    <ClInclude Include="..\..\..\cds\os\osx\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\osx\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\fake_topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\base.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\check_deadlock.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpb.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpi.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpt.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_buffered.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_threaded.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\dispose_thread.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\exempt_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\general_buffered.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\general_instant.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\general_threaded.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\options.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_buffered.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_threaded.h" />\r
+    <ClInclude Include="..\..\..\src\hzp_const.h" />\r
+    <ClInclude Include="..\..\..\cds\backoff_strategy.h" />\r
+    <ClInclude Include="..\..\..\cds\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\init.h" />\r
+    <ClInclude Include="..\..\..\cds\int_algo.h" />\r
+    <ClInclude Include="..\..\..\cds\numtraits.h" />\r
+    <ClInclude Include="..\..\..\cds\ref.h" />\r
+    <ClInclude Include="..\..\..\cds\refcounter.h" />\r
+    <ClInclude Include="..\..\..\cds\version.h" />\r
+    <ClInclude Include="..\..\..\cds\details\aligned_allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\details\aligned_type.h" />\r
+    <ClInclude Include="..\..\..\cds\details\allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bitop_generic.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bounded_array.h" />\r
+    <ClInclude Include="..\..\..\cds\details\comparator.h" />\r
+    <ClInclude Include="..\..\..\cds\details\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\details\functor_wrapper.h" />\r
+    <ClInclude Include="..\..\..\cds\details\is_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\details\make_const_type.h" />\r
+    <ClInclude Include="..\..\..\cds\details\marked_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\details\noncopyable.h" />\r
+    <ClInclude Include="..\..\..\cds\impl\queue_base.h" />\r
+    <ClInclude Include="..\..\..\cds\details\trivial_assign.h" />\r
+    <ClInclude Include="..\..\..\cds\details\type_padding.h" />\r
+    <ClInclude Include="..\..\..\cds\details\void_selector.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\default_gc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hp.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_alloc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_inline.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_retired.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_type.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\hzp.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\gc_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_inline.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_retired.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb\ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\details\retired_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\user_setup\allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\user_setup\cache_line.h" />\r
+    <ClInclude Include="..\..\..\cds\user_setup\threading.h" />\r
+    <ClInclude Include="..\..\..\cds\lock\spinlock.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\_common.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\auto_detect.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\model.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_barriers.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\compiler_barriers.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\os\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\syserror.h" />\r
+    <ClInclude Include="..\..\..\cds\os\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\os\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\hpux\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\hpux\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\hpux\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\linux\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\linux\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\linux\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\syserror.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\os\sunos\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\sunos\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\sunos\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\syserror.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\aix\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\aix\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\aix\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\libc\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\details\fake_topology.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\bound_check.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\options.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\osalloc_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\procheap_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\buffer.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\compare.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\hash.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_std.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_var.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\options.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\permutation.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\value_cleaner.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcstack.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\moir_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\msqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\optimistic_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\queue_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\single_link_struct.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\treiber_stack.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\tsigas_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\vyukov_mpmc_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcdeque.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcpriority_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcstack.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\moir_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\msqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\optimistic_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\rwqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\treiber_stack.h" />\r
+    <ClInclude Include="..\..\..\cds\container\tsigas_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\vyukov_mpmc_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_kvlist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_kvlist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_split_list_set.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/cds.vcxproj.filters b/projects/Win/vc10/cds.vcxproj.filters
new file mode 100644 (file)
index 0000000..0b58ea3
--- /dev/null
@@ -0,0 +1,1338 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="Source Files">\r
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r
+      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r
+    </Filter>\r
+    <Filter Include="Header Files">\r
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds">\r
+      <UniqueIdentifier>{202add83-3de8-46db-a1aa-4c0030beae1a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\details">\r
+      <UniqueIdentifier>{0051e611-824f-49c5-b100-df394c55975a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc">\r
+      <UniqueIdentifier>{a3c9928d-5261-4593-a8b9-728235f7056f}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\hzp">\r
+      <UniqueIdentifier>{21a6c665-7381-45b8-9f03-b21f3da5503d}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\hrc">\r
+      <UniqueIdentifier>{695568b2-b136-4b80-bd18-6e3e13c22301}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\ptb">\r
+      <UniqueIdentifier>{53d28ee4-5fe9-4fa1-a617-53d8b0628eac}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\details">\r
+      <UniqueIdentifier>{d7c48c0e-cc45-4a1a-b8e9-aa5b50abd22a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\user_setup">\r
+      <UniqueIdentifier>{f9f695b1-1322-437c-87b2-c243d83e1b0c}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\lock">\r
+      <UniqueIdentifier>{189d2da3-ba56-44b2-be2a-fad41fd75c4e}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\threading">\r
+      <UniqueIdentifier>{1af712b3-4429-4ecc-b0a2-f9c639decd19}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler">\r
+      <UniqueIdentifier>{4cce5abe-4256-4883-988d-2e725f38eee4}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc">\r
+      <UniqueIdentifier>{98435c30-814f-40fb-8906-0e7847db55ff}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\amd64">\r
+      <UniqueIdentifier>{87ab6aea-29b2-4e79-ad22-2190fa3c5870}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\ia64">\r
+      <UniqueIdentifier>{9aedc993-3ad3-4f6b-9df0-cdf5a69a3ae0}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\sparc">\r
+      <UniqueIdentifier>{44e1d2da-18b3-416f-9aeb-d937d46b5479}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\x86">\r
+      <UniqueIdentifier>{45671e15-bec1-47fd-a174-a7b57bb55458}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\ppc64">\r
+      <UniqueIdentifier>{58c4d0de-4802-4a0f-9f03-37b338b9d08a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\vc">\r
+      <UniqueIdentifier>{04b93d00-cb76-468a-86ce-f03ba531e47d}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\vc\x86">\r
+      <UniqueIdentifier>{2a690a60-0be8-423f-91cb-7f198b4bc507}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\vc\amd64">\r
+      <UniqueIdentifier>{125d466a-6e6e-4c88-9c60-475557797d91}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS">\r
+      <UniqueIdentifier>{f058a2ad-989d-45e9-9bb2-43dfda122708}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\hpux">\r
+      <UniqueIdentifier>{36e1bb0b-ab23-4484-8fb2-cc52bad3dbe3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\linux">\r
+      <UniqueIdentifier>{6d27baa4-414b-41a6-a7e0-72e406af5543}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\posix">\r
+      <UniqueIdentifier>{00c94a5c-9f94-427b-9739-fc06a2f39167}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\sunos">\r
+      <UniqueIdentifier>{4bc2a231-2ea0-4af8-84ad-534a76fda942}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\win">\r
+      <UniqueIdentifier>{64c62189-73c0-4c45-9bf5-aed7b5c6c5e4}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\aix">\r
+      <UniqueIdentifier>{5cf9ca07-cadf-4854-a36d-f8293bffc553}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\libc">\r
+      <UniqueIdentifier>{20b237f6-e6fd-43bd-970d-4f1daf89f494}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\free_bsd">\r
+      <UniqueIdentifier>{f1518588-7c09-496e-81c0-a1ee55cc5d21}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\details">\r
+      <UniqueIdentifier>{fcebfe0e-30de-48ac-8890-7497f1d97fba}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\memory">\r
+      <UniqueIdentifier>{5c631093-3ca2-4a36-acf7-2d9368b65366}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\memory\michael">\r
+      <UniqueIdentifier>{b7cdb65c-15d3-4655-abec-1e4640271432}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\opt">\r
+      <UniqueIdentifier>{fe7576b4-d93f-473a-8522-493feac51996}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\intrusive">\r
+      <UniqueIdentifier>{7226715d-6777-4c01-8e66-83b3885c00c1}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container">\r
+      <UniqueIdentifier>{84ca9e83-f6c9-4503-a45f-14f08317fd70}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container\details">\r
+      <UniqueIdentifier>{4b79fe31-4f6c-4e05-8910-1151a26d51f3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Resource Files">\r
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\clang">\r
+      <UniqueIdentifier>{48cc7cd0-fbd6-46fc-ae91-693d7ec85924}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\details\std">\r
+      <UniqueIdentifier>{903ea79d-4241-439d-91f8-32c1b735d0db}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\intrusive\striped_set">\r
+      <UniqueIdentifier>{251e804f-9dde-4e65-867c-4d3aae456868}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container\striped_map">\r
+      <UniqueIdentifier>{8ba63aec-041b-471e-b956-b62656367d9b}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container\striped_set">\r
+      <UniqueIdentifier>{a6a14876-fc00-46b2-8cbb-908129803e33}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\urcu">\r
+      <UniqueIdentifier>{d2a4c592-44ad-48ad-9110-4331ff0d2509}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\urcu\details">\r
+      <UniqueIdentifier>{b6b1c167-2351-42b7-8d5a-7f4671732414}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\intrusive\details">\r
+      <UniqueIdentifier>{3933ac98-c2ef-4fd2-9aca-69edbbc854f0}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\icl">\r
+      <UniqueIdentifier>{bc95b990-68c6-4245-9781-29ae5e952e2e}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\osx">\r
+      <UniqueIdentifier>{3b730524-324b-4104-b956-2f34892053a3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\algo">\r
+      <UniqueIdentifier>{8be21b5b-cd62-4c1f-b686-26add61b9656}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\src\dllmain.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\hrc_gc.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\hzp_gc.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\init.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\michael_heap.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\ptb_gc.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\topology_hpux.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\topology_linux.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\urcu_gp.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\urcu_sh.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\topology_osx.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\src\hzp_const.h">\r
+      <Filter>Source Files</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\backoff_strategy.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\bitop.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\init.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\int_algo.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\numtraits.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\ref.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\refcounter.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\version.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\aligned_allocator.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\aligned_type.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\allocator.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bitop_generic.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bounded_array.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\comparator.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\defs.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\functor_wrapper.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\is_aligned.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\make_const_type.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\marked_ptr.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\noncopyable.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\impl\queue_base.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\trivial_assign.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\type_padding.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\void_selector.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\default_gc.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hp.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\nogc.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_alloc.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_fwd.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_inline.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_retired.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_type.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\hzp.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\gc_fwd.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\hrc.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_fwd.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_inline.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_retired.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb\ptb.h">\r
+      <Filter>Header Files\cds\gc\ptb</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\details\retired_ptr.h">\r
+      <Filter>Header Files\cds\gc\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\user_setup\allocator.h">\r
+      <Filter>Header Files\cds\user_setup</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\user_setup\cache_line.h">\r
+      <Filter>Header Files\cds\user_setup</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\user_setup\threading.h">\r
+      <Filter>Header Files\cds\user_setup</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\lock\spinlock.h">\r
+      <Filter>Header Files\cds\lock</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\_common.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\auto_detect.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\model.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\backoff.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\bitop.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\defs.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_barriers.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\defs.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ia64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ia64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\sparc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\sparc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ppc64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ppc64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\compiler_barriers.h">\r
+      <Filter>Header Files\cds\compiler\vc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\defs.h">\r
+      <Filter>Header Files\cds\compiler\vc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\backoff.h">\r
+      <Filter>Header Files\cds\compiler\vc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\bitop.h">\r
+      <Filter>Header Files\cds\compiler\vc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\vc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\vc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\syserror.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\thread.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\timer.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\topology.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\hpux\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\hpux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\hpux\timer.h">\r
+      <Filter>Header Files\cds\OS\hpux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\hpux\topology.h">\r
+      <Filter>Header Files\cds\OS\hpux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\linux\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\linux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\linux\timer.h">\r
+      <Filter>Header Files\cds\OS\linux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\linux\topology.h">\r
+      <Filter>Header Files\cds\OS\linux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\syserror.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\thread.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\sunos\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\sunos</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\sunos\timer.h">\r
+      <Filter>Header Files\cds\OS\sunos</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\sunos\topology.h">\r
+      <Filter>Header Files\cds\OS\sunos</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\syserror.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\thread.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\timer.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\topology.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\aix\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\aix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\aix\timer.h">\r
+      <Filter>Header Files\cds\OS\aix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\aix\topology.h">\r
+      <Filter>Header Files\cds\OS\aix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\libc\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\libc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\free_bsd</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\timer.h">\r
+      <Filter>Header Files\cds\OS\free_bsd</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\topology.h">\r
+      <Filter>Header Files\cds\OS\free_bsd</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\details\fake_topology.h">\r
+      <Filter>Header Files\cds\OS\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\allocator.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\bound_check.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\options.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\osalloc_stat.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\procheap_stat.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\buffer.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\compare.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\hash.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_std.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_var.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\options.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\permutation.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\value_cleaner.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcqueue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcstack.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hrc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hrc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\moir_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\msqueue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\optimistic_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\queue_stat.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\segmented_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\single_link_struct.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\treiber_stack.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\tsigas_cycle_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\vyukov_mpmc_cycle_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcdeque.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcpriority_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcqueue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcstack.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\moir_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\msqueue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\optimistic_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\rwqueue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\segmented_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\treiber_stack.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\tsigas_cycle_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\vyukov_mpmc_cycle_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\guarded_ptr_cast.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_kvlist.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_list.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_kvlist.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_list.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_split_list_set.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hp_decl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hp_impl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_decl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_impl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_decl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_impl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\vc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\vc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\cxx11_atomic.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\sparc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ia64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_boost.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_std.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_patches.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\cxx11_atomic_patches.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bounded_container.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\hash_functor_selector.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\cxx11_features.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\all.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\defs.h">\r
+      <Filter>Header Files\cds\compiler\clang</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_deque.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\mapper.h">\r
+      <Filter>Header Files\cds\memory</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_deque.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\basket_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\basket_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_prepatches.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\cxx11_atomic_prepatches.h">\r
+      <Filter>Header Files\cds\compiler\clang</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\deque_stat.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\type_traits.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\memory.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_refinable_hash_set.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\tuple.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\cuckoo_set.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\adapter.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_avl_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_list.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_sg_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_slist.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_splay_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_treap_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_unordered_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\resizing_policy.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\striping_policy.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\adapter.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_flat_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_list.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_slist.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_stable_vector.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_unordered_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_vector.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_std.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_vc.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_list.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_vector.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_flat_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_list.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_slist.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_unordered_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_std.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_vc.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_list.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hrc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\exception.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_set.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_map.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\static_functor.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\condition_variable.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\mutex.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\thread.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\chrono.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\base.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp_decl.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpb.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpi.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpt.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\exempt_ptr.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\general_buffered.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\general_instant.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\general_threaded.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\node_traits.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\options.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\check_deadlock.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\options.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\binary_functor_wrapper.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\gc_fwd.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\dummy_node_holder.h">\r
+      <Filter>Header Files\cds\intrusive\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh_decl.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_buffered.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_threaded.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\dispose_thread.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_buffered.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_threaded.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\ellen_bintree_base.h">\r
+      <Filter>Header Files\cds\intrusive\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\pool_allocator.h">\r
+      <Filter>Header Files\cds\memory</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\vyukov_queue_pool.h">\r
+      <Filter>Header Files\cds\memory</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bit_reverse_counter.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\mspriority_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\defs.h">\r
+      <Filter>Header Files\cds\compiler\icl</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\cxx11_atomic_patches_win.h">\r
+      <Filter>Header Files\cds\compiler\icl</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\compiler_barriers.h">\r
+      <Filter>Header Files\cds\compiler\icl</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\lib.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\mspriority_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_macro.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\fake_topology.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\timer.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\osx\timer.h">\r
+      <Filter>Header Files\cds\OS\osx</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\osx\topology.h">\r
+      <Filter>Header Files\cds\OS\osx</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\guarded_ptr.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\base.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\elimination.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_opt.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_tls.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\flat_combining.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-deque.vcxproj b/projects/Win/vc10/hdr-test-deque.vcxproj
new file mode 100644 (file)
index 0000000..eee7f86
--- /dev/null
@@ -0,0 +1,555 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}</ProjectGuid>\r
+    <RootNamespace>hdrtestdeque</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\deque\hdr_deque.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\deque\hdr_intrusive_deque.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_fcdeque.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_intrusive_michael_deque_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_intrusive_michael_deque_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_michael_deque_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_michael_deque_ptb.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-map.vcxproj b/projects/Win/vc10/hdr-test-map.vcxproj
new file mode 100644 (file)
index 0000000..9c144e6
--- /dev/null
@@ -0,0 +1,619 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{282E9A9A-386A-40FB-A483-994BACE24830}</ProjectGuid>\r
+    <RootNamespace>hdrtestmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_striped_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\print_skiplist_stat.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_flat_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_unordered_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_flat_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_unordered_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_map_reg.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-map.vcxproj.filters b/projects/Win/vc10/hdr-test-map.vcxproj.filters
new file mode 100644 (file)
index 0000000..e7de3f0
--- /dev/null
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.cpp">\r
+      <Filter>cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hp.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_ptb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hrc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hp.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hrc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_nogc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_ptb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_nogc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_flat_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_slist.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_unordered_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_std.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_vc.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hp.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_ptb.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hrc.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hp.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_ptb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hrc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hp.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hrc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_nogc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_ptb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_nogc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_flat_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_slist.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_unordered_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_std.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_vc.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpi.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpt.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpi.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpt.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpi.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpt.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpi.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpt.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpb.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpi.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpt.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_nogc.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_map_reg.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_shb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_sht.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_shb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_sht.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_shb.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_sht.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_shb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_sht.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_shb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_sht.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\print_skiplist_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map.h">\r
+      <Filter>skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu.h">\r
+      <Filter>skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_striped_map.h">\r
+      <Filter>striped</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.h">\r
+      <Filter>cuckoo</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="cuckoo">\r
+      <UniqueIdentifier>{461285c3-7f6b-46dc-b81d-d3bdda1d1de5}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="michael">\r
+      <UniqueIdentifier>{ff9bff4e-3bb7-4189-8a75-95400c4d7b06}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="striped">\r
+      <UniqueIdentifier>{8f87f661-bbcd-40b5-988b-52d2fef226c2}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="skip_list">\r
+      <UniqueIdentifier>{96805520-3b6b-41d4-8455-a69726c2c1c1}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="split_list">\r
+      <UniqueIdentifier>{f081717f-6035-4716-bc90-6ddff4a4018b}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-misc.vcxproj b/projects/Win/vc10/hdr-test-misc.vcxproj
new file mode 100644 (file)
index 0000000..008053b
--- /dev/null
@@ -0,0 +1,558 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{C5E76975-B87B-4B9E-8596-B01DDA683FCA}</ProjectGuid>\r
+    <RootNamespace>hdrtestmisc</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\allocator_test.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\bitop_st.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\cxx11_atomic_class.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\cxx11_atomic_func.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\find_option.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\hash_tuple.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\michael_allocator.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\permutation_generator.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\misc\cxx11_convert_memory_order.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\misc\michael_allocator.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-ordered-list.vcxproj b/projects/Win/vc10/hdr-test-ordered-list.vcxproj
new file mode 100644 (file)
index 0000000..150a50b
--- /dev/null
@@ -0,0 +1,608 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}</ProjectGuid>\r
+    <RootNamespace>hdrtestordlist</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_sht.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-ordered-list.vcxproj.filters b/projects/Win/vc10/hdr-test-ordered-list.vcxproj.filters
new file mode 100644 (file)
index 0000000..199a269
--- /dev/null
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_nogc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpi.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpt.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpi.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpt.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_nogc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_shb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_sht.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_sht.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_shb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{c92315f7-61b9-4211-807b-1f8cc33334f4}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{b1aaff76-25a4-49ce-9adf-d8efda9c9508}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-priority_queue.vcxproj b/projects/Win/vc10/hdr-test-priority_queue.vcxproj
new file mode 100644 (file)
index 0000000..4b51420
--- /dev/null
@@ -0,0 +1,542 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_boost_stable_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_deque.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_dyn.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_static.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_dyn.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_static.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_priority_queue_reg.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_pqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_pqueue.h" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{FF477D60-02E9-4aa7-BAED-7D04673853A6}</ProjectGuid>\r
+    <RootNamespace>hdrtestpriorityqueue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-priority_queue.vcxproj.filters b/projects/Win/vc10/hdr-test-priority_queue.vcxproj.filters
new file mode 100644 (file)
index 0000000..5427f6c
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{17b25c96-d101-42c7-b7c9-67775d96ea52}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{08f1f550-3f8f-4cbe-9f7f-bb28885f5b5c}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_priority_queue_reg.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_dyn.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_static.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_dyn.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_static.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_boost_stable_vector.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_deque.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_vector.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_pqueue.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_pqueue.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-queue.vcxproj b/projects/Win/vc10/hdr-test-queue.vcxproj
new file mode 100644 (file)
index 0000000..a328cb0
--- /dev/null
@@ -0,0 +1,587 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{33664E63-8D24-4FF4-A744-9782EB711509}</ProjectGuid>\r
+    <RootNamespace>hdrtestqueue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_fcqueue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_fcqueue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_tsigas_cycle_queue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_vyukovmpmc_cycle_queue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_rwqueue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_vyukov_mpmc_cyclic.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\queue_test_header.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_node.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_singlelink_node.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\queue_test_header.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-queue.vcxproj.filters b/projects/Win/vc10/hdr-test-queue.vcxproj.filters
new file mode 100644 (file)
index 0000000..e330bc3
--- /dev/null
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_fcqueue.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_vyukovmpmc_cycle_queue.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_fcqueue.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_tsigas_cycle_queue.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_rwqueue.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_vyukov_mpmc_cyclic.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\queue_test_header.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_node.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_singlelink_node.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\queue_test_header.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{0ea1bb70-958e-4d26-97a6-56c155649f21}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{60d51fca-67cb-476e-8dba-85cc0ef9f726}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-set.vcxproj b/projects/Win/vc10/hdr-test-set.vcxproj
new file mode 100644 (file)
index 0000000..bbad35b
--- /dev/null
@@ -0,0 +1,652 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_sht.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu.h" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}</ProjectGuid>\r
+    <RootNamespace>hdrtestset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-set.vcxproj.filters b/projects/Win/vc10/hdr-test-set.vcxproj.filters
new file mode 100644 (file)
index 0000000..3b5c722
--- /dev/null
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{1ce02b02-46ee-4cdd-afcc-07d6c2d67996}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{8aabd5d4-bc7a-4514-83ef-68cff5d4b4fd}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\michael">\r
+      <UniqueIdentifier>{305d2066-73ee-4fe1-9509-418fbfa23363}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\skip_list">\r
+      <UniqueIdentifier>{0498597f-eb49-48b8-975e-20fce2bba451}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\split_list">\r
+      <UniqueIdentifier>{5ce6f875-904e-48de-8cdf-e7a9006d2b5f}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\michael">\r
+      <UniqueIdentifier>{d445f17f-748f-4084-ad95-a4960a99b20d}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\skip_list">\r
+      <UniqueIdentifier>{f3627624-b537-4cf1-96e7-744ed5b2f1f6}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\split_list">\r
+      <UniqueIdentifier>{1b93c60a-1acb-4de2-ba41-df47d452c165}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt_lazy.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp_lazy.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc_lazy.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc_lazy.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb_lazy.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb_lazy.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi_lazy.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hrc.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hp.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpt.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hrc.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hp.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hrc.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_nogc.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_ptb.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpb.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpi.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpt.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_nogc.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_ptb.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpb.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpi.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hp.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_ptb.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hrc.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hp.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_ptb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hrc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hp.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hrc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_nogc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_ptb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_nogc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpi.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpt.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpi.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpt.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpb.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpi.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpt.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_nogc.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb_lazy.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht_lazy.cpp">\r
+      <Filter>intrusive\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_shb.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_sht.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_shb.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_sht.cpp">\r
+      <Filter>container\michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_shb.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_sht.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_shb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_sht.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_shb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_sht.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_set.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_set.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set.h">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set_rcu.h">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set.h">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu.h">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-stack.vcxproj b/projects/Win/vc10/hdr-test-stack.vcxproj
new file mode 100644 (file)
index 0000000..11470d2
--- /dev/null
@@ -0,0 +1,564 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}</ProjectGuid>\r
+    <RootNamespace>hdrteststack</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_fcstack.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_fcstack.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_ptb.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-striped-set.vcxproj b/projects/Win/vc10/hdr-test-striped-set.vcxproj
new file mode 100644 (file)
index 0000000..72c577e
--- /dev/null
@@ -0,0 +1,597 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_refinable_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_avlset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_sgset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_splayset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_treapset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_uset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_avlset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_sgset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_splayset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_treapset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_uset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_flat_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_stable_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_unordered_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_flat_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_stable_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_unordered_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_vector.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_striped_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\intrusive_cuckoo_set_common.h" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{81A87B2D-4F17-474e-95A7-9B06804F5063}</ProjectGuid>\r
+    <RootNamespace>hdrteststripedset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-striped-set.vcxproj.filters b/projects/Win/vc10/hdr-test-striped-set.vcxproj.filters
new file mode 100644 (file)
index 0000000..4b3b4e5
--- /dev/null
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{daf0001a-2d99-470f-b06c-b71cc66b08e8}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{b2fe5479-3542-4ea7-8a0e-8db919dc3afc}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\cuckoo">\r
+      <UniqueIdentifier>{8abe9194-8b9c-490e-a31e-da5fa62a99ff}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\striped">\r
+      <UniqueIdentifier>{1ed3bb8a-8c6e-46f2-9fb7-38e1c8876374}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\cuckoo">\r
+      <UniqueIdentifier>{ce2bc420-ee23-4aad-a531-da6a8d474160}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\striped">\r
+      <UniqueIdentifier>{2e3a4938-f8de-42aa-a3af-5ef832cdda4b}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_refinable_set.cpp">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.cpp">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_avlset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_list.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_set.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_sgset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_slist.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_splayset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_treapset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_uset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_avlset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_list.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_set.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_sgset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_slist.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_splayset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_treapset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_uset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.cpp">\r
+      <Filter>container\cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_flat_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_stable_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_unordered_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_std.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_vc.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_slist.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_flat_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_stable_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_unordered_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_std.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_vc.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_slist.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.h">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\intrusive_cuckoo_set_common.h">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.h">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.h">\r
+      <Filter>container\cuckoo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_striped_set.h">\r
+      <Filter>container\striped</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-tree.vcxproj b/projects/Win/vc10/hdr-test-tree.vcxproj
new file mode 100644 (file)
index 0000000..69741a9
--- /dev/null
@@ -0,0 +1,567 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{6F834EAD-7B94-4979-A0F1-A662E3D30145}</ProjectGuid>\r
+    <RootNamespace>hdrtesttree</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_bintree.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_hp.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_ptb.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_rcu.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_tree_reg.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/hdr-test-tree.vcxproj.filters b/projects/Win/vc10/hdr-test-tree.vcxproj.filters
new file mode 100644 (file)
index 0000000..3303a2e
--- /dev/null
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{74b30507-4767-4deb-a172-bf9d67285164}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{00cea333-aa9a-4127-8b65-d1bbc3395f5a}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_bintree.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_rcu.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_hp.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_ptb.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_tree_reg.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/unit-map-delodd.vcxproj b/projects/Win/vc10/unit-map-delodd.vcxproj
new file mode 100644 (file)
index 0000000..9f846ec
--- /dev/null
@@ -0,0 +1,488 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_delodd.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{3EF80910-0929-4db7-A887-9548EF8A7A41}</ProjectGuid>\r
+    <RootNamespace>unitmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/unit-map-find.vcxproj b/projects/Win/vc10/unit-map-find.vcxproj
new file mode 100644 (file)
index 0000000..1956cf3
--- /dev/null
@@ -0,0 +1,490 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_find_int.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_find_string.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insfind_int.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{85F77A9C-D482-4c5e-A383-05601EA8703F}</ProjectGuid>\r
+    <RootNamespace>unitmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/unit-map-insdel.vcxproj b/projects/Win/vc10/unit-map-insdel.vcxproj
new file mode 100644 (file)
index 0000000..2c1ae10
--- /dev/null
@@ -0,0 +1,493 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdelfind.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_func.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_int.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_item_int.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_item_string.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_string.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{8F691043-C5B1-4c8b-9BA6-83023A0FF0C7}</ProjectGuid>\r
+    <RootNamespace>unitmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/unit-misc.vcxproj b/projects/Win/vc10/unit-misc.vcxproj
new file mode 100644 (file)
index 0000000..9e17a5c
--- /dev/null
@@ -0,0 +1,493 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{77350FDC-9E51-438B-9A8F-D2FEA11D46B2}</ProjectGuid>\r
+    <RootNamespace>unitmisc</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\hoard_threadtest.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\larson.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\linux_scale.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\michael_allocator.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\random.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\lock\spinlock.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\michael_allocator.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\random_gen.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\lock\nolock.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\lock\win32_lock.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/unit-misc.vcxproj.filters b/projects/Win/vc10/unit-misc.vcxproj.filters
new file mode 100644 (file)
index 0000000..24beb8e
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="alloc">\r
+      <UniqueIdentifier>{00770a55-c45a-483b-b2ae-798ba5097bb6}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="lock">\r
+      <UniqueIdentifier>{e6e1e5af-a81d-41b7-ad96-6a888cd73c7e}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\hoard_threadtest.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\larson.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\linux_scale.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\michael_allocator.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\random.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\lock\spinlock.cpp">\r
+      <Filter>lock</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\michael_allocator.h">\r
+      <Filter>alloc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\random_gen.h">\r
+      <Filter>alloc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\unit\lock\nolock.h">\r
+      <Filter>lock</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\unit\lock\win32_lock.h">\r
+      <Filter>lock</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/unit-pqueue.vcxproj b/projects/Win/vc10/unit-pqueue.vcxproj
new file mode 100644 (file)
index 0000000..02e4f8c
--- /dev/null
@@ -0,0 +1,494 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\ellen_bintree_pqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\pqueue_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\pqueue_item.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\pqueue_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\skiplist_pqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\std_pqueue.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\pqueue\pop.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\pqueue\push.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\pqueue\push_pop.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{20B6C380-E96A-4cff-BC17-D88AAE581919}</ProjectGuid>\r
+    <RootNamespace>unitpqueue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificWarnings>2586</DisableSpecificWarnings>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificWarnings>2586</DisableSpecificWarnings>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificWarnings>2586</DisableSpecificWarnings>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+      <EmitDiagnosticsToFile>true</EmitDiagnosticsToFile>\r
+      <EmitOptimizationDiagnosticsToFile>true</EmitOptimizationDiagnosticsToFile>\r
+      <AnalyzeIncludeFiles>true</AnalyzeIncludeFiles>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <InterproceduralOptimization>false</InterproceduralOptimization>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificWarnings>2586</DisableSpecificWarnings>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/unit-prerequisites.vcxproj b/projects/Win/vc10/unit-prerequisites.vcxproj
new file mode 100644 (file)
index 0000000..4ef8279
--- /dev/null
@@ -0,0 +1,558 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{61179F2F-07E1-490D-B64D-D85A90B6EF81}</ProjectGuid>\r
+    <RootNamespace>unitprerequisites</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\cppunit\cppunit_mini.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\cppunit_proxy.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\file_reporter.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\ellen_bintree_update_desc_pool.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\michael_alloc.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_cuckoo_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_deque_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\test_beans.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\thread.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_ellenbintree_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_mspriorityqueue_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_segmentedqueue_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_skip_list_stat.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\ellen_bintree_update_desc_pool.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\michael_alloc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\cppunit\test_main.cpp" />\r
+    <ClCompile Include="..\..\..\tests\cppunit\thread.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <CustomBuild Include="..\..\..\tests\data\test-debug.conf">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+    <CustomBuild Include="..\..\..\tests\data\test-express.conf">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+    <CustomBuild Include="..\..\..\tests\data\test.conf">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+    <CustomBuild Include="..\..\..\tests\data\text.txt">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/unit-queue.vcxproj b/projects/Win/vc10/unit-queue.vcxproj
new file mode 100644 (file)
index 0000000..40c7c86
--- /dev/null
@@ -0,0 +1,497 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{6C15AF8A-4A99-49F9-BCF0-1BF36771099A}</ProjectGuid>\r
+    <RootNamespace>unitqueue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\queue\intrusive_queue_reader_writer.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_pop.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_push.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_random.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_reader_writer.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\queue\intrusive_queue_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\intrusive_queue_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\queue_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\queue_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\std_queue.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/unit-set-delodd.vcxproj b/projects/Win/vc10/unit-set-delodd.vcxproj
new file mode 100644 (file)
index 0000000..289563b
--- /dev/null
@@ -0,0 +1,487 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_delodd.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{3C5EBF73-1565-4999-89E2-DD97EB89C172}</ProjectGuid>\r
+    <RootNamespace>unitset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/unit-set-insdel.vcxproj b/projects/Win/vc10/unit-set-insdel.vcxproj
new file mode 100644 (file)
index 0000000..1362acb
--- /dev/null
@@ -0,0 +1,498 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdelfind.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func2.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func3.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func4.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func5.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func6.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func7.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_string.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\set2\set_insdel_func.h" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{F7E5E798-D46B-4fb9-925A-4ECFE5A47C9F}</ProjectGuid>\r
+    <RootNamespace>unitset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_SCL_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <LargeAddressAware>true</LargeAddressAware>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc10/unit-stack.vcxproj b/projects/Win/vc10/unit-stack.vcxproj
new file mode 100644 (file)
index 0000000..cfd64fc
--- /dev/null
@@ -0,0 +1,492 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{E29DE1F7-AE8D-4AE6-98B1-147E5103D974}</ProjectGuid>\r
+    <RootNamespace>unitstack</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc10\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc10_icl13\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc10\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc10_icl13\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificWarnings>2586</DisableSpecificWarnings>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificWarnings>2586</DisableSpecificWarnings>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificWarnings>2586</DisableSpecificWarnings>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+      <EmitDiagnosticsToFile>true</EmitDiagnosticsToFile>\r
+      <EmitOptimizationDiagnosticsToFile>true</EmitOptimizationDiagnosticsToFile>\r
+      <AnalyzeIncludeFiles>true</AnalyzeIncludeFiles>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <InterproceduralOptimization>false</InterproceduralOptimization>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <DisableSpecificWarnings>2586</DisableSpecificWarnings>\r
+      <DisableSpecificDiagnostics>2586</DisableSpecificDiagnostics>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\stack\stack_intrusive_pushpop.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\stack\stack_push.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\stack\stack_pushpop.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\stack\intrusive_stack_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\stack\intrusive_stack_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\stack\stack_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\stack\stack_defs.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/cds.sln b/projects/Win/vc11/cds.sln
new file mode 100644 (file)
index 0000000..7c40a7e
--- /dev/null
@@ -0,0 +1,618 @@
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2012\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cds", "cds.vcxproj", "{408FE9BC-44F0-4E6A-89FA-D6F952584239}"\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unit-test", "unit-test", "{B30CA283-1796-4763-92C3-2E4848D443F7}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-prerequisites", "unit-prerequisites.vcxproj", "{61179F2F-07E1-490D-B64D-D85A90B6EF81}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-misc", "unit-misc.vcxproj", "{77350FDC-9E51-438B-9A8F-D2FEA11D46B2}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-queue", "unit-queue.vcxproj", "{6C15AF8A-4A99-49F9-BCF0-1BF36771099A}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-stack", "unit-stack.vcxproj", "{E29DE1F7-AE8D-4AE6-98B1-147E5103D974}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hdr-test", "hdr-test", "{B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\test-hdr\size_check.h = ..\..\..\tests\test-hdr\size_check.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-deque", "hdr-test-deque.vcxproj", "{CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-map", "hdr-test-map.vcxproj", "{282E9A9A-386A-40FB-A483-994BACE24830}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-misc", "hdr-test-misc.vcxproj", "{C5E76975-B87B-4B9E-8596-B01DDA683FCA}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-ordered-list", "hdr-test-ordered-list.vcxproj", "{EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-queue", "hdr-test-queue.vcxproj", "{33664E63-8D24-4FF4-A744-9782EB711509}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-set", "hdr-test-set.vcxproj", "{E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-striped-set", "hdr-test-striped-set.vcxproj", "{A38E5597-6916-4480-A343-C9846EF544E4}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-stack", "hdr-test-stack.vcxproj", "{E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-tree", "hdr-test-tree.vcxproj", "{6F834EAD-7B94-4979-A0F1-A662E3D30145}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "map", "map", "{88B4E75D-5285-4900-86BF-3C8AB53016CF}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\unit\map2\map_defs.h = ..\..\..\tests\unit\map2\map_defs.h\r
+               ..\..\..\tests\unit\map2\map_types.h = ..\..\..\tests\unit\map2\map_types.h\r
+               ..\..\..\tests\unit\map2\std_hash_map.h = ..\..\..\tests\unit\map2\std_hash_map.h\r
+               ..\..\..\tests\unit\map2\std_hash_map_gcc.h = ..\..\..\tests\unit\map2\std_hash_map_gcc.h\r
+               ..\..\..\tests\unit\map2\std_hash_map_vc.h = ..\..\..\tests\unit\map2\std_hash_map_vc.h\r
+               ..\..\..\tests\unit\map2\std_map.h = ..\..\..\tests\unit\map2\std_map.h\r
+               ..\..\..\tests\unit\map2\std_map_gcc.h = ..\..\..\tests\unit\map2\std_map_gcc.h\r
+               ..\..\..\tests\unit\map2\std_map_vc.h = ..\..\..\tests\unit\map2\std_map_vc.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "set", "set", "{C2180BE1-9B69-4212-A8DF-1241031103DE}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\unit\set2\set_defs.h = ..\..\..\tests\unit\set2\set_defs.h\r
+               ..\..\..\tests\unit\set2\set_types.h = ..\..\..\tests\unit\set2\set_types.h\r
+               ..\..\..\tests\unit\set2\std_hash_set.h = ..\..\..\tests\unit\set2\std_hash_set.h\r
+               ..\..\..\tests\unit\set2\std_hash_set_std.h = ..\..\..\tests\unit\set2\std_hash_set_std.h\r
+               ..\..\..\tests\unit\set2\std_hash_set_vc9.h = ..\..\..\tests\unit\set2\std_hash_set_vc9.h\r
+               ..\..\..\tests\unit\set2\std_set.h = ..\..\..\tests\unit\set2\std_set.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-delodd", "unit-map-delodd.vcxproj", "{F34F63CB-C6C1-431C-A146-0F4E1D0443B2}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-find", "unit-map-find.vcxproj", "{586E7858-33BF-4AC4-BB67-B5B749599E86}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-insdel", "unit-map-insdel.vcxproj", "{45010456-BA88-4F6A-AF59-898F8C0C888E}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-set-delodd", "unit-set-delodd.vcxproj", "{46363760-5DF1-4EE9-B9DE-DC3A146C8E89}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-set-insdel", "unit-set-insdel.vcxproj", "{0100BA8C-277D-4A81-8061-E39FD07A9CEF}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-priority_queue", "hdr-test-priority_queue.vcxproj", "{9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-pqueue", "unit-pqueue.vcxproj", "{20B6C380-E96A-4CFF-BC17-D88AAE581919}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Win32 = Debug|Win32\r
+               Debug|x64 = Debug|x64\r
+               DebugVLD|Win32 = DebugVLD|Win32\r
+               DebugVLD|x64 = DebugVLD|x64\r
+               ICL-Debug|Win32 = ICL-Debug|Win32\r
+               ICL-Debug|x64 = ICL-Debug|x64\r
+               ICL-Release|Win32 = ICL-Release|Win32\r
+               ICL-Release|x64 = ICL-Release|x64\r
+               Release|Win32 = Release|Win32\r
+               Release|x64 = Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|Win32.Build.0 = Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|x64.ActiveCfg = Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|x64.Build.0 = Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|Win32.ActiveCfg = Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|Win32.Build.0 = Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|x64.ActiveCfg = Release|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|x64.Build.0 = Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|Win32.Build.0 = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|x64.ActiveCfg = Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|x64.Build.0 = Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|Win32.ActiveCfg = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|Win32.Build.0 = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|Win32.ActiveCfg = Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|Win32.Build.0 = Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|x64.ActiveCfg = Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|x64.Build.0 = Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|Win32.Build.0 = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|x64.ActiveCfg = Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|x64.Build.0 = Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|Win32.ActiveCfg = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|Win32.Build.0 = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|Win32.ActiveCfg = Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|Win32.Build.0 = Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|x64.ActiveCfg = Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|x64.Build.0 = Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|Win32.Build.0 = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|x64.ActiveCfg = Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|x64.Build.0 = Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|Win32.ActiveCfg = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|Win32.Build.0 = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|Win32.ActiveCfg = Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|Win32.Build.0 = Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|x64.ActiveCfg = Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|x64.Build.0 = Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|x64.Build.0 = Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|Win32.ActiveCfg = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|Win32.Build.0 = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|Win32.Build.0 = Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|x64.ActiveCfg = Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|x64.Build.0 = Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|Win32.Build.0 = Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|x64.ActiveCfg = Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|x64.Build.0 = Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|Win32.ActiveCfg = Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|Win32.Build.0 = Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|x64.ActiveCfg = Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|x64.Build.0 = Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|Win32.Build.0 = Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|x64.ActiveCfg = Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|x64.Build.0 = Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|Win32.ActiveCfg = Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|Win32.Build.0 = Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|x64.ActiveCfg = Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|x64.Build.0 = Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|Win32.Build.0 = Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|x64.ActiveCfg = Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|x64.Build.0 = Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|Win32.ActiveCfg = Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|Win32.Build.0 = Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|x64.ActiveCfg = Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|x64.Build.0 = Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|Win32.Build.0 = Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|x64.ActiveCfg = Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|x64.Build.0 = Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|Win32.ActiveCfg = Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|Win32.Build.0 = Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|x64.ActiveCfg = Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|x64.Build.0 = Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|Win32.Build.0 = Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|x64.ActiveCfg = Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|x64.Build.0 = Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|Win32.ActiveCfg = Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|Win32.Build.0 = Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|x64.ActiveCfg = Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|x64.Build.0 = Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|x64.Build.0 = Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|Win32.Build.0 = Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|x64.ActiveCfg = Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|x64.Build.0 = Release|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Debug|Win32.Build.0 = Debug|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Debug|x64.ActiveCfg = Debug|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Debug|x64.Build.0 = Debug|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Release|Win32.ActiveCfg = Release|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Release|Win32.Build.0 = Release|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Release|x64.ActiveCfg = Release|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Release|x64.Build.0 = Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|x64.Build.0 = Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|Win32.Build.0 = Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|x64.ActiveCfg = Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|x64.Build.0 = Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|Win32.Build.0 = Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|x64.ActiveCfg = Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|x64.Build.0 = Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|Win32.ActiveCfg = Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|Win32.Build.0 = Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|x64.ActiveCfg = Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|x64.Build.0 = Release|x64\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.Debug|Win32.Build.0 = Debug|Win32\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.Debug|x64.ActiveCfg = Debug|x64\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.Debug|x64.Build.0 = Debug|x64\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.Release|Win32.ActiveCfg = Release|Win32\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.Release|Win32.Build.0 = Release|Win32\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.Release|x64.ActiveCfg = Release|x64\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2}.Release|x64.Build.0 = Release|x64\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.Debug|Win32.Build.0 = Debug|Win32\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.Debug|x64.ActiveCfg = Debug|x64\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.Debug|x64.Build.0 = Debug|x64\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.Release|Win32.ActiveCfg = Release|Win32\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.Release|Win32.Build.0 = Release|Win32\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.Release|x64.ActiveCfg = Release|x64\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86}.Release|x64.Build.0 = Release|x64\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.Debug|Win32.Build.0 = Debug|Win32\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.Debug|x64.ActiveCfg = Debug|x64\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.Debug|x64.Build.0 = Debug|x64\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.Release|Win32.ActiveCfg = Release|Win32\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.Release|Win32.Build.0 = Release|Win32\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.Release|x64.ActiveCfg = Release|x64\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E}.Release|x64.Build.0 = Release|x64\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.Debug|Win32.Build.0 = Debug|Win32\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.Debug|x64.ActiveCfg = Debug|x64\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.Debug|x64.Build.0 = Debug|x64\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.Release|Win32.ActiveCfg = Release|Win32\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.Release|Win32.Build.0 = Release|Win32\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.Release|x64.ActiveCfg = Release|x64\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89}.Release|x64.Build.0 = Release|x64\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.Debug|Win32.Build.0 = Debug|Win32\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.Debug|x64.ActiveCfg = Debug|x64\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.Debug|x64.Build.0 = Debug|x64\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.Release|Win32.ActiveCfg = Release|Win32\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.Release|Win32.Build.0 = Release|Win32\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.Release|x64.ActiveCfg = Release|x64\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF}.Release|x64.Build.0 = Release|x64\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.Debug|Win32.Build.0 = Debug|Win32\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.Debug|x64.ActiveCfg = Debug|x64\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.Debug|x64.Build.0 = Debug|x64\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.Release|Win32.ActiveCfg = Release|Win32\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.Release|Win32.Build.0 = Release|Win32\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.Release|x64.ActiveCfg = Release|x64\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2}.Release|x64.Build.0 = Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|Win32.Build.0 = Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|x64.ActiveCfg = Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|x64.Build.0 = Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|Win32.ActiveCfg = Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|Win32.Build.0 = Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|x64.ActiveCfg = Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|x64.Build.0 = Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+       GlobalSection(NestedProjects) = preSolution\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {88B4E75D-5285-4900-86BF-3C8AB53016CF} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {C2180BE1-9B69-4212-A8DF-1241031103DE} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {282E9A9A-386A-40FB-A483-994BACE24830} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {33664E63-8D24-4FF4-A744-9782EB711509} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {A38E5597-6916-4480-A343-C9846EF544E4} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {9443BAFC-8A5B-4C1D-B2AE-C9BD8FFD44F2} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {F34F63CB-C6C1-431C-A146-0F4E1D0443B2} = {88B4E75D-5285-4900-86BF-3C8AB53016CF}\r
+               {586E7858-33BF-4AC4-BB67-B5B749599E86} = {88B4E75D-5285-4900-86BF-3C8AB53016CF}\r
+               {45010456-BA88-4F6A-AF59-898F8C0C888E} = {88B4E75D-5285-4900-86BF-3C8AB53016CF}\r
+               {46363760-5DF1-4EE9-B9DE-DC3A146C8E89} = {C2180BE1-9B69-4212-A8DF-1241031103DE}\r
+               {0100BA8C-277D-4A81-8061-E39FD07A9CEF} = {C2180BE1-9B69-4212-A8DF-1241031103DE}\r
+       EndGlobalSection\r
+       GlobalSection(DPCodeReviewSolutionGUID) = preSolution\r
+               DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/projects/Win/vc11/cds.vcxproj b/projects/Win/vc11/cds.vcxproj
new file mode 100644 (file)
index 0000000..7f0dff7
--- /dev/null
@@ -0,0 +1,1011 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{408FE9BC-44F0-4E6A-89FA-D6F952584239}</ProjectGuid>\r
+    <RootNamespace>cds</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">true</GenerateManifest>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">true</GenerateManifest>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">true</GenerateManifest>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</PostBuildEventUseInBuild>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</PostBuildEventUseInBuild>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">true</GenerateManifest>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</PostBuildEventUseInBuild>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</PostBuildEventUseInBuild>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">true</GenerateManifest>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">true</GenerateManifest>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">libcds-x86-vc11_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">libcds-x86-icl_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">libcds-x86-vc11_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">libcds-x86-vc11</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">libcds-x86-icl</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">libcds-amd64-vc11_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">libcds-amd64-icl_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">libcds-amd64-vc11_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">libcds-amd64-vc11</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">libcds-amd64-icl</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>false</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+      <SuppressStartupBanner>false</SuppressStartupBanner>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>false</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+      <SuppressStartupBanner>false</SuppressStartupBanner>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\src\dllmain.cpp" />\r
+    <ClCompile Include="..\..\..\src\hrc_gc.cpp" />\r
+    <ClCompile Include="..\..\..\src\hzp_gc.cpp" />\r
+    <ClCompile Include="..\..\..\src\init.cpp" />\r
+    <ClCompile Include="..\..\..\src\michael_heap.cpp" />\r
+    <ClCompile Include="..\..\..\src\ptb_gc.cpp" />\r
+    <ClCompile Include="..\..\..\src\topology_hpux.cpp" />\r
+    <ClCompile Include="..\..\..\src\topology_linux.cpp" />\r
+    <ClCompile Include="..\..\..\src\topology_osx.cpp" />\r
+    <ClCompile Include="..\..\..\src\urcu_gp.cpp" />\r
+    <ClCompile Include="..\..\..\src\urcu_sh.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\cds\algo\base.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\elimination.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_opt.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_tls.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\flat_combining.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\cxx11_atomic_prepatches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_boost.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_std.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_patches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_prepatches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_macro.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\cxx11_atomic_patches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\compiler_barriers.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\cxx11_atomic_patches_win.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\container\basket_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\guarded_ptr_cast.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_deque.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\mspriority_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_flat_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_slist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_unordered_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_std.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_vc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\adapter.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_flat_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_slist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_stable_vector.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_unordered_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_vector.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_std.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_vc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_vector.h" />\r
+    <ClInclude Include="..\..\..\cds\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\details\binary_functor_wrapper.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bit_reverse_counter.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bounded_container.h" />\r
+    <ClInclude Include="..\..\..\cds\details\cxx11_features.h" />\r
+    <ClInclude Include="..\..\..\cds\details\hash_functor_selector.h" />\r
+    <ClInclude Include="..\..\..\cds\details\lib.h" />\r
+    <ClInclude Include="..\..\..\cds\details\static_functor.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\condition_variable.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\memory.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\mutex.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\chrono.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\tuple.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\type_traits.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\all.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\exception.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\gc_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\guarded_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hp_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hp_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\basket_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\deque_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\dummy_node_holder.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\ellen_bintree_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_deque.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\mspriority_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\node_traits.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\options.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\adapter.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_avl_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_list.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_sg_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_slist.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_splay_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_treap_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_unordered_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\resizing_policy.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\striping_policy.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\mapper.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\pool_allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\vyukov_queue_pool.h" />\r
+    <ClInclude Include="..\..\..\cds\os\osx\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\osx\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\fake_topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\base.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\check_deadlock.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpb.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpi.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpt.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_buffered.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_threaded.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\exempt_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\dispose_thread.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\general_buffered.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\general_instant.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\general_threaded.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\options.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_buffered.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_threaded.h" />\r
+    <ClInclude Include="..\..\..\src\hzp_const.h" />\r
+    <ClInclude Include="..\..\..\cds\backoff_strategy.h" />\r
+    <ClInclude Include="..\..\..\cds\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\init.h" />\r
+    <ClInclude Include="..\..\..\cds\int_algo.h" />\r
+    <ClInclude Include="..\..\..\cds\numtraits.h" />\r
+    <ClInclude Include="..\..\..\cds\ref.h" />\r
+    <ClInclude Include="..\..\..\cds\refcounter.h" />\r
+    <ClInclude Include="..\..\..\cds\version.h" />\r
+    <ClInclude Include="..\..\..\cds\details\aligned_allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\details\aligned_type.h" />\r
+    <ClInclude Include="..\..\..\cds\details\allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bitop_generic.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bounded_array.h" />\r
+    <ClInclude Include="..\..\..\cds\details\comparator.h" />\r
+    <ClInclude Include="..\..\..\cds\details\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\details\functor_wrapper.h" />\r
+    <ClInclude Include="..\..\..\cds\details\is_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\details\make_const_type.h" />\r
+    <ClInclude Include="..\..\..\cds\details\marked_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\details\noncopyable.h" />\r
+    <ClInclude Include="..\..\..\cds\impl\queue_base.h" />\r
+    <ClInclude Include="..\..\..\cds\details\trivial_assign.h" />\r
+    <ClInclude Include="..\..\..\cds\details\type_padding.h" />\r
+    <ClInclude Include="..\..\..\cds\details\void_selector.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\default_gc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hp.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_alloc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_inline.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_retired.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_type.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\hzp.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\gc_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_inline.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_retired.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb\ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\details\retired_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\user_setup\allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\user_setup\cache_line.h" />\r
+    <ClInclude Include="..\..\..\cds\user_setup\threading.h" />\r
+    <ClInclude Include="..\..\..\cds\lock\spinlock.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\_common.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\auto_detect.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\model.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_barriers.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\compiler_barriers.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\os\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\syserror.h" />\r
+    <ClInclude Include="..\..\..\cds\os\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\os\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\hpux\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\hpux\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\hpux\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\linux\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\linux\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\linux\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\syserror.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\os\sunos\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\sunos\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\sunos\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\syserror.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\aix\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\aix\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\aix\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\libc\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\details\fake_topology.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\bound_check.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\options.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\osalloc_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\procheap_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\buffer.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\compare.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\hash.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_std.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_var.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\options.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\permutation.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\value_cleaner.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcstack.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\moir_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\msqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\optimistic_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\queue_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\single_link_struct.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\treiber_stack.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\tsigas_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\vyukov_mpmc_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcdeque.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcpriority_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcstack.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\moir_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\msqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\optimistic_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\rwqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\treiber_stack.h" />\r
+    <ClInclude Include="..\..\..\cds\container\tsigas_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\vyukov_mpmc_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_kvlist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_kvlist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_list.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/cds.vcxproj.filters b/projects/Win/vc11/cds.vcxproj.filters
new file mode 100644 (file)
index 0000000..db49a83
--- /dev/null
@@ -0,0 +1,1332 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="Source Files">\r
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r
+      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r
+    </Filter>\r
+    <Filter Include="Header Files">\r
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds">\r
+      <UniqueIdentifier>{202add83-3de8-46db-a1aa-4c0030beae1a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\details">\r
+      <UniqueIdentifier>{0051e611-824f-49c5-b100-df394c55975a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc">\r
+      <UniqueIdentifier>{a3c9928d-5261-4593-a8b9-728235f7056f}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\hzp">\r
+      <UniqueIdentifier>{21a6c665-7381-45b8-9f03-b21f3da5503d}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\hrc">\r
+      <UniqueIdentifier>{695568b2-b136-4b80-bd18-6e3e13c22301}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\ptb">\r
+      <UniqueIdentifier>{53d28ee4-5fe9-4fa1-a617-53d8b0628eac}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\details">\r
+      <UniqueIdentifier>{d7c48c0e-cc45-4a1a-b8e9-aa5b50abd22a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\user_setup">\r
+      <UniqueIdentifier>{f9f695b1-1322-437c-87b2-c243d83e1b0c}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\lock">\r
+      <UniqueIdentifier>{189d2da3-ba56-44b2-be2a-fad41fd75c4e}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\threading">\r
+      <UniqueIdentifier>{1af712b3-4429-4ecc-b0a2-f9c639decd19}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler">\r
+      <UniqueIdentifier>{4cce5abe-4256-4883-988d-2e725f38eee4}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc">\r
+      <UniqueIdentifier>{98435c30-814f-40fb-8906-0e7847db55ff}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\amd64">\r
+      <UniqueIdentifier>{87ab6aea-29b2-4e79-ad22-2190fa3c5870}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\ia64">\r
+      <UniqueIdentifier>{9aedc993-3ad3-4f6b-9df0-cdf5a69a3ae0}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\sparc">\r
+      <UniqueIdentifier>{44e1d2da-18b3-416f-9aeb-d937d46b5479}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\x86">\r
+      <UniqueIdentifier>{45671e15-bec1-47fd-a174-a7b57bb55458}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\ppc64">\r
+      <UniqueIdentifier>{58c4d0de-4802-4a0f-9f03-37b338b9d08a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\vc">\r
+      <UniqueIdentifier>{04b93d00-cb76-468a-86ce-f03ba531e47d}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\vc\x86">\r
+      <UniqueIdentifier>{2a690a60-0be8-423f-91cb-7f198b4bc507}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\vc\amd64">\r
+      <UniqueIdentifier>{125d466a-6e6e-4c88-9c60-475557797d91}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS">\r
+      <UniqueIdentifier>{f058a2ad-989d-45e9-9bb2-43dfda122708}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\hpux">\r
+      <UniqueIdentifier>{36e1bb0b-ab23-4484-8fb2-cc52bad3dbe3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\linux">\r
+      <UniqueIdentifier>{6d27baa4-414b-41a6-a7e0-72e406af5543}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\posix">\r
+      <UniqueIdentifier>{00c94a5c-9f94-427b-9739-fc06a2f39167}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\sunos">\r
+      <UniqueIdentifier>{4bc2a231-2ea0-4af8-84ad-534a76fda942}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\win">\r
+      <UniqueIdentifier>{64c62189-73c0-4c45-9bf5-aed7b5c6c5e4}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\aix">\r
+      <UniqueIdentifier>{5cf9ca07-cadf-4854-a36d-f8293bffc553}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\libc">\r
+      <UniqueIdentifier>{20b237f6-e6fd-43bd-970d-4f1daf89f494}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\free_bsd">\r
+      <UniqueIdentifier>{f1518588-7c09-496e-81c0-a1ee55cc5d21}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\details">\r
+      <UniqueIdentifier>{fcebfe0e-30de-48ac-8890-7497f1d97fba}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\memory">\r
+      <UniqueIdentifier>{5c631093-3ca2-4a36-acf7-2d9368b65366}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\memory\michael">\r
+      <UniqueIdentifier>{b7cdb65c-15d3-4655-abec-1e4640271432}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\opt">\r
+      <UniqueIdentifier>{fe7576b4-d93f-473a-8522-493feac51996}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\intrusive">\r
+      <UniqueIdentifier>{7226715d-6777-4c01-8e66-83b3885c00c1}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container">\r
+      <UniqueIdentifier>{84ca9e83-f6c9-4503-a45f-14f08317fd70}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container\details">\r
+      <UniqueIdentifier>{4b79fe31-4f6c-4e05-8910-1151a26d51f3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Resource Files">\r
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\clang">\r
+      <UniqueIdentifier>{ae97048d-bd62-4ff2-be28-3c84338e7186}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\details\std">\r
+      <UniqueIdentifier>{e6c65d81-ad06-40f3-be4e-ddaab3295bf3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\intrusive\striped_set">\r
+      <UniqueIdentifier>{560b4d4c-71e1-443c-942e-dcc5a275c7c2}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container\striped_map">\r
+      <UniqueIdentifier>{6530b757-5bb7-4de0-b1c9-019acc8183ba}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container\striped_set">\r
+      <UniqueIdentifier>{d3f68c37-8c36-448e-9d4c-cd89a940d275}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\urcu">\r
+      <UniqueIdentifier>{32754dfc-727a-42ff-b243-9a8510bf5c4e}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\urcu\details">\r
+      <UniqueIdentifier>{c621d14b-f90c-4e13-bfd6-16318f3e16da}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\intrusive\details">\r
+      <UniqueIdentifier>{97ec57a8-312a-408a-9f19-76705940a0aa}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\icl">\r
+      <UniqueIdentifier>{9b0192f6-ef71-439a-8c57-e600ccb3cecb}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\osx">\r
+      <UniqueIdentifier>{7b1df607-0c2c-4721-a3c5-5c423e45da13}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\algo">\r
+      <UniqueIdentifier>{fb958e63-5431-4c75-a94a-0285185f8800}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\src\dllmain.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\hrc_gc.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\hzp_gc.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\init.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\michael_heap.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\ptb_gc.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\topology_hpux.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\topology_linux.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\urcu_gp.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\urcu_sh.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\topology_osx.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\src\hzp_const.h">\r
+      <Filter>Source Files</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\backoff_strategy.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\bitop.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\init.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\int_algo.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\numtraits.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\ref.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\refcounter.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\version.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\aligned_allocator.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\aligned_type.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\allocator.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bitop_generic.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bounded_array.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\comparator.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\defs.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\functor_wrapper.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\is_aligned.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\make_const_type.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\marked_ptr.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\noncopyable.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\impl\queue_base.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\trivial_assign.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\type_padding.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\void_selector.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\default_gc.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hp.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\nogc.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_alloc.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_fwd.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_inline.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_retired.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_type.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\hzp.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\gc_fwd.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\hrc.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_fwd.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_inline.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_retired.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb\ptb.h">\r
+      <Filter>Header Files\cds\gc\ptb</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\details\retired_ptr.h">\r
+      <Filter>Header Files\cds\gc\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\user_setup\allocator.h">\r
+      <Filter>Header Files\cds\user_setup</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\user_setup\cache_line.h">\r
+      <Filter>Header Files\cds\user_setup</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\user_setup\threading.h">\r
+      <Filter>Header Files\cds\user_setup</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\lock\spinlock.h">\r
+      <Filter>Header Files\cds\lock</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\_common.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\auto_detect.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\model.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\backoff.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\bitop.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\defs.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_barriers.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\defs.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ia64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ia64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\sparc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\sparc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ppc64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ppc64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\compiler_barriers.h">\r
+      <Filter>Header Files\cds\compiler\vc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\defs.h">\r
+      <Filter>Header Files\cds\compiler\vc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\backoff.h">\r
+      <Filter>Header Files\cds\compiler\vc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\bitop.h">\r
+      <Filter>Header Files\cds\compiler\vc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\vc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\vc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\syserror.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\thread.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\timer.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\topology.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\hpux\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\hpux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\hpux\timer.h">\r
+      <Filter>Header Files\cds\OS\hpux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\hpux\topology.h">\r
+      <Filter>Header Files\cds\OS\hpux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\linux\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\linux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\linux\timer.h">\r
+      <Filter>Header Files\cds\OS\linux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\linux\topology.h">\r
+      <Filter>Header Files\cds\OS\linux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\syserror.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\thread.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\sunos\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\sunos</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\sunos\timer.h">\r
+      <Filter>Header Files\cds\OS\sunos</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\sunos\topology.h">\r
+      <Filter>Header Files\cds\OS\sunos</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\syserror.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\thread.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\timer.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\topology.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\aix\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\aix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\aix\timer.h">\r
+      <Filter>Header Files\cds\OS\aix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\aix\topology.h">\r
+      <Filter>Header Files\cds\OS\aix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\libc\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\libc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\free_bsd</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\timer.h">\r
+      <Filter>Header Files\cds\OS\free_bsd</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\topology.h">\r
+      <Filter>Header Files\cds\OS\free_bsd</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\details\fake_topology.h">\r
+      <Filter>Header Files\cds\OS\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\allocator.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\bound_check.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\options.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\osalloc_stat.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\procheap_stat.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\buffer.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\compare.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\hash.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_std.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_var.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\options.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\permutation.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\value_cleaner.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcqueue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcstack.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hrc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hrc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\moir_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\msqueue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\optimistic_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\queue_stat.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\segmented_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\single_link_struct.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\treiber_stack.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\tsigas_cycle_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\vyukov_mpmc_cycle_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcdeque.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcpriority_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcqueue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcstack.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\moir_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\msqueue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\optimistic_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\rwqueue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\segmented_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\treiber_stack.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\tsigas_cycle_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\vyukov_mpmc_cycle_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\guarded_ptr_cast.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_kvlist.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_list.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_kvlist.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_list.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hp_decl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hp_impl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_decl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_impl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_decl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_impl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\vc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\vc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\cxx11_atomic.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\sparc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ia64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_boost.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_std.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_patches.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\cxx11_atomic_patches.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bounded_container.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\hash_functor_selector.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\cxx11_features.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\all.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\defs.h">\r
+      <Filter>Header Files\cds\compiler\clang</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_deque.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\mapper.h">\r
+      <Filter>Header Files\cds\memory</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_deque.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\basket_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\basket_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_prepatches.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\cxx11_atomic_prepatches.h">\r
+      <Filter>Header Files\cds\compiler\clang</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\deque_stat.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\type_traits.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\memory.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\tuple.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\cuckoo_set.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\adapter.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_avl_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_list.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_sg_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_slist.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_splay_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_treap_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_unordered_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\resizing_policy.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\striping_policy.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\adapter.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_flat_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_list.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_slist.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_stable_vector.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_unordered_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_vector.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_std.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_vc.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_list.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_vector.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_flat_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_list.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_slist.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_unordered_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_std.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_vc.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_list.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\exception.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hrc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_set.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_map.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\condition_variable.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\mutex.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\thread.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\chrono.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\static_functor.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\node_traits.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\options.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\base.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\check_deadlock.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp_decl.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpb.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpi.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpt.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\exempt_ptr.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\general_buffered.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\general_instant.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\general_threaded.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\options.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\binary_functor_wrapper.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\gc_fwd.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\dummy_node_holder.h">\r
+      <Filter>Header Files\cds\intrusive\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh_decl.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_buffered.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_threaded.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\dispose_thread.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_buffered.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_threaded.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\ellen_bintree_base.h">\r
+      <Filter>Header Files\cds\intrusive\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\pool_allocator.h">\r
+      <Filter>Header Files\cds\memory</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\vyukov_queue_pool.h">\r
+      <Filter>Header Files\cds\memory</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bit_reverse_counter.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\mspriority_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\compiler_barriers.h">\r
+      <Filter>Header Files\cds\compiler\icl</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\cxx11_atomic_patches_win.h">\r
+      <Filter>Header Files\cds\compiler\icl</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\defs.h">\r
+      <Filter>Header Files\cds\compiler\icl</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\lib.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\mspriority_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_macro.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\fake_topology.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\timer.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\osx\timer.h">\r
+      <Filter>Header Files\cds\OS\osx</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\osx\topology.h">\r
+      <Filter>Header Files\cds\OS\osx</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\guarded_ptr.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\base.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\elimination.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_opt.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_tls.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\flat_combining.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-deque.vcxproj b/projects/Win/vc11/hdr-test-deque.vcxproj
new file mode 100644 (file)
index 0000000..ae461f0
--- /dev/null
@@ -0,0 +1,552 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}</ProjectGuid>\r
+    <RootNamespace>hdrtestdeque</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\deque\hdr_deque.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\deque\hdr_intrusive_deque.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_fcdeque.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_intrusive_michael_deque_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_intrusive_michael_deque_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_michael_deque_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_michael_deque_ptb.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-map.vcxproj b/projects/Win/vc11/hdr-test-map.vcxproj
new file mode 100644 (file)
index 0000000..cd89d9d
--- /dev/null
@@ -0,0 +1,610 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{282E9A9A-386A-40FB-A483-994BACE24830}</ProjectGuid>\r
+    <RootNamespace>hdrtestmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_striped_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\print_skiplist_stat.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_flat_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_unordered_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_flat_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_unordered_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_map_reg.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-map.vcxproj.filters b/projects/Win/vc11/hdr-test-map.vcxproj.filters
new file mode 100644 (file)
index 0000000..beb743c
--- /dev/null
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.cpp">\r
+      <Filter>cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hp.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hrc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hp.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hrc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_nogc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_ptb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_nogc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_ptb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_flat_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_unordered_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_std.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_vc.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_slist.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hp.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hrc.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_ptb.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hp.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hrc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hp.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hrc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_nogc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_ptb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_nogc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_ptb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_flat_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_unordered_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_std.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_vc.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_slist.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpi.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpt.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpi.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpt.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpi.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpt.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpi.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpt.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpb.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpi.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpt.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_nogc.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_map_reg.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_shb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_sht.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_shb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_sht.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_shb.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_sht.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_shb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_sht.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_shb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_sht.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\print_skiplist_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map.h">\r
+      <Filter>skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu.h">\r
+      <Filter>skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_striped_map.h">\r
+      <Filter>striped</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.h">\r
+      <Filter>cuckoo</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="cuckoo">\r
+      <UniqueIdentifier>{9cc8e982-b321-4a7d-8362-7f1491ad445d}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="michael">\r
+      <UniqueIdentifier>{c524c47b-2087-42eb-b3b2-f70ed379e373}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="striped">\r
+      <UniqueIdentifier>{33452d52-b86d-4143-9f87-bf154d53f890}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="skip_list">\r
+      <UniqueIdentifier>{1f7bd2f3-a377-47a5-aaae-aaddd60cbedc}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="split_list">\r
+      <UniqueIdentifier>{9318c3c0-92a3-4a5a-be2b-a47411a3e4c4}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-misc.vcxproj b/projects/Win/vc11/hdr-test-misc.vcxproj
new file mode 100644 (file)
index 0000000..128e75f
--- /dev/null
@@ -0,0 +1,550 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{C5E76975-B87B-4B9E-8596-B01DDA683FCA}</ProjectGuid>\r
+    <RootNamespace>hdrtestmisc</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\allocator_test.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\bitop_st.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\cxx11_atomic_class.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\cxx11_atomic_func.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\find_option.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\hash_tuple.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\michael_allocator.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\thread_init_fini.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\permutation_generator.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\misc\cxx11_convert_memory_order.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\misc\michael_allocator.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-ordered-list.vcxproj b/projects/Win/vc11/hdr-test-ordered-list.vcxproj
new file mode 100644 (file)
index 0000000..c1783dd
--- /dev/null
@@ -0,0 +1,599 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}</ProjectGuid>\r
+    <RootNamespace>hdrtestordlist</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_sht.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-ordered-list.vcxproj.filters b/projects/Win/vc11/hdr-test-ordered-list.vcxproj.filters
new file mode 100644 (file)
index 0000000..f7f6493
--- /dev/null
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_nogc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpi.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpt.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpi.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpt.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_nogc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_shb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_sht.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_shb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_sht.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{fff45fc3-9c35-4f00-94ac-a2403b1caed6}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{b0d8933f-3fbc-49c2-ad77-89bd74461395}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-priority_queue.vcxproj b/projects/Win/vc11/hdr-test-priority_queue.vcxproj
new file mode 100644 (file)
index 0000000..ff1e9e7
--- /dev/null
@@ -0,0 +1,549 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_boost_stable_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_deque.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_dyn.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_static.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_dyn.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_static.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_priority_queue_reg.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_pqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_pqueue.h" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{9443BAFC-8A5B-4c1d-B2AE-C9BD8FFD44F2}</ProjectGuid>\r
+    <RootNamespace>hdrtestpriorityqueue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-priority_queue.vcxproj.filters b/projects/Win/vc11/hdr-test-priority_queue.vcxproj.filters
new file mode 100644 (file)
index 0000000..5382013
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{b801302d-3f5a-4019-b1c3-b7e816d22d6c}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{9d3a5e69-5a77-491b-a8dc-45b169e0f6ad}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_priority_queue_reg.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_dyn.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_static.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_dyn.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_static.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_boost_stable_vector.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_deque.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_vector.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_pqueue.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_pqueue.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-queue.vcxproj b/projects/Win/vc11/hdr-test-queue.vcxproj
new file mode 100644 (file)
index 0000000..f24eff2
--- /dev/null
@@ -0,0 +1,578 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{33664E63-8D24-4FF4-A744-9782EB711509}</ProjectGuid>\r
+    <RootNamespace>hdrtestqueue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_fcqueue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_fcqueue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_tsigas_cycle_queue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_vyukovmpmc_cycle_queue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_rwqueue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_vyukov_mpmc_cyclic.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\queue_test_header.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_node.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_singlelink_node.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\queue_test_header.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-queue.vcxproj.filters b/projects/Win/vc11/hdr-test-queue.vcxproj.filters
new file mode 100644 (file)
index 0000000..7dcaaf8
--- /dev/null
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_fcqueue.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_fcqueue.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_tsigas_cycle_queue.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_vyukovmpmc_cycle_queue.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_rwqueue.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_vyukov_mpmc_cyclic.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\queue_test_header.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_node.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_singlelink_node.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\queue_test_header.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{68aaf08b-6544-4d6a-b912-0935954efdf2}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{a466b6f6-2b88-4c6e-84df-1f9d53122909}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-set.vcxproj b/projects/Win/vc11/hdr-test-set.vcxproj
new file mode 100644 (file)
index 0000000..6be566f
--- /dev/null
@@ -0,0 +1,643 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}</ProjectGuid>\r
+    <RootNamespace>hdrtestset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_sht.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-set.vcxproj.filters b/projects/Win/vc11/hdr-test-set.vcxproj.filters
new file mode 100644 (file)
index 0000000..d0129f6
--- /dev/null
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_set.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_set.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set.h">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set_rcu.h">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set.h">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu.h">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{83622d26-addb-4c52-98b3-eaa62a1047b6}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{c0375a89-d67a-480a-83d2-d1cdd8d467e9}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\michael_set">\r
+      <UniqueIdentifier>{4719fe70-337c-4740-931e-548d21a39466}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\split_list">\r
+      <UniqueIdentifier>{7786d807-8092-4310-9109-945854d26048}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\skip_list">\r
+      <UniqueIdentifier>{5b8a3b8a-27ad-49e7-9714-1859a842fd7f}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\michael_set">\r
+      <UniqueIdentifier>{dc053424-ec8d-46a7-9236-6a75f4dc0ad5}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\skip_list">\r
+      <UniqueIdentifier>{c1d0709e-ede1-4125-b4b8-eb3177ce05d2}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\split_list">\r
+      <UniqueIdentifier>{61f94a40-c964-4233-af67-66a1be1e0aab}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hrc.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hp.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hrc.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hp.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hrc.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_nogc.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_ptb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpi.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpt.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_nogc.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_ptb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpi.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpt.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hp.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hrc.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_ptb.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hp.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hrc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hp.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hrc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_nogc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_ptb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_nogc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_ptb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpi.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpt.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpi.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpt.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpb.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpi.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpt.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_nogc.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_shb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_sht.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_shb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_sht.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_shb.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_sht.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_shb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_sht.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_shb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_sht.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-stack.vcxproj b/projects/Win/vc11/hdr-test-stack.vcxproj
new file mode 100644 (file)
index 0000000..7e6dfaa
--- /dev/null
@@ -0,0 +1,555 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}</ProjectGuid>\r
+    <RootNamespace>hdrteststack</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_fcstack.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_fcstack.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_ptb.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-striped-set.vcxproj b/projects/Win/vc11/hdr-test-striped-set.vcxproj
new file mode 100644 (file)
index 0000000..9a160bf
--- /dev/null
@@ -0,0 +1,588 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_refinable_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_avlset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_sgset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_splayset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_treapset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_uset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_avlset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_sgset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_splayset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_treapset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_uset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_flat_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_stable_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_unordered_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_flat_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_stable_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_unordered_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_vector.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_striped_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\intrusive_cuckoo_set_common.h" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{A38E5597-6916-4480-A343-C9846EF544E4}</ProjectGuid>\r
+    <RootNamespace>hdrteststripedset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-striped-set.vcxproj.filters b/projects/Win/vc11/hdr-test-striped-set.vcxproj.filters
new file mode 100644 (file)
index 0000000..9e66278
--- /dev/null
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{4061d7f1-7ab8-4624-adb0-b4533e05a932}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{718f3de0-3b1c-4245-944c-0a56f288c6f7}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\cuckoo">\r
+      <UniqueIdentifier>{db3df5e9-9ef5-407f-821d-e25b9cc70082}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\striped">\r
+      <UniqueIdentifier>{0147ba57-0ecc-4674-8d7b-7492054d3a48}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\cuckoo">\r
+      <UniqueIdentifier>{ee3a372b-70df-47e6-bade-e7c4d1de7ec3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\striped">\r
+      <UniqueIdentifier>{4c811e47-74dd-436d-93f7-686f35980069}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_refinable_set.cpp">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.cpp">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_avlset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_list.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_set.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_sgset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_slist.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_splayset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_treapset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_uset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_avlset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_list.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_set.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_sgset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_slist.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_splayset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_treapset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_uset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.cpp">\r
+      <Filter>container\cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_flat_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_stable_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_unordered_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_std.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_vc.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_slist.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_flat_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_stable_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_unordered_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_std.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_vc.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_slist.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.h">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\intrusive_cuckoo_set_common.h">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.h">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.h">\r
+      <Filter>container\cuckoo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_striped_set.h">\r
+      <Filter>container\striped</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-tree.vcxproj b/projects/Win/vc11/hdr-test-tree.vcxproj
new file mode 100644 (file)
index 0000000..5add620
--- /dev/null
@@ -0,0 +1,574 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{6F834EAD-7B94-4979-A0F1-A662E3D30145}</ProjectGuid>\r
+    <RootNamespace>hdrtesttree</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_bintree.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_hp.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_ptb.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_rcu.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_tree_reg.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/hdr-test-tree.vcxproj.filters b/projects/Win/vc11/hdr-test-tree.vcxproj.filters
new file mode 100644 (file)
index 0000000..9f196a6
--- /dev/null
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{dec34594-a06a-4ed8-9792-fbc6b2a251f5}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{a13910ed-6cb1-46bc-a137-7da531e65e3a}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_bintree.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_rcu.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_hp.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_ptb.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_tree_reg.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/unit-map-delodd.vcxproj b/projects/Win/vc11/unit-map-delodd.vcxproj
new file mode 100644 (file)
index 0000000..05cc100
--- /dev/null
@@ -0,0 +1,482 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{F34F63CB-C6C1-431c-A146-0F4E1D0443B2}</ProjectGuid>\r
+    <RootNamespace>unitmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_delodd.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/unit-map-find.vcxproj b/projects/Win/vc11/unit-map-find.vcxproj
new file mode 100644 (file)
index 0000000..e670137
--- /dev/null
@@ -0,0 +1,484 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_find_int.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_find_string.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insfind_int.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{586E7858-33BF-4ac4-BB67-B5B749599E86}</ProjectGuid>\r
+    <RootNamespace>unitmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/unit-map-insdel.vcxproj b/projects/Win/vc11/unit-map-insdel.vcxproj
new file mode 100644 (file)
index 0000000..10ae003
--- /dev/null
@@ -0,0 +1,486 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_func.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_int.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_item_int.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_item_string.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_string.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{45010456-BA88-4f6a-AF59-898F8C0C888E}</ProjectGuid>\r
+    <RootNamespace>unitmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/unit-misc.vcxproj b/projects/Win/vc11/unit-misc.vcxproj
new file mode 100644 (file)
index 0000000..ecac829
--- /dev/null
@@ -0,0 +1,493 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{77350FDC-9E51-438B-9A8F-D2FEA11D46B2}</ProjectGuid>\r
+    <RootNamespace>unitmisc</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\hoard_threadtest.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\larson.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\linux_scale.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\michael_allocator.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\random.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\lock\spinlock.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\michael_allocator.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\random_gen.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\lock\nolock.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\lock\win32_lock.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/unit-misc.vcxproj.filters b/projects/Win/vc11/unit-misc.vcxproj.filters
new file mode 100644 (file)
index 0000000..39108a6
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\hoard_threadtest.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\larson.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\linux_scale.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\michael_allocator.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\random.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\lock\spinlock.cpp">\r
+      <Filter>lock</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\random_gen.h">\r
+      <Filter>alloc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\michael_allocator.h">\r
+      <Filter>alloc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\unit\lock\win32_lock.h">\r
+      <Filter>lock</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\unit\lock\nolock.h">\r
+      <Filter>lock</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="alloc">\r
+      <UniqueIdentifier>{03866e2b-6bdb-47ed-a165-3c7f19927d0e}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="lock">\r
+      <UniqueIdentifier>{6952493f-7eee-4643-a7c4-b2fefbb583d2}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/unit-pqueue.vcxproj b/projects/Win/vc11/unit-pqueue.vcxproj
new file mode 100644 (file)
index 0000000..56cf92f
--- /dev/null
@@ -0,0 +1,492 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\ellen_bintree_pqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\pqueue_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\pqueue_item.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\pqueue_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\skiplist_pqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\std_pqueue.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\pqueue\pop.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\pqueue\push.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\pqueue\push_pop.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{20B6C380-E96A-4cff-BC17-D88AAE581919}</ProjectGuid>\r
+    <RootNamespace>unitpqueue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/unit-prerequisites.vcxproj b/projects/Win/vc11/unit-prerequisites.vcxproj
new file mode 100644 (file)
index 0000000..e6b2104
--- /dev/null
@@ -0,0 +1,562 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{61179F2F-07E1-490D-B64D-D85A90B6EF81}</ProjectGuid>\r
+    <RootNamespace>unitprerequisites</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\cppunit\cppunit_mini.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\cppunit_proxy.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\file_reporter.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\ellen_bintree_update_desc_pool.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\michael_alloc.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_cuckoo_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_deque_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\test_beans.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\thread.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_ellenbintree_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_mspriorityqueue_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_segmentedqueue_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_skip_list_stat.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\ellen_bintree_update_desc_pool.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\michael_alloc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\cppunit\test_main.cpp" />\r
+    <ClCompile Include="..\..\..\tests\cppunit\thread.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <CustomBuild Include="..\..\..\tests\data\test-debug.conf">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+    <CustomBuild Include="..\..\..\tests\data\test-express.conf">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+    <CustomBuild Include="..\..\..\tests\data\test.conf">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+    <CustomBuild Include="..\..\..\tests\data\text.txt">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/unit-queue.vcxproj b/projects/Win/vc11/unit-queue.vcxproj
new file mode 100644 (file)
index 0000000..093fd13
--- /dev/null
@@ -0,0 +1,493 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{6C15AF8A-4A99-49F9-BCF0-1BF36771099A}</ProjectGuid>\r
+    <RootNamespace>unitqueue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\queue\intrusive_queue_reader_writer.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_pop.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_push.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_random.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_reader_writer.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\queue\intrusive_queue_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\intrusive_queue_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\queue_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\queue_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\std_queue.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/unit-set-delodd.vcxproj b/projects/Win/vc11/unit-set-delodd.vcxproj
new file mode 100644 (file)
index 0000000..6b11634
--- /dev/null
@@ -0,0 +1,482 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_delodd.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{46363760-5DF1-4ee9-B9DE-DC3A146C8E89}</ProjectGuid>\r
+    <RootNamespace>unitset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/unit-set-insdel.vcxproj b/projects/Win/vc11/unit-set-insdel.vcxproj
new file mode 100644 (file)
index 0000000..7169c8c
--- /dev/null
@@ -0,0 +1,493 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdelfind.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func2.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func3.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func4.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func5.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func6.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func7.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_string.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\set2\set_insdel_func.h" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{0100BA8C-277D-4a81-8061-E39FD07A9CEF}</ProjectGuid>\r
+    <RootNamespace>unitset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc11/unit-stack.vcxproj b/projects/Win/vc11/unit-stack.vcxproj
new file mode 100644 (file)
index 0000000..ef84cec
--- /dev/null
@@ -0,0 +1,490 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{E29DE1F7-AE8D-4AE6-98B1-147E5103D974}</ProjectGuid>\r
+    <RootNamespace>unitstack</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v110</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc11\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc11-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc11\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc11-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\stack\stack_intrusive_pushpop.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\stack\stack_push.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\stack\stack_pushpop.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\stack\intrusive_stack_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\stack\intrusive_stack_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\stack\stack_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\stack\stack_defs.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/cds.sln b/projects/Win/vc12/cds.sln
new file mode 100644 (file)
index 0000000..46adbef
--- /dev/null
@@ -0,0 +1,619 @@
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2013\r
+VisualStudioVersion = 12.0.21005.1\r
+MinimumVisualStudioVersion = 10.0.40219.1\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cds", "cds.vcxproj", "{408FE9BC-44F0-4E6A-89FA-D6F952584239}"\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unit-test", "unit-test", "{B30CA283-1796-4763-92C3-2E4848D443F7}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-prerequisites", "unit-prerequisites.vcxproj", "{61179F2F-07E1-490D-B64D-D85A90B6EF81}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-misc", "unit-misc.vcxproj", "{77350FDC-9E51-438B-9A8F-D2FEA11D46B2}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-queue", "unit-queue.vcxproj", "{6C15AF8A-4A99-49F9-BCF0-1BF36771099A}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-stack", "unit-stack.vcxproj", "{E29DE1F7-AE8D-4AE6-98B1-147E5103D974}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hdr-test", "hdr-test", "{B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\test-hdr\size_check.h = ..\..\..\tests\test-hdr\size_check.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-deque", "hdr-test-deque.vcxproj", "{CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-map", "hdr-test-map.vcxproj", "{282E9A9A-386A-40FB-A483-994BACE24830}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-misc", "hdr-test-misc.vcxproj", "{C5E76975-B87B-4B9E-8596-B01DDA683FCA}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-ordered-list", "hdr-test-ordered-list.vcxproj", "{EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "map", "map", "{6BB7A27F-FC59-4267-B6FA-D034176D1459}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\unit\map2\map_types.h = ..\..\..\tests\unit\map2\map_types.h\r
+               ..\..\..\tests\unit\map2\std_hash_map.h = ..\..\..\tests\unit\map2\std_hash_map.h\r
+               ..\..\..\tests\unit\map2\std_hash_map_gcc.h = ..\..\..\tests\unit\map2\std_hash_map_gcc.h\r
+               ..\..\..\tests\unit\map2\std_hash_map_vc.h = ..\..\..\tests\unit\map2\std_hash_map_vc.h\r
+               ..\..\..\tests\unit\map2\std_map.h = ..\..\..\tests\unit\map2\std_map.h\r
+               ..\..\..\tests\unit\map2\std_map_gcc.h = ..\..\..\tests\unit\map2\std_map_gcc.h\r
+               ..\..\..\tests\unit\map2\std_map_vc.h = ..\..\..\tests\unit\map2\std_map_vc.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "set", "set", "{A64449B7-90FB-4E2B-A686-9EFC0E298644}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\unit\set2\set_defs.h = ..\..\..\tests\unit\set2\set_defs.h\r
+               ..\..\..\tests\unit\set2\set_types.h = ..\..\..\tests\unit\set2\set_types.h\r
+               ..\..\..\tests\unit\set2\std_hash_set.h = ..\..\..\tests\unit\set2\std_hash_set.h\r
+               ..\..\..\tests\unit\set2\std_hash_set_std.h = ..\..\..\tests\unit\set2\std_hash_set_std.h\r
+               ..\..\..\tests\unit\set2\std_hash_set_vc9.h = ..\..\..\tests\unit\set2\std_hash_set_vc9.h\r
+               ..\..\..\tests\unit\set2\std_set.h = ..\..\..\tests\unit\set2\std_set.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-delodd", "unit-map-delodd.vcxproj", "{3C598F96-FB84-4D42-9B43-F697F53B0221}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-find", "unit-map-find.vcxproj", "{BA2A9239-0299-4069-BB0E-16DACE87ADE0}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-insdel", "unit-map-insdel.vcxproj", "{CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-set-delodd", "unit-set-delodd.vcxproj", "{AF7B2253-2E6D-4992-94D9-4B3699C54929}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-set-insdel", "unit-set-insdel.vcxproj", "{BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-priority_queue", "hdr-test-priority_queue.vcxproj", "{90192F7D-5850-41DD-AE89-62D26B387162}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-queue", "hdr-test-queue.vcxproj", "{33664E63-8D24-4FF4-A744-9782EB711509}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-set", "hdr-test-set.vcxproj", "{E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-stack", "hdr-test-stack.vcxproj", "{E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-striped-set", "hdr-test-striped-set.vcxproj", "{A38E5597-6916-4480-A343-C9846EF544E4}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-tree", "hdr-test-tree.vcxproj", "{6F834EAD-7B94-4979-A0F1-A662E3D30145}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-pqueue", "unit-pqueue.vcxproj", "{20B6C380-E96A-4CFF-BC17-D88AAE581919}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Win32 = Debug|Win32\r
+               Debug|x64 = Debug|x64\r
+               DebugVLD|Win32 = DebugVLD|Win32\r
+               DebugVLD|x64 = DebugVLD|x64\r
+               ICL-Debug|Win32 = ICL-Debug|Win32\r
+               ICL-Debug|x64 = ICL-Debug|x64\r
+               ICL-Release|Win32 = ICL-Release|Win32\r
+               ICL-Release|x64 = ICL-Release|x64\r
+               Release|Win32 = Release|Win32\r
+               Release|x64 = Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|Win32.Build.0 = Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|x64.ActiveCfg = Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|x64.Build.0 = Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|Win32.ActiveCfg = Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|Win32.Build.0 = Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|x64.ActiveCfg = Release|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|x64.Build.0 = Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|Win32.Build.0 = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|x64.ActiveCfg = Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|x64.Build.0 = Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|Win32.ActiveCfg = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|Win32.Build.0 = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|Win32.ActiveCfg = Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|Win32.Build.0 = Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|x64.ActiveCfg = Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|x64.Build.0 = Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|Win32.Build.0 = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|x64.ActiveCfg = Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|x64.Build.0 = Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|Win32.ActiveCfg = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|Win32.Build.0 = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|Win32.ActiveCfg = Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|Win32.Build.0 = Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|x64.ActiveCfg = Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|x64.Build.0 = Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|Win32.Build.0 = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|x64.ActiveCfg = Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|x64.Build.0 = Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|Win32.ActiveCfg = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|Win32.Build.0 = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|Win32.ActiveCfg = Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|Win32.Build.0 = Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|x64.ActiveCfg = Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|x64.Build.0 = Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|x64.Build.0 = Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|Win32.ActiveCfg = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|Win32.Build.0 = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|Win32.Build.0 = Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|x64.ActiveCfg = Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|x64.Build.0 = Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|Win32.Build.0 = Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|x64.ActiveCfg = Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|x64.Build.0 = Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|Win32.ActiveCfg = Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|Win32.Build.0 = Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|x64.ActiveCfg = Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|x64.Build.0 = Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|Win32.Build.0 = Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|x64.ActiveCfg = Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|x64.Build.0 = Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|Win32.ActiveCfg = Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|Win32.Build.0 = Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|x64.ActiveCfg = Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|x64.Build.0 = Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|Win32.Build.0 = Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|x64.ActiveCfg = Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|x64.Build.0 = Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|Win32.ActiveCfg = Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|Win32.Build.0 = Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|x64.ActiveCfg = Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|x64.Build.0 = Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|Win32.Build.0 = Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|x64.ActiveCfg = Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|x64.Build.0 = Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|Win32.ActiveCfg = Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|Win32.Build.0 = Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|x64.ActiveCfg = Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|x64.Build.0 = Release|x64\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.Debug|Win32.Build.0 = Debug|Win32\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.Debug|x64.ActiveCfg = Debug|x64\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.Debug|x64.Build.0 = Debug|x64\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.Release|Win32.ActiveCfg = Release|Win32\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.Release|Win32.Build.0 = Release|Win32\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.Release|x64.ActiveCfg = Release|x64\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221}.Release|x64.Build.0 = Release|x64\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.Debug|Win32.Build.0 = Debug|Win32\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.Debug|x64.ActiveCfg = Debug|x64\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.Debug|x64.Build.0 = Debug|x64\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.Release|Win32.ActiveCfg = Release|Win32\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.Release|Win32.Build.0 = Release|Win32\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.Release|x64.ActiveCfg = Release|x64\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0}.Release|x64.Build.0 = Release|x64\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.Debug|Win32.Build.0 = Debug|Win32\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.Debug|x64.ActiveCfg = Debug|x64\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.Debug|x64.Build.0 = Debug|x64\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.Release|Win32.ActiveCfg = Release|Win32\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.Release|Win32.Build.0 = Release|Win32\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.Release|x64.ActiveCfg = Release|x64\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}.Release|x64.Build.0 = Release|x64\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.Debug|Win32.Build.0 = Debug|Win32\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.Debug|x64.ActiveCfg = Debug|x64\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.Debug|x64.Build.0 = Debug|x64\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.Release|Win32.ActiveCfg = Release|Win32\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.Release|Win32.Build.0 = Release|Win32\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.Release|x64.ActiveCfg = Release|x64\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929}.Release|x64.Build.0 = Release|x64\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.Debug|Win32.Build.0 = Debug|Win32\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.Debug|x64.ActiveCfg = Debug|x64\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.Debug|x64.Build.0 = Debug|x64\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.Release|Win32.ActiveCfg = Release|Win32\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.Release|Win32.Build.0 = Release|Win32\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.Release|x64.ActiveCfg = Release|x64\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}.Release|x64.Build.0 = Release|x64\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.Debug|Win32.Build.0 = Debug|Win32\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.Debug|x64.ActiveCfg = Debug|x64\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.Debug|x64.Build.0 = Debug|x64\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.Release|Win32.ActiveCfg = Release|Win32\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.Release|Win32.Build.0 = Release|Win32\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.Release|x64.ActiveCfg = Release|x64\r
+               {90192F7D-5850-41DD-AE89-62D26B387162}.Release|x64.Build.0 = Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|Win32.Build.0 = Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|x64.ActiveCfg = Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|x64.Build.0 = Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|Win32.ActiveCfg = Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|Win32.Build.0 = Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|x64.ActiveCfg = Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|x64.Build.0 = Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|x64.Build.0 = Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|Win32.Build.0 = Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|x64.ActiveCfg = Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|x64.Build.0 = Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|x64.Build.0 = Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|Win32.Build.0 = Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|x64.ActiveCfg = Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|x64.Build.0 = Release|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Debug|Win32.Build.0 = Debug|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Debug|x64.ActiveCfg = Debug|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Debug|x64.Build.0 = Debug|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Release|Win32.ActiveCfg = Release|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Release|Win32.Build.0 = Release|Win32\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Release|x64.ActiveCfg = Release|x64\r
+               {A38E5597-6916-4480-A343-C9846EF544E4}.Release|x64.Build.0 = Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|Win32.Build.0 = Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|x64.ActiveCfg = Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|x64.Build.0 = Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|Win32.ActiveCfg = Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|Win32.Build.0 = Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|x64.ActiveCfg = Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|x64.Build.0 = Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|Win32.Build.0 = Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|x64.ActiveCfg = Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|x64.Build.0 = Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|Win32.ActiveCfg = ICL-Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|Win32.Build.0 = ICL-Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|x64.ActiveCfg = ICL-Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Debug|x64.Build.0 = ICL-Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|Win32.ActiveCfg = ICL-Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|Win32.Build.0 = ICL-Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|x64.ActiveCfg = ICL-Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.ICL-Release|x64.Build.0 = ICL-Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|Win32.ActiveCfg = Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|Win32.Build.0 = Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|x64.ActiveCfg = Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|x64.Build.0 = Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+       GlobalSection(NestedProjects) = preSolution\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {6BB7A27F-FC59-4267-B6FA-D034176D1459} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {A64449B7-90FB-4E2B-A686-9EFC0E298644} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919} = {B30CA283-1796-4763-92C3-2E4848D443F7}\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {282E9A9A-386A-40FB-A483-994BACE24830} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {90192F7D-5850-41DD-AE89-62D26B387162} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {33664E63-8D24-4FF4-A744-9782EB711509} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {A38E5597-6916-4480-A343-C9846EF544E4} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145} = {B8C24D26-A3BF-4DA6-B64C-142CBA4BFE75}\r
+               {3C598F96-FB84-4D42-9B43-F697F53B0221} = {6BB7A27F-FC59-4267-B6FA-D034176D1459}\r
+               {BA2A9239-0299-4069-BB0E-16DACE87ADE0} = {6BB7A27F-FC59-4267-B6FA-D034176D1459}\r
+               {CA25BDBF-B354-4597-B6D2-220ABBB0D2F4} = {6BB7A27F-FC59-4267-B6FA-D034176D1459}\r
+               {AF7B2253-2E6D-4992-94D9-4B3699C54929} = {A64449B7-90FB-4E2B-A686-9EFC0E298644}\r
+               {BA23811C-D4CB-4836-B2F3-6791BD6FFCD1} = {A64449B7-90FB-4E2B-A686-9EFC0E298644}\r
+       EndGlobalSection\r
+       GlobalSection(DPCodeReviewSolutionGUID) = preSolution\r
+               DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/projects/Win/vc12/cds.vcxproj b/projects/Win/vc12/cds.vcxproj
new file mode 100644 (file)
index 0000000..13436ef
--- /dev/null
@@ -0,0 +1,1018 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{408FE9BC-44F0-4E6A-89FA-D6F952584239}</ProjectGuid>\r
+    <RootNamespace>cds</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">true</GenerateManifest>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">true</GenerateManifest>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">true</GenerateManifest>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</PostBuildEventUseInBuild>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</PostBuildEventUseInBuild>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">true</GenerateManifest>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</PostBuildEventUseInBuild>\r
+    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</PostBuildEventUseInBuild>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">true</GenerateManifest>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">true</LinkIncremental>\r
+    <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">true</GenerateManifest>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">libcds-x86-vc12_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">libcds-x86-icl_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">libcds-x86-vc12_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">libcds-x86-vc12</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">libcds-x86-icl</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">libcds-amd64-vc12_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">libcds-amd64-icl_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">libcds-amd64-vc12_debug</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">libcds-amd64-vc12</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">libcds-amd64-icl</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>false</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+      <SuppressStartupBanner>false</SuppressStartupBanner>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>\r
+      <WholeProgramOptimization>false</WholeProgramOptimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <EmitDiagnosticsToFile>false</EmitDiagnosticsToFile>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>NotSet</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>\r
+      </LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>false</Profile>\r
+      <AdditionalDependencies>\r
+      </AdditionalDependencies>\r
+      <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>\r
+      <SuppressStartupBanner>false</SuppressStartupBanner>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Message>\r
+      </Message>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/wd4512 /wd4127 %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..\;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <OutputFile>$(OutDir)$(TargetName).dll</OutputFile>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\src\dllmain.cpp" />\r
+    <ClCompile Include="..\..\..\src\hrc_gc.cpp" />\r
+    <ClCompile Include="..\..\..\src\hzp_gc.cpp" />\r
+    <ClCompile Include="..\..\..\src\init.cpp" />\r
+    <ClCompile Include="..\..\..\src\michael_heap.cpp" />\r
+    <ClCompile Include="..\..\..\src\ptb_gc.cpp" />\r
+    <ClCompile Include="..\..\..\src\topology_hpux.cpp" />\r
+    <ClCompile Include="..\..\..\src\topology_linux.cpp" />\r
+    <ClCompile Include="..\..\..\src\topology_osx.cpp" />\r
+    <ClCompile Include="..\..\..\src\urcu_gp.cpp" />\r
+    <ClCompile Include="..\..\..\src\urcu_sh.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\cds\algo\base.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\elimination.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_opt.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_tls.h" />\r
+    <ClInclude Include="..\..\..\cds\algo\flat_combining.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\cxx11_atomic_prepatches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_boost.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_std.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_patches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_prepatches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_macro.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\cxx11_atomic_patches.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\compiler_barriers.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\cxx11_atomic_patches_win.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\container\basket_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\guarded_ptr_cast.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_deque.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\mspriority_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_flat_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_slist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_unordered_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_std.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_vc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\adapter.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_flat_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_slist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_stable_vector.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_unordered_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_vector.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_std.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_vc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_vector.h" />\r
+    <ClInclude Include="..\..\..\cds\cxx11_atomic.h" />\r
+    <ClInclude Include="..\..\..\cds\details\binary_functor_wrapper.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bit_reverse_counter.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bounded_container.h" />\r
+    <ClInclude Include="..\..\..\cds\details\cxx11_features.h" />\r
+    <ClInclude Include="..\..\..\cds\details\hash_functor_selector.h" />\r
+    <ClInclude Include="..\..\..\cds\details\lib.h" />\r
+    <ClInclude Include="..\..\..\cds\details\static_functor.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\condition_variable.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\memory.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\mutex.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\chrono.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\tuple.h" />\r
+    <ClInclude Include="..\..\..\cds\details\std\type_traits.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\all.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\exception.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\gc_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\guarded_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hp_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hp_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\basket_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\deque_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\dummy_node_holder.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\ellen_bintree_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_deque.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\mspriority_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\node_traits.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\options.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_rcu.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\adapter.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_avl_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_list.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_sg_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_slist.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_splay_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_treap_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_unordered_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\resizing_policy.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\striping_policy.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\mapper.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\pool_allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\vyukov_queue_pool.h" />\r
+    <ClInclude Include="..\..\..\cds\os\osx\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\osx\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\fake_topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\base.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\check_deadlock.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpb.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpi.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpt.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh_decl.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_buffered.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_threaded.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\exempt_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\dispose_thread.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\general_buffered.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\general_instant.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\general_threaded.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\options.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_buffered.h" />\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_threaded.h" />\r
+    <ClInclude Include="..\..\..\src\hzp_const.h" />\r
+    <ClInclude Include="..\..\..\cds\backoff_strategy.h" />\r
+    <ClInclude Include="..\..\..\cds\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\init.h" />\r
+    <ClInclude Include="..\..\..\cds\int_algo.h" />\r
+    <ClInclude Include="..\..\..\cds\numtraits.h" />\r
+    <ClInclude Include="..\..\..\cds\ref.h" />\r
+    <ClInclude Include="..\..\..\cds\refcounter.h" />\r
+    <ClInclude Include="..\..\..\cds\version.h" />\r
+    <ClInclude Include="..\..\..\cds\details\aligned_allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\details\aligned_type.h" />\r
+    <ClInclude Include="..\..\..\cds\details\allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bitop_generic.h" />\r
+    <ClInclude Include="..\..\..\cds\details\bounded_array.h" />\r
+    <ClInclude Include="..\..\..\cds\details\comparator.h" />\r
+    <ClInclude Include="..\..\..\cds\details\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\details\functor_wrapper.h" />\r
+    <ClInclude Include="..\..\..\cds\details\is_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\details\make_const_type.h" />\r
+    <ClInclude Include="..\..\..\cds\details\marked_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\details\noncopyable.h" />\r
+    <ClInclude Include="..\..\..\cds\impl\queue_base.h" />\r
+    <ClInclude Include="..\..\..\cds\details\trivial_assign.h" />\r
+    <ClInclude Include="..\..\..\cds\details\type_padding.h" />\r
+    <ClInclude Include="..\..\..\cds\details\void_selector.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\default_gc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hp.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_alloc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_inline.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_retired.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_type.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\hzp.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\gc_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_fwd.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_inline.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_retired.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\ptb\ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\gc\details\retired_ptr.h" />\r
+    <ClInclude Include="..\..\..\cds\user_setup\allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\user_setup\cache_line.h" />\r
+    <ClInclude Include="..\..\..\cds\user_setup\threading.h" />\r
+    <ClInclude Include="..\..\..\cds\lock\spinlock.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\_common.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\auto_detect.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\model.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls.h" />\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls_manager.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_barriers.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\compiler_barriers.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\defs.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\backoff.h" />\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\bitop.h" />\r
+    <ClInclude Include="..\..\..\cds\os\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\syserror.h" />\r
+    <ClInclude Include="..\..\..\cds\os\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\os\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\hpux\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\hpux\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\hpux\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\linux\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\linux\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\linux\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\syserror.h" />\r
+    <ClInclude Include="..\..\..\cds\os\posix\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\os\sunos\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\sunos\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\sunos\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\syserror.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\thread.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\win\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\aix\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\aix\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\aix\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\libc\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\alloc_aligned.h" />\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\timer.h" />\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\topology.h" />\r
+    <ClInclude Include="..\..\..\cds\os\details\fake_topology.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\allocator.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\bound_check.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\options.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\osalloc_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\memory\michael\procheap_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\buffer.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\compare.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\hash.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_std.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_var.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\options.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\permutation.h" />\r
+    <ClInclude Include="..\..\..\cds\opt\value_cleaner.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcstack.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\moir_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\msqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\optimistic_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\queue_stat.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\single_link_struct.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\treiber_stack.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\tsigas_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\vyukov_mpmc_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcdeque.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcpriority_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\fcstack.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hp.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hrc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_impl.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_ptb.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\moir_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\msqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\optimistic_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\rwqueue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set.h" />\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_nogc.h" />\r
+    <ClInclude Include="..\..\..\cds\container\treiber_stack.h" />\r
+    <ClInclude Include="..\..\..\cds\container\tsigas_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\vyukov_mpmc_cycle_queue.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_kvlist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_list.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_kvlist.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_list.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/cds.vcxproj.filters b/projects/Win/vc12/cds.vcxproj.filters
new file mode 100644 (file)
index 0000000..7c59474
--- /dev/null
@@ -0,0 +1,1329 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="Source Files">\r
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r
+      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r
+    </Filter>\r
+    <Filter Include="Header Files">\r
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds">\r
+      <UniqueIdentifier>{202add83-3de8-46db-a1aa-4c0030beae1a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\details">\r
+      <UniqueIdentifier>{0051e611-824f-49c5-b100-df394c55975a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc">\r
+      <UniqueIdentifier>{a3c9928d-5261-4593-a8b9-728235f7056f}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\hzp">\r
+      <UniqueIdentifier>{21a6c665-7381-45b8-9f03-b21f3da5503d}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\hrc">\r
+      <UniqueIdentifier>{695568b2-b136-4b80-bd18-6e3e13c22301}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\ptb">\r
+      <UniqueIdentifier>{53d28ee4-5fe9-4fa1-a617-53d8b0628eac}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\gc\details">\r
+      <UniqueIdentifier>{d7c48c0e-cc45-4a1a-b8e9-aa5b50abd22a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\user_setup">\r
+      <UniqueIdentifier>{f9f695b1-1322-437c-87b2-c243d83e1b0c}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\lock">\r
+      <UniqueIdentifier>{189d2da3-ba56-44b2-be2a-fad41fd75c4e}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\threading">\r
+      <UniqueIdentifier>{1af712b3-4429-4ecc-b0a2-f9c639decd19}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler">\r
+      <UniqueIdentifier>{4cce5abe-4256-4883-988d-2e725f38eee4}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc">\r
+      <UniqueIdentifier>{98435c30-814f-40fb-8906-0e7847db55ff}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\amd64">\r
+      <UniqueIdentifier>{87ab6aea-29b2-4e79-ad22-2190fa3c5870}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\ia64">\r
+      <UniqueIdentifier>{9aedc993-3ad3-4f6b-9df0-cdf5a69a3ae0}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\sparc">\r
+      <UniqueIdentifier>{44e1d2da-18b3-416f-9aeb-d937d46b5479}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\x86">\r
+      <UniqueIdentifier>{45671e15-bec1-47fd-a174-a7b57bb55458}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\gcc\ppc64">\r
+      <UniqueIdentifier>{58c4d0de-4802-4a0f-9f03-37b338b9d08a}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\vc">\r
+      <UniqueIdentifier>{04b93d00-cb76-468a-86ce-f03ba531e47d}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\vc\x86">\r
+      <UniqueIdentifier>{2a690a60-0be8-423f-91cb-7f198b4bc507}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\vc\amd64">\r
+      <UniqueIdentifier>{125d466a-6e6e-4c88-9c60-475557797d91}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS">\r
+      <UniqueIdentifier>{f058a2ad-989d-45e9-9bb2-43dfda122708}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\hpux">\r
+      <UniqueIdentifier>{36e1bb0b-ab23-4484-8fb2-cc52bad3dbe3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\linux">\r
+      <UniqueIdentifier>{6d27baa4-414b-41a6-a7e0-72e406af5543}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\posix">\r
+      <UniqueIdentifier>{00c94a5c-9f94-427b-9739-fc06a2f39167}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\sunos">\r
+      <UniqueIdentifier>{4bc2a231-2ea0-4af8-84ad-534a76fda942}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\win">\r
+      <UniqueIdentifier>{64c62189-73c0-4c45-9bf5-aed7b5c6c5e4}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\aix">\r
+      <UniqueIdentifier>{5cf9ca07-cadf-4854-a36d-f8293bffc553}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\libc">\r
+      <UniqueIdentifier>{20b237f6-e6fd-43bd-970d-4f1daf89f494}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\free_bsd">\r
+      <UniqueIdentifier>{f1518588-7c09-496e-81c0-a1ee55cc5d21}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\details">\r
+      <UniqueIdentifier>{fcebfe0e-30de-48ac-8890-7497f1d97fba}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\memory">\r
+      <UniqueIdentifier>{5c631093-3ca2-4a36-acf7-2d9368b65366}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\memory\michael">\r
+      <UniqueIdentifier>{b7cdb65c-15d3-4655-abec-1e4640271432}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\opt">\r
+      <UniqueIdentifier>{fe7576b4-d93f-473a-8522-493feac51996}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\intrusive">\r
+      <UniqueIdentifier>{7226715d-6777-4c01-8e66-83b3885c00c1}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container">\r
+      <UniqueIdentifier>{84ca9e83-f6c9-4503-a45f-14f08317fd70}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container\details">\r
+      <UniqueIdentifier>{4b79fe31-4f6c-4e05-8910-1151a26d51f3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Resource Files">\r
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\clang">\r
+      <UniqueIdentifier>{ae97048d-bd62-4ff2-be28-3c84338e7186}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\details\std">\r
+      <UniqueIdentifier>{e6c65d81-ad06-40f3-be4e-ddaab3295bf3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\intrusive\striped_set">\r
+      <UniqueIdentifier>{560b4d4c-71e1-443c-942e-dcc5a275c7c2}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container\striped_map">\r
+      <UniqueIdentifier>{6530b757-5bb7-4de0-b1c9-019acc8183ba}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\container\striped_set">\r
+      <UniqueIdentifier>{d3f68c37-8c36-448e-9d4c-cd89a940d275}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\urcu">\r
+      <UniqueIdentifier>{32754dfc-727a-42ff-b243-9a8510bf5c4e}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\urcu\details">\r
+      <UniqueIdentifier>{c621d14b-f90c-4e13-bfd6-16318f3e16da}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\intrusive\details">\r
+      <UniqueIdentifier>{97ec57a8-312a-408a-9f19-76705940a0aa}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\compiler\icl">\r
+      <UniqueIdentifier>{355e1ac3-ee6a-49c1-8ba6-03e0b7a036e3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\OS\osx">\r
+      <UniqueIdentifier>{d6687964-5707-4f13-aedf-99873453e402}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files\cds\algo">\r
+      <UniqueIdentifier>{a85484ff-a066-4ee3-a856-b724b72dd7ff}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\src\dllmain.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\hrc_gc.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\hzp_gc.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\init.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\michael_heap.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\ptb_gc.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\topology_hpux.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\topology_linux.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\urcu_gp.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\urcu_sh.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\topology_osx.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\src\hzp_const.h">\r
+      <Filter>Source Files</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\backoff_strategy.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\bitop.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\init.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\int_algo.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\numtraits.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\ref.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\refcounter.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\version.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\aligned_allocator.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\aligned_type.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\allocator.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bitop_generic.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bounded_array.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\comparator.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\defs.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\functor_wrapper.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\guarded_ptr.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\is_aligned.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\make_const_type.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\marked_ptr.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\noncopyable.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\impl\queue_base.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\trivial_assign.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\type_padding.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\void_selector.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\default_gc.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hp.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\nogc.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_alloc.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_fwd.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_inline.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_retired.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\details\hp_type.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hzp\hzp.h">\r
+      <Filter>Header Files\cds\gc\hzp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\gc_fwd.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\hrc.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_fwd.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_inline.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc\details\hrc_retired.h">\r
+      <Filter>Header Files\cds\gc\hrc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb\ptb.h">\r
+      <Filter>Header Files\cds\gc\ptb</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\details\retired_ptr.h">\r
+      <Filter>Header Files\cds\gc\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\user_setup\allocator.h">\r
+      <Filter>Header Files\cds\user_setup</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\user_setup\cache_line.h">\r
+      <Filter>Header Files\cds\user_setup</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\user_setup\threading.h">\r
+      <Filter>Header Files\cds\user_setup</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\lock\spinlock.h">\r
+      <Filter>Header Files\cds\lock</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\_common.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\auto_detect.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\gcc_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\model.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\msvc_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\pthread_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\wintls_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\backoff.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\bitop.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\defs.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_barriers.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\defs.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ia64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ia64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\sparc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\sparc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ppc64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ppc64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ppc64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\compiler_barriers.h">\r
+      <Filter>Header Files\cds\compiler\vc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\defs.h">\r
+      <Filter>Header Files\cds\compiler\vc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\backoff.h">\r
+      <Filter>Header Files\cds\compiler\vc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\bitop.h">\r
+      <Filter>Header Files\cds\compiler\vc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\backoff.h">\r
+      <Filter>Header Files\cds\compiler\vc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\bitop.h">\r
+      <Filter>Header Files\cds\compiler\vc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\syserror.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\thread.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\timer.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\topology.h">\r
+      <Filter>Header Files\cds\OS</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\hpux\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\hpux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\hpux\timer.h">\r
+      <Filter>Header Files\cds\OS\hpux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\hpux\topology.h">\r
+      <Filter>Header Files\cds\OS\hpux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\linux\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\linux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\linux\timer.h">\r
+      <Filter>Header Files\cds\OS\linux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\linux\topology.h">\r
+      <Filter>Header Files\cds\OS\linux</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\syserror.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\thread.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\sunos\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\sunos</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\sunos\timer.h">\r
+      <Filter>Header Files\cds\OS\sunos</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\sunos\topology.h">\r
+      <Filter>Header Files\cds\OS\sunos</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\syserror.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\thread.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\timer.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\win\topology.h">\r
+      <Filter>Header Files\cds\OS\win</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\aix\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\aix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\aix\timer.h">\r
+      <Filter>Header Files\cds\OS\aix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\aix\topology.h">\r
+      <Filter>Header Files\cds\OS\aix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\libc\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\libc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\alloc_aligned.h">\r
+      <Filter>Header Files\cds\OS\free_bsd</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\timer.h">\r
+      <Filter>Header Files\cds\OS\free_bsd</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\free_bsd\topology.h">\r
+      <Filter>Header Files\cds\OS\free_bsd</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\details\fake_topology.h">\r
+      <Filter>Header Files\cds\OS\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\allocator.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\bound_check.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\options.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\osalloc_stat.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\michael\procheap_stat.h">\r
+      <Filter>Header Files\cds\memory\michael</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\buffer.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\compare.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\hash.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_std.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\make_options_var.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\options.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\permutation.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\opt\value_cleaner.h">\r
+      <Filter>Header Files\cds\opt</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcqueue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\fcstack.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_hrc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_hrc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\moir_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\msqueue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\optimistic_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\queue_stat.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\segmented_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\single_link_struct.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\treiber_stack.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\tsigas_cycle_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\vyukov_mpmc_cycle_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcdeque.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcpriority_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcqueue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\fcstack.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\moir_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\msqueue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\optimistic_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\rwqueue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\segmented_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\treiber_stack.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\tsigas_cycle_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\vyukov_mpmc_cycle_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\guarded_ptr_cast.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_kvlist.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_lazy_list.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_kvlist.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_michael_list.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hp_decl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hp_impl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_decl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\hrc_impl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_decl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\ptb_impl.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\x86\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\vc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\vc\amd64\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\vc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\amd64\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\amd64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\x86\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\x86</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\cxx11_atomic.h">\r
+      <Filter>Header Files\cds</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\sparc\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\sparc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\ia64\cxx11_atomic.h">\r
+      <Filter>Header Files\cds\compiler\gcc\ia64</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_boost.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cstdint_std.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_patches.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\cxx11_atomic_patches.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bounded_container.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\hash_functor_selector.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\cxx11_features.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\all.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\defs.h">\r
+      <Filter>Header Files\cds\compiler\clang</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_deque.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\mapper.h">\r
+      <Filter>Header Files\cds\memory</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_deque.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\basket_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\basket_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\cxx11_atomic_prepatches.h">\r
+      <Filter>Header Files\cds\compiler</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\clang\cxx11_atomic_prepatches.h">\r
+      <Filter>Header Files\cds\compiler\clang</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\deque_stat.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\type_traits.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\memory.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\tuple.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\cuckoo_set.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\adapter.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_avl_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_list.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_sg_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_slist.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_splay_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_treap_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\boost_unordered_set.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\resizing_policy.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\striped_set\striping_policy.h">\r
+      <Filter>Header Files\cds\intrusive\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\adapter.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_flat_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_list.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_slist.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_stable_vector.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_unordered_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\boost_vector.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_std.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_hash_set_vc.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_list.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_set.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set\std_vector.h">\r
+      <Filter>Header Files\cds\container\striped_set</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_flat_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_list.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_slist.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\boost_unordered_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_std.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_hash_map_vc.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_list.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map\std_map.h">\r
+      <Filter>Header Files\cds\container\striped_map</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\striped_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_set.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\cuckoo_map.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\exception.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_base.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_hrc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_set.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_hrc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\make_skip_list_map.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\condition_variable.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\mutex.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\thread.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\std\chrono.h">\r
+      <Filter>Header Files\cds\details\std</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\static_functor.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\node_traits.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\options.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\base.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\check_deadlock.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gp_decl.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpb.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpi.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\gpt.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\exempt_ptr.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\general_buffered.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\general_instant.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\general_threaded.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\options.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\lazy_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\michael_set_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_list_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_list_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_kvlist_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\lazy_kvlist_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\split_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\michael_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\split_list_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\skip_list_nogc.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\threading\details\cxx11_manager.h">\r
+      <Filter>Header Files\cds\threading</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_set_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\skip_list_map_nogc.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\binary_functor_wrapper.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\gc\gc_fwd.h">\r
+      <Filter>Header Files\cds\gc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\dummy_node_holder.h">\r
+      <Filter>Header Files\cds\intrusive\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sh_decl.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_buffered.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\details\sig_threaded.h">\r
+      <Filter>Header Files\cds\urcu\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\dispose_thread.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_buffered.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\urcu\signal_threaded.h">\r
+      <Filter>Header Files\cds\urcu</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\ellen_bintree_base.h">\r
+      <Filter>Header Files\cds\intrusive\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_hp.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_ptb.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_rcu.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_base.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\pool_allocator.h">\r
+      <Filter>Header Files\cds\memory</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\memory\vyukov_queue_pool.h">\r
+      <Filter>Header Files\cds\memory</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_rcu.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\bit_reverse_counter.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\mspriority_queue.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\compiler_barriers.h">\r
+      <Filter>Header Files\cds\compiler\icl</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\cxx11_atomic_patches_win.h">\r
+      <Filter>Header Files\cds\compiler\icl</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\icl\defs.h">\r
+      <Filter>Header Files\cds\compiler\icl</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\details\lib.h">\r
+      <Filter>Header Files\cds\details</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_impl.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_hp.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_impl.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_ptb.h">\r
+      <Filter>Header Files\cds\container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\mspriority_queue.h">\r
+      <Filter>Header Files\cds\intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\compiler\gcc\compiler_macro.h">\r
+      <Filter>Header Files\cds\compiler\gcc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\fake_topology.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\posix\timer.h">\r
+      <Filter>Header Files\cds\OS\posix</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\osx\timer.h">\r
+      <Filter>Header Files\cds\OS\osx</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\os\osx\topology.h">\r
+      <Filter>Header Files\cds\OS\osx</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\base.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\elimination.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_opt.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\algo\elimination_tls.h">\r
+      <Filter>Header Files\cds\algo</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-deque.vcxproj b/projects/Win/vc12/hdr-test-deque.vcxproj
new file mode 100644 (file)
index 0000000..6e3fad1
--- /dev/null
@@ -0,0 +1,561 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}</ProjectGuid>\r
+    <RootNamespace>hdrtestdeque</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <RecognizeRestrictKeyword>false</RecognizeRestrictKeyword>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <RecognizeRestrictKeyword>false</RecognizeRestrictKeyword>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <RecognizeRestrictKeyword>false</RecognizeRestrictKeyword>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <RecognizeRestrictKeyword>false</RecognizeRestrictKeyword>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\deque\hdr_deque.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\deque\hdr_intrusive_deque.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_fcdeque.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_intrusive_michael_deque_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_intrusive_michael_deque_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_michael_deque_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\deque\hdr_michael_deque_ptb.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-map.vcxproj b/projects/Win/vc12/hdr-test-map.vcxproj
new file mode 100644 (file)
index 0000000..104dac4
--- /dev/null
@@ -0,0 +1,615 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{282E9A9A-386A-40FB-A483-994BACE24830}</ProjectGuid>\r
+    <RootNamespace>hdrtestmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_striped_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\print_skiplist_stat.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_flat_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_unordered_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_flat_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_unordered_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_map.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_map_reg.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-map.vcxproj.filters b/projects/Win/vc12/hdr-test-map.vcxproj.filters
new file mode 100644 (file)
index 0000000..beb743c
--- /dev/null
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.cpp">\r
+      <Filter>cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hp.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_hrc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hp.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hrc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_nogc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_ptb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_nogc.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_ptb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_flat_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_unordered_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_std.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_vc.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_slist.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hp.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hrc.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_ptb.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hp.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hrc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hp.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hrc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_nogc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_ptb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_nogc.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_ptb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_flat_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_unordered_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_std.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_vc.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_list.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_map.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_slist.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpi.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpt.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpi.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpt.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpi.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpt.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpi.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpt.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpb.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpi.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpt.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_nogc.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_striped_map_reg.cpp">\r
+      <Filter>striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_shb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_sht.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_shb.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_sht.cpp">\r
+      <Filter>michael</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_shb.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_sht.cpp">\r
+      <Filter>skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_shb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_sht.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_shb.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_sht.cpp">\r
+      <Filter>split_list</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\print_skiplist_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map.h">\r
+      <Filter>skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu.h">\r
+      <Filter>skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_striped_map.h">\r
+      <Filter>striped</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.h">\r
+      <Filter>cuckoo</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="cuckoo">\r
+      <UniqueIdentifier>{9cc8e982-b321-4a7d-8362-7f1491ad445d}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="michael">\r
+      <UniqueIdentifier>{c524c47b-2087-42eb-b3b2-f70ed379e373}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="striped">\r
+      <UniqueIdentifier>{33452d52-b86d-4143-9f87-bf154d53f890}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="skip_list">\r
+      <UniqueIdentifier>{1f7bd2f3-a377-47a5-aaae-aaddd60cbedc}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="split_list">\r
+      <UniqueIdentifier>{9318c3c0-92a3-4a5a-be2b-a47411a3e4c4}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-misc.vcxproj b/projects/Win/vc12/hdr-test-misc.vcxproj
new file mode 100644 (file)
index 0000000..a347ce2
--- /dev/null
@@ -0,0 +1,555 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{C5E76975-B87B-4B9E-8596-B01DDA683FCA}</ProjectGuid>\r
+    <RootNamespace>hdrtestmisc</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\allocator_test.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\bitop_st.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\cxx11_atomic_class.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\cxx11_atomic_func.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\find_option.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\hash_tuple.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\michael_allocator.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\thread_init_fini.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\misc\permutation_generator.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\misc\cxx11_convert_memory_order.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\misc\michael_allocator.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-ordered-list.vcxproj b/projects/Win/vc12/hdr-test-ordered-list.vcxproj
new file mode 100644 (file)
index 0000000..a4f65c7
--- /dev/null
@@ -0,0 +1,604 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}</ProjectGuid>\r
+    <RootNamespace>hdrtestordlist</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_sht.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-ordered-list.vcxproj.filters b/projects/Win/vc12/hdr-test-ordered-list.vcxproj.filters
new file mode 100644 (file)
index 0000000..f7f6493
--- /dev/null
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_nogc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpi.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpt.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpi.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpt.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_nogc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_nogc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_shb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_sht.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_shb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_sht.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{fff45fc3-9c35-4f00-94ac-a2403b1caed6}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{b0d8933f-3fbc-49c2-ad77-89bd74461395}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-priority_queue.vcxproj b/projects/Win/vc12/hdr-test-priority_queue.vcxproj
new file mode 100644 (file)
index 0000000..d0e02c7
--- /dev/null
@@ -0,0 +1,554 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_boost_stable_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_deque.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_dyn.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_static.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_dyn.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_static.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_priority_queue_reg.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_pqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_pqueue.h" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{90192F7D-5850-41dd-AE89-62D26B387162}</ProjectGuid>\r
+    <RootNamespace>hdrtestpriority_queue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-priority_queue.vcxproj.filters b/projects/Win/vc12/hdr-test-priority_queue.vcxproj.filters
new file mode 100644 (file)
index 0000000..3a2eb19
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{2e5ccb52-5287-4912-8d3f-aeaf257134cd}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{d864adcf-d418-48b8-85be-6f4d39ac6941}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_priority_queue_reg.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_dyn.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_static.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_dyn.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_static.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_boost_stable_vector.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_deque.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_vector.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_pqueue.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\priority_queue\hdr_pqueue.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-queue.vcxproj b/projects/Win/vc12/hdr-test-queue.vcxproj
new file mode 100644 (file)
index 0000000..28a5589
--- /dev/null
@@ -0,0 +1,583 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{33664E63-8D24-4FF4-A744-9782EB711509}</ProjectGuid>\r
+    <RootNamespace>hdrtestqueue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_fcqueue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_fcqueue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_tsigas_cycle_queue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_vyukovmpmc_cycle_queue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_hzp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_rwqueue.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_vyukov_mpmc_cyclic.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\queue_test_header.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_node.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_singlelink_node.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\queue_test_header.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-queue.vcxproj.filters b/projects/Win/vc12/hdr-test-queue.vcxproj.filters
new file mode 100644 (file)
index 0000000..7dcaaf8
--- /dev/null
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_basketqueue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_fcqueue.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_fcqueue.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hrc.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_tsigas_cycle_queue.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_vyukovmpmc_cycle_queue.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_moirqueue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hrc.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_msqueue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_hzp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_optimistic_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_rwqueue.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\hdr_vyukov_mpmc_cyclic.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\queue\queue_test_header.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_node.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_intrusive_singlelink_node.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\hdr_segmented_queue.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\queue\queue_test_header.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{68aaf08b-6544-4d6a-b912-0935954efdf2}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{a466b6f6-2b88-4c6e-84df-1f9d53122909}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-set.vcxproj b/projects/Win/vc12/hdr-test-set.vcxproj
new file mode 100644 (file)
index 0000000..79138f6
--- /dev/null
@@ -0,0 +1,648 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}</ProjectGuid>\r
+    <RootNamespace>hdrtestset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set_rcu.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_nogc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_sht.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-set.vcxproj.filters b/projects/Win/vc12/hdr-test-set.vcxproj.filters
new file mode 100644 (file)
index 0000000..d0129f6
--- /dev/null
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_set.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_set.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set.h">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set_rcu.h">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set.h">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu.h">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{83622d26-addb-4c52-98b3-eaa62a1047b6}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{c0375a89-d67a-480a-83d2-d1cdd8d467e9}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\michael_set">\r
+      <UniqueIdentifier>{4719fe70-337c-4740-931e-548d21a39466}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\split_list">\r
+      <UniqueIdentifier>{7786d807-8092-4310-9109-945854d26048}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\skip_list">\r
+      <UniqueIdentifier>{5b8a3b8a-27ad-49e7-9714-1859a842fd7f}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\michael_set">\r
+      <UniqueIdentifier>{dc053424-ec8d-46a7-9236-6a75f4dc0ad5}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\skip_list">\r
+      <UniqueIdentifier>{c1d0709e-ede1-4125-b4b8-eb3177ce05d2}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\split_list">\r
+      <UniqueIdentifier>{61f94a40-c964-4233-af67-66a1be1e0aab}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hrc.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hp.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_hrc.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hp.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hrc.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_nogc.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_ptb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpi.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpt.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_nogc.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_ptb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpi.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpt.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hp.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hrc.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_ptb.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hp.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hrc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hp.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hrc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_nogc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_ptb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_nogc.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_ptb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpi.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpt.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpi.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpt.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpb.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpi.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpt.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_nogc.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht_lazy.cpp">\r
+      <Filter>intrusive\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht_member.cpp">\r
+      <Filter>intrusive\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp">\r
+      <Filter>intrusive\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_shb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_sht.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_shb.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_sht.cpp">\r
+      <Filter>container\michael_set</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_shb.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_sht.cpp">\r
+      <Filter>container\skip_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_shb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_sht.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_shb.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_sht.cpp">\r
+      <Filter>container\split_list</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-stack.vcxproj b/projects/Win/vc12/hdr-test-stack.vcxproj
new file mode 100644 (file)
index 0000000..a923671
--- /dev/null
@@ -0,0 +1,560 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}</ProjectGuid>\r
+    <RootNamespace>hdrteststack</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_fcstack.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_fcstack.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_hrc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_ptb.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-striped-set.vcxproj b/projects/Win/vc12/hdr-test-striped-set.vcxproj
new file mode 100644 (file)
index 0000000..57ac00a
--- /dev/null
@@ -0,0 +1,593 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_refinable_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_avlset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_sgset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_splayset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_treapset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_uset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_avlset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_sgset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_splayset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_treapset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_uset.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_flat_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_stable_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_unordered_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_flat_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_stable_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_unordered_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_vector.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_std.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_vc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_list.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_set.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_slist.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_vector.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_striped_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\intrusive_cuckoo_set_common.h" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{A38E5597-6916-4480-A343-C9846EF544E4}</ProjectGuid>\r
+    <RootNamespace>hdrteststripedset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-striped-set.vcxproj.filters b/projects/Win/vc12/hdr-test-striped-set.vcxproj.filters
new file mode 100644 (file)
index 0000000..9e66278
--- /dev/null
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{4061d7f1-7ab8-4624-adb0-b4533e05a932}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{718f3de0-3b1c-4245-944c-0a56f288c6f7}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\cuckoo">\r
+      <UniqueIdentifier>{db3df5e9-9ef5-407f-821d-e25b9cc70082}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive\striped">\r
+      <UniqueIdentifier>{0147ba57-0ecc-4674-8d7b-7492054d3a48}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\cuckoo">\r
+      <UniqueIdentifier>{ee3a372b-70df-47e6-bade-e7c4d1de7ec3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="container\striped">\r
+      <UniqueIdentifier>{4c811e47-74dd-436d-93f7-686f35980069}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_refinable_set.cpp">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.cpp">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_avlset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_list.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_set.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_sgset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_slist.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_splayset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_treapset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_uset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_avlset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_list.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_set.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_sgset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_slist.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_splayset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_treapset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_uset.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.cpp">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.cpp">\r
+      <Filter>container\cuckoo</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_flat_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_stable_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_unordered_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_std.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_vc.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_slist.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_flat_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_stable_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_unordered_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_std.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_vc.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_list.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_set.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_slist.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\set\hdr_striped_hashset_vector.cpp">\r
+      <Filter>container\striped</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.h">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\intrusive_cuckoo_set_common.h">\r
+      <Filter>intrusive\cuckoo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.h">\r
+      <Filter>intrusive\striped</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.h">\r
+      <Filter>container\cuckoo</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\set\hdr_striped_set.h">\r
+      <Filter>container\striped</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-tree.vcxproj b/projects/Win/vc12/hdr-test-tree.vcxproj
new file mode 100644 (file)
index 0000000..c671bcb
--- /dev/null
@@ -0,0 +1,579 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{6F834EAD-7B94-4979-A0F1-A662E3D30145}</ProjectGuid>\r
+    <RootNamespace>hdrtesttree</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Full</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <OmitFramePointers>false</OmitFramePointers>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <EnablePREfast>false</EnablePREfast>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <Profile>true</Profile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\test-hdr;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CallingConvention>Cdecl</CallingConvention>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_bintree.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_hp.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_ptb.h" />\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_rcu.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht_member.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_tree_reg.cpp" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/hdr-test-tree.vcxproj.filters b/projects/Win/vc12/hdr-test-tree.vcxproj.filters
new file mode 100644 (file)
index 0000000..9f196a6
--- /dev/null
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="container">\r
+      <UniqueIdentifier>{dec34594-a06a-4ed8-9792-fbc6b2a251f5}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="intrusive">\r
+      <UniqueIdentifier>{a13910ed-6cb1-46bc-a137-7da531e65e3a}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_bintree.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_rcu.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set.h">\r
+      <Filter>container</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_hp.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_ptb.h">\r
+      <Filter>intrusive</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpi.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpt.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_shb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_sht.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_tree_reg.cpp" />\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb_member.cpp">\r
+      <Filter>intrusive</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_hp.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_ptb.cpp">\r
+      <Filter>container</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/unit-map-delodd.vcxproj b/projects/Win/vc12/unit-map-delodd.vcxproj
new file mode 100644 (file)
index 0000000..74d6bcb
--- /dev/null
@@ -0,0 +1,488 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_delodd.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{3C598F96-FB84-4d42-9B43-F697F53B0221}</ProjectGuid>\r
+    <RootNamespace>unitmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/unit-map-find.vcxproj b/projects/Win/vc12/unit-map-find.vcxproj
new file mode 100644 (file)
index 0000000..67710f3
--- /dev/null
@@ -0,0 +1,490 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_find_int.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_find_string.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insfind_int.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{BA2A9239-0299-4069-BB0E-16DACE87ADE0}</ProjectGuid>\r
+    <RootNamespace>unitmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/unit-map-insdel.vcxproj b/projects/Win/vc12/unit-map-insdel.vcxproj
new file mode 100644 (file)
index 0000000..8f028f2
--- /dev/null
@@ -0,0 +1,493 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_delodd.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_func.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_int.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_item_int.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_item_string.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\map2\map_insdel_string.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{CA25BDBF-B354-4597-B6D2-220ABBB0D2F4}</ProjectGuid>\r
+    <RootNamespace>unitmap</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/unit-misc.vcxproj b/projects/Win/vc12/unit-misc.vcxproj
new file mode 100644 (file)
index 0000000..a3e4ebb
--- /dev/null
@@ -0,0 +1,499 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{77350FDC-9E51-438B-9A8F-D2FEA11D46B2}</ProjectGuid>\r
+    <RootNamespace>unitmisc</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\hoard_threadtest.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\larson.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\linux_scale.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\michael_allocator.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\random.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\lock\spinlock.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\michael_allocator.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\random_gen.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\lock\nolock.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\lock\win32_lock.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/unit-misc.vcxproj.filters b/projects/Win/vc12/unit-misc.vcxproj.filters
new file mode 100644 (file)
index 0000000..39108a6
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\hoard_threadtest.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\larson.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\linux_scale.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\michael_allocator.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\alloc\random.cpp">\r
+      <Filter>alloc</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\tests\unit\lock\spinlock.cpp">\r
+      <Filter>lock</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\random_gen.h">\r
+      <Filter>alloc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\unit\alloc\michael_allocator.h">\r
+      <Filter>alloc</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\unit\lock\win32_lock.h">\r
+      <Filter>lock</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\tests\unit\lock\nolock.h">\r
+      <Filter>lock</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Filter Include="alloc">\r
+      <UniqueIdentifier>{03866e2b-6bdb-47ed-a165-3c7f19927d0e}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="lock">\r
+      <UniqueIdentifier>{6952493f-7eee-4643-a7c4-b2fefbb583d2}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/unit-pqueue.vcxproj b/projects/Win/vc12/unit-pqueue.vcxproj
new file mode 100644 (file)
index 0000000..ab6a078
--- /dev/null
@@ -0,0 +1,498 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\ellen_bintree_pqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\pqueue_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\pqueue_item.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\pqueue_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\skiplist_pqueue.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\pqueue\std_pqueue.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\pqueue\pop.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\pqueue\push.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\pqueue\push_pop.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{20B6C380-E96A-4cff-BC17-D88AAE581919}</ProjectGuid>\r
+    <RootNamespace>unitpqueue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/unit-prerequisites.vcxproj b/projects/Win/vc12/unit-prerequisites.vcxproj
new file mode 100644 (file)
index 0000000..20e597b
--- /dev/null
@@ -0,0 +1,568 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{61179F2F-07E1-490D-B64D-D85A90B6EF81}</ProjectGuid>\r
+    <RootNamespace>unitprerequisites</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Lib>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\cppunit\cppunit_mini.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\cppunit_proxy.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\file_reporter.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\ellen_bintree_update_desc_pool.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\michael_alloc.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_cuckoo_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_deque_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\test_beans.h" />\r
+    <ClInclude Include="..\..\..\tests\cppunit\thread.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_ellenbintree_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_mspriorityqueue_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_segmentedqueue_stat.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\print_skip_list_stat.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\ellen_bintree_update_desc_pool.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\michael_alloc.cpp" />\r
+    <ClCompile Include="..\..\..\tests\cppunit\test_main.cpp" />\r
+    <ClCompile Include="..\..\..\tests\cppunit\thread.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <CustomBuild Include="..\..\..\tests\data\test-debug.conf">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\test-debug.conf;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+    <CustomBuild Include="..\..\..\tests\data\test-express.conf">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\test-express.conf;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+    <CustomBuild Include="..\..\..\tests\data\test.conf">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Copy test configurations</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Copy test configurations</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">copy %(FullPath) $(TargetDir)\*.*</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\test.conf;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+    <CustomBuild Include="..\..\..\tests\data\text.txt">\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Build text dictionary</Message>\r
+      <Message Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">Build text dictionary</Message>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Command Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">cd %(RootDir)%(Directory) &amp;&amp; perl -X split.pl  &amp;&amp; copy %(RootDir)%(Directory)\dictionary.txt $(TargetDir)\dictionary.txt</Command>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(TargetDir)\dictionary.txt;%(Outputs)</Outputs>\r
+    </CustomBuild>\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/unit-queue.vcxproj b/projects/Win/vc12/unit-queue.vcxproj
new file mode 100644 (file)
index 0000000..9b890e1
--- /dev/null
@@ -0,0 +1,499 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{6C15AF8A-4A99-49F9-BCF0-1BF36771099A}</ProjectGuid>\r
+    <RootNamespace>unitqueue</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\queue\intrusive_queue_reader_writer.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_pop.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_push.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_random.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\queue\queue_reader_writer.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\queue\intrusive_queue_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\intrusive_queue_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\queue_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\queue_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\queue\std_queue.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/unit-set-delodd.vcxproj b/projects/Win/vc12/unit-set-delodd.vcxproj
new file mode 100644 (file)
index 0000000..94ba024
--- /dev/null
@@ -0,0 +1,488 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_delodd.cpp" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{AF7B2253-2E6D-4992-94D9-4B3699C54929}</ProjectGuid>\r
+    <RootNamespace>unitset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/unit-set-insdel.vcxproj b/projects/Win/vc12/unit-set-insdel.vcxproj
new file mode 100644 (file)
index 0000000..523e1b7
--- /dev/null
@@ -0,0 +1,499 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdelfind.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func2.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func3.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func4.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func5.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func6.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_func7.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\set2\set_insdel_string.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\set2\set_insdel_func.h" />\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{BA23811C-D4CB-4836-B2F3-6791BD6FFCD1}</ProjectGuid>\r
+    <RootNamespace>unitset</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc12/unit-stack.vcxproj b/projects/Win/vc12/unit-stack.vcxproj
new file mode 100644 (file)
index 0000000..4e920c9
--- /dev/null
@@ -0,0 +1,496 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="DebugVLD|Win32">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="DebugVLD|x64">\r
+      <Configuration>DebugVLD</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|x64">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|Win32">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Debug|x64">\r
+      <Configuration>ICL-Debug</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|Win32">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ICL-Release|x64">\r
+      <Configuration>ICL-Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|x64">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>x64</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{E29DE1F7-AE8D-4AE6-98B1-147E5103D974}</ProjectGuid>\r
+    <RootNamespace>unitstack</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <VCTargetsPath Condition="'$(VCTargetsPath11)' != '' and '$(VSVersion)' == '' and $(VisualStudioVersion) == ''">$(VCTargetsPath11)</VCTargetsPath>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>Intel C++ Compiler XE 13.0</PlatformToolset>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <PlatformToolset>v120</PlatformToolset>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\bin\vc12\$(Platform)\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\bin\vc12-icl\$(Platform)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\..\obj\vc12\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">$(SolutionDir)..\..\..\obj\vc12-icl\$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">false</LinkIncremental>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">$(ProjectName)_d</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">$(ProjectName)_d</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Debug|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugVLD|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites_d.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|Win32'">\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage32/lib;$(BOOST_PATH)/stage/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <DisableSpecificWarnings>4520</DisableSpecificWarnings>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ICL-Release|x64'">\r
+    <Midl>\r
+      <TargetEnvironment>X64</TargetEnvironment>\r
+    </Midl>\r
+    <ClCompile>\r
+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>$(SolutionDir)..\..\..;$(SolutionDir)..\..\..\tests\unit;$(SolutionDir)..\..\..\tests;$(BOOST_PATH);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <PrecompiledHeader>\r
+      </PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <Cpp0xSupport>true</Cpp0xSupport>\r
+      <UseProcessorExtensions>HOST</UseProcessorExtensions>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>unit-prerequisites.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <AdditionalLibraryDirectories>$(BOOST_PATH)/stage64/lib;$(BOOST_PATH)/bin;$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>true</OptimizeReferences>\r
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+      <TargetMachine>MachineX64</TargetMachine>\r
+      <OutputFile>$(TargetPath)</OutputFile>\r
+    </Link>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\tests\unit\stack\stack_intrusive_pushpop.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\stack\stack_push.cpp" />\r
+    <ClCompile Include="..\..\..\tests\unit\stack\stack_pushpop.cpp" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\tests\unit\stack\intrusive_stack_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\stack\intrusive_stack_defs.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\stack\stack_type.h" />\r
+    <ClInclude Include="..\..\..\tests\unit\stack\stack_defs.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/projects/Win/vc9/cds.ncb b/projects/Win/vc9/cds.ncb
new file mode 100644 (file)
index 0000000..e1c8810
Binary files /dev/null and b/projects/Win/vc9/cds.ncb differ
diff --git a/projects/Win/vc9/cds.sln b/projects/Win/vc9/cds.sln
new file mode 100644 (file)
index 0000000..1ceaca6
--- /dev/null
@@ -0,0 +1,446 @@
+Microsoft Visual Studio Solution File, Format Version 10.00\r
+# Visual Studio 2008\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cds", "cds.vcproj", "{408FE9BC-44F0-4E6A-89FA-D6F952584239}"\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unit-test", "unit-test", "{165BB780-4551-4E13-BD90-C16B229773F0}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-prerequisites", "unit-prerequisites.vcproj", "{61179F2F-07E1-490D-B64D-D85A90B6EF81}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-queue", "unit-queue.vcproj", "{6C15AF8A-4A99-49F9-BCF0-1BF36771099A}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-stack", "unit-stack.vcproj", "{E29DE1F7-AE8D-4AE6-98B1-147E5103D974}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-misc", "unit-misc.vcproj", "{77350FDC-9E51-438B-9A8F-D2FEA11D46B2}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hdr-test", "hdr-test", "{7C6D330F-0B08-4DA0-BD0D-EB2269F6B24D}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\test-hdr\size_check.h = ..\..\..\tests\test-hdr\size_check.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-deque", "hdr-test-deque.vcproj", "{CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-map", "hdr-test-map.vcproj", "{282E9A9A-386A-40FB-A483-994BACE24830}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-set", "hdr-test-set.vcproj", "{E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-misc", "hdr-test-misc.vcproj", "{C5E76975-B87B-4B9E-8596-B01DDA683FCA}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-ordered-list", "hdr-test-ordered-list.vcproj", "{EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-queue", "hdr-test-queue.vcproj", "{33664E63-8D24-4FF4-A744-9782EB711509}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-stack", "hdr-test-stack.vcproj", "{E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-striped-set", "hdr-test-striped-set.vcproj", "{D8A92546-DCB0-4709-A12C-52510F36D596}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-tree", "hdr-test-tree.vcproj", "{6F834EAD-7B94-4979-A0F1-A662E3D30145}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "map", "map", "{40D82CA3-738D-414E-939A-262591647ADB}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\unit\map2\map_defs.h = ..\..\..\tests\unit\map2\map_defs.h\r
+               ..\..\..\tests\unit\map2\map_types.h = ..\..\..\tests\unit\map2\map_types.h\r
+               ..\..\..\tests\unit\map2\std_hash_map.h = ..\..\..\tests\unit\map2\std_hash_map.h\r
+               ..\..\..\tests\unit\map2\std_hash_map_gcc.h = ..\..\..\tests\unit\map2\std_hash_map_gcc.h\r
+               ..\..\..\tests\unit\map2\std_hash_map_vc.h = ..\..\..\tests\unit\map2\std_hash_map_vc.h\r
+               ..\..\..\tests\unit\map2\std_map.h = ..\..\..\tests\unit\map2\std_map.h\r
+               ..\..\..\tests\unit\map2\std_map_gcc.h = ..\..\..\tests\unit\map2\std_map_gcc.h\r
+               ..\..\..\tests\unit\map2\std_map_vc.h = ..\..\..\tests\unit\map2\std_map_vc.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-delodd", "unit-map-delodd.vcproj", "{B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-insdel", "unit-map-insdel.vcproj", "{92FED7E7-3577-4ACA-9197-FBD2B3275EE6}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-find", "unit-map-find.vcproj", "{30FE61D0-7914-4B7C-972A-DEB61510102B}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "set", "set", "{0CA81A86-DA79-45FF-B8BE-DFBB6F47D0E0}"\r
+       ProjectSection(SolutionItems) = preProject\r
+               ..\..\..\tests\unit\set2\set_defs.h = ..\..\..\tests\unit\set2\set_defs.h\r
+               ..\..\..\tests\unit\set2\set_types.h = ..\..\..\tests\unit\set2\set_types.h\r
+               ..\..\..\tests\unit\set2\std_hash_set.h = ..\..\..\tests\unit\set2\std_hash_set.h\r
+               ..\..\..\tests\unit\set2\std_hash_set_std.h = ..\..\..\tests\unit\set2\std_hash_set_std.h\r
+               ..\..\..\tests\unit\set2\std_hash_set_vc9.h = ..\..\..\tests\unit\set2\std_hash_set_vc9.h\r
+               ..\..\..\tests\unit\set2\std_set.h = ..\..\..\tests\unit\set2\std_set.h\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-set-insdel", "unit-set-insdel.vcproj", "{DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-set-delodd", "unit-set-delodd.vcproj", "{6AA271C0-9A17-4FAC-BB17-140E44EC73E2}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hdr-test-priority_queue", "hdr-test-priority_queue.vcproj", "{A0C10519-B253-4C63-B7CC-A211B1BA9E64}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-pqueue", "unit-pqueue.vcproj", "{20B6C380-E96A-4CFF-BC17-D88AAE581919}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {61179F2F-07E1-490D-B64D-D85A90B6EF81}\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239} = {408FE9BC-44F0-4E6A-89FA-D6F952584239}\r
+       EndProjectSection\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Win32 = Debug|Win32\r
+               Debug|x64 = Debug|x64\r
+               DebugVLD|Win32 = DebugVLD|Win32\r
+               DebugVLD|x64 = DebugVLD|x64\r
+               Release|Win32 = Release|Win32\r
+               Release|x64 = Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|Win32.Build.0 = Debug|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|x64.ActiveCfg = Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Debug|x64.Build.0 = Debug|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|Win32.ActiveCfg = Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|Win32.Build.0 = Release|Win32\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|x64.ActiveCfg = Release|x64\r
+               {408FE9BC-44F0-4E6A-89FA-D6F952584239}.Release|x64.Build.0 = Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|Win32.Build.0 = Debug|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|x64.ActiveCfg = Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Debug|x64.Build.0 = Debug|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|Win32.ActiveCfg = Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|Win32.Build.0 = Release|Win32\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|x64.ActiveCfg = Release|x64\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81}.Release|x64.Build.0 = Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|Win32.Build.0 = Debug|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|x64.ActiveCfg = Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Debug|x64.Build.0 = Debug|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|Win32.ActiveCfg = Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|Win32.Build.0 = Release|Win32\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|x64.ActiveCfg = Release|x64\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A}.Release|x64.Build.0 = Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Debug|x64.Build.0 = Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|x64.ActiveCfg = Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.DebugVLD|x64.Build.0 = Debug|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|Win32.Build.0 = Release|Win32\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|x64.ActiveCfg = Release|x64\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974}.Release|x64.Build.0 = Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|Win32.Build.0 = Debug|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|x64.ActiveCfg = Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Debug|x64.Build.0 = Debug|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|Win32.ActiveCfg = Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|Win32.Build.0 = Release|Win32\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|x64.ActiveCfg = Release|x64\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2}.Release|x64.Build.0 = Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|Win32.Build.0 = Debug|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|x64.ActiveCfg = Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Debug|x64.Build.0 = Debug|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|Win32.ActiveCfg = Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|Win32.Build.0 = Release|Win32\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|x64.ActiveCfg = Release|x64\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}.Release|x64.Build.0 = Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|Win32.Build.0 = Debug|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|x64.ActiveCfg = Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Debug|x64.Build.0 = Debug|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|Win32.ActiveCfg = Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|Win32.Build.0 = Release|Win32\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|x64.ActiveCfg = Release|x64\r
+               {282E9A9A-386A-40FB-A483-994BACE24830}.Release|x64.Build.0 = Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Debug|x64.Build.0 = Debug|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|Win32.Build.0 = Release|Win32\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|x64.ActiveCfg = Release|x64\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}.Release|x64.Build.0 = Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|Win32.Build.0 = Debug|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|x64.ActiveCfg = Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Debug|x64.Build.0 = Debug|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|Win32.ActiveCfg = Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|Win32.Build.0 = Release|Win32\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|x64.ActiveCfg = Release|x64\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA}.Release|x64.Build.0 = Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|Win32.Build.0 = Debug|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|x64.ActiveCfg = Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Debug|x64.Build.0 = Debug|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|Win32.ActiveCfg = Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|Win32.Build.0 = Release|Win32\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|x64.ActiveCfg = Release|x64\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}.Release|x64.Build.0 = Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|Win32.Build.0 = Debug|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|x64.ActiveCfg = Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Debug|x64.Build.0 = Debug|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|Win32.ActiveCfg = Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|Win32.Build.0 = Release|Win32\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|x64.ActiveCfg = Release|x64\r
+               {33664E63-8D24-4FF4-A744-9782EB711509}.Release|x64.Build.0 = Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|Win32.Build.0 = Debug|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|x64.ActiveCfg = Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Debug|x64.Build.0 = Debug|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|Win32.ActiveCfg = Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|Win32.Build.0 = Release|Win32\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|x64.ActiveCfg = Release|x64\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}.Release|x64.Build.0 = Release|x64\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.Debug|Win32.Build.0 = Debug|Win32\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.Debug|x64.ActiveCfg = Debug|x64\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.Debug|x64.Build.0 = Debug|x64\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.Release|Win32.ActiveCfg = Release|Win32\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.Release|Win32.Build.0 = Release|Win32\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.Release|x64.ActiveCfg = Release|x64\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596}.Release|x64.Build.0 = Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|Win32.Build.0 = Debug|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|x64.ActiveCfg = Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Debug|x64.Build.0 = Debug|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|Win32.ActiveCfg = Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|Win32.Build.0 = Release|Win32\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|x64.ActiveCfg = Release|x64\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145}.Release|x64.Build.0 = Release|x64\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.Debug|Win32.Build.0 = Debug|Win32\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.Debug|x64.ActiveCfg = Debug|x64\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.Debug|x64.Build.0 = Debug|x64\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.Release|Win32.ActiveCfg = Release|Win32\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.Release|Win32.Build.0 = Release|Win32\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.Release|x64.ActiveCfg = Release|x64\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}.Release|x64.Build.0 = Release|x64\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.Debug|Win32.Build.0 = Debug|Win32\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.Debug|x64.ActiveCfg = Debug|x64\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.Debug|x64.Build.0 = Debug|x64\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.Release|Win32.ActiveCfg = Release|Win32\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.Release|Win32.Build.0 = Release|Win32\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.Release|x64.ActiveCfg = Release|x64\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6}.Release|x64.Build.0 = Release|x64\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.Debug|Win32.Build.0 = Debug|Win32\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.Debug|x64.ActiveCfg = Debug|x64\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.Debug|x64.Build.0 = Debug|x64\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.Release|Win32.ActiveCfg = Release|Win32\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.Release|Win32.Build.0 = Release|Win32\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.Release|x64.ActiveCfg = Release|x64\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B}.Release|x64.Build.0 = Release|x64\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.Debug|Win32.Build.0 = Debug|Win32\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.Debug|x64.ActiveCfg = Debug|x64\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.Debug|x64.Build.0 = Debug|x64\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.Release|Win32.ActiveCfg = Release|Win32\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.Release|Win32.Build.0 = Release|Win32\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.Release|x64.ActiveCfg = Release|x64\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}.Release|x64.Build.0 = Release|x64\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.Debug|Win32.Build.0 = Debug|Win32\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.Debug|x64.ActiveCfg = Debug|x64\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.Debug|x64.Build.0 = Debug|x64\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.Release|Win32.ActiveCfg = Release|Win32\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.Release|Win32.Build.0 = Release|Win32\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.Release|x64.ActiveCfg = Release|x64\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2}.Release|x64.Build.0 = Release|x64\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.Debug|Win32.Build.0 = Debug|Win32\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.Debug|x64.ActiveCfg = Debug|x64\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.Debug|x64.Build.0 = Debug|x64\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.Release|Win32.ActiveCfg = Release|Win32\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.Release|Win32.Build.0 = Release|Win32\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.Release|x64.ActiveCfg = Release|x64\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64}.Release|x64.Build.0 = Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|Win32.Build.0 = Debug|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|x64.ActiveCfg = Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Debug|x64.Build.0 = Debug|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|Win32.ActiveCfg = DebugVLD|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|Win32.Build.0 = DebugVLD|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|x64.ActiveCfg = DebugVLD|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.DebugVLD|x64.Build.0 = DebugVLD|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|Win32.ActiveCfg = Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|Win32.Build.0 = Release|Win32\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|x64.ActiveCfg = Release|x64\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919}.Release|x64.Build.0 = Release|x64\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+       GlobalSection(NestedProjects) = preSolution\r
+               {61179F2F-07E1-490D-B64D-D85A90B6EF81} = {165BB780-4551-4E13-BD90-C16B229773F0}\r
+               {6C15AF8A-4A99-49F9-BCF0-1BF36771099A} = {165BB780-4551-4E13-BD90-C16B229773F0}\r
+               {E29DE1F7-AE8D-4AE6-98B1-147E5103D974} = {165BB780-4551-4E13-BD90-C16B229773F0}\r
+               {40D82CA3-738D-414E-939A-262591647ADB} = {165BB780-4551-4E13-BD90-C16B229773F0}\r
+               {0CA81A86-DA79-45FF-B8BE-DFBB6F47D0E0} = {165BB780-4551-4E13-BD90-C16B229773F0}\r
+               {20B6C380-E96A-4CFF-BC17-D88AAE581919} = {165BB780-4551-4E13-BD90-C16B229773F0}\r
+               {77350FDC-9E51-438B-9A8F-D2FEA11D46B2} = {165BB780-4551-4E13-BD90-C16B229773F0}\r
+               {B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0} = {40D82CA3-738D-414E-939A-262591647ADB}\r
+               {92FED7E7-3577-4ACA-9197-FBD2B3275EE6} = {40D82CA3-738D-414E-939A-262591647ADB}\r
+               {30FE61D0-7914-4B7C-972A-DEB61510102B} = {40D82CA3-738D-414E-939A-262591647ADB}\r
+               {CD0BC7FC-9BFF-40B0-8E66-99D244A8A026} = {7C6D330F-0B08-4DA0-BD0D-EB2269F6B24D}\r
+               {282E9A9A-386A-40FB-A483-994BACE24830} = {7C6D330F-0B08-4DA0-BD0D-EB2269F6B24D}\r
+               {E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7} = {7C6D330F-0B08-4DA0-BD0D-EB2269F6B24D}\r
+               {C5E76975-B87B-4B9E-8596-B01DDA683FCA} = {7C6D330F-0B08-4DA0-BD0D-EB2269F6B24D}\r
+               {EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805} = {7C6D330F-0B08-4DA0-BD0D-EB2269F6B24D}\r
+               {33664E63-8D24-4FF4-A744-9782EB711509} = {7C6D330F-0B08-4DA0-BD0D-EB2269F6B24D}\r
+               {E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18} = {7C6D330F-0B08-4DA0-BD0D-EB2269F6B24D}\r
+               {D8A92546-DCB0-4709-A12C-52510F36D596} = {7C6D330F-0B08-4DA0-BD0D-EB2269F6B24D}\r
+               {6F834EAD-7B94-4979-A0F1-A662E3D30145} = {7C6D330F-0B08-4DA0-BD0D-EB2269F6B24D}\r
+               {A0C10519-B253-4C63-B7CC-A211B1BA9E64} = {7C6D330F-0B08-4DA0-BD0D-EB2269F6B24D}\r
+               {DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE} = {0CA81A86-DA79-45FF-B8BE-DFBB6F47D0E0}\r
+               {6AA271C0-9A17-4FAC-BB17-140E44EC73E2} = {0CA81A86-DA79-45FF-B8BE-DFBB6F47D0E0}\r
+       EndGlobalSection\r
+       GlobalSection(DPCodeReviewSolutionGUID) = preSolution\r
+               DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/projects/Win/vc9/cds.suo b/projects/Win/vc9/cds.suo
new file mode 100644 (file)
index 0000000..7f27e23
Binary files /dev/null and b/projects/Win/vc9/cds.suo differ
diff --git a/projects/Win/vc9/cds.vcproj b/projects/Win/vc9/cds.vcproj
new file mode 100644 (file)
index 0000000..ac8bb34
--- /dev/null
@@ -0,0 +1,2332 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="cds"\r
+       ProjectGUID="{408FE9BC-44F0-4E6A-89FA-D6F952584239}"\r
+       RootNamespace="cds"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)\"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)\"\r
+                       ConfigurationType="2"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/wd4512 /wd4127"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..\&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               OutputFile="$(OutDir)/libcds-x86-vc9_debug.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateManifest="true"\r
+                               GenerateDebugInformation="true"\r
+                               ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               ImportLibrary="$(OutDir)/$(TargetName).lib"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)\"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)\"\r
+                       ConfigurationType="2"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/wd4512 /wd4127"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..\&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               OutputFile="$(OutDir)/libcds-amd64-vc9_debug.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateManifest="true"\r
+                               GenerateDebugInformation="true"\r
+                               ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               ImportLibrary="$(OutDir)/$(TargetName).lib"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)\"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)\"\r
+                       ConfigurationType="2"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/wd4512 /wd4127"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               EnableFiberSafeOptimizations="true"\r
+                               WholeProgramOptimization="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..\&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               OutputFile="$(OutDir)/libcds-x86-vc9.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateManifest="true"\r
+                               GenerateDebugInformation="true"\r
+                               ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"\r
+                               SubSystem="0"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="0"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               ImportLibrary="$(OutDir)/$(TargetName).lib"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                               CommandLine=""\r
+                               ExcludedFromBuild="false"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)\"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)\"\r
+                       ConfigurationType="2"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/wd4512 /wd4127"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               EnableFiberSafeOptimizations="false"\r
+                               WholeProgramOptimization="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..\&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;CDS_BUILD_LIB"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               OutputFile="$(OutDir)/libcds-amd64-vc9.dll"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateManifest="true"\r
+                               GenerateDebugInformation="true"\r
+                               ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"\r
+                               SubSystem="0"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="0"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               ImportLibrary="$(OutDir)/$(TargetName).lib"\r
+                               TargetMachine="17"\r
+                               Profile="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                               CommandLine=""\r
+                               ExcludedFromBuild="false"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)\"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)\"\r
+                       ConfigurationType="2"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/wd4512 /wd4127"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..\&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               OutputFile="$(OutDir)/libcds-x86-vc9_debug.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateManifest="true"\r
+                               GenerateDebugInformation="true"\r
+                               ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               ImportLibrary="$(OutDir)/$(TargetName).lib"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)\"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)\"\r
+                       ConfigurationType="2"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/wd4512 /wd4127"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..\&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;CDS_BUILD_LIB"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               OutputFile="$(OutDir)/libcds-amd64-vc9_debug.dll"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateManifest="true"\r
+                               GenerateDebugInformation="true"\r
+                               ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               ImportLibrary="$(OutDir)/$(TargetName).lib"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\src\dllmain.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\hrc_gc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\hzp_const.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\hzp_gc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\init.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\michael_heap.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\ptb_gc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\topology_hpux.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\topology_linux.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\topology_osx.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\urcu_gp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\urcu_sh.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       >\r
+                       <Filter\r
+                               Name="cds"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\cds\backoff_strategy.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\cds\bitop.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\cds\cxx11_atomic.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\cds\init.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\cds\int_algo.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\cds\numtraits.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\cds\ref.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\cds\refcounter.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\cds\version.h"\r
+                                       >\r
+                               </File>\r
+                               <Filter\r
+                                       Name="details"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\aligned_allocator.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\aligned_type.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\allocator.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\binary_functor_wrapper.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\bit_reverse_counter.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\bitop_generic.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\bounded_array.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\bounded_container.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\comparator.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\cxx11_features.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\defs.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\functor_wrapper.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\hash_functor_selector.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\is_aligned.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\lib.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\make_const_type.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\marked_ptr.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\marked_thread_id.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\noncopyable.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\impl\queue_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\static_functor.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\trivial_assign.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\type_padding.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\details\void_selector.h"\r
+                                               >\r
+                                       </File>\r
+                                       <Filter\r
+                                               Name="compiler"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\compiler\backoff.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\compiler\bitop.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\compiler\cstdint_boost.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\compiler\cstdint_std.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\compiler\cxx11_atomic.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\compiler\cxx11_atomic_patches.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\compiler\cxx11_atomic_prepatches.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\compiler\defs.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <Filter\r
+                                                       Name="gcc"\r
+                                                       >\r
+                                                       <File\r
+                                                               RelativePath="..\..\..\cds\compiler\gcc\compiler_barriers.h"\r
+                                                               >\r
+                                                       </File>\r
+                                                       <File\r
+                                                               RelativePath="..\..\..\cds\compiler\gcc\compiler_macro.h"\r
+                                                               >\r
+                                                       </File>\r
+                                                       <File\r
+                                                               RelativePath="..\..\..\cds\compiler\gcc\cxx11_atomic_patches.h"\r
+                                                               >\r
+                                                       </File>\r
+                                                       <File\r
+                                                               RelativePath="..\..\..\cds\compiler\gcc\defs.h"\r
+                                                               >\r
+                                                       </File>\r
+                                                       <Filter\r
+                                                               Name="amd64"\r
+                                                               >\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\amd64\backoff.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\amd64\bitop.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\amd64\cxx11_atomic.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                       </Filter>\r
+                                                       <Filter\r
+                                                               Name="ia64"\r
+                                                               >\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\ia64\backoff.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\ia64\bitop.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\ia64\cxx11_atomic.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                       </Filter>\r
+                                                       <Filter\r
+                                                               Name="sparc"\r
+                                                               >\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\sparc\backoff.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\sparc\bitop.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\sparc\cxx11_atomic.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                       </Filter>\r
+                                                       <Filter\r
+                                                               Name="x86"\r
+                                                               >\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\x86\backoff.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\x86\bitop.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\x86\cxx11_atomic.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\x86\cxx11_atomic32.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                       </Filter>\r
+                                                       <Filter\r
+                                                               Name="ppc64"\r
+                                                               >\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\ppc64\backoff.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\gcc\ppc64\bitop.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                       </Filter>\r
+                                               </Filter>\r
+                                               <Filter\r
+                                                       Name="vc"\r
+                                                       >\r
+                                                       <File\r
+                                                               RelativePath="..\..\..\cds\compiler\vc\compiler_barriers.h"\r
+                                                               >\r
+                                                       </File>\r
+                                                       <File\r
+                                                               RelativePath="..\..\..\cds\compiler\vc\defs.h"\r
+                                                               >\r
+                                                       </File>\r
+                                                       <Filter\r
+                                                               Name="x86"\r
+                                                               >\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\vc\x86\backoff.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\vc\x86\bitop.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\vc\x86\cxx11_atomic.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                       </Filter>\r
+                                                       <Filter\r
+                                                               Name="amd64"\r
+                                                               >\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\vc\amd64\backoff.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\vc\amd64\bitop.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                               <File\r
+                                                                       RelativePath="..\..\..\cds\compiler\vc\amd64\cxx11_atomic.h"\r
+                                                                       >\r
+                                                               </File>\r
+                                                       </Filter>\r
+                                               </Filter>\r
+                                               <Filter\r
+                                                       Name="clang"\r
+                                                       >\r
+                                                       <File\r
+                                                               RelativePath="..\..\..\cds\compiler\clang\cxx11_atomic_prepatches.h"\r
+                                                               >\r
+                                                       </File>\r
+                                                       <File\r
+                                                               RelativePath="..\..\..\cds\compiler\clang\defs.h"\r
+                                                               >\r
+                                                       </File>\r
+                                               </Filter>\r
+                                               <Filter\r
+                                                       Name="icl"\r
+                                                       >\r
+                                                       <File\r
+                                                               RelativePath="..\..\..\cds\compiler\icl\compiler_barriers.h"\r
+                                                               >\r
+                                                       </File>\r
+                                                       <File\r
+                                                               RelativePath="..\..\..\cds\compiler\icl\cxx11_atomic_patches_win.h"\r
+                                                               >\r
+                                                       </File>\r
+                                                       <File\r
+                                                               RelativePath="..\..\..\cds\compiler\icl\defs.h"\r
+                                                               >\r
+                                                       </File>\r
+                                               </Filter>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="std"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\details\std\chrono.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\details\std\condition_variable.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\details\std\memory.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\details\std\mutex.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\details\std\thread.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\details\std\tuple.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\details\std\type_traits.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="gc"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\all.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\default_gc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\exception.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\gc_fwd.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\guarded_ptr.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\hp_decl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\hp_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\hrc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\hrc_decl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\hrc_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\ptb_decl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\gc\ptb_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <Filter\r
+                                               Name="hzp"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\hzp\details\hp_alloc.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\hzp\details\hp_fwd.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\hzp\details\hp_inline.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\hzp\details\hp_retired.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\hzp\details\hp_type.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\hzp\hzp.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="hrc"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\hrc\gc_fwd.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\hrc\hrc.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\hrc\details\hrc_fwd.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\hrc\details\hrc_inline.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\hrc\details\hrc_retired.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="ptb"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\ptb\ptb.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="details"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\gc\details\retired_ptr.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="user_setup"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\user_setup\allocator.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\user_setup\cache_line.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\user_setup\threading.h"\r
+                                               >\r
+                                       </File>\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="lock"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\lock\array.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\lock\scoped_lock.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\lock\spinlock.h"\r
+                                               >\r
+                                       </File>\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="threading"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\_common.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\auto_detect.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\cxx11.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\cxx11_manager.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\gcc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\gcc_manager.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\model.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\msvc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\msvc_manager.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\pthread.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\pthread_manager.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\wintls.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\threading\details\wintls_manager.h"\r
+                                               >\r
+                                       </File>\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="OS"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\os\alloc_aligned.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\os\syserror.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\os\thread.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\os\timer.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\os\topology.h"\r
+                                               >\r
+                                       </File>\r
+                                       <Filter\r
+                                               Name="hpux"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\hpux\alloc_aligned.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\hpux\timer.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\hpux\topology.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="linux"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\linux\alloc_aligned.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\linux\timer.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\linux\topology.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="posix"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\posix\alloc_aligned.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\posix\fake_topology.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\posix\syserror.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\posix\thread.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\posix\timer.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="sunos"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\sunos\alloc_aligned.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\sunos\timer.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\sunos\topology.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="win"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\win\alloc_aligned.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\win\syserror.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\win\thread.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\win\timer.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\win\topology.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="aix"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\aix\alloc_aligned.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\aix\timer.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\aix\topology.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="libc"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\libc\alloc_aligned.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="free_bsd"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\free_bsd\alloc_aligned.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\free_bsd\timer.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\free_bsd\topology.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="details"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\details\fake_topology.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="osx"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\osx\timer.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\os\osx\topology.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="memory"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\memory\pool_allocator.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\memory\vyukov_queue_pool.h"\r
+                                               >\r
+                                       </File>\r
+                                       <Filter\r
+                                               Name="michael"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\memory\michael\allocator.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\memory\michael\bound_check.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\memory\michael\options.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\memory\michael\osalloc_stat.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\memory\michael\procheap_stat.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="opt"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\opt\buffer.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\opt\compare.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\opt\hash.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\opt\make_options_std.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\opt\make_options_var.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\opt\options.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\opt\permutation.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\opt\value_cleaner.h"\r
+                                               >\r
+                                       </File>\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="intrusive"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\basket_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\cuckoo_set.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\deque_stat.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\ellen_bintree_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\ellen_bintree_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\ellen_bintree_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\ellen_bintree_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\fcqueue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\fcstack.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\lazy_list_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\lazy_list_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\lazy_list_hrc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\lazy_list_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\lazy_list_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\lazy_list_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\lazy_list_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_deque.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_list_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_list_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_list_hrc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_list_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_list_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_list_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_list_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_set.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_set_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_set_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\michael_set_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\moir_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\mspriority_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\msqueue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\node_traits.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\optimistic_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\options.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\queue_stat.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\segmented_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\single_link_struct.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\skip_list_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\skip_list_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\skip_list_hrc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\skip_list_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\skip_list_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\skip_list_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\skip_list_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\split_list.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\split_list_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\split_list_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\split_list_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\striped_set.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\treiber_stack.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\tsigas_cycle_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\intrusive\vyukov_mpmc_cycle_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <Filter\r
+                                               Name="striped_set"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\striped_set\adapter.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\striped_set\boost_avl_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\striped_set\boost_list.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\striped_set\boost_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\striped_set\boost_sg_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\striped_set\boost_slist.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\striped_set\boost_splay_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\striped_set\boost_treap_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\striped_set\boost_unordered_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\striped_set\resizing_policy.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\striped_set\striping_policy.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="details"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\details\dummy_node_holder.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\intrusive\details\ellen_bintree_base.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="container"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\basket_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\cuckoo_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\cuckoo_map.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\cuckoo_set.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\ellen_bintree_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\ellen_bintree_map_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\ellen_bintree_map_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\ellen_bintree_map_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\ellen_bintree_map_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\ellen_bintree_set_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\ellen_bintree_set_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\ellen_bintree_set_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\ellen_bintree_set_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\fcdeque.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\fcpriority_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\fcqueue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\fcstack.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_kvlist_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_kvlist_hrc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_kvlist_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_kvlist_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_kvlist_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_kvlist_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_list_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_list_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_list_hrc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_list_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_list_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_list_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\lazy_list_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_deque.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_kvlist_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_kvlist_hrc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_kvlist_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_kvlist_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_kvlist_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_kvlist_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_list_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_list_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_list_hrc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_list_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_list_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_list_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_list_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_map.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_map_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_map_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_map_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_set.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_set_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_set_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\michael_set_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\moir_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\mspriority_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\msqueue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\optimistic_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\rwqueue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\segmented_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_map_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_map_hrc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_map_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_map_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_map_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_map_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_set_hp.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_set_hrc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_set_impl.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_set_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_set_ptb.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\skip_list_set_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\split_list_base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\split_list_map.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\split_list_map_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\split_list_map_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\split_list_set.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\split_list_set_nogc.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\split_list_set_rcu.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\striped_map.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\striped_set.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\treiber_stack.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\tsigas_cycle_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\container\vyukov_mpmc_cycle_queue.h"\r
+                                               >\r
+                                       </File>\r
+                                       <Filter\r
+                                               Name="details"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\details\guarded_ptr_cast.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\details\make_lazy_kvlist.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\details\make_lazy_list.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\details\make_michael_kvlist.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\details\make_michael_list.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\details\make_skip_list_map.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\details\make_skip_list_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\details\make_split_list_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="striped_set"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\adapter.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\boost_flat_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\boost_list.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\boost_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\boost_slist.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\boost_stable_vector.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\boost_unordered_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\boost_vector.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\std_hash_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\std_hash_set_std.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\std_hash_set_vc.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\std_list.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\std_set.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_set\std_vector.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                                       <Filter\r
+                                               Name="striped_map"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_map\boost_flat_map.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_map\boost_list.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_map\boost_map.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_map\boost_slist.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_map\boost_unordered_map.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_map\std_hash_map.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_map\std_hash_map_std.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_map\std_hash_map_vc.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_map\std_list.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\container\striped_map\std_map.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="urcu"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\urcu\dispose_thread.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\urcu\exempt_ptr.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\urcu\general_buffered.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\urcu\general_instant.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\urcu\general_threaded.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\urcu\options.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\urcu\signal_buffered.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\urcu\signal_threaded.h"\r
+                                               >\r
+                                       </File>\r
+                                       <Filter\r
+                                               Name="details"\r
+                                               >\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\urcu\details\base.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\urcu\details\check_deadlock.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\urcu\details\gp.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\urcu\details\gp_decl.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\urcu\details\gpb.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\urcu\details\gpi.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\urcu\details\gpt.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\urcu\details\sh.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\urcu\details\sh_decl.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\urcu\details\sig_buffered.h"\r
+                                                       >\r
+                                               </File>\r
+                                               <File\r
+                                                       RelativePath="..\..\..\cds\urcu\details\sig_threaded.h"\r
+                                                       >\r
+                                               </File>\r
+                                       </Filter>\r
+                               </Filter>\r
+                               <Filter\r
+                                       Name="algo"\r
+                                       >\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\algo\base.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\algo\elimination.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\algo\elimination_opt.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\algo\elimination_tls.h"\r
+                                               >\r
+                                       </File>\r
+                                       <File\r
+                                               RelativePath="..\..\..\cds\algo\flat_combining.h"\r
+                                               >\r
+                                       </File>\r
+                               </Filter>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Resource Files"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"\r
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       >\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/cds.vcproj.user.u.user b/projects/Win/vc9/cds.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..770286f
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/hdr-test-deque.vcproj b/projects/Win/vc9/hdr-test-deque.vcproj
new file mode 100644 (file)
index 0000000..588bc4f
--- /dev/null
@@ -0,0 +1,552 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="hdr-test-deque"\r
+       ProjectGUID="{CD0BC7FC-9BFF-40B0-8E66-99D244A8A026}"\r
+       RootNamespace="hdrtestdeque"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\deque\hdr_deque.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\deque\hdr_fcdeque.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\deque\hdr_intrusive_deque.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\deque\hdr_intrusive_michael_deque_hp.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\deque\hdr_intrusive_michael_deque_ptb.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\deque\hdr_michael_deque_hp.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\deque\hdr_michael_deque_ptb.cpp"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/hdr-test-deque.vcproj.user.u.user b/projects/Win/vc9/hdr-test-deque.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/hdr-test-map.vcproj b/projects/Win/vc9/hdr-test-map.vcproj
new file mode 100644 (file)
index 0000000..ca7ae96
--- /dev/null
@@ -0,0 +1,828 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="hdr-test-map"\r
+       ProjectGUID="{282E9A9A-386A-40FB-A483-994BACE24830}"\r
+       RootNamespace="hdrtestmap"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="cuckoo"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_cuckoo_map.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="michael"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_nogc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_lazy_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_nogc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_michael_map_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="striped"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_flat_map.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_list.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_map.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_boost_unordered_map.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_std.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_hashmap_vc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_list.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_map.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_refinable_hashmap_slist.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_flat_map.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_list.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_map.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_boost_unordered_map.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_std.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_hashmap_vc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_list.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_map.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_striped_hashmap_slist.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_striped_map.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_striped_map_reg.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="skip_list"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_skiplist_map.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_skiplist_map_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_skiplist_map_nogc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_skiplist_map_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_skiplist_map_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="split_list"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_nogc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_lazy_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_nogc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\map\hdr_splitlist_map_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\map\hdr_map.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\map\print_skiplist_stat.h"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/hdr-test-map.vcproj.user.u.user b/projects/Win/vc9/hdr-test-map.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/hdr-test-misc.vcproj b/projects/Win/vc9/hdr-test-misc.vcproj
new file mode 100644 (file)
index 0000000..5af965b
--- /dev/null
@@ -0,0 +1,568 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="hdr-test-misc"\r
+       ProjectGUID="{C5E76975-B87B-4B9E-8596-B01DDA683FCA}"\r
+       RootNamespace="hdrtestmisc"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\misc\allocator_test.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\misc\bitop_st.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\misc\cxx11_atomic_class.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\misc\cxx11_atomic_func.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\misc\cxx11_convert_memory_order.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\misc\find_option.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\misc\hash_tuple.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\misc\michael_allocator.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\misc\michael_allocator.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\misc\permutation_generator.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\misc\thread_init_fini.cpp"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/hdr-test-misc.vcproj.user.u.user b/projects/Win/vc9/hdr-test-misc.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/hdr-test-ordered-list.vcproj b/projects/Win/vc9/hdr-test-ordered-list.vcproj
new file mode 100644 (file)
index 0000000..59cb0db
--- /dev/null
@@ -0,0 +1,772 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="hdr-test-ordered-list"\r
+       ProjectGUID="{EFCBBADE-2CF4-4E2B-ADB2-98C8D139E805}"\r
+       RootNamespace="hdrtestordlist"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="container"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_nogc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_kv_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_nogc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_lazy_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_nogc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_kv_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_nogc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_michael_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="intrusive"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_nogc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_lazy_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_list_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_nogc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\ordered_list\hdr_intrusive_michael_ptb.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/hdr-test-ordered-list.vcproj.user.u.user b/projects/Win/vc9/hdr-test-ordered-list.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/hdr-test-priority_queue.vcproj b/projects/Win/vc9/hdr-test-priority_queue.vcproj
new file mode 100644 (file)
index 0000000..14b0074
--- /dev/null
@@ -0,0 +1,572 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="hdr-test-priority_queue"\r
+       ProjectGUID="{A0C10519-B253-4C63-B7CC-A211B1BA9E64}"\r
+       RootNamespace="hdrtestpriorityqueue"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="container"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_boost_stable_vector.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_deque.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\priority_queue\hdr_fcpqueue_vector.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_dyn.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\priority_queue\hdr_mspqueue_static.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\priority_queue\hdr_pqueue.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="intrusive"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_dyn.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_mspqueue_static.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\priority_queue\hdr_intrusive_pqueue.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\priority_queue\hdr_priority_queue_reg.cpp"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/hdr-test-priority_queue.vcproj.user.u.user b/projects/Win/vc9/hdr-test-priority_queue.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/hdr-test-project-template.vcproj b/projects/Win/vc9/hdr-test-project-template.vcproj
new file mode 100644 (file)
index 0000000..39e102a
--- /dev/null
@@ -0,0 +1,524 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="hdr-test"\r
+       ProjectGUID="{B8EC8927-F96E-41CE-9431-6654AE33BB19}"\r
+       RootNamespace="hdrtest"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/hdr-test-queue.vcproj b/projects/Win/vc9/hdr-test-queue.vcproj
new file mode 100644 (file)
index 0000000..a2871ff
--- /dev/null
@@ -0,0 +1,688 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="hdr-test-queue"\r
+       ProjectGUID="{33664E63-8D24-4FF4-A744-9782EB711509}"\r
+       RootNamespace="hdrtestqueue"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="intrusive"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_node.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_basketqueue_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_fcqueue.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_moirqueue_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_msqueue_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_optimisticqueue_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_segmented_queue_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_singlelink_node.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_tsigas_cycle_queue.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_intrusive_vyukovmpmc_cycle_queue.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="container"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_basketqueue_hzp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_basketqueue_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_fcqueue.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_moirqueue_hzp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_moirqueue_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_msqueue_hrc.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_msqueue_hzp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_msqueue_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_optimistic_hzp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_optimistic_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_rwqueue.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_segmented_queue.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_segmented_queue_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\hdr_vyukov_mpmc_cyclic.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\queue_test_header.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\queue\queue_test_header.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/hdr-test-queue.vcproj.user.u.user b/projects/Win/vc9/hdr-test-queue.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/hdr-test-set.vcproj b/projects/Win/vc9/hdr-test-set.vcproj
new file mode 100644 (file)
index 0000000..d08b08a
--- /dev/null
@@ -0,0 +1,972 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="hdr-test-set"\r
+       ProjectGUID="{E5E9DB4A-7816-45D4-A116-6BBBA0EE8EE7}"\r
+       RootNamespace="hdrtestset"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE_NO_WARNINGS;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="container"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\set\hdr_set.h"\r
+                               >\r
+                       </File>\r
+                       <Filter\r
+                               Name="michael"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_hp.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_hrc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hp.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_hrc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_nogc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_ptb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpi.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_gpt.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_shb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_lazy_rcu_sht.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_nogc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_ptb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpi.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_gpt.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_shb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_michael_set_rcu_sht.cpp"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="skip_list"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_skiplist_set.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hp.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_skiplist_set_hrc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_skiplist_set_nogc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_skiplist_set_ptb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpi.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_gpt.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_shb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_skiplist_set_rcu_sht.cpp"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="split_list"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hp.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_hrc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hp.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_hrc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_nogc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_ptb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpi.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_gpt.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_shb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_lazy_rcu_sht.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_nogc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_ptb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpi.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_gpt.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_shb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_splitlist_set_rcu_sht.cpp"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="intrusive"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_set.h"\r
+                               >\r
+                       </File>\r
+                       <Filter\r
+                               Name="michael"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hp_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_hrc_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_nogc_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_ptb_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpb_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpi_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_gpt_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_shb_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_michael_set_rcu_sht_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="skip_list"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hp_member.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_hrc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_nogc_member.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_ptb_member.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpb_member.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpi_member.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_gpt_member.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_shb_member.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_rcu_sht_member.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_skiplist_set_rcu.h"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="split_list"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hp_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_hrc_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_nogc_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_ptb_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/hdr-test-set.vcproj.user.u.user b/projects/Win/vc9/hdr-test-set.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/hdr-test-stack.vcproj b/projects/Win/vc9/hdr-test-stack.vcproj
new file mode 100644 (file)
index 0000000..1c4ea7f
--- /dev/null
@@ -0,0 +1,588 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="hdr-test-stack"\r
+       ProjectGUID="{E3F2927A-6ED6-4B18-BDE6-B3B760E1AF18}"\r
+       RootNamespace="hdrteststack"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_hp.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_hrc.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_elimination_stack_ptb.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_fcstack.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_hp.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_hrc.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_intrusive_elimination_stack_ptb.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_intrusive_fcstack.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_hp.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_hrc.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_intrusive_treiber_stack_ptb.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_treiber_stack.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_hp.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_hrc.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\stack\hdr_treiber_stack_ptb.cpp"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/hdr-test-stack.vcproj.user.u.user b/projects/Win/vc9/hdr-test-stack.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/hdr-test-striped-set.vcproj b/projects/Win/vc9/hdr-test-striped-set.vcproj
new file mode 100644 (file)
index 0000000..a541724
--- /dev/null
@@ -0,0 +1,744 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="hdr-test-striped-set"\r
+       ProjectGUID="{D8A92546-DCB0-4709-A12C-52510F36D596}"\r
+       RootNamespace="hdrtestset"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE_NO_WARNINGS;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="container"\r
+                       >\r
+                       <Filter\r
+                               Name="cuckoo"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_cuckoo_set.h"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="striped"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_flat_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_list.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_stable_vector.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_unordered_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_boost_vector.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_std.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_hashset_vc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_list.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_slist.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_refinable_hashset_vector.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_flat_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_list.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_stable_vector.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_unordered_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_boost_vector.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_std.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_hashset_vc.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_list.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_slist.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_hashset_vector.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_striped_set.h"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="intrusive"\r
+                       >\r
+                       <Filter\r
+                               Name="cuckoo"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_refinable_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_cuckoo_set.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\intrusive_cuckoo_set_common.h"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+                       <Filter\r
+                               Name="striped"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_avlset.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_list.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_sgset.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_slist.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_splayset.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_treapset.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_refinable_hashset_uset.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_avlset.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_list.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_sgset.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_slist.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_splayset.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_treapset.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_hashset_uset.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\tests\test-hdr\set\hdr_intrusive_striped_set.h"\r
+                                       >\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/hdr-test-striped-set.vcproj.user.u.user b/projects/Win/vc9/hdr-test-striped-set.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/hdr-test-tree.vcproj b/projects/Win/vc9/hdr-test-tree.vcproj
new file mode 100644 (file)
index 0000000..1e43441
--- /dev/null
@@ -0,0 +1,672 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="hdr-test-tree"\r
+       ProjectGUID="{6F834EAD-7B94-4979-A0F1-A662E3D30145}"\r
+       RootNamespace="hdrtesttree"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableEnhancedInstructionSet="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="3"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               OmitFramePointers="false"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                               EnablePREfast="false"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName).exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               LinkTimeCodeGeneration="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                               Profile="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\test-hdr&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                               CallingConvention="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="container"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_map_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_ellenbintree_set_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="intrusive"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_bintree.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_hp_member.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_hp.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_ptb.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_pool_rcu.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_ptb_member.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpb_member.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpi_member.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_gpt_member.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_shb_member.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\test-hdr\tree\hdr_intrusive_ellen_bintree_rcu_sht_member.cpp"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <File\r
+                       RelativePath="..\..\..\tests\test-hdr\tree\hdr_tree_reg.cpp"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/hdr-test-tree.vcproj.user.u.user b/projects/Win/vc9/hdr-test-tree.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/unit-map-delodd.vcproj b/projects/Win/vc9/unit-map-delodd.vcproj
new file mode 100644 (file)
index 0000000..88766c0
--- /dev/null
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="unit-map-delodd"\r
+       ProjectGUID="{B5500E14-C9E3-4F47-9E1F-CE26D1F3DCA0}"\r
+       RootNamespace="unitmap"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\map2\map_delodd.cpp"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/unit-map-delodd.vcproj.user.u.user b/projects/Win/vc9/unit-map-delodd.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/unit-map-find.vcproj b/projects/Win/vc9/unit-map-find.vcproj
new file mode 100644 (file)
index 0000000..8aeabce
--- /dev/null
@@ -0,0 +1,508 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="unit-map-find"\r
+       ProjectGUID="{30FE61D0-7914-4B7C-972A-DEB61510102B}"\r
+       RootNamespace="unitmap"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\map2\map_find_int.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\map2\map_find_string.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\map2\map_insfind_int.cpp"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/unit-map-find.vcproj.user.u.user b/projects/Win/vc9/unit-map-find.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/unit-map-insdel.vcproj b/projects/Win/vc9/unit-map-insdel.vcproj
new file mode 100644 (file)
index 0000000..3180780
--- /dev/null
@@ -0,0 +1,520 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="unit-map-insdel"\r
+       ProjectGUID="{92FED7E7-3577-4ACA-9197-FBD2B3275EE6}"\r
+       RootNamespace="unitmap"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\map2\map_insdel_func.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\map2\map_insdel_int.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\map2\map_insdel_item_int.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\map2\map_insdel_item_string.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\map2\map_insdel_string.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\map2\map_insdelfind.cpp"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/unit-map-insdel.vcproj.user.u.user b/projects/Win/vc9/unit-map-insdel.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/unit-misc.vcproj b/projects/Win/vc9/unit-misc.vcproj
new file mode 100644 (file)
index 0000000..0dc8201
--- /dev/null
@@ -0,0 +1,544 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="unit-misc"\r
+       ProjectGUID="{77350FDC-9E51-438B-9A8F-D2FEA11D46B2}"\r
+       RootNamespace="unitmisc"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="alloc"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\unit\alloc\hoard_threadtest.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\unit\alloc\larson.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\unit\alloc\linux_scale.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\unit\alloc\michael_allocator.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\unit\alloc\michael_allocator.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\unit\alloc\random.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\unit\alloc\random_gen.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+               <Filter\r
+                       Name="lock"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\tests\unit\lock\nolock.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\unit\lock\spinlock.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\tests\unit\lock\win32_lock.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/unit-misc.vcproj.user.u.user b/projects/Win/vc9/unit-misc.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/unit-pqueue.vcproj b/projects/Win/vc9/unit-pqueue.vcproj
new file mode 100644 (file)
index 0000000..01c9c20
--- /dev/null
@@ -0,0 +1,532 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="unit-pqueue"\r
+       ProjectGUID="{20B6C380-E96A-4CFF-BC17-D88AAE581919}"\r
+       RootNamespace="unitpqueue"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\pqueue\ellen_bintree_pqueue.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\pqueue\pop.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\pqueue\pqueue_defs.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\pqueue\pqueue_item.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\pqueue\pqueue_type.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\pqueue\push.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\pqueue\push_pop.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\pqueue\skiplist_pqueue.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\pqueue\std_pqueue.h"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/unit-pqueue.vcproj.user.u.user b/projects/Win/vc9/unit-pqueue.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/unit-prerequisites.vcproj b/projects/Win/vc9/unit-prerequisites.vcproj
new file mode 100644 (file)
index 0000000..c892d07
--- /dev/null
@@ -0,0 +1,748 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="unit-prerequisites"\r
+       ProjectGUID="{61179F2F-07E1-490D-B64D-D85A90B6EF81}"\r
+       RootNamespace="unitprerequisites"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="CDS_USE_VLD;WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\cppunit\cppunit_mini.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\cppunit\cppunit_proxy.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\ellen_bintree_update_desc_pool.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\ellen_bintree_update_desc_pool.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\cppunit\file_reporter.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\michael_alloc.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\michael_alloc.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\print_cuckoo_stat.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\print_deque_stat.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\print_ellenbintree_stat.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\print_mspriorityqueue_stat.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\print_segmentedqueue_stat.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\print_skip_list_stat.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\map2\std_hash_map.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\data\test-debug.conf"\r
+                       >\r
+                       <FileConfiguration\r
+                               Name="Debug|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-debug.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Debug|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-debug.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Release|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-debug.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Release|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-debug.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="DebugVLD|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-debug.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="DebugVLD|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-debug.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\data\test-express.conf"\r
+                       >\r
+                       <FileConfiguration\r
+                               Name="Debug|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-express.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Debug|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-express.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Release|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-express.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Release|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-express.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="DebugVLD|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-express.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="DebugVLD|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test-express.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\data\test.conf"\r
+                       >\r
+                       <FileConfiguration\r
+                               Name="Debug|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Debug|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Release|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Release|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="DebugVLD|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="DebugVLD|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Copy test configurations"\r
+                                       CommandLine="copy $(InputPath) $(TargetDir)\*.*&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\test.conf"\r
+                               />\r
+                       </FileConfiguration>\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\cppunit\test_beans.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\cppunit\test_main.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\data\text.txt"\r
+                       >\r
+                       <FileConfiguration\r
+                               Name="Debug|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Build text dictionary"\r
+                                       CommandLine="cd $(InputDir) &amp;&amp; perl -X split.pl  &amp;&amp; copy $(InputDir)\dictionary.txt $(TargetDir)\dictionary.txt&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\dictionary.txt"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Debug|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Build text dictionary"\r
+                                       CommandLine="cd $(InputDir) &amp;&amp; perl -X split.pl  &amp;&amp; copy $(InputDir)\dictionary.txt $(TargetDir)\dictionary.txt&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\dictionary.txt"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Release|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Build text dictionary"\r
+                                       CommandLine="cd $(InputDir) &amp;&amp; perl -X split.pl  &amp;&amp; copy $(InputDir)\dictionary.txt $(TargetDir)\dictionary.txt&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\dictionary.txt"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="Release|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Build text dictionary"\r
+                                       CommandLine="cd $(InputDir) &amp;&amp; perl -X split.pl  &amp;&amp; copy $(InputDir)\dictionary.txt $(TargetDir)\dictionary.txt&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\dictionary.txt"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="DebugVLD|Win32"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Build text dictionary"\r
+                                       CommandLine="cd $(InputDir) &amp;&amp; perl -X split.pl  &amp;&amp; copy $(InputDir)\dictionary.txt $(TargetDir)\dictionary.txt&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\dictionary.txt"\r
+                               />\r
+                       </FileConfiguration>\r
+                       <FileConfiguration\r
+                               Name="DebugVLD|x64"\r
+                               >\r
+                               <Tool\r
+                                       Name="VCCustomBuildTool"\r
+                                       Description="Build text dictionary"\r
+                                       CommandLine="cd $(InputDir) &amp;&amp; perl -X split.pl  &amp;&amp; copy $(InputDir)\dictionary.txt $(TargetDir)\dictionary.txt&#x0D;&#x0A;"\r
+                                       Outputs="$(TargetDir)\dictionary.txt"\r
+                               />\r
+                       </FileConfiguration>\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\cppunit\thread.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\cppunit\thread.h"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/unit-prerequisites.vcproj.user.u.user b/projects/Win/vc9/unit-prerequisites.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..770286f
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command=""\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/unit-project-template.vcproj b/projects/Win/vc9/unit-project-template.vcproj
new file mode 100644 (file)
index 0000000..a886085
--- /dev/null
@@ -0,0 +1,343 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="unit-queue"\r
+       ProjectGUID="{6C15AF8A-4A99-49F9-BCF0-1BF36771099A}"\r
+       RootNamespace="unitqueue"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/unit-queue.vcproj b/projects/Win/vc9/unit-queue.vcproj
new file mode 100644 (file)
index 0000000..9ad5d4a
--- /dev/null
@@ -0,0 +1,536 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="unit-queue"\r
+       ProjectGUID="{6C15AF8A-4A99-49F9-BCF0-1BF36771099A}"\r
+       RootNamespace="unitqueue"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\queue\intrusive_queue_defs.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\queue\intrusive_queue_reader_writer.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\queue\intrusive_queue_type.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\queue\queue_defs.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\queue\queue_pop.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\queue\queue_push.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\queue\queue_random.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\queue\queue_reader_writer.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\queue\queue_type.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\queue\std_queue.h"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/unit-queue.vcproj.user.u.user b/projects/Win/vc9/unit-queue.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/unit-set-delodd.vcproj b/projects/Win/vc9/unit-set-delodd.vcproj
new file mode 100644 (file)
index 0000000..5c90a26
--- /dev/null
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="unit-set-delodd"\r
+       ProjectGUID="{6AA271C0-9A17-4FAC-BB17-140E44EC73E2}"\r
+       RootNamespace="unitset"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\set2\set_delodd.cpp"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/unit-set-delodd.vcproj.user.u.user b/projects/Win/vc9/unit-set-delodd.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/unit-set-insdel.vcproj b/projects/Win/vc9/unit-set-insdel.vcproj
new file mode 100644 (file)
index 0000000..382e0f6
--- /dev/null
@@ -0,0 +1,536 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="unit-set-insdel"\r
+       ProjectGUID="{DFA03A8D-5A5C-46D3-AD21-67DC85BAFAEE}"\r
+       RootNamespace="unitset"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0;_SCL_SECURE_NO_WARNINGS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\set2\set_insdel_func.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\set2\set_insdel_func.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\set2\set_insdel_func2.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\set2\set_insdel_func3.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\set2\set_insdel_func4.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\set2\set_insdel_func5.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\set2\set_insdel_func6.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\set2\set_insdel_func7.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\set2\set_insdel_string.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\set2\set_insdelfind.cpp"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/unit-set-insdel.vcproj.user.u.user b/projects/Win/vc9/unit-set-insdel.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/Win/vc9/unit-stack.vcproj b/projects/Win/vc9/unit-stack.vcproj
new file mode 100644 (file)
index 0000000..8f9ffc0
--- /dev/null
@@ -0,0 +1,524 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="unit-stack"\r
+       ProjectGUID="{E29DE1F7-AE8D-4AE6-98B1-147E5103D974}"\r
+       RootNamespace="unitstack"\r
+       Keyword="Win32Proj"\r
+       TargetFrameworkVersion="196613"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(SolutionDir)..\..\..\bin\vc9\$(PlatformName)"\r
+                       IntermediateDirectory="$(SolutionDir)..\..\..\obj\vc9\$(PlatformName)\$(ProjectName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               FavorSizeOrSpeed="1"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites.lib"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"\r
+                       IntermediateDirectory="$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="4"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage32/lib&quot;;&quot;$(BOOST_PATH)/stage/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"\r
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               AdditionalOptions="/bigobj"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="&quot;$(SolutionDir)..\..\..&quot;;&quot;$(SolutionDir)..\..\..\tests\unit&quot;;&quot;$(SolutionDir)..\..\..\tests&quot;;&quot;$(BOOST_PATH)&quot;"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0501;_SCL_SECURE=0"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               AdditionalDependencies="unit-prerequisites_d.lib"\r
+                               OutputFile="$(OutDir)\$(ProjectName)_d.exe"\r
+                               LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="&quot;$(BOOST_PATH)/stage64/lib&quot;;&quot;$(BOOST_PATH)/bin&quot;;&quot;$(OutDir)&quot;"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="1"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\stack\intrusive_stack_defs.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\stack\intrusive_stack_type.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\stack\stack_defs.h"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\stack\stack_intrusive_pushpop.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\stack\stack_push.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\stack\stack_pushpop.cpp"\r
+                       >\r
+               </File>\r
+               <File\r
+                       RelativePath="..\..\..\tests\unit\stack\stack_type.h"\r
+                       >\r
+               </File>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/projects/Win/vc9/unit-stack.vcproj.user.u.user b/projects/Win/vc9/unit-stack.vcproj.user.u.user
new file mode 100644 (file)
index 0000000..e8c1f27
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="windows-1251"?>\r
+<VisualStudioUserFile\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       ShowAllFiles="false"\r
+       >\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|Win32"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="DebugVLD|x64"\r
+                       >\r
+                       <DebugSettings\r
+                               Command="$(TargetPath)"\r
+                               WorkingDirectory=""\r
+                               CommandArguments=""\r
+                               Attach="false"\r
+                               DebuggerType="3"\r
+                               Remote="1"\r
+                               RemoteMachine="USER"\r
+                               RemoteCommand=""\r
+                               HttpUrl=""\r
+                               PDBPath=""\r
+                               SQLDebugging=""\r
+                               Environment=""\r
+                               EnvironmentMerge="true"\r
+                               DebuggerFlavor=""\r
+                               MPIRunCommand=""\r
+                               MPIRunArguments=""\r
+                               MPIRunWorkingDirectory=""\r
+                               ApplicationCommand=""\r
+                               ApplicationArguments=""\r
+                               ShimCommand=""\r
+                               MPIAcceptMode=""\r
+                               MPIAcceptFilter=""\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+</VisualStudioUserFile>\r
diff --git a/projects/android/jni/Android.mk b/projects/android/jni/Android.mk
new file mode 100644 (file)
index 0000000..87dcf23
--- /dev/null
@@ -0,0 +1,185 @@
+\r
+    CDS_LIBRARY_VERSION := 1.6.0\r
+    LOCAL_PATH := $(call my-dir)\r
+    CDS_ROOT_DIR = $(LOCAL_PATH)/../../..\r
+\r
+    BOOST_LIBS := -lboost_thread -lboost_system\r
+    BOOST_LIB_PATH := $(BOOST_ROOT)/stage32-android/lib\r
+\r
+    CDS_TESTHDR_INCLUDE := $(LOCAL_PATH)/../../.. \\r
+                        $(LOCAL_PATH)/../../../tests \\r
+                        $(LOCAL_PATH)/../../../tests/test-hdr \\r
+                        $(BOOST_ROOT)\r
+# libcds\r
+    include $(CLEAR_VARS)\r
+\r
+    LOCAL_MODULE    := cds\r
+    LOCAL_MODULE_FILENAME = libcds-$(CDS_LIBRARY_VERSION)\r
+    include $(CDS_ROOT_DIR)/projects/source.libcds.mk\r
+    LOCAL_SRC_FILES := $(CDS_SOURCES:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../.. $(BOOST_ROOT)\r
+    LOCAL_CPP_FEATURES := exceptions\r
+\r
+    include $(BUILD_SHARED_LIBRARY)\r
+\r
+#test-hdr-map\r
+    include $(CLEAR_VARS)\r
+\r
+    LOCAL_MODULE    := test-hdr-map\r
+    include $(CDS_ROOT_DIR)/projects/source.test-common.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.offsetof.mk\r
+    LOCAL_SRC_FILES := $(CDS_TESTCOMMON_SOURCES:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_MAP:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_OFFSETOF_MAP:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_C_INCLUDES := $(CDS_TESTHDR_INCLUDE)\r
+    LOCAL_SHARED_LIBRARIES := cds\r
+    LOCAL_CPP_FEATURES := exceptions\r
+    LOCAL_CPPFLAGS := -Wno-invalid-offsetof -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS\r
+    LOCAL_LDLIBS   := $(BOOST_LIBS)\r
+    LOCAL_LDFLAGS  := -L$(BOOST_LIB_PATH)\r
+    include $(BUILD_EXECUTABLE)\r
+\r
+#test-hdr-deque\r
+    include $(CLEAR_VARS)\r
+\r
+    LOCAL_MODULE    := test-hdr-deque\r
+    include $(CDS_ROOT_DIR)/projects/source.test-common.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.offsetof.mk\r
+    LOCAL_SRC_FILES := $(CDS_TESTCOMMON_SOURCES:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_DEQUE:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_OFFSETOF_DEQUE:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_C_INCLUDES := $(CDS_TESTHDR_INCLUDE)\r
+    LOCAL_SHARED_LIBRARIES := cds\r
+    LOCAL_CPP_FEATURES := exceptions\r
+    LOCAL_CPPFLAGS := -Wno-invalid-offsetof -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS\r
+    LOCAL_LDLIBS   := $(BOOST_LIBS)\r
+    LOCAL_LDFLAGS  := -L$(BOOST_LIB_PATH)\r
+    include $(BUILD_EXECUTABLE)\r
+\r
+#test-hdr-ordlist\r
+    include $(CLEAR_VARS)\r
+\r
+    LOCAL_MODULE    := test-hdr-ordlist\r
+    include $(CDS_ROOT_DIR)/projects/source.test-common.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.offsetof.mk\r
+    LOCAL_SRC_FILES := $(CDS_TESTCOMMON_SOURCES:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_ORDLIST:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_OFFSETOF_ORDLIST:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_C_INCLUDES := $(CDS_TESTHDR_INCLUDE)\r
+    LOCAL_SHARED_LIBRARIES := cds\r
+    LOCAL_CPP_FEATURES := exceptions\r
+    LOCAL_CPPFLAGS := -Wno-invalid-offsetof -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS\r
+    LOCAL_LDLIBS   := $(BOOST_LIBS)\r
+    LOCAL_LDFLAGS  := -L$(BOOST_LIB_PATH)\r
+    include $(BUILD_EXECUTABLE)\r
+\r
+#test-hdr-pqueue\r
+    include $(CLEAR_VARS)\r
+\r
+    LOCAL_MODULE    := test-hdr-pqueue\r
+    include $(CDS_ROOT_DIR)/projects/source.test-common.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.offsetof.mk\r
+    LOCAL_SRC_FILES := $(CDS_TESTCOMMON_SOURCES:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_PQUEUE:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+#    LOCAL_SRC_FILES += $(CDS_TESTHDR_OFFSETOF_PQUEUE:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_C_INCLUDES := $(CDS_TESTHDR_INCLUDE)\r
+    LOCAL_SHARED_LIBRARIES := cds\r
+    LOCAL_CPP_FEATURES := exceptions\r
+    LOCAL_CPPFLAGS := -Wno-invalid-offsetof -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS\r
+    LOCAL_LDLIBS   := $(BOOST_LIBS)\r
+    LOCAL_LDFLAGS  := -L$(BOOST_LIB_PATH)\r
+    include $(BUILD_EXECUTABLE)\r
+\r
+#test-hdr-queue\r
+    include $(CLEAR_VARS)\r
+\r
+    LOCAL_MODULE    := test-hdr-queue\r
+    include $(CDS_ROOT_DIR)/projects/source.test-common.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.offsetof.mk\r
+    LOCAL_SRC_FILES := $(CDS_TESTCOMMON_SOURCES:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_QUEUE:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_OFFSETOF_QUEUE:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_C_INCLUDES := $(CDS_TESTHDR_INCLUDE)\r
+    LOCAL_SHARED_LIBRARIES := cds\r
+    LOCAL_CPP_FEATURES := exceptions\r
+    LOCAL_CPPFLAGS := -Wno-invalid-offsetof -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS\r
+    LOCAL_LDLIBS   := $(BOOST_LIBS)\r
+    LOCAL_LDFLAGS  := -L$(BOOST_LIB_PATH)\r
+    include $(BUILD_EXECUTABLE)\r
+\r
+#test-hdr-set\r
+    include $(CLEAR_VARS)\r
+\r
+    LOCAL_MODULE    := test-hdr-set\r
+    include $(CDS_ROOT_DIR)/projects/source.test-common.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.offsetof.mk\r
+    LOCAL_SRC_FILES := $(CDS_TESTCOMMON_SOURCES:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_SET:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_OFFSETOF_SET:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_C_INCLUDES := $(CDS_TESTHDR_INCLUDE)\r
+    LOCAL_SHARED_LIBRARIES := cds\r
+    LOCAL_CPP_FEATURES := exceptions\r
+    LOCAL_CPPFLAGS := -Wno-invalid-offsetof -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS\r
+    LOCAL_LDLIBS   := $(BOOST_LIBS)\r
+    LOCAL_LDFLAGS  := -L$(BOOST_LIB_PATH)\r
+    include $(BUILD_EXECUTABLE)\r
+\r
+#test-hdr-stack\r
+    include $(CLEAR_VARS)\r
+\r
+    LOCAL_MODULE    := test-hdr-stack\r
+    include $(CDS_ROOT_DIR)/projects/source.test-common.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.offsetof.mk\r
+    LOCAL_SRC_FILES := $(CDS_TESTCOMMON_SOURCES:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_STACK:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_OFFSETOF_STACK:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_C_INCLUDES := $(CDS_TESTHDR_INCLUDE)\r
+    LOCAL_SHARED_LIBRARIES := cds\r
+    LOCAL_CPP_FEATURES := exceptions\r
+    LOCAL_CPPFLAGS := -Wno-invalid-offsetof -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS\r
+    LOCAL_LDLIBS   := $(BOOST_LIBS)\r
+    LOCAL_LDFLAGS  := -L$(BOOST_LIB_PATH)\r
+    include $(BUILD_EXECUTABLE)\r
+\r
+#test-hdr-tree\r
+    include $(CLEAR_VARS)\r
+\r
+    LOCAL_MODULE    := test-hdr-tree\r
+    include $(CDS_ROOT_DIR)/projects/source.test-common.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.offsetof.mk\r
+    LOCAL_SRC_FILES := $(CDS_TESTCOMMON_SOURCES:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_TREE:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_OFFSETOF_TREE:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_C_INCLUDES := $(CDS_TESTHDR_INCLUDE)\r
+    LOCAL_SHARED_LIBRARIES := cds\r
+    LOCAL_CPP_FEATURES := exceptions\r
+    LOCAL_CPPFLAGS := -Wno-invalid-offsetof -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS\r
+    LOCAL_LDLIBS   := $(BOOST_LIBS)\r
+    LOCAL_LDFLAGS  := -L$(BOOST_LIB_PATH)\r
+    include $(BUILD_EXECUTABLE)\r
+\r
+#test-hdr-misc\r
+    include $(CLEAR_VARS)\r
+\r
+    LOCAL_MODULE    := test-hdr-misc\r
+    include $(CDS_ROOT_DIR)/projects/source.test-common.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.mk\r
+    include $(CDS_ROOT_DIR)/projects/source.test-hdr.offsetof.mk\r
+    LOCAL_SRC_FILES := $(CDS_TESTCOMMON_SOURCES:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_SRC_FILES += $(CDS_TESTHDR_MISC:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+#    LOCAL_SRC_FILES += $(CDS_TESTHDR_OFFSETOF_MISC:%.cpp=$(CDS_ROOT_DIR)/%.cpp)\r
+    LOCAL_C_INCLUDES := $(CDS_TESTHDR_INCLUDE)\r
+    LOCAL_SHARED_LIBRARIES := cds\r
+    LOCAL_CPP_FEATURES := exceptions\r
+    LOCAL_CPPFLAGS := -Wno-invalid-offsetof -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS\r
+    LOCAL_LDLIBS   := $(BOOST_LIBS)\r
+    LOCAL_LDFLAGS  := -L$(BOOST_LIB_PATH)\r
+    include $(BUILD_EXECUTABLE)\r
diff --git a/projects/android/jni/Application.mk b/projects/android/jni/Application.mk
new file mode 100644 (file)
index 0000000..ad5a1e2
--- /dev/null
@@ -0,0 +1,10 @@
+
+APP_MODULES := cds test-hdr-map test-hdr-deque test-hdr-ordlist test_hdr_pqueue 
+APP_MODULES += test-hdr-queue test-hdr-set test-hdr-stack test-hdr-tree test-hdr-misc
+APP_ABI := armeabi-v7a
+APP_OPTIM := debug
+APP_STL := gnustl_shared
+APP_CPPFLAGS := -std=c++0x -frtti -pedantic -Wall -Wno-unused-local-typedefs
+#APP_LDFLAGS :=
+APP_GNUSTL_FORCE_CPP_FEATURES := exceptions
+NDK_TOOLCHAIN_VERSION := 4.8
diff --git a/projects/android/jni/build.sh b/projects/android/jni/build.sh
new file mode 100644 (file)
index 0000000..dfb8f67
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+BOOST_ROOT=~/works/libs/boost_1_53_0 $NDK/ndk-build -j 1 2>&1 |tee arm-build.log
diff --git a/projects/source.libcds.mk b/projects/source.libcds.mk
new file mode 100644 (file)
index 0000000..2006182
--- /dev/null
@@ -0,0 +1,11 @@
+CDS_SOURCES=src/hzp_gc.cpp \\r
+         src/init.cpp \\r
+         src/hrc_gc.cpp \\r
+         src/ptb_gc.cpp \\r
+         src/urcu_gp.cpp \\r
+         src/urcu_sh.cpp \\r
+         src/michael_heap.cpp \\r
+         src/topology_hpux.cpp \\r
+         src/topology_linux.cpp \\r
+         src/topology_osx.cpp \\r
+         src/dllmain.cpp\r
diff --git a/projects/source.test-common.mk b/projects/source.test-common.mk
new file mode 100644 (file)
index 0000000..a867a52
--- /dev/null
@@ -0,0 +1,6 @@
+
+CDS_TESTCOMMON_SOURCES := \
+    tests/cppunit/test_main.cpp \
+    tests/cppunit/thread.cpp \
+    tests/unit/michael_alloc.cpp \
+    tests/unit/ellen_bintree_update_desc_pool.cpp
diff --git a/projects/source.test-hdr.mk b/projects/source.test-hdr.mk
new file mode 100644 (file)
index 0000000..ae1dbca
--- /dev/null
@@ -0,0 +1,303 @@
+CDS_TESTHDR_MAP := \
+    tests/test-hdr/map/hdr_michael_map_hp.cpp \
+    tests/test-hdr/map/hdr_michael_map_hrc.cpp \
+    tests/test-hdr/map/hdr_michael_map_ptb.cpp \
+    tests/test-hdr/map/hdr_michael_map_rcu_gpi.cpp \
+    tests/test-hdr/map/hdr_michael_map_rcu_gpb.cpp \
+    tests/test-hdr/map/hdr_michael_map_rcu_gpt.cpp \
+    tests/test-hdr/map/hdr_michael_map_rcu_shb.cpp \
+    tests/test-hdr/map/hdr_michael_map_rcu_sht.cpp \
+    tests/test-hdr/map/hdr_michael_map_nogc.cpp \
+    tests/test-hdr/map/hdr_michael_map_lazy_hp.cpp \
+    tests/test-hdr/map/hdr_michael_map_lazy_hrc.cpp \
+    tests/test-hdr/map/hdr_michael_map_lazy_ptb.cpp \
+    tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpi.cpp \
+    tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpb.cpp \
+    tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpt.cpp \
+    tests/test-hdr/map/hdr_michael_map_lazy_rcu_shb.cpp \
+    tests/test-hdr/map/hdr_michael_map_lazy_rcu_sht.cpp \
+    tests/test-hdr/map/hdr_michael_map_lazy_nogc.cpp \
+    tests/test-hdr/map/hdr_refinable_hashmap_hashmap_std.cpp \
+    tests/test-hdr/map/hdr_refinable_hashmap_boost_list.cpp \
+    tests/test-hdr/map/hdr_refinable_hashmap_list.cpp \
+    tests/test-hdr/map/hdr_refinable_hashmap_map.cpp \
+    tests/test-hdr/map/hdr_refinable_hashmap_boost_map.cpp \
+    tests/test-hdr/map/hdr_refinable_hashmap_boost_flat_map.cpp \
+    tests/test-hdr/map/hdr_refinable_hashmap_boost_unordered_map.cpp \
+    tests/test-hdr/map/hdr_refinable_hashmap_slist.cpp \
+    tests/test-hdr/map/hdr_skiplist_map_hp.cpp \
+    tests/test-hdr/map/hdr_skiplist_map_hrc.cpp \
+    tests/test-hdr/map/hdr_skiplist_map_ptb.cpp \
+    tests/test-hdr/map/hdr_skiplist_map_rcu_gpi.cpp \
+    tests/test-hdr/map/hdr_skiplist_map_rcu_gpb.cpp \
+    tests/test-hdr/map/hdr_skiplist_map_rcu_gpt.cpp \
+    tests/test-hdr/map/hdr_skiplist_map_rcu_shb.cpp \
+    tests/test-hdr/map/hdr_skiplist_map_rcu_sht.cpp \
+    tests/test-hdr/map/hdr_skiplist_map_nogc.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_hp.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_hrc.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_ptb.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_nogc.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_rcu_gpi.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_rcu_gpb.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_rcu_gpt.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_rcu_shb.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_rcu_sht.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_lazy_hp.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_lazy_hrc.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_lazy_ptb.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_lazy_nogc.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpi.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpb.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpt.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_sht.cpp \
+    tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_shb.cpp \
+    tests/test-hdr/map/hdr_striped_hashmap_hashmap_std.cpp \
+    tests/test-hdr/map/hdr_striped_hashmap_boost_list.cpp \
+    tests/test-hdr/map/hdr_striped_hashmap_list.cpp \
+    tests/test-hdr/map/hdr_striped_hashmap_map.cpp \
+    tests/test-hdr/map/hdr_striped_hashmap_boost_map.cpp \
+    tests/test-hdr/map/hdr_striped_hashmap_boost_flat_map.cpp \
+    tests/test-hdr/map/hdr_striped_hashmap_boost_unordered_map.cpp \
+    tests/test-hdr/map/hdr_striped_hashmap_slist.cpp \
+    tests/test-hdr/map/hdr_striped_map_reg.cpp
+
+CDS_TESTHDR_DEQUE := \
+    tests/test-hdr/deque/hdr_michael_deque_hp.cpp \
+    tests/test-hdr/deque/hdr_michael_deque_ptb.cpp \
+    tests/test-hdr/deque/hdr_fcdeque.cpp
+
+CDS_TESTHDR_ORDLIST := \
+    tests/test-hdr/ordered_list/hdr_intrusive_lazy_hrc.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_hp.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_hrc.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_nogc.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_ptb.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_rcu_gpi.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_rcu_gpb.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_rcu_gpt.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_rcu_shb.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_rcu_sht.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_kv_hp.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_kv_hrc.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_kv_nogc.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_kv_ptb.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpb.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpi.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpt.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_shb.cpp \
+    tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_sht.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_michael_hrc.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_hp.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_hrc.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_nogc.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_ptb.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_rcu_gpi.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_rcu_gpb.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_rcu_gpt.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_rcu_shb.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_rcu_sht.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_kv_hp.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_kv_hrc.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_kv_nogc.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_kv_ptb.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpi.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpb.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpt.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_kv_rcu_shb.cpp \
+    tests/test-hdr/ordered_list/hdr_michael_kv_rcu_sht.cpp
+
+CDS_TESTHDR_PQUEUE := \
+    tests/test-hdr/priority_queue/hdr_intrusive_mspqueue_dyn.cpp \
+    tests/test-hdr/priority_queue/hdr_intrusive_mspqueue_static.cpp \
+    tests/test-hdr/priority_queue/hdr_mspqueue_dyn.cpp \
+    tests/test-hdr/priority_queue/hdr_mspqueue_static.cpp \
+    tests/test-hdr/priority_queue/hdr_fcpqueue_boost_stable_vector.cpp \
+    tests/test-hdr/priority_queue/hdr_fcpqueue_deque.cpp \
+    tests/test-hdr/priority_queue/hdr_fcpqueue_vector.cpp \
+    tests/test-hdr/priority_queue/hdr_priority_queue_reg.cpp
+
+CDS_TESTHDR_QUEUE := \
+    tests/test-hdr/queue/hdr_intrusive_basketqueue_hrc.cpp \
+    tests/test-hdr/queue/hdr_intrusive_fcqueue.cpp \
+    tests/test-hdr/queue/hdr_intrusive_moirqueue_hrc.cpp \
+    tests/test-hdr/queue/hdr_intrusive_msqueue_hrc.cpp \
+    tests/test-hdr/queue/hdr_intrusive_segmented_queue_hp.cpp \
+    tests/test-hdr/queue/hdr_intrusive_segmented_queue_ptb.cpp \
+    tests/test-hdr/queue/hdr_intrusive_tsigas_cycle_queue.cpp \
+    tests/test-hdr/queue/hdr_intrusive_vyukovmpmc_cycle_queue.cpp \
+    tests/test-hdr/queue/hdr_basketqueue_hrc.cpp \
+    tests/test-hdr/queue/hdr_basketqueue_hzp.cpp \
+    tests/test-hdr/queue/hdr_basketqueue_ptb.cpp \
+    tests/test-hdr/queue/hdr_fcqueue.cpp \
+    tests/test-hdr/queue/hdr_moirqueue_hrc.cpp \
+    tests/test-hdr/queue/hdr_moirqueue_hzp.cpp \
+    tests/test-hdr/queue/hdr_moirqueue_ptb.cpp \
+    tests/test-hdr/queue/hdr_msqueue_hrc.cpp \
+    tests/test-hdr/queue/hdr_msqueue_hzp.cpp \
+    tests/test-hdr/queue/hdr_msqueue_ptb.cpp \
+    tests/test-hdr/queue/hdr_optimistic_hzp.cpp \
+    tests/test-hdr/queue/hdr_optimistic_ptb.cpp \
+    tests/test-hdr/queue/hdr_rwqueue.cpp \
+    tests/test-hdr/queue/hdr_segmented_queue_hp.cpp \
+    tests/test-hdr/queue/hdr_segmented_queue_ptb.cpp \
+    tests/test-hdr/queue/hdr_vyukov_mpmc_cyclic.cpp \
+    tests/test-hdr/queue/queue_test_header.cpp 
+
+CDS_TESTHDR_SET := \
+    tests/test-hdr/set/hdr_intrusive_michael_set_hrc.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_hrc_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_refinable_hashset_avlset.cpp \
+    tests/test-hdr/set/hdr_intrusive_refinable_hashset_list.cpp \
+    tests/test-hdr/set/hdr_intrusive_refinable_hashset_set.cpp \
+    tests/test-hdr/set/hdr_intrusive_refinable_hashset_sgset.cpp \
+    tests/test-hdr/set/hdr_intrusive_refinable_hashset_slist.cpp \
+    tests/test-hdr/set/hdr_intrusive_refinable_hashset_splayset.cpp \
+    tests/test-hdr/set/hdr_intrusive_refinable_hashset_treapset.cpp \
+    tests/test-hdr/set/hdr_intrusive_refinable_hashset_uset.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_hp.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_hrc.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_ptb.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpb.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpi.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpt.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_rcu_shb.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_rcu_sht.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_nogc.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_hrc.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_hrc_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_striped_hashset_avlset.cpp \
+    tests/test-hdr/set/hdr_intrusive_striped_hashset_list.cpp \
+    tests/test-hdr/set/hdr_intrusive_striped_hashset_set.cpp \
+    tests/test-hdr/set/hdr_intrusive_striped_hashset_sgset.cpp \
+    tests/test-hdr/set/hdr_intrusive_striped_hashset_slist.cpp \
+    tests/test-hdr/set/hdr_intrusive_striped_hashset_splayset.cpp \
+    tests/test-hdr/set/hdr_intrusive_striped_hashset_treapset.cpp \
+    tests/test-hdr/set/hdr_intrusive_striped_hashset_uset.cpp \
+    tests/test-hdr/set/hdr_intrusive_striped_set.cpp \
+    tests/test-hdr/set/hdr_michael_set_hp.cpp \
+    tests/test-hdr/set/hdr_michael_set_hrc.cpp \
+    tests/test-hdr/set/hdr_michael_set_ptb.cpp \
+    tests/test-hdr/set/hdr_michael_set_rcu_gpi.cpp \
+    tests/test-hdr/set/hdr_michael_set_rcu_gpb.cpp \
+    tests/test-hdr/set/hdr_michael_set_rcu_gpt.cpp \
+    tests/test-hdr/set/hdr_michael_set_rcu_shb.cpp \
+    tests/test-hdr/set/hdr_michael_set_rcu_sht.cpp \
+    tests/test-hdr/set/hdr_michael_set_nogc.cpp \
+    tests/test-hdr/set/hdr_michael_set_lazy_hp.cpp \
+    tests/test-hdr/set/hdr_michael_set_lazy_hrc.cpp \
+    tests/test-hdr/set/hdr_michael_set_lazy_ptb.cpp \
+    tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpi.cpp \
+    tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpb.cpp \
+    tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpt.cpp \
+    tests/test-hdr/set/hdr_michael_set_lazy_rcu_shb.cpp \
+    tests/test-hdr/set/hdr_michael_set_lazy_rcu_sht.cpp \
+    tests/test-hdr/set/hdr_michael_set_lazy_nogc.cpp \
+    tests/test-hdr/set/hdr_refinable_hashset_hashset_std.cpp \
+    tests/test-hdr/set/hdr_refinable_hashset_boost_flat_set.cpp \
+    tests/test-hdr/set/hdr_refinable_hashset_boost_list.cpp \
+    tests/test-hdr/set/hdr_refinable_hashset_boost_set.cpp \
+    tests/test-hdr/set/hdr_refinable_hashset_boost_stable_vector.cpp \
+    tests/test-hdr/set/hdr_refinable_hashset_boost_unordered_set.cpp \
+    tests/test-hdr/set/hdr_refinable_hashset_boost_vector.cpp \
+    tests/test-hdr/set/hdr_refinable_hashset_list.cpp \
+    tests/test-hdr/set/hdr_refinable_hashset_set.cpp \
+    tests/test-hdr/set/hdr_refinable_hashset_slist.cpp \
+    tests/test-hdr/set/hdr_refinable_hashset_vector.cpp \
+    tests/test-hdr/set/hdr_skiplist_set_hp.cpp \
+    tests/test-hdr/set/hdr_skiplist_set_hrc.cpp \
+    tests/test-hdr/set/hdr_skiplist_set_ptb.cpp \
+    tests/test-hdr/set/hdr_skiplist_set_rcu_gpi.cpp \
+    tests/test-hdr/set/hdr_skiplist_set_rcu_gpb.cpp \
+    tests/test-hdr/set/hdr_skiplist_set_rcu_gpt.cpp \
+    tests/test-hdr/set/hdr_skiplist_set_rcu_shb.cpp \
+    tests/test-hdr/set/hdr_skiplist_set_rcu_sht.cpp \
+    tests/test-hdr/set/hdr_skiplist_set_nogc.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_hp.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_hrc.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_nogc.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_ptb.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_rcu_gpi.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_rcu_gpb.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_rcu_gpt.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_rcu_shb.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_rcu_sht.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_lazy_hp.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_lazy_hrc.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_lazy_nogc.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_lazy_ptb.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpi.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpb.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpt.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_shb.cpp \
+    tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_sht.cpp \
+    tests/test-hdr/set/hdr_striped_hashset_hashset_std.cpp \
+    tests/test-hdr/set/hdr_striped_hashset_boost_flat_set.cpp \
+    tests/test-hdr/set/hdr_striped_hashset_boost_list.cpp \
+    tests/test-hdr/set/hdr_striped_hashset_boost_set.cpp \
+    tests/test-hdr/set/hdr_striped_hashset_boost_stable_vector.cpp \
+    tests/test-hdr/set/hdr_striped_hashset_boost_unordered_set.cpp \
+    tests/test-hdr/set/hdr_striped_hashset_boost_vector.cpp \
+    tests/test-hdr/set/hdr_striped_hashset_list.cpp \
+    tests/test-hdr/set/hdr_striped_hashset_set.cpp \
+    tests/test-hdr/set/hdr_striped_hashset_slist.cpp \
+    tests/test-hdr/set/hdr_striped_hashset_vector.cpp 
+
+CDS_TESTHDR_STACK := \
+    tests/test-hdr/stack/hdr_intrusive_treiber_stack_hrc.cpp \
+    tests/test-hdr/stack/hdr_intrusive_elimination_stack_hrc.cpp \
+    tests/test-hdr/stack/hdr_intrusive_fcstack.cpp \
+    tests/test-hdr/stack/hdr_treiber_stack_hp.cpp \
+    tests/test-hdr/stack/hdr_treiber_stack_hrc.cpp \
+    tests/test-hdr/stack/hdr_treiber_stack_ptb.cpp \
+    tests/test-hdr/stack/hdr_elimination_stack_hp.cpp \
+    tests/test-hdr/stack/hdr_elimination_stack_hrc.cpp \
+    tests/test-hdr/stack/hdr_elimination_stack_ptb.cpp \
+    tests/test-hdr/stack/hdr_fcstack.cpp
+
+CDS_TESTHDR_TREE := \
+    tests/test-hdr/tree/hdr_tree_reg.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_hp.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_ptb.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpb.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpi.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpt.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_shb.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_sht.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_map_hp.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_map_ptb.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpb.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpi.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpt.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_map_rcu_shb.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_map_rcu_sht.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_set_hp.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_set_ptb.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpb.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpi.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpt.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_set_rcu_shb.cpp \
+    tests/test-hdr/tree/hdr_ellenbintree_set_rcu_sht.cpp
+
+CDS_TESTHDR_MISC := \
+    tests/test-hdr/misc/cxx11_atomic_class.cpp \
+    tests/test-hdr/misc/cxx11_atomic_func.cpp \
+    tests/test-hdr/misc/find_option.cpp \
+    tests/test-hdr/misc/allocator_test.cpp \
+    tests/test-hdr/misc/michael_allocator.cpp \
+    tests/test-hdr/misc/hash_tuple.cpp \
+    tests/test-hdr/misc/bitop_st.cpp \
+    tests/test-hdr/misc/permutation_generator.cpp \
+    tests/test-hdr/misc/thread_init_fini.cpp
+
+CDS_TESTHDR_SOURCES := \
+    $(CDS_TESTHDR_MAP) \
+    $(CDS_TESTHDR_DEQUE) \
+    $(CDS_TESTHDR_ORDLIST) \
+    $(CDS_TESTHDR_PQUEUE) \
+    $(CDS_TESTHDR_QUEUE) \
+    $(CDS_TESTHDR_SET) \
+    $(CDS_TESTHDR_STACK) \
+    $(CDS_TESTHDR_TREE) \
+    $(CDS_TESTHDR_MISC)
+    
\ No newline at end of file
diff --git a/projects/source.test-hdr.offsetof.mk b/projects/source.test-hdr.offsetof.mk
new file mode 100644 (file)
index 0000000..9f7c224
--- /dev/null
@@ -0,0 +1,103 @@
+CDS_TESTHDR_OFFSETOF_DEQUE := \
+    tests/test-hdr/deque/hdr_intrusive_michael_deque_hp.cpp \
+    tests/test-hdr/deque/hdr_intrusive_michael_deque_ptb.cpp
+
+CDS_TESTHDR_OFFSETOF_MAP := \
+    tests/test-hdr/map/hdr_cuckoo_map.cpp 
+
+CDS_TESTHDR_OFFSETOF_SET := \
+    tests/test-hdr/set/hdr_cuckoo_set.cpp \
+    tests/test-hdr/set/hdr_intrusive_cuckoo_set.cpp \
+    tests/test-hdr/set/hdr_intrusive_cuckoo_refinable_set.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_hp.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_ptb.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_nogc.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpi.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpb.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpt.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_rcu_shb.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_rcu_sht.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_hp_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_ptb_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_nogc_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpi_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpb_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpt_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_rcu_shb_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_michael_set_rcu_sht_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_hp_member.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_ptb_member.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpi_member.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpb_member.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpt_member.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_rcu_shb_member.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_rcu_sht_member.cpp \
+    tests/test-hdr/set/hdr_intrusive_skiplist_nogc_member.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_hp.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_nogc.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_ptb.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpb.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpi.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpt.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_shb.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_sht.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_hp_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_nogc_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_ptb_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp \
+    tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp 
+
+CDS_TESTHDR_OFFSETOF_ORDLIST := \
+    tests/test-hdr/ordered_list/hdr_intrusive_lazy_hp.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_lazy_nogc.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_lazy_ptb.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpb.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpi.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpt.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_shb.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_sht.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_michael_hp.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_michael_nogc.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_michael_ptb.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpb.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpi.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpt.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_shb.cpp \
+    tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_sht.cpp
+
+CDS_TESTHDR_OFFSETOF_QUEUE := \
+    tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp \
+    tests/test-hdr/queue/hdr_intrusive_basketqueue_ptb.cpp \
+    tests/test-hdr/queue/hdr_intrusive_moirqueue_hp.cpp \
+    tests/test-hdr/queue/hdr_intrusive_moirqueue_ptb.cpp \
+    tests/test-hdr/queue/hdr_intrusive_msqueue_hp.cpp \
+    tests/test-hdr/queue/hdr_intrusive_msqueue_ptb.cpp \
+    tests/test-hdr/queue/hdr_intrusive_optimisticqueue_hp.cpp \
+    tests/test-hdr/queue/hdr_intrusive_optimisticqueue_ptb.cpp
+
+CDS_TESTHDR_OFFSETOF_STACK := \
+    tests/test-hdr/stack/hdr_intrusive_treiber_stack_hp.cpp \
+    tests/test-hdr/stack/hdr_intrusive_treiber_stack_ptb.cpp \
+    tests/test-hdr/stack/hdr_intrusive_elimination_stack_hp.cpp \
+    tests/test-hdr/stack/hdr_intrusive_elimination_stack_ptb.cpp 
+
+CDS_TESTHDR_OFFSETOF_TREE := \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_hp_member.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_ptb_member.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpb_member.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpi_member.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpt_member.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_shb_member.cpp \
+    tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_sht_member.cpp
+
+CDS_TESTHDR_OFFSETOF_SOURCES := \
+       $(CDS_TESTHDR_OFFSETOF_DEQUE) \
+       $(CDS_TESTHDR_OFFSETOF_MAP) \
+       $(CDS_TESTHDR_OFFSETOF_SET) \
+       $(CDS_TESTHDR_OFFSETOF_ORDLIST) \
+       $(CDS_TESTHDR_OFFSETOF_QUEUE) \
+       $(CDS_TESTHDR_OFFSETOF_STACK) \
+       $(CDS_TESTHDR_OFFSETOF_TREE)
\ No newline at end of file
diff --git a/projects/source.unit.map.mk b/projects/source.unit.map.mk
new file mode 100644 (file)
index 0000000..5d8f4bf
--- /dev/null
@@ -0,0 +1,12 @@
+
+CDSUNIT_MAP_SOURCES := \
+    tests/unit/map2/map_find_int.cpp \
+    tests/unit/map2/map_find_string.cpp \
+    tests/unit/map2/map_insdel_func.cpp \
+    tests/unit/map2/map_insdel_int.cpp \
+    tests/unit/map2/map_insdel_item_int.cpp \
+    tests/unit/map2/map_insdel_string.cpp \
+    tests/unit/map2/map_insdel_item_string.cpp \
+    tests/unit/map2/map_insfind_int.cpp \
+    tests/unit/map2/map_insdelfind.cpp \
+    tests/unit/map2/map_delodd.cpp
diff --git a/projects/source.unit.misc.mk b/projects/source.unit.misc.mk
new file mode 100644 (file)
index 0000000..7a1508f
--- /dev/null
@@ -0,0 +1,8 @@
+
+CDSUNIT_MISC_SOURCES := \
+    tests/unit/alloc/hoard_threadtest.cpp \
+    tests/unit/alloc/larson.cpp \
+    tests/unit/alloc/linux_scale.cpp \
+    tests/unit/alloc/michael_allocator.cpp \
+    tests/unit/alloc/random.cpp \
+    tests/unit/lock/spinlock.cpp
diff --git a/projects/source.unit.pqueue.mk b/projects/source.unit.pqueue.mk
new file mode 100644 (file)
index 0000000..8eddfbb
--- /dev/null
@@ -0,0 +1,5 @@
+
+CDSUNIT_PQUEUE_SOURCES= \
+    tests/unit/pqueue/pop.cpp \
+    tests/unit/pqueue/push.cpp \
+    tests/unit/pqueue/push_pop.cpp
diff --git a/projects/source.unit.queue.mk b/projects/source.unit.queue.mk
new file mode 100644 (file)
index 0000000..7c677e0
--- /dev/null
@@ -0,0 +1,7 @@
+
+CDSUNIT_QUEUE_SOURCES := \
+    tests/unit/queue/queue_pop.cpp \
+    tests/unit/queue/queue_push.cpp \
+    tests/unit/queue/queue_random.cpp \
+    tests/unit/queue/queue_reader_writer.cpp \
+    tests/unit/queue/intrusive_queue_reader_writer.cpp
diff --git a/projects/source.unit.set.mk b/projects/source.unit.set.mk
new file mode 100644 (file)
index 0000000..8fd0dd5
--- /dev/null
@@ -0,0 +1,12 @@
+
+CDSUNIT_SET_SOURCES := \
+       tests/unit/set2/set_insdel_func.cpp \
+       tests/unit/set2/set_insdel_func2.cpp \
+       tests/unit/set2/set_insdel_func3.cpp \
+       tests/unit/set2/set_insdel_func4.cpp \
+       tests/unit/set2/set_insdel_func5.cpp \
+       tests/unit/set2/set_insdel_func6.cpp \
+       tests/unit/set2/set_insdel_func7.cpp \
+       tests/unit/set2/set_insdel_string.cpp \
+       tests/unit/set2/set_insdelfind.cpp \
+       tests/unit/set2/set_delodd.cpp
diff --git a/projects/source.unit.stack.mk b/projects/source.unit.stack.mk
new file mode 100644 (file)
index 0000000..a78ba9d
--- /dev/null
@@ -0,0 +1,6 @@
+
+CDSUNIT_STACK_SOURCES := \
+    tests/unit/stack/stack_push.cpp \
+    tests/unit/stack/stack_pushpop.cpp \
+    tests/unit/stack/stack_intrusive_pushpop.cpp
+
diff --git a/readme b/readme
new file mode 100644 (file)
index 0000000..5eab5f6
--- /dev/null
+++ b/readme
@@ -0,0 +1,149 @@
+CDS (Concurrent Data Structures) C++ library\r
+\r
+CDS library is (mostly) header-only template library. The shared library contains only garbage collector's core implementation.\r
+CDS contains implementation of some well-known lock-free and fine-grained data structures:\r
+\r
+Stack:\r
+    TreiberStack\r
+        [1986] R. K. Treiber. Systems programming: Coping with parallelism. Technical Report RJ 5118, IBM Almaden Research Center, April 1986.\r
+      Elimination back-off implementation is based on idea from\r
+        [2004] Danny Hendler, Nir Shavit, Lena Yerushalmi "A Scalable Lock-free Stack Algorithm"\r
+        \r
+Queue:\r
+    BasketQueue\r
+        [2007] Moshe Hoffman, Ori Shalev, Nir Shavit "The Baskets Queue"\r
+    MSQueue\r
+        [1998] Maged Michael, Michael Scott "Simple, fast, and practical non-blocking and blocking concurrent queue algorithms"\r
+        [2002] Maged M.Michael "Safe memory reclamation for dynamic lock-free objects using atomic reads and writes"\r
+        [2003] Maged M.Michael "Hazard Pointers: Safe memory reclamation for lock-free objects"\r
+    RWQueue\r
+        [1998] Maged Michael, Michael Scott "Simple, fast, and practical non-blocking and blocking concurrent queue algorithms"\r
+    MoirQueue\r
+        [2000] Simon Doherty, Lindsay Groves, Victor Luchangco, Mark Moir "Formal Verification of a practical lock-free queue algorithm"\r
+    OptimisticQueue\r
+        [2008] Edya Ladan-Mozes, Nir Shavit "An Optimistic Approach to Lock-Free FIFO Queues"\r
+    SegmentedQueue\r
+        [2010] Afek, Korland, Yanovsky "Quasi-Linearizability: relaxed consistency for improved concurrency"\r
+    TsigasCycleQueue\r
+        [2000] Philippas Tsigas, Yi Zhang "A Simple, Fast and Scalable Non-Blocking Concurrent FIFO Queue for Shared Memory Multiprocessor Systems"\r
+    VyukovMPMCCycleQueue\r
+        Dmitry Vyukov (see http://www.1024cores.net)\r
+\r
+Deque:\r
+    MichaelDeque\r
+        [2003] Maged Michael "CAS-based Lock-free Algorithm for Shared Deque"\r
+\r
+Map, set:\r
+    MichaelHashMap\r
+        [2002] Maged Michael "High performance dynamic lock-free hash tables and list-based sets"\r
+    SplitOrderedList\r
+        [2003] Ori Shalev, Nir Shavit "Split-Ordered Lists - Lock-free Resizable Hash Tables"\r
+    StripedMap, StripedSet\r
+        [2008] Maurice Herlihy, Nir Shavit "The Art of Multiprocessor Programming"\r
+    CuckooMap, CuckooSet\r
+        [2008] Maurice Herlihy, Nir Shavit "The Art of Multiprocessor Programming"\r
+    SkipListMap, SkipListSet\r
+        [2008] Maurice Herlihy, Nir Shavit "The Art of Multiprocessor Programming"\r
+        \r
+Ordered single-linked list (buckets for the map):\r
+    LazyList\r
+        [2005] Steve Heller, Maurice Herlihy, Victor Luchangco, Mark Moir, William N. Scherer III, and Nir Shavit "A Lazy Concurrent List-Based Set Algorithm"\r
+    MichaelList\r
+        [2002] Maged Michael "High performance dynamic lock-free hash tables and list-based sets"\r
+\r
+Priority queue:\r
+    MSPriorityQueue\r
+        [1996] G.Hunt, M.Michael, S. Parthasarathy, M.Scott "An efficient algorithm for concurrent priority queue heaps"\r
+\r
+Tree:\r
+    EllenBinTree\r
+        [2010] F.Ellen, P.Fatourou, E.Ruppert, F.van Breugel "Non-blocking Binary Search Tree"\r
+\r
+Garbage collection:\r
+    Hazard Pointers\r
+        [2002] Maged M.Michael "Safe memory reclamation for dynamic lock-freeobjects using atomic reads and writes"\r
+        [2003] Maged M.Michael "Hazard Pointers: Safe memory reclamation for lock-free objects"\r
+        [2004] Andrei Alexandrescy, Maged Michael "Lock-free Data Structures with Hazard Pointers"\r
+    Hazard pointers with reference counting\r
+        [2006] A.Gidenstam "Algorithms for synchronization and consistency in concurrent system services", Chapter 5 "Lock-Free Memory Reclamation" Thesis for the degree of Doctor    of Philosophy \r
+        [2005] Anders Gidenstam, Marina Papatriantafilou and Philippas Tsigas "Allocating memory in a lock-free manner", Proceedings of the 13th Annual European Symposium on Algorithms (ESA 2005), Lecture Notes in Computer Science Vol. 3669, pages 229 \96 242, Springer-Verlag, 2005\r
+    Pass-the-Buck\r
+        [2002] M. Herlihy, V. Luchangco, and M. Moir. The repeat offender problem: A mechanism for supporting\r
+               dynamic-sized lockfree data structures. Technical Report TR-2002-112, Sun Microsystems Laboratories, 2002\r
+        [2002] M. Herlihy, V. Luchangco, P. Martin, and M. Moir. Dynamic-sized Lockfree Data Structures. \r
+               Technical Report TR-2002-110, Sun Microsystems Laboratories, 2002\r
+        [2005] M. Herlihy, V. Luchangco, P. Martin, and M. Moir. Nonblocking Memory Management Support\r
+               for Dynamic_Sized Data Structures. ACM Transactions on Computer Systems, Vol.23, No.2, May 2005\r
+    User-space RCU\r
+        [2009] M.Desnoyers "Low-Impact Operating System Tracing" PhD Thesis,\r
+               Chapter 6 "User-Level Implementations of Read-Copy Update"\r
+        [2011] M.Desnoyers, P.McKenney, A.Stern, M.Dagenias, J.Walpole "User-Level\r
+               Implementations of Read-Copy Update"\r
+\r
+Memory allocation:\r
+    [2004] M.Michael "Scalable Lock-free Dynamic Memory Allocation"\r
+\r
+Common approach:\r
+    [2010] Hendler, Incze, Shavit and Tzafrir "Flat Combining and \r
+           the Synchronization-Parallelism Tradeoff"\r
+    \r
+Supported platforms and compilers\r
+---------------------------------\r
+\r
+GCC: 4.3 and above\r
+MS Visual C++: 9 (2008) and above\r
+Clang: 3.0 and above\r
+\r
+The library was tested on following server platforms:\r
+GNU GCC 4.3.3:\r
+    x86 RedHat Linux 4.0, 5.0\r
+    amd64 (x86-64) RedHat Linux 4.0, 5.0\r
+    ia64 (itanium) RedHat Linux 4.0\r
+    ia64 (itanium) HP-UX 11.23 and HP-UX 11.31\r
+    sparc (ultrasparc-IV and Niagara) Sun Solaris 2.10\r
+\r
+    also tested by GCC 4.4+ on amd64 Ubuntu 12.04, amd64 FreeBSD 8.1, Mac OS X\r
+\r
+Microsoft Visual C++ 2008 :\r
+    x86 Windows7\r
+    amd64 (x86-64) Windows7\r
+    \r
+Clang:\r
+    amd64 Linux Ubuntu 12.04\r
+\r
+How to build\r
+------------\r
+\r
+The CDS library is depend on boost header-only libraries (tested with boost 1.47 and later). \r
+The regression tests in tests directory also depends on boost_thread dynamic library. \r
+You should build boost_thread library before building CDS test.\r
+\r
+Windows\r
+    Use Visual C++ 2008 solution projects\Win\vc9\cds.sln.\r
+    The solution depends on BOOST_PATH environment variable that contains the path to boost root directory. \r
+    The CDS tests also depends on boost_thread library in %BOOST_PATH%\stage\lib or %BOOST_PATH%\bin.\r
+\r
+Unix \r
+    GCC compiler supported (4.3 and above) and Clang 3.0 and above for Linux\r
+    Use script build/build.sh that builds release and debug libcds.so and tests executable. Please,\r
+    do not try to call 'make' directly, - build.sh script sets necessary vars for make.\r
+    See examples in build/sample directory.\r
+\r
+    build.sh main options:\r
+    -x compiler     C++ compiler name (g++, gcc, clang; default g++)\r
+    -p arch         Processor architecture. Possible values are:  x86, amd64, x86_64, sparc, ia64\r
+    -o os_family    OS family. Possible values are: linux, sunos, solaris, hpux\r
+    -b bits         Bits to build (32 or 64)\r
+    -l options      Extra linker options\r
+    -x options      Extra compiler options\r
+    --with-boost path   Path to boost root\r
+    --clean         Clean all before building\r
+\r
+    For more options use build.sh -h\r
+\r
+Warnings\r
+    GCC: compile CDS library and all projects that depends on libcds with -fno-strict-aliasing flag!\r
+    \r
+Test suite\r
+----------\r
+    Note the duration of full test set is up to 24 hours (depending on your hardware and test configuration)\r
diff --git a/scripts/tab2space.pl b/scripts/tab2space.pl
new file mode 100644 (file)
index 0000000..6fb1bf6
--- /dev/null
@@ -0,0 +1,78 @@
+\r
+\r
+sub processDir( $ )\r
+{\r
+       my $dirName = shift ;\r
+       \r
+       opendir(my $dh, $dirName) || die "can't opendir $dirName: $!";\r
+    my @files = grep { /^[^\.]/ } readdir($dh);\r
+    closedir $dh;\r
+       \r
+       foreach my $file ( @files ) {\r
+               if ( -d "$dirName/$file" ) {\r
+                       processDir("$dirName/$file")    ;\r
+               }\r
+               elsif ( $file =~ /\.(h|cpp)$/ ) {\r
+                       processFile( "$dirName/$file" ) ;\r
+               }\r
+       }\r
+}\r
+\r
+sub processFile( $ ) \r
+{\r
+       my $file = shift        ;\r
+       \r
+       if ( open( my $fh, $file )) {\r
+               binmode $fh     ;\r
+               my $str = ''            ;\r
+               my $bTabified = 0       ;\r
+               while (<$fh>) {\r
+                       my $s = $_      ;\r
+                       if ( $str eq '' ) {\r
+                               unless ( $s =~ m#//\$\$CDS-header\$\$# ) {\r
+                                       $str .= '//$$CDS-header$$'."\n\n"       ;\r
+                                       $bTabified = 1  ;\r
+                               }\r
+                       }\r
+                       while ( $s =~ /\t/ ) {\r
+                               #print "pos=", $+[0], "\n"      ;\r
+                               $bTabified = 1  ;\r
+                               my $pos = $+[0] ;\r
+                               if ( $pos ) {\r
+                                       $pos -= 1       ;\r
+                                       if ( $pos % 4 == 0 ) {\r
+                                               $s =~ s/\t/    /        ;\r
+                                       }\r
+                                       elsif ( $pos % 4 == 1 ) {\r
+                                               $s =~ s/\t/   / ;\r
+                                       }\r
+                                       elsif ( $pos % 4 == 2 ) {\r
+                                               $s =~ s/\t/  /  ;\r
+                                       }\r
+                                       elsif ( $pos % 4 == 3 ) {\r
+                                               $s =~ s/\t/ /   ;\r
+                                       }\r
+                               }\r
+                       }\r
+                       $bTabified = 1 if $s =~ s/[\t ]+([\n\r]+)$/$1/ ;\r
+                       $str .= $s ;\r
+               }\r
+               close $fh       ;\r
+               \r
+               if ( $bTabified ) {\r
+                       print $file, "\n"       ;\r
+                       if ( open( my $fh, ">$file" )) {\r
+                               binmode $fh     ;\r
+                               print $fh $str  ;\r
+                               close $fh               ;\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+chdir ('..') ;\r
+processDir('cds')      ;\r
+processDir('src')      ;\r
+processDir('tests/unit')       ;\r
+\r
+exit;
\ No newline at end of file
diff --git a/src/dllmain.cpp b/src/dllmain.cpp
new file mode 100644 (file)
index 0000000..06921f1
--- /dev/null
@@ -0,0 +1,219 @@
+//$$CDS-header$$
+
+#include <cds/details/defs.h>
+
+#if CDS_OS_TYPE == CDS_OS_WIN32 || CDS_OS_TYPE == CDS_OS_WIN64 || CDS_OS_TYPE == CDS_OS_MINGW
+
+#include <cds/os/thread.h>
+
+// Visual leak detector (see http://vld.codeplex.com/)
+#if defined(CDS_USE_VLD) && CDS_COMPILER == CDS_COMPILER_MSVC
+#   ifdef _DEBUG
+#       include <vld.h>
+#   endif
+#endif
+
+static cds::OS::ThreadId    s_MainThreadId = 0;
+static HINSTANCE            s_DllInstance = NULL;
+
+#if _WIN32_WINNT < 0x0601
+// For Windows below Windows 7
+
+#include <cds/os/topology.h>
+#include <cds/bitop.h>
+
+static unsigned int     s_nProcessorCount = 1;
+static unsigned int     s_nProcessorGroupCount = 1;
+
+// Array of processor - cell relationship
+// Array size is s_nProcessorCount
+// s_arrProcessorCellRelationship[i] is the cell (the processor group) number for i-th processor
+// static unsigned int *   s_arrProcessorCellRelationship = NULL;
+
+static void discover_topology()
+{
+    // From MSDN: http://msdn.microsoft.com/en-us/library/ms683194%28v=VS.85%29.aspx
+
+    typedef BOOL (WINAPI *LPFN_GLPI)( PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD);
+
+    LPFN_GLPI glpi;
+    bool bDone = false;
+    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
+    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL;
+    DWORD returnLength = 0;
+    DWORD logicalProcessorCount = 0;
+    DWORD numaNodeCount = 0;
+    DWORD processorCoreCount = 0;
+    DWORD processorPackageCount = 0;
+    DWORD byteOffset = 0;
+
+    s_nProcessorCount = 1;
+    s_nProcessorGroupCount = 1;
+
+    glpi = (LPFN_GLPI) GetProcAddress( GetModuleHandle("kernel32"), "GetLogicalProcessorInformation" );
+    if (NULL == glpi) {
+        return;
+    }
+
+    while (!bDone)
+    {
+        DWORD rc = glpi(buffer, &returnLength);
+
+        if (FALSE == rc) {
+            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+                if (buffer)
+                    free(buffer);
+
+                buffer = reinterpret_cast<PSYSTEM_LOGICAL_PROCESSOR_INFORMATION>( ::malloc( returnLength ) );
+
+                if (NULL == buffer) {
+                    // allocation failed
+                    return;
+                }
+            }
+            else {
+                // System error
+                // _tprintf(TEXT("\nError %d\n"), GetLastError());
+                return;
+            }
+        }
+        else
+            bDone = true;
+    }
+
+    ptr = buffer;
+
+    while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength)
+    {
+        switch (ptr->Relationship)
+        {
+        case RelationNumaNode:
+            // Non-NUMA systems report a single record of this type.
+            numaNodeCount++;
+            break;
+
+        case RelationProcessorCore:
+            processorCoreCount++;
+
+            // A hyperthreaded core supplies more than one logical processor.
+            logicalProcessorCount += cds::bitop::SBC( ptr->ProcessorMask );
+            break;
+
+        case RelationCache:
+            break;
+
+        case RelationProcessorPackage:
+            // Logical processors share a physical package.
+            processorPackageCount++;
+            break;
+
+        default:
+            // Unsupported LOGICAL_PROCESSOR_RELATIONSHIP value
+            break;
+        }
+        byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
+        ptr++;
+    }
+
+    s_nProcessorCount = logicalProcessorCount;
+    s_nProcessorGroupCount = numaNodeCount;
+
+    // Build relationship processor -> cell
+    /*
+    s_arrProcessorCellRelationship = new unsigned int[s_nProcessorCount];
+    memset( s_arrProcessorCellRelationship, 0, s_nProcessorCount * sizeof(s_arrProcessorCellRelationship[0]) );
+    byteOffset = 0;
+    ptr = buffer;
+    while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength)
+    {
+        switch (ptr->Relationship)
+        {
+        case RelationNumaNode:
+            // Non-NUMA systems report a single record of this type.
+            for ( unsigned int i = 0; i < sizeof(ptr->ProcessorMask) * 8; ++i ) {
+                if ( ptr->ProcessorMask & (1 << i) ) {
+                    assert( i < s_nProcessorCount );
+                    assert( ptr->NumaNode.NodeNumber < s_nProcessorGroupCount );
+                    if ( i < s_nProcessorCount )
+                        s_arrProcessorCellRelationship[i] = ptr->NumaNode.NodeNumber;
+                }
+            }
+            break;
+        }
+        byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
+        ptr++;
+    }
+    */
+
+    free(buffer);
+
+    return;
+}
+
+namespace cds { namespace OS { namespace Win32 {
+    unsigned int    topology::processor_count()
+    {
+        return s_nProcessorCount;
+    }
+}}} // namespace cds::OS::Win32
+
+#endif  // #if _WIN32_WINNT < 0x0601
+
+#if _WIN32_WINNT < 0x0600
+#   include <cds/os/win/topology.h>
+    typedef DWORD (WINAPI * fnGetCurrentProcessorNumber)();
+    static fnGetCurrentProcessorNumber s_fnGetCurrentProcessorNumber;
+
+    static void prepare_current_processor_call()
+    {
+        s_fnGetCurrentProcessorNumber = (fnGetCurrentProcessorNumber) GetProcAddress( GetModuleHandle("kernel32"), "GetCurrentProcessorNumber" );
+        if ( s_fnGetCurrentProcessorNumber == NULL )
+            s_fnGetCurrentProcessorNumber = (fnGetCurrentProcessorNumber) GetProcAddress( GetModuleHandle("ntdll"), "NtGetCurrentProcessorNumber" );
+    }
+
+    namespace cds { namespace OS { namespace Win32 {
+        unsigned int topology::current_processor()
+        {
+            if ( s_fnGetCurrentProcessorNumber != NULL )
+                return s_fnGetCurrentProcessorNumber();
+            return 0;
+        }
+    }}} // namespace cds::OS::Win32
+#endif
+
+extern "C" __declspec(dllexport)
+BOOL WINAPI DllMain(
+                HINSTANCE hinstDLL,
+                DWORD fdwReason,
+                LPVOID /*lpvReserved*/
+)
+{
+    switch ( fdwReason ) {
+        case DLL_PROCESS_ATTACH:
+            s_DllInstance = hinstDLL;
+            s_MainThreadId = cds::OS::getCurrentThreadId();
+#if _WIN32_WINNT < 0x0601
+            discover_topology();
+#endif
+#   if _WIN32_WINNT < 0x0600
+            prepare_current_processor_call();
+#endif
+            break;
+
+        case DLL_PROCESS_DETACH:
+/*
+#if _WIN32_WINNT < 0x0601
+            if ( s_arrProcessorCellRelationship != NULL ) {
+                delete [] s_arrProcessorCellRelationship;
+                s_arrProcessorCellRelationship = NULL;
+            }
+#endif
+*/
+            break;
+    }
+    return TRUE;
+}
+
+#endif  // #if CDS_OS_TYPE == CDS_OS_WIN32
+
+
diff --git a/src/hrc_gc.cpp b/src/hrc_gc.cpp
new file mode 100644 (file)
index 0000000..db9f556
--- /dev/null
@@ -0,0 +1,408 @@
+//$$CDS-header$$
+
+/*
+    File: hrc_gc.cpp
+
+    Implementation of cds::gc::hrc::HRCGarbageCollector
+
+    Editions:
+        2008.03.10    Maxim.Khiszinsky    Created
+*/
+
+#include <cds/gc/hrc/hrc.h>
+
+#include "hzp_const.h"
+#include <vector>
+#include <algorithm>    // std::sort
+
+#define    CDS_HRC_STATISTIC( _x )    if ( m_bStatEnabled ) { _x; }
+
+namespace cds { namespace gc {
+    namespace hrc {
+
+        GarbageCollector * GarbageCollector::m_pGC = null_ptr<GarbageCollector *>();
+
+        GarbageCollector::GarbageCollector(
+            size_t nHazardPtrCount,
+            size_t nMaxThreadCount,
+            size_t nRetiredNodeArraySize
+            )
+            : m_pListHead( null_ptr<thread_list_node *>()),
+            m_bStatEnabled( true ),
+            m_nHazardPointerCount( nHazardPtrCount ),
+            m_nMaxThreadCount( nMaxThreadCount ),
+            m_nMaxRetiredPtrCount( nRetiredNodeArraySize )
+        {}
+
+        GarbageCollector::~GarbageCollector()
+        {
+            thread_list_node * pNode = m_pListHead.load( CDS_ATOMIC::memory_order_relaxed );
+            while ( pNode ) {
+                assert( pNode->m_idOwner.load(CDS_ATOMIC::memory_order_relaxed) == cds::OS::nullThreadId() );
+                clearHRCThreadDesc( pNode );
+                thread_list_node * pNext = pNode->m_pNext;
+                deleteHRCThreadDesc( pNode );
+                pNode = pNext;
+            }
+        }
+
+        void CDS_STDCALL GarbageCollector::Construct(
+            size_t nHazardPtrCount,        // hazard pointers count
+            size_t nMaxThreadCount,        // max thread count
+            size_t nMaxNodeLinkCount,    // max HRC-pointer count in the HRC-container's item
+            size_t nMaxTransientLinks    // max HRC-container's item count that can point to deleting item of container
+            )
+        {
+            if ( !m_pGC ) {
+                if ( nHazardPtrCount == 0 )
+                    nHazardPtrCount = c_nHazardPointerPerThread    + c_nCleanUpHazardPointerPerThread;
+                if ( nMaxThreadCount == 0 )
+                    nMaxThreadCount = c_nMaxThreadCount;
+                if ( nMaxNodeLinkCount == 0 )
+                    nMaxNodeLinkCount = c_nHRCMaxNodeLinkCount;
+                if ( nMaxTransientLinks == 0 )
+                    nMaxTransientLinks = c_nHRCMaxTransientLinks;
+
+                size_t nRetiredNodeArraySize = nMaxThreadCount * ( nHazardPtrCount + nMaxNodeLinkCount + nMaxTransientLinks + 1 );
+
+                m_pGC = new GarbageCollector( nHazardPtrCount, nMaxThreadCount, nRetiredNodeArraySize );
+            }
+        }
+
+        void CDS_STDCALL GarbageCollector::Destruct()
+        {
+            if ( m_pGC ) {
+                {
+                    ThreadGC tgc;
+                    tgc.init();
+                    m_pGC->HelpScan( &tgc );
+                    m_pGC->Scan( &tgc );
+                    // tgc dtor calls fini()
+                }
+
+                delete m_pGC;
+                m_pGC = null_ptr<GarbageCollector *>();
+            }
+        }
+
+        inline GarbageCollector::thread_list_node * GarbageCollector::newHRCThreadDesc()
+        {
+            CDS_HRC_STATISTIC( ++m_Stat.m_AllocNewHRCThreadDesc );
+            return new thread_list_node( *this );
+        }
+
+        inline void GarbageCollector::deleteHRCThreadDesc( thread_list_node * pNode )
+        {
+            assert( pNode->m_hzp.size() == pNode->m_hzp.capacity() );
+            CDS_HRC_STATISTIC( ++m_Stat.m_DeleteHRCThreadDesc );
+            delete pNode;
+        }
+
+        void GarbageCollector::clearHRCThreadDesc( thread_list_node * pNode )
+        {
+            assert( pNode->m_hzp.size() == pNode->m_hzp.capacity() );
+            ContainerNode * pItem;
+            for ( size_t n = 0; n < pNode->m_arrRetired.capacity(); ++n ) {
+                if ( (pItem = pNode->m_arrRetired[n].m_pNode.load(CDS_ATOMIC::memory_order_relaxed)) != null_ptr<ContainerNode *>() ) {
+                    pNode->m_arrRetired[n].m_funcFree( pItem );
+                    //pItem->destroy();
+                    pNode->m_arrRetired[n].m_pNode.store( null_ptr<ContainerNode *>(), CDS_ATOMIC::memory_order_relaxed );
+                }
+            }
+            assert( pNode->m_hzp.size() == pNode->m_hzp.capacity() );
+        }
+
+        GarbageCollector::thread_list_node *  GarbageCollector::getHRCThreadDescForCurrentThread() const
+        {
+            thread_list_node * hprec;
+            const cds::OS::ThreadId curThreadId  = cds::OS::getCurrentThreadId();
+
+            for ( hprec = m_pListHead.load( CDS_ATOMIC::memory_order_acquire ); hprec; hprec = hprec->m_pNext ) {
+                if ( hprec->m_idOwner.load( CDS_ATOMIC::memory_order_acquire ) == curThreadId ) {
+                    assert( !hprec->m_bFree );
+                    return hprec;
+                }
+            }
+            return null_ptr<GarbageCollector::thread_list_node *>();
+        }
+
+        details::thread_descriptor * GarbageCollector::allocateHRCThreadDesc( ThreadGC * pThreadGC )
+        {
+            CDS_HRC_STATISTIC( ++m_Stat.m_AllocHRCThreadDesc );
+
+            thread_list_node * hprec;
+            const cds::OS::ThreadId nullThreadId = cds::OS::nullThreadId();
+            const cds::OS::ThreadId curThreadId  = cds::OS::getCurrentThreadId();
+
+            // First try to reuse a retired (non-active) HP record
+            for ( hprec = m_pListHead.load( CDS_ATOMIC::memory_order_acquire ); hprec; hprec = hprec->m_pNext ) {
+                cds::OS::ThreadId expectedThreadId = nullThreadId;
+                if ( !hprec->m_idOwner.compare_exchange_strong( expectedThreadId, curThreadId, CDS_ATOMIC::memory_order_acq_rel, CDS_ATOMIC::memory_order_relaxed ) )
+                    continue;
+                hprec->m_pOwner = pThreadGC;
+                hprec->m_bFree = false;
+                assert( hprec->m_hzp.size() == hprec->m_hzp.capacity() );
+                return hprec;
+            }
+
+            // No HP records available for reuse
+            // Allocate and push a new HP record
+            hprec = newHRCThreadDesc();
+            assert( hprec->m_hzp.size() == hprec->m_hzp.capacity() );
+            hprec->m_idOwner.store( curThreadId, CDS_ATOMIC::memory_order_relaxed );
+            hprec->m_pOwner = pThreadGC;
+            hprec->m_bFree = false;
+            thread_list_node * pOldHead;
+
+            pOldHead = m_pListHead.load( CDS_ATOMIC::memory_order_relaxed );
+            do {
+                hprec->m_pNext = pOldHead;
+            } while ( !m_pListHead.compare_exchange_weak( pOldHead, hprec, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+
+            assert( hprec->m_hzp.size() == hprec->m_hzp.capacity() );
+            return hprec;
+        }
+
+        void GarbageCollector::retireHRCThreadDesc( details::thread_descriptor * pRec )
+        {
+            CDS_HRC_STATISTIC( ++m_Stat.m_RetireHRCThreadDesc );
+
+            pRec->clear();
+            thread_list_node * pNode = static_cast<thread_list_node *>( pRec );
+            assert( pNode->m_hzp.size() == pNode->m_hzp.capacity() );
+            /*
+                It is possible that
+                    pNode->m_idOwner.value() != cds::OS::getCurrentThreadId()
+                if the destruction of thread object is called by the destructor
+                after thread termination
+            */
+            assert( pNode->m_idOwner.load(CDS_ATOMIC::memory_order_relaxed) != cds::OS::nullThreadId() );
+            pNode->m_pOwner = null_ptr<ThreadGC *>();
+            pNode->m_idOwner.store( cds::OS::nullThreadId(), CDS_ATOMIC::memory_order_release );
+            assert( pNode->m_hzp.size() == pNode->m_hzp.capacity() );
+        }
+
+        void GarbageCollector::Scan( ThreadGC * pThreadGC )
+        {
+            CDS_HRC_STATISTIC( ++m_Stat.m_ScanCalls );
+
+            typedef std::vector< ContainerNode * > hazard_ptr_list;
+
+            details::thread_descriptor * pRec = pThreadGC->m_pDesc;
+            assert( static_cast< thread_list_node *>( pRec )->m_idOwner.load(CDS_ATOMIC::memory_order_relaxed) == cds::OS::getCurrentThreadId() );
+
+            // Step 1: mark all pRec->m_arrRetired items as "traced"
+            {
+                details::retired_vector::const_iterator itEnd = pRec->m_arrRetired.end();
+
+                for ( details::retired_vector::const_iterator it = pRec->m_arrRetired.begin() ; it != itEnd; ++it ) {
+                    ContainerNode * pNode = it->m_pNode.load( CDS_ATOMIC::memory_order_acquire );
+                    if ( pNode ) {
+                        if ( pNode->m_RC.value() == 0 ) {
+                            pNode->m_bTrace.store( true, CDS_ATOMIC::memory_order_release );
+                            if ( pNode->m_RC.value() != 0 )
+                                pNode->m_bTrace.store( false, CDS_ATOMIC::memory_order_release );
+                        }
+                    }
+                }
+            }
+
+            // Array of hazard pointers for all threads
+            hazard_ptr_list   plist;
+            plist.reserve( m_nMaxThreadCount * m_nHazardPointerCount );
+            assert( plist.size() == 0 );
+
+            // Stage 2: Scan HP list and insert non-null values to plist
+            {
+                thread_list_node * pNode = m_pListHead.load( CDS_ATOMIC::memory_order_acquire );
+
+                while ( pNode ) {
+                    for ( size_t i = 0; i < m_nHazardPointerCount; ++i ) {
+                        ContainerNode * hptr = pNode->m_hzp[i];
+                        if ( hptr )
+                            plist.push_back( hptr );
+                    }
+                    pNode = pNode->m_pNext;
+                }
+            }
+
+            // Sort plist to simplify search in
+            std::sort( plist.begin(), plist.end() );
+
+            // Stage 3: Deletes all nodes for refCount == 0 and that do not declare as Hazard in other thread
+            {
+                details::retired_vector& arr =  pRec->m_arrRetired;
+
+                hazard_ptr_list::iterator itHPBegin = plist.begin();
+                hazard_ptr_list::iterator itHPEnd = plist.end();
+
+                details::retired_vector::iterator itEnd = arr.end();
+                details::retired_vector::iterator it = arr.begin();
+
+                for ( size_t nRetired = 0; it != itEnd; ++nRetired, ++it ) {
+                    details::retired_node& node = *it;
+                    ContainerNode * pNode = node.m_pNode.load(CDS_ATOMIC::memory_order_acquire);
+                    if ( !pNode )
+                        continue;
+
+                    if ( pNode->m_RC.value() == 0 && pNode->m_bTrace.load(CDS_ATOMIC::memory_order_acquire) && !std::binary_search( itHPBegin, itHPEnd, pNode ) ) {
+                        // pNode may be destructed safely
+
+                        node.m_bDone.store( true, CDS_ATOMIC::memory_order_release );
+                        if ( node.m_nClaim.load( CDS_ATOMIC::memory_order_acquire ) == 0 ) {
+                            pNode->terminate( pThreadGC, false );
+                            pNode->clean( CDS_ATOMIC::memory_order_relaxed );
+                            node.m_funcFree( pNode );
+
+                            arr.pop( nRetired );
+                            CDS_HRC_STATISTIC( ++m_Stat.m_DeletedNode );
+                            continue;
+                        }
+
+                        pNode->terminate( pThreadGC, true );
+                        //node.m_bDone.store( true, CDS_ATOMIC::memory_order_release );
+                        CDS_HRC_STATISTIC( ++m_Stat.m_ScanClaimGuarded );
+                    }
+                    else {
+                        CDS_HRC_STATISTIC( ++m_Stat.m_ScanGuarded );
+                    }
+                }
+            }
+        }
+
+        void GarbageCollector::HelpScan( ThreadGC * pThis )
+        {
+            if ( pThis->m_pDesc->m_arrRetired.isFull() )
+                return;
+
+            CDS_HRC_STATISTIC( ++m_Stat.m_HelpScanCalls );
+
+            const cds::OS::ThreadId nullThreadId = cds::OS::nullThreadId();
+            const cds::OS::ThreadId curThreadId  = cds::OS::getCurrentThreadId();
+
+            for ( thread_list_node * pRec = m_pListHead.load(CDS_ATOMIC::memory_order_acquire); pRec; pRec = pRec->m_pNext )
+            {
+                // If threadDesc is free then own its
+                cds::OS::ThreadId expectedThreadId = nullThreadId;
+                if ( !pRec->m_idOwner.compare_exchange_strong(expectedThreadId, curThreadId, CDS_ATOMIC::memory_order_acquire, CDS_ATOMIC::memory_order_relaxed) )
+                {
+                    continue;
+                }
+
+                // We own threadDesc.
+                assert( pRec->m_pOwner == null_ptr<ThreadGC *>() );
+
+                if ( !pRec->m_bFree ) {
+                    // All undeleted pointers is moved to pThis (it is private for the current thread)
+
+                    details::retired_vector& src = pRec->m_arrRetired;
+                    details::retired_vector& dest = pThis->m_pDesc->m_arrRetired;
+                    assert( !dest.isFull());
+
+                    details::retired_vector::iterator itEnd = src.end();
+                    details::retired_vector::iterator it = src.begin();
+
+                    for ( size_t nRetired = 0; it != itEnd; ++nRetired, ++it ) {
+                        if ( it->m_pNode.load(CDS_ATOMIC::memory_order_relaxed) == null_ptr<ContainerNode *>() )
+                            continue;
+
+                        dest.push( it->m_pNode.load(CDS_ATOMIC::memory_order_relaxed), it->m_funcFree );
+                        src.pop( nRetired );
+
+                        while ( dest.isFull() ) {
+                            pThis->cleanUpLocal();
+                            if ( dest.isFull() )
+                                Scan( pThis );
+                            if ( dest.isFull() )
+                                CleanUpAll( pThis );
+                            else
+                                break;
+                        }
+                    }
+                    pRec->m_bFree = true;
+                }
+                pRec->m_idOwner.store( nullThreadId, CDS_ATOMIC::memory_order_release );
+            }
+        }
+
+        void GarbageCollector::CleanUpAll( ThreadGC * pThis )
+        {
+            CDS_HRC_STATISTIC( ++m_Stat.m_CleanUpAllCalls );
+
+            //const cds::OS::ThreadId nullThreadId = cds::OS::nullThreadId();
+            thread_list_node * pThread = m_pListHead.load(CDS_ATOMIC::memory_order_acquire);
+            while ( pThread ) {
+                for ( size_t i = 0; i < pThread->m_arrRetired.capacity(); ++i ) {
+                    details::retired_node& rRetiredNode = pThread->m_arrRetired[i];
+                    ContainerNode * pNode = rRetiredNode.m_pNode.load(CDS_ATOMIC::memory_order_acquire);
+                    if ( pNode && !rRetiredNode.m_bDone.load(CDS_ATOMIC::memory_order_acquire) ) {
+                        rRetiredNode.m_nClaim.fetch_add( 1, CDS_ATOMIC::memory_order_release );
+                        if ( !rRetiredNode.m_bDone.load(CDS_ATOMIC::memory_order_acquire)
+                            && pNode == rRetiredNode.m_pNode.load(CDS_ATOMIC::memory_order_acquire) )
+                        {
+                            pNode->cleanUp( pThis );
+                        }
+                        rRetiredNode.m_nClaim.fetch_sub( 1, CDS_ATOMIC::memory_order_release );
+                    }
+                }
+                pThread = pThread->m_pNext;
+            }
+        }
+
+        GarbageCollector::internal_state& GarbageCollector::getInternalState( GarbageCollector::internal_state& stat) const
+        {
+            // Const
+            stat.nHPCount               = m_nHazardPointerCount;
+            stat.nMaxThreadCount        = m_nMaxThreadCount;
+            stat.nMaxRetiredPtrCount    = m_nMaxRetiredPtrCount;
+            stat.nHRCRecSize            = sizeof( thread_list_node )
+                                            + sizeof( details::retired_node) * m_nMaxRetiredPtrCount;
+            stat.nHRCRecAllocated            =
+                stat.nHRCRecUsed             =
+                stat.nTotalRetiredPtrCount   =
+                stat.nRetiredPtrInFreeHRCRecs = 0;
+
+            // Walk through HRC records
+            for ( thread_list_node *hprec = m_pListHead.load(CDS_ATOMIC::memory_order_acquire); hprec; hprec = hprec->m_pNext ) {
+                ++stat.nHRCRecAllocated;
+                size_t nRetiredNodeCount = hprec->m_arrRetired.retiredNodeCount();
+                if ( hprec->m_bFree ) {
+                    stat.nRetiredPtrInFreeHRCRecs += nRetiredNodeCount;
+                }
+                else {
+                    ++stat.nHRCRecUsed;
+                }
+                stat.nTotalRetiredPtrCount += nRetiredNodeCount;
+            }
+
+            // Events
+            stat.evcAllocHRCRec            = m_Stat.m_AllocHRCThreadDesc;
+            stat.evcRetireHRCRec        = m_Stat.m_RetireHRCThreadDesc;
+            stat.evcAllocNewHRCRec        = m_Stat.m_AllocNewHRCThreadDesc;
+            stat.evcDeleteHRCRec        = m_Stat.m_DeleteHRCThreadDesc;
+            stat.evcScanCall            = m_Stat.m_ScanCalls;
+            stat.evcHelpScanCalls       = m_Stat.m_HelpScanCalls;
+            stat.evcCleanUpAllCalls     = m_Stat.m_CleanUpAllCalls;
+            stat.evcDeletedNode         = m_Stat.m_DeletedNode;
+            stat.evcScanGuarded         = m_Stat.m_ScanGuarded;
+            stat.evcScanClaimGuarded    = m_Stat.m_ScanClaimGuarded;
+
+#       ifdef CDS_DEBUG
+            stat.evcNodeConstruct       = m_Stat.m_NodeConstructed;
+            stat.evcNodeDestruct        = m_Stat.m_NodeDestructed;
+#       endif
+
+            return stat;
+        }
+
+        void ContainerNode::cleanUp( ThreadGC * /*pGC*/ )
+        {
+            CDS_PURE_VIRTUAL_FUNCTION_CALLED_("cds::gc::hrc::ContainerNode::cleanUp");
+        }
+        void ContainerNode::terminate( ThreadGC * /*pGC*/, bool /*bConcurrent*/ )
+        {
+            CDS_PURE_VIRTUAL_FUNCTION_CALLED_("cds::gc::hrc::ContainerNode::terminate");
+        }
+
+    }    // namespace hrc
+}} // namespace cds::gc
diff --git a/src/hzp_const.h b/src/hzp_const.h
new file mode 100644 (file)
index 0000000..4d3291b
--- /dev/null
@@ -0,0 +1,45 @@
+//$$CDS-header$$
+
+#ifndef __CDSIMPL_HZP_CONST_H
+#define __CDSIMPL_HZP_CONST_H
+
+/*
+    File: hzp_const.h
+
+    Michael's Hazard Pointer reclamation schema global constants
+    Gidenstam's reclamation schema global constants
+
+    Editions:
+        2008.03.10    Maxim.Khiszinsky    Created
+*/
+
+namespace cds { namespace gc {
+
+    //---------------------------------------------------------------
+    // Hazard Pointers reclamation schema constants
+    namespace hzp {
+        // Max number of threads expected
+        static const size_t c_nMaxThreadCount     = 100;
+
+        // Number of Hazard Pointers per thread
+        static const size_t c_nHazardPointerPerThread = 8;
+    } // namespace hzp
+
+    //---------------------------------------------------------------
+    // HRC (Gidenstam) reclamation schema constants
+    namespace hrc {
+        using cds::gc::hzp::c_nMaxThreadCount;
+        using cds::gc::hzp::c_nHazardPointerPerThread;
+
+        /// Number of Hazard Pointers per thread for Node::CleanUp methods
+        static const size_t c_nCleanUpHazardPointerPerThread = 2;
+
+        /// Max number of links for HRC node
+        static const size_t c_nHRCMaxNodeLinkCount = 4;
+
+        /// Max number of links in live node that may transiently point to a deleted node
+        static const size_t c_nHRCMaxTransientLinks = c_nHRCMaxNodeLinkCount;
+    }    // namespace hrc
+} /* namespace gc */ }    /* namespace cds */
+
+#endif    // #ifndef __CDSIMPL_HZP_CONST_H
diff --git a/src/hzp_gc.cpp b/src/hzp_gc.cpp
new file mode 100644 (file)
index 0000000..7fa6d83
--- /dev/null
@@ -0,0 +1,364 @@
+//$$CDS-header$$
+
+/*
+    File: hzp_gc.cpp
+
+    Hazard Pointers memory reclamation strategy implementation
+
+    Editions:
+        2008.02.10    Maxim.Khiszinsky    Created
+*/
+
+#include <cds/gc/hzp/hzp.h>
+
+#include <algorithm>    // std::sort
+#include "hzp_const.h"
+
+#define    CDS_HAZARDPTR_STATISTIC( _x )    if ( m_bStatEnabled ) { _x; }
+
+namespace cds { namespace gc {
+    namespace hzp {
+
+        /// Max array size of retired pointers
+        static const size_t c_nMaxRetireNodeCount = c_nHazardPointerPerThread * c_nMaxThreadCount * 2;
+
+        GarbageCollector *    GarbageCollector::m_pHZPManager = NULL;
+
+        void CDS_STDCALL GarbageCollector::Construct( size_t nHazardPtrCount, size_t nMaxThreadCount, size_t nMaxRetiredPtrCount, scan_type nScanType )
+        {
+            if ( !m_pHZPManager ) {
+                m_pHZPManager = new GarbageCollector( nHazardPtrCount, nMaxThreadCount, nMaxRetiredPtrCount, nScanType );
+            }
+        }
+
+        void CDS_STDCALL GarbageCollector::Destruct( bool bDetachAll )
+        {
+            if ( m_pHZPManager ) {
+                if ( bDetachAll )
+                    m_pHZPManager->detachAllThread();
+
+                delete m_pHZPManager;
+                m_pHZPManager = NULL;
+            }
+        }
+
+        GarbageCollector::GarbageCollector(
+            size_t nHazardPtrCount,
+            size_t nMaxThreadCount,
+            size_t nMaxRetiredPtrCount,
+            scan_type nScanType
+        )
+            : m_pListHead(NULL)
+            ,m_bStatEnabled( true )
+            ,m_nHazardPointerCount( nHazardPtrCount == 0 ? c_nHazardPointerPerThread : nHazardPtrCount )
+            ,m_nMaxThreadCount( nMaxThreadCount == 0 ? c_nMaxThreadCount : nMaxThreadCount )
+            ,m_nMaxRetiredPtrCount( nMaxRetiredPtrCount > c_nMaxRetireNodeCount ? nMaxRetiredPtrCount : c_nMaxRetireNodeCount )
+            ,m_nScanType( nScanType )
+        {}
+
+        GarbageCollector::~GarbageCollector()
+        {
+            CDS_DEBUG_DO( const cds::OS::ThreadId nullThreadId = cds::OS::nullThreadId() ;)
+            CDS_DEBUG_DO( const cds::OS::ThreadId mainThreadId = cds::OS::getCurrentThreadId() ;)
+
+            hplist_node * pHead = m_pListHead.load( CDS_ATOMIC::memory_order_relaxed );
+            m_pListHead.store( null_ptr<hplist_node *>(), CDS_ATOMIC::memory_order_relaxed );
+
+            hplist_node * pNext = NULL;
+            for ( hplist_node * hprec = pHead; hprec; hprec = pNext ) {
+                assert( hprec->m_idOwner.load( CDS_ATOMIC::memory_order_relaxed ) == nullThreadId
+                    || hprec->m_idOwner.load( CDS_ATOMIC::memory_order_relaxed ) == mainThreadId
+                    || !cds::OS::isThreadAlive( hprec->m_idOwner.load( CDS_ATOMIC::memory_order_relaxed ) )
+                );
+                details::retired_vector& vect = hprec->m_arrRetired;
+                details::retired_vector::iterator itRetired = vect.begin();
+                details::retired_vector::iterator itRetiredEnd = vect.end();
+                while ( itRetired != itRetiredEnd ) {
+                    DeletePtr( *itRetired );
+                    ++itRetired;
+                }
+                vect.clear();
+                pNext = hprec->m_pNextNode;
+                hprec->m_bFree.store( true, CDS_ATOMIC::memory_order_relaxed );
+                DeleteHPRec( hprec );
+            }
+        }
+
+        inline GarbageCollector::hplist_node * GarbageCollector::NewHPRec()
+        {
+            CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_AllocNewHPRec );
+            return new hplist_node( *this );
+        }
+
+        inline void GarbageCollector::DeleteHPRec( hplist_node * pNode )
+        {
+            CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_DeleteHPRec );
+            assert( pNode->m_arrRetired.size() == 0 );
+            delete pNode;
+        }
+
+        inline void GarbageCollector::DeletePtr( details::retired_ptr& p )
+        {
+            CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_DeletedNode );
+            p.free();
+        }
+
+        details::HPRec * GarbageCollector::AllocateHPRec()
+        {
+            CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_AllocHPRec );
+
+            hplist_node * hprec;
+            const cds::OS::ThreadId nullThreadId = cds::OS::nullThreadId();
+            const cds::OS::ThreadId curThreadId  = cds::OS::getCurrentThreadId();
+
+            // First try to reuse a retired (non-active) HP record
+            for ( hprec = m_pListHead.load( CDS_ATOMIC::memory_order_acquire ); hprec; hprec = hprec->m_pNextNode ) {
+                cds::OS::ThreadId thId = nullThreadId;
+                if ( !hprec->m_idOwner.compare_exchange_strong( thId, curThreadId, CDS_ATOMIC::memory_order_seq_cst, CDS_ATOMIC::memory_order_relaxed ) )
+                    continue;
+                hprec->m_bFree.store( false, CDS_ATOMIC::memory_order_release );
+                return hprec;
+            }
+
+            // No HP records available for reuse
+            // Allocate and push a new HP record
+            hprec = NewHPRec();
+            hprec->m_idOwner.store( curThreadId, CDS_ATOMIC::memory_order_relaxed );
+            hprec->m_bFree.store( false, CDS_ATOMIC::memory_order_relaxed );
+
+            CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_release );
+
+            hplist_node * pOldHead = m_pListHead.load( CDS_ATOMIC::memory_order_acquire );
+            do {
+                hprec->m_pNextNode = pOldHead;
+            } while ( !m_pListHead.compare_exchange_weak( pOldHead, hprec, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ));
+
+            return hprec;
+        }
+
+        void GarbageCollector::RetireHPRec( details::HPRec * pRec )
+        {
+            assert( pRec != NULL );
+            CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_RetireHPRec );
+
+            pRec->clear();
+            Scan( pRec );
+            hplist_node * pNode = static_cast<hplist_node *>( pRec );
+            pNode->m_idOwner.store( cds::OS::nullThreadId(), CDS_ATOMIC::memory_order_release );
+        }
+
+        void GarbageCollector::detachAllThread()
+        {
+            hplist_node * pNext = NULL;
+            const cds::OS::ThreadId nullThreadId = cds::OS::nullThreadId();
+            for ( hplist_node * hprec = m_pListHead.load(CDS_ATOMIC::memory_order_acquire); hprec; hprec = pNext ) {
+                pNext = hprec->m_pNextNode;
+                if ( hprec->m_idOwner.load(CDS_ATOMIC::memory_order_relaxed) != nullThreadId ) {
+                    RetireHPRec( hprec );
+                }
+            }
+        }
+
+        void GarbageCollector::classic_scan( details::HPRec * pRec )
+        {
+            CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_ScanCallCount );
+
+            std::vector< void * >   plist;
+            plist.reserve( m_nMaxThreadCount * m_nHazardPointerCount );
+            assert( plist.size() == 0 );
+
+            // Stage 1: Scan HP list and insert non-null values in plist
+
+            hplist_node * pNode = m_pListHead.load(CDS_ATOMIC::memory_order_acquire);
+
+            while ( pNode ) {
+                for ( size_t i = 0; i < m_nHazardPointerCount; ++i ) {
+                    void * hptr = pNode->m_hzp[i];
+                    if ( hptr )
+                        plist.push_back( hptr );
+                }
+                pNode = pNode->m_pNextNode;
+            }
+
+            // Sort plist to simplify search in
+            std::sort( plist.begin(), plist.end() );
+
+            // Stage 2: Search plist
+            details::retired_vector& arrRetired = pRec->m_arrRetired;
+
+            details::retired_vector::iterator itRetired     = arrRetired.begin();
+            details::retired_vector::iterator itRetiredEnd  = arrRetired.end();
+            // arrRetired is not a std::vector!
+            // clear is just set up item counter to 0, the items is not destroying
+            arrRetired.clear();
+
+            std::vector< void * >::iterator itBegin = plist.begin();
+            std::vector< void * >::iterator itEnd = plist.end();
+            while ( itRetired != itRetiredEnd ) {
+                if ( std::binary_search( itBegin, itEnd, itRetired->m_p) ) {
+                    CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_DeferredNode );
+                    arrRetired.push( *itRetired );
+                }
+                else
+                    DeletePtr( *itRetired );
+                ++itRetired;
+            }
+        }
+
+        void GarbageCollector::inplace_scan( details::HPRec * pRec )
+        {
+            CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_ScanCallCount );
+
+            // In-place scan algo uses LSB of retired ptr as a mark for internal purposes.
+            // It is correct if all retired pointers are ar least 2-byte aligned (LSB is zero).
+            // If it is wrong, we use classic scan algorithm
+
+            // Check if all retired pointers has zero LSB
+            // LSB is used for marking pointers that cannot be deleted yet
+            details::retired_vector::iterator itRetired     = pRec->m_arrRetired.begin();
+            details::retired_vector::iterator itRetiredEnd  = pRec->m_arrRetired.end();
+            for ( details::retired_vector::iterator it = itRetired; it != itRetiredEnd; ++it ) {
+                if ( reinterpret_cast<ptr_atomic_t>(it->m_p) & 1 ) {
+                    // found a pointer with LSB bit set - use classic_scan
+                    classic_scan( pRec );
+                    return;
+                }
+            }
+
+            // Sort retired pointer array
+            std::sort( itRetired, itRetiredEnd, cds::gc::details::retired_ptr::less );
+
+            // Search guarded pointers in retired array
+
+            hplist_node * pNode = m_pListHead.load(CDS_ATOMIC::memory_order_acquire);
+
+            while ( pNode ) {
+                for ( size_t i = 0; i < m_nHazardPointerCount; ++i ) {
+                    void * hptr = pNode->m_hzp[i];
+                    if ( hptr ) {
+                        details::retired_ptr    dummyRetired;
+                        dummyRetired.m_p = hptr;
+                        details::retired_vector::iterator it = std::lower_bound( itRetired, itRetiredEnd, dummyRetired, cds::gc::details::retired_ptr::less );
+                        if ( it != itRetiredEnd && it->m_p == hptr )  {
+                            // Mark retired pointer as guarded
+                            it->m_p = reinterpret_cast<void *>(reinterpret_cast<ptr_atomic_t>(it->m_p ) | 1);
+                        }
+                    }
+                }
+                pNode = pNode->m_pNextNode;
+            }
+
+            // Move all marked pointers to head of array
+            details::retired_vector::iterator itInsert = itRetired;
+            for ( details::retired_vector::iterator it = itRetired; it != itRetiredEnd; ++it ) {
+                if ( reinterpret_cast<ptr_atomic_t>(it->m_p) & 1 ) {
+                    it->m_p = reinterpret_cast<void *>(reinterpret_cast<ptr_atomic_t>(it->m_p ) & ~1);
+                    *itInsert = *it;
+                    ++itInsert;
+                    CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_DeferredNode );
+                }
+                else {
+                    // Retired pointer may be freed
+                    DeletePtr( *it );
+                }
+            }
+            pRec->m_arrRetired.size( itInsert - itRetired );
+        }
+
+        void GarbageCollector::HelpScan( details::HPRec * pThis )
+        {
+            CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_HelpScanCallCount );
+
+            assert( static_cast<hplist_node *>(pThis)->m_idOwner.load(CDS_ATOMIC::memory_order_relaxed) == cds::OS::getCurrentThreadId() );
+
+            const cds::OS::ThreadId nullThreadId = cds::OS::nullThreadId();
+            const cds::OS::ThreadId curThreadId = cds::OS::getCurrentThreadId();
+            for ( hplist_node * hprec = m_pListHead.load(CDS_ATOMIC::memory_order_acquire); hprec; hprec = hprec->m_pNextNode ) {
+
+                // If m_bFree == true then hprec->m_arrRetired is empty - we don't need to see it
+                if ( hprec->m_bFree.load(CDS_ATOMIC::memory_order_acquire) )
+                    continue;
+
+                // Owns hprec if it is empty.
+                // Several threads may work concurrently so we use atomic technique only.
+                {
+                    cds::OS::ThreadId curOwner = hprec->m_idOwner.load(CDS_ATOMIC::memory_order_acquire);
+                    if ( curOwner == nullThreadId || !cds::OS::isThreadAlive( curOwner )) {
+                        if ( !hprec->m_idOwner.compare_exchange_strong( curOwner, curThreadId, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                            continue;
+                    }
+                    else {
+                        curOwner = nullThreadId;
+                        if ( !hprec->m_idOwner.compare_exchange_strong( curOwner, curThreadId, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed ))
+                            continue;
+                    }
+                }
+
+                // We own the thread successfully. Now, we can see whether HPRec has retired pointers.
+                // If it has ones then we move to pThis that is private for current thread.
+                details::retired_vector& src = hprec->m_arrRetired;
+                details::retired_vector& dest = pThis->m_arrRetired;
+                assert( !dest.isFull());
+                details::retired_vector::iterator itRetired = src.begin();
+                details::retired_vector::iterator itRetiredEnd = src.end();
+                while ( itRetired != itRetiredEnd ) {
+                    dest.push( *itRetired );
+                    if ( dest.isFull()) {
+                        CDS_HAZARDPTR_STATISTIC( ++m_Stat.m_CallScanFromHelpScan );
+                        Scan( pThis );
+                    }
+                    ++itRetired;
+                }
+                src.clear();
+
+                hprec->m_bFree.store(true, CDS_ATOMIC::memory_order_release);
+                hprec->m_idOwner.store( nullThreadId, CDS_ATOMIC::memory_order_release );
+            }
+        }
+
+        GarbageCollector::InternalState& GarbageCollector::getInternalState( GarbageCollector::InternalState& stat) const
+        {
+            stat.nHPCount                = m_nHazardPointerCount;
+            stat.nMaxThreadCount         = m_nMaxThreadCount;
+            stat.nMaxRetiredPtrCount     = m_nMaxRetiredPtrCount;
+            stat.nHPRecSize              = sizeof( hplist_node )
+                                            + sizeof(details::retired_ptr) * m_nMaxRetiredPtrCount;
+
+            stat.nHPRecAllocated         =
+                stat.nHPRecUsed              =
+                stat.nTotalRetiredPtrCount   =
+                stat.nRetiredPtrInFreeHPRecs = 0;
+
+            for ( hplist_node * hprec = m_pListHead.load(CDS_ATOMIC::memory_order_acquire); hprec; hprec = hprec->m_pNextNode ) {
+                ++stat.nHPRecAllocated;
+                stat.nTotalRetiredPtrCount += hprec->m_arrRetired.size();
+
+                if ( hprec->m_bFree.load(CDS_ATOMIC::memory_order_relaxed) ) {
+                    // Free HP record
+                    stat.nRetiredPtrInFreeHPRecs += hprec->m_arrRetired.size();
+                }
+                else {
+                    // Used HP record
+                    ++stat.nHPRecUsed;
+                }
+            }
+
+            // Events
+            stat.evcAllocHPRec   = m_Stat.m_AllocHPRec;
+            stat.evcRetireHPRec  = m_Stat.m_RetireHPRec;
+            stat.evcAllocNewHPRec= m_Stat.m_AllocNewHPRec;
+            stat.evcDeleteHPRec  = m_Stat.m_DeleteHPRec;
+
+            stat.evcScanCall     = m_Stat.m_ScanCallCount;
+            stat.evcHelpScanCall = m_Stat.m_HelpScanCallCount;
+            stat.evcScanFromHelpScan= m_Stat.m_CallScanFromHelpScan;
+
+            stat.evcDeletedNode  = m_Stat.m_DeletedNode;
+            stat.evcDeferredNode = m_Stat.m_DeferredNode;
+
+            return stat;
+        }
+
+
+    } //namespace hzp
+}} // namespace cds::gc
diff --git a/src/init.cpp b/src/init.cpp
new file mode 100644 (file)
index 0000000..9d53436
--- /dev/null
@@ -0,0 +1,65 @@
+//$$CDS-header$$
+
+#include <cds/init.h>
+#include <cds/cxx11_atomic.h>
+
+#if CDS_OS_INTERFACE == CDS_OSI_WINDOWS
+#   if CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL
+#       include <cds/threading/details/msvc_manager.h>
+#   endif
+#   include <cds/threading/details/wintls_manager.h>
+#else   // CDS_OS_INTERFACE != CDS_OSI_WINDOWS
+#   if CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG || CDS_COMPILER == CDS_COMPILER_INTEL
+#       include <cds/threading/details/gcc_manager.h>
+#   endif
+#   include <cds/threading/details/pthread_manager.h>
+#endif
+
+#ifdef CDS_CXX11_THREAD_LOCAL_SUPPORT
+#   include <cds/threading/details/cxx11_manager.h>
+#endif
+
+namespace cds {
+
+    CDS_EXPORT_API CDS_ATOMIC::atomic<size_t> threading::ThreadData::s_nLastUsedProcNo(0);
+    CDS_EXPORT_API size_t threading::ThreadData::s_nProcCount = 1;
+
+#if CDS_OS_INTERFACE == CDS_OSI_WINDOWS
+    CDS_EXPORT_API DWORD cds::threading::wintls::Manager::Holder::m_key = TLS_OUT_OF_INDEXES;
+
+    __declspec( thread ) threading::msvc_internal::ThreadDataPlaceholder threading::msvc_internal::s_threadData;
+    __declspec( thread ) threading::ThreadData * threading::msvc_internal::s_pThreadData = NULL;
+
+#else
+    pthread_key_t threading::pthread::Manager::Holder::m_key;
+
+#   if CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG
+        __thread threading::gcc_internal::ThreadDataPlaceholder CDS_DATA_ALIGNMENT(8) threading::gcc_internal::s_threadData;
+        __thread threading::ThreadData * threading::gcc_internal::s_pThreadData = NULL;
+#   endif
+#endif
+
+#ifdef CDS_CXX11_THREAD_LOCAL_SUPPORT
+    thread_local threading::cxx11_internal::ThreadDataPlaceholder CDS_DATA_ALIGNMENT(8) threading::cxx11_internal::s_threadData;
+    thread_local threading::ThreadData * threading::cxx11_internal::s_pThreadData = NULL;
+#endif
+
+    namespace details {
+        static CDS_ATOMIC::atomic<size_t> s_nInitCallCount(0);
+
+        bool CDS_EXPORT_API init_first_call()
+        {
+            return s_nInitCallCount.fetch_add(1, CDS_ATOMIC::memory_order_relaxed) == 0;
+        }
+
+        bool CDS_EXPORT_API fini_last_call()
+        {
+            if ( s_nInitCallCount.fetch_sub( 1, CDS_ATOMIC::memory_order_relaxed ) == 1 ) {
+                CDS_ATOMIC::atomic_thread_fence( CDS_ATOMIC::memory_order_release );
+                return true;
+            }
+            return false;
+        }
+    } // namespace details
+
+}   // namespace cds
diff --git a/src/michael_heap.cpp b/src/michael_heap.cpp
new file mode 100644 (file)
index 0000000..4be2f30
--- /dev/null
@@ -0,0 +1,327 @@
+//$$CDS-header$$
+
+/*
+    Michael allocator implementation
+    Source:
+        [2004] Maged Michael "Scalable Lock-Free Dynamic Memory Allocation"
+
+    Editions:
+        2011.01.30 khizmax  Created
+*/
+
+#include <cds/memory/michael/allocator.h>
+
+#ifdef _DEBUG
+//#   include <iostream>
+#endif
+
+namespace cds { namespace memory { namespace michael {
+
+    CDS_DATA_ALIGNMENT(128) unsigned int const default_sizeclass_selector::m_szClassBounds[default_sizeclass_selector::c_nSizeClassCount] = {
+        /* 0*/ 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256,       // 15 (step 16) 64K superblock size
+        /*15*/ 320, 384, 448,                                                              //  3 (step 64) 64K superblock size
+        /*18*/ 512, 576, 640, 704, 768, 832, 896, 960, 1024,                               //  9 (step 64)  1M superblock size
+        /*27*/ 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096,     // 12 (step 256) 1M superblock size
+        /*39*/ 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336, 15360, 16384, // 12 (step 1K)  1M superblock size
+        /*51*/ 20480, 24576, 28672, 32768, 36864, 40960, 45056, 49152,                      // 12 (step 4K)  1M superblock size
+               53248, 57344, 61440, 65536
+    };
+
+    size_class const default_sizeclass_selector::m_szClass[default_sizeclass_selector::c_nSizeClassCount] = {
+        // 64K superblock
+        { m_szClassBounds[ 0], c_nPage64K, c_nPage64K / m_szClassBounds[ 0], 0 },
+        { m_szClassBounds[ 1], c_nPage64K, c_nPage64K / m_szClassBounds[ 1], 0 },
+        { m_szClassBounds[ 2], c_nPage64K, c_nPage64K / m_szClassBounds[ 2], 0 },
+        { m_szClassBounds[ 3], c_nPage64K, c_nPage64K / m_szClassBounds[ 3], 0 },
+        { m_szClassBounds[ 4], c_nPage64K, c_nPage64K / m_szClassBounds[ 4], 0 },
+        { m_szClassBounds[ 5], c_nPage64K, c_nPage64K / m_szClassBounds[ 5], 0 },
+        { m_szClassBounds[ 6], c_nPage64K, c_nPage64K / m_szClassBounds[ 6], 0 },
+        { m_szClassBounds[ 7], c_nPage64K, c_nPage64K / m_szClassBounds[ 7], 0 },
+        { m_szClassBounds[ 8], c_nPage64K, c_nPage64K / m_szClassBounds[ 8], 0 },
+        { m_szClassBounds[ 9], c_nPage64K, c_nPage64K / m_szClassBounds[ 9], 0 },
+        { m_szClassBounds[10], c_nPage64K, c_nPage64K / m_szClassBounds[10], 0 },
+        { m_szClassBounds[11], c_nPage64K, c_nPage64K / m_szClassBounds[11], 0 },
+        { m_szClassBounds[12], c_nPage64K, c_nPage64K / m_szClassBounds[12], 0 },
+        { m_szClassBounds[13], c_nPage64K, c_nPage64K / m_szClassBounds[13], 0 },
+        { m_szClassBounds[14], c_nPage64K, c_nPage64K / m_szClassBounds[14], 0 },
+        { m_szClassBounds[15], c_nPage64K, c_nPage64K / m_szClassBounds[15], 0 },
+        { m_szClassBounds[16], c_nPage64K, c_nPage64K / m_szClassBounds[16], 0 },
+        { m_szClassBounds[17], c_nPage64K, c_nPage64K / m_szClassBounds[17], 0 },
+        // 1M superblock
+        { m_szClassBounds[18], c_nPage1M,   c_nPage1M / m_szClassBounds[18], 1 },
+        { m_szClassBounds[19], c_nPage1M,   c_nPage1M / m_szClassBounds[19], 1 },
+        { m_szClassBounds[20], c_nPage1M,   c_nPage1M / m_szClassBounds[20], 1 },
+        { m_szClassBounds[21], c_nPage1M,   c_nPage1M / m_szClassBounds[21], 1 },
+        { m_szClassBounds[22], c_nPage1M,   c_nPage1M / m_szClassBounds[22], 1 },
+        { m_szClassBounds[23], c_nPage1M,   c_nPage1M / m_szClassBounds[23], 1 },
+        { m_szClassBounds[24], c_nPage1M,   c_nPage1M / m_szClassBounds[24], 1 },
+        { m_szClassBounds[25], c_nPage1M,   c_nPage1M / m_szClassBounds[25], 1 },
+        { m_szClassBounds[26], c_nPage1M,   c_nPage1M / m_szClassBounds[26], 1 },
+        // 1M superblock, step 256
+        { m_szClassBounds[27], c_nPage1M,   c_nPage1M / m_szClassBounds[27], 1 },
+        { m_szClassBounds[28], c_nPage1M,   c_nPage1M / m_szClassBounds[28], 1 },
+        { m_szClassBounds[29], c_nPage1M,   c_nPage1M / m_szClassBounds[29], 1 },
+        { m_szClassBounds[30], c_nPage1M,   c_nPage1M / m_szClassBounds[30], 1 },
+        { m_szClassBounds[31], c_nPage1M,   c_nPage1M / m_szClassBounds[31], 1 },
+        { m_szClassBounds[32], c_nPage1M,   c_nPage1M / m_szClassBounds[32], 1 },
+        { m_szClassBounds[33], c_nPage1M,   c_nPage1M / m_szClassBounds[33], 1 },
+        { m_szClassBounds[34], c_nPage1M,   c_nPage1M / m_szClassBounds[34], 1 },
+        { m_szClassBounds[35], c_nPage1M,   c_nPage1M / m_szClassBounds[35], 1 },
+        { m_szClassBounds[36], c_nPage1M,   c_nPage1M / m_szClassBounds[36], 1 },
+        { m_szClassBounds[37], c_nPage1M,   c_nPage1M / m_szClassBounds[37], 1 },
+        { m_szClassBounds[38], c_nPage1M,   c_nPage1M / m_szClassBounds[38], 1 },
+        // 1M superblock, step 1024
+        { m_szClassBounds[39], c_nPage1M,   c_nPage1M / m_szClassBounds[39], 1 },
+        { m_szClassBounds[40], c_nPage1M,   c_nPage1M / m_szClassBounds[40], 1 },
+        { m_szClassBounds[41], c_nPage1M,   c_nPage1M / m_szClassBounds[41], 1 },
+        { m_szClassBounds[42], c_nPage1M,   c_nPage1M / m_szClassBounds[42], 1 },
+        { m_szClassBounds[43], c_nPage1M,   c_nPage1M / m_szClassBounds[43], 1 },
+        { m_szClassBounds[44], c_nPage1M,   c_nPage1M / m_szClassBounds[44], 1 },
+        { m_szClassBounds[45], c_nPage1M,   c_nPage1M / m_szClassBounds[45], 1 },
+        { m_szClassBounds[46], c_nPage1M,   c_nPage1M / m_szClassBounds[46], 1 },
+        { m_szClassBounds[47], c_nPage1M,   c_nPage1M / m_szClassBounds[47], 1 },
+        { m_szClassBounds[48], c_nPage1M,   c_nPage1M / m_szClassBounds[48], 1 },
+        { m_szClassBounds[49], c_nPage1M,   c_nPage1M / m_szClassBounds[49], 1 },
+        { m_szClassBounds[50], c_nPage1M,   c_nPage1M / m_szClassBounds[50], 1 },
+        // 1M superblock, step 4K
+        { m_szClassBounds[51], c_nPage1M,   c_nPage1M / m_szClassBounds[51], 1 },
+        { m_szClassBounds[52], c_nPage1M,   c_nPage1M / m_szClassBounds[52], 1 },
+        { m_szClassBounds[53], c_nPage1M,   c_nPage1M / m_szClassBounds[53], 1 },
+        { m_szClassBounds[54], c_nPage1M,   c_nPage1M / m_szClassBounds[54], 1 },
+        { m_szClassBounds[55], c_nPage1M,   c_nPage1M / m_szClassBounds[55], 1 },
+        { m_szClassBounds[56], c_nPage1M,   c_nPage1M / m_szClassBounds[56], 1 },
+        { m_szClassBounds[57], c_nPage1M,   c_nPage1M / m_szClassBounds[57], 1 },
+        { m_szClassBounds[58], c_nPage1M,   c_nPage1M / m_szClassBounds[58], 1 },
+        { m_szClassBounds[59], c_nPage1M,   c_nPage1M / m_szClassBounds[59], 1 },
+        { m_szClassBounds[60], c_nPage1M,   c_nPage1M / m_szClassBounds[60], 1 },
+        { m_szClassBounds[61], c_nPage1M,   c_nPage1M / m_szClassBounds[61], 1 },
+        { m_szClassBounds[62], c_nPage1M,   c_nPage1M / m_szClassBounds[62], 1 },
+    };
+
+#ifdef _DEBUG
+    default_sizeclass_selector::default_sizeclass_selector()
+    {
+        for ( size_t i = 0; i < sizeof(m_szClass) / sizeof(m_szClass[0]); ++i )
+            assert( m_szClass[i].nCapacity == m_szClass[i].nSBSize / m_szClass[i].nBlockSize );
+        /*
+        // Calculate m_szClassMap
+        size_t nSzClass = 0;
+        for ( size_t i = 0; i <= 65536; i+= 16) {
+            if ( i > m_szClassBounds[nSzClass] )
+                ++nSzClass;
+            std::cout << nSzClass << ", ";
+        }
+        std::cout << std::endl;
+        throw std::exception()  ;   // stop execution
+        */
+    }
+#endif
+
+    unsigned char const default_sizeclass_selector::m_szClassMap[] = {
+        0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, 15, 16, 16,
+        16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21,
+        21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26,
+        26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28,
+        28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29,
+        29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+        30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+        31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33,
+        33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34,
+        34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+        35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+        36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38,
+        38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39,
+        39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+        39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+        39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40,
+        40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+        40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+        40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+        40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+        41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+        41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+        41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+        42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+        42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+        42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+        43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+        43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+        43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44,
+        44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+        44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+        44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45,
+        45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+        45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+        45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+        45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+        46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+        46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+        46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+        47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+        47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+        47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49,
+        49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+        49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+        49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50,
+        50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+        50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+        50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+        50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+        51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+        52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+        53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+        54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+        55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+        56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+        57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+        59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+        60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+        61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+        62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62
+    };
+}}} // namespace cds::memory::michael
diff --git a/src/ptb_gc.cpp b/src/ptb_gc.cpp
new file mode 100644 (file)
index 0000000..f3ab0ad
--- /dev/null
@@ -0,0 +1,307 @@
+//$$CDS-header$$
+
+// Pass The Buck (PTB) Memory manager implementation
+
+#include <cds/gc/ptb/ptb.h>
+#include <cds/int_algo.h>
+
+#include <cds/details/hash_functor_selector.h>
+#include <algorithm>   // std::fill
+
+namespace cds { namespace gc { namespace ptb {
+
+    namespace details {
+
+        class liberate_set {
+            typedef retired_ptr_node *  item_type;
+            typedef cds::details::Allocator<item_type, CDS_DEFAULT_ALLOCATOR>   allocator_type;
+
+            size_t const m_nBucketCount;
+            item_type *  m_Buckets;
+
+            item_type&  bucket( retired_ptr_node& node )
+            {
+                return bucket( node.m_ptr.m_p );
+            }
+            item_type&  bucket( guard_data::guarded_ptr p )
+            {
+                return m_Buckets[ cds::details::hash<guard_data::guarded_ptr>()( p ) & (m_nBucketCount - 1)  ];
+            }
+
+        public:
+            liberate_set( size_t nBucketCount )
+                : m_nBucketCount( nBucketCount )
+            {
+                assert( nBucketCount > 0 );
+                assert( (nBucketCount & (nBucketCount - 1)) == 0 );
+
+                m_Buckets = allocator_type().NewArray( nBucketCount );
+                std::fill( m_Buckets, m_Buckets + nBucketCount, null_ptr<item_type>());
+            }
+
+            ~liberate_set()
+            {
+                allocator_type().Delete( m_Buckets, m_nBucketCount );
+            }
+
+            void insert( retired_ptr_node& node )
+            {
+                node.m_pNext = null_ptr<item_type>();
+
+                item_type& refBucket = bucket( node );
+                if ( refBucket ) {
+                    item_type p = refBucket;
+                    do {
+                        if ( p->m_ptr.m_p == node.m_ptr.m_p ) {
+                            assert( node.m_pNextFree == null_ptr<details::retired_ptr_node *>() );
+
+                            node.m_pNextFree = p->m_pNextFree;
+                            p->m_pNextFree = &node;
+                            return;
+                        }
+                        p = p->m_pNext;
+                    } while ( p );
+
+                    node.m_pNext = refBucket;
+                }
+                refBucket = &node;
+            }
+
+            item_type erase( guard_data::guarded_ptr ptr )
+            {
+                item_type& refBucket = bucket( ptr );
+                item_type p = refBucket;
+                item_type pPrev = null_ptr<item_type>();
+
+                while ( p ) {
+                    if ( p->m_ptr.m_p == ptr ) {
+                        if ( pPrev )
+                            pPrev->m_pNext = p->m_pNext;
+                        else
+                            refBucket = p->m_pNext;
+                        p->m_pNext = null_ptr<item_type>();
+                        return p;
+                    }
+                    pPrev = p;
+                    p = p->m_pNext;
+                }
+
+                return null_ptr<item_type>();
+            }
+
+            typedef std::pair<item_type, item_type>     list_range;
+
+            list_range free_all()
+            {
+                item_type pTail = null_ptr<item_type>();
+                list_range ret = std::make_pair( pTail, pTail );
+
+                item_type const * pEndBucket = m_Buckets + m_nBucketCount;
+                for ( item_type * ppBucket = m_Buckets; ppBucket < pEndBucket; ++ppBucket ) {
+                    item_type pBucket = *ppBucket;
+                    if ( pBucket ) {
+                        if ( !ret.first )
+                            ret.first = pBucket;
+                        else
+                            pTail->m_pNextFree = pBucket;
+
+                        pTail = pBucket;
+                        for (;;) {
+                            item_type pNext = pTail->m_pNext;
+                            pTail->m_ptr.free();
+                            pTail->m_pNext = null_ptr<item_type>();
+
+                            while ( pTail->m_pNextFree ) {
+                                pTail = pTail->m_pNextFree;
+                                pTail->m_ptr.free();
+                                pTail->m_pNext = null_ptr<item_type>();
+                            }
+
+                            if ( pNext )
+                                pTail = pTail->m_pNextFree = pNext;
+                            else
+                                break;
+                        }
+                    }
+                }
+
+                if ( pTail )
+                    pTail->m_pNextFree = null_ptr<item_type>();
+                ret.second = pTail;
+                return ret;
+            }
+        };
+    }
+
+    GarbageCollector * GarbageCollector::m_pManager = NULL;
+
+    void CDS_STDCALL GarbageCollector::Construct(
+        size_t nLiberateThreshold
+        , size_t nInitialThreadGuardCount
+    )
+    {
+        if ( !m_pManager ) {
+            m_pManager = new GarbageCollector( nLiberateThreshold, nInitialThreadGuardCount );
+        }
+    }
+
+    void CDS_STDCALL GarbageCollector::Destruct()
+    {
+        if ( m_pManager ) {
+            delete m_pManager;
+            m_pManager = NULL;
+        }
+    }
+
+    GarbageCollector::GarbageCollector( size_t nLiberateThreshold, size_t nInitialThreadGuardCount )
+        : m_nLiberateThreshold( nLiberateThreshold ? nLiberateThreshold : 1024 )
+        , m_nInitialThreadGuardCount( nInitialThreadGuardCount ? nInitialThreadGuardCount : 8 )
+        //, m_nInLiberate(0)
+    {
+    }
+
+    GarbageCollector::~GarbageCollector()
+    {
+        liberate();
+
+#if 0
+        details::retired_ptr_node * pHead = null_ptr<details::retired_ptr_node *>();
+        details::retired_ptr_node * pTail = null_ptr<details::retired_ptr_node *>();
+
+        for ( details::guard_data * pGuard = m_GuardPool.begin(); pGuard; pGuard = pGuard->pGlobalNext.load(CDS_ATOMIC::memory_order_relaxed)) {
+            details::guard_data::handoff_ptr h = pGuard->pHandOff;
+            pGuard->pHandOff  = null_ptr<details::guard_data::handoff_ptr>();
+            while ( h ) {
+                details::guard_data::handoff_ptr pNext = h->m_pNextFree;
+                if ( h->m_ptr.m_p )
+                    h->m_ptr.free();
+                if ( !pHead )
+                    pTail = pHead = h;
+                else
+                    pTail = pTail->m_pNextFree = h;
+                h = pNext;
+            }
+        }
+        if ( pHead )
+            m_RetiredAllocator.free_range( pHead, pTail );
+#endif
+    }
+
+    void GarbageCollector::liberate()
+    {
+        details::retired_ptr_buffer::privatize_result retiredList = m_RetiredBuffer.privatize();
+        if ( retiredList.first ) {
+
+            size_t nLiberateThreshold = m_nLiberateThreshold.load(CDS_ATOMIC::memory_order_relaxed);
+            details::liberate_set set( beans::ceil2( retiredList.second > nLiberateThreshold ? retiredList.second : nLiberateThreshold ) );
+
+            // Get list of retired pointers
+            details::retired_ptr_node * pHead = retiredList.first;
+            while ( pHead ) {
+                details::retired_ptr_node * pNext = pHead->m_pNext;
+                pHead->m_pNextFree = null_ptr<details::retired_ptr_node *>();
+                set.insert( *pHead );
+                pHead = pNext;
+            }
+
+            // Liberate cycle
+            for ( details::guard_data * pGuard = m_GuardPool.begin(); pGuard; pGuard = pGuard->pGlobalNext.load(CDS_ATOMIC::memory_order_acquire) )
+            {
+                // get guarded pointer
+                details::guard_data::guarded_ptr  valGuarded = pGuard->pPost.load(CDS_ATOMIC::memory_order_acquire);
+
+                if ( valGuarded ) {
+                    details::retired_ptr_node * pRetired = set.erase( valGuarded );
+                    if ( pRetired ) {
+                        // Retired pointer is being guarded
+                        // pRetired is the head of retired pointers list for which the m_ptr.m_p field is equal
+                        // List is linked on m_pNextFree field
+
+                        do {
+                            details::retired_ptr_node * pNext = pRetired->m_pNextFree;
+                            m_RetiredBuffer.push( *pRetired );
+                            pRetired = pNext;
+                        } while ( pRetired );
+                    }
+                }
+            }
+
+            // Free all retired pointers
+            details::liberate_set::list_range range = set.free_all();
+
+            m_RetiredAllocator.inc_epoch();
+
+            if ( range.first ) {
+                assert( range.second != null_ptr<details::retired_ptr_node *>() );
+                m_RetiredAllocator.free_range( range.first, range.second );
+            }
+            else {
+                // liberate cycle did not free any retired pointer - double liberate threshold
+                m_nLiberateThreshold.compare_exchange_strong( nLiberateThreshold, nLiberateThreshold * 2, CDS_ATOMIC::memory_order_release, CDS_ATOMIC::memory_order_relaxed );
+            }
+        }
+    }
+
+#if 0
+    void GarbageCollector::liberate( details::liberate_set& set )
+    {
+        details::guard_data::handoff_ptr const nullHandOff = null_ptr<details::guard_data::handoff_ptr>();
+
+        for ( details::guard_data * pGuard = m_GuardPool.begin(); pGuard; pGuard = pGuard->pGlobalNext.load(CDS_ATOMIC::memory_order_acquire) )
+        {
+            // get guarded pointer
+            details::guard_data::guarded_ptr  valGuarded = pGuard->pPost.load(CDS_ATOMIC::memory_order_acquire);
+            details::guard_data::handoff_ptr h;
+
+            if ( valGuarded ) {
+                details::retired_ptr_node * pRetired = set.erase( valGuarded );
+                if ( pRetired ) {
+                    // Retired pointer is being guarded
+
+                    // pRetired is the head of retired pointers list for which the m_ptr.m_p field is equal
+                    // List is linked on m_pNextFree field
+
+                    // Now, try to set retired node pRetired as a hand-off node for the guard
+                    cds::lock::Auto<details::guard_data::handoff_spin> al( pGuard->spinHandOff );
+                    if ( valGuarded == pGuard->pPost.load(CDS_ATOMIC::memory_order_acquire) ) {
+                        if ( pGuard->pHandOff && pGuard->pHandOff->m_ptr.m_p == pRetired->m_ptr.m_p ) {
+                            h = nullHandOff ; //null_ptr<details::guard_data::handoff_ptr>();
+                            details::retired_ptr_node * pTail = pGuard->pHandOff;
+                            while ( pTail->m_pNextFree )
+                                pTail = pTail->m_pNextFree;
+                            pTail->m_pNextFree = pRetired;
+                        }
+                        else {
+                            // swap h and pGuard->pHandOff
+                            h = pGuard->pHandOff;
+                            pGuard->pHandOff = pRetired;
+                        }
+                    }
+                    else
+                        h = pRetired;
+                }
+                else {
+                    cds::lock::Auto<details::guard_data::handoff_spin> al( pGuard->spinHandOff );
+                    h = pGuard->pHandOff;
+                    if ( h ) {
+                        if ( h->m_ptr.m_p != valGuarded )
+                            pGuard->pHandOff = nullHandOff;
+                        else
+                            h = nullHandOff;
+                    }
+                }
+            }
+            else {
+                cds::lock::Auto<details::guard_data::handoff_spin> al( pGuard->spinHandOff );
+                h = pGuard->pHandOff;
+                pGuard->pHandOff = nullHandOff;
+            }
+
+            // h is the head of a list linked on m_pNextFree field
+            if ( h ) {
+                set.insert( *h );
+            }
+        }
+    }
+#endif
+}}} // namespace cds::gc::ptb
diff --git a/src/topology_hpux.cpp b/src/topology_hpux.cpp
new file mode 100644 (file)
index 0000000..68a951a
--- /dev/null
@@ -0,0 +1,79 @@
+//$$CDS-header$$
+
+#include <cds/os/topology.h>
+
+#if CDS_OS_TYPE == CDS_OS_HPUX
+
+#include <cds/cxx11_atomic.h>
+#include <limits>
+
+namespace cds { namespace OS { CDS_CXX11_INLINE_NAMESPACE namespace Hpux {
+
+    size_t topology::s_nProcMapSize = 0;
+    topology::processor_map * topology::s_procMap = NULL;
+
+    void topology::make_processor_map()
+    {
+        spu_t nProc;
+        spu_t nMaxProcNo;
+
+        // Processor numbers are not sequential in HP-UX.
+
+        // Calculate max processor number
+        nProc = nMaxProcNo = ::mpctl( MPC_GETFIRSTSPU, 0, 0 );
+
+        while ( (nProc = ::mpctl( MPC_GETNEXTSPU, nProc, 0 )) != -1 ) {
+            if ( nMaxProcNo < nProc )
+                nMaxProcNo = nProc;
+        }
+
+        // Allocate processor map array
+        s_nProcMapSize = nMaxProcNo + 1;
+
+        // We cannot use operator new or std::allocator in this code
+        // since the initialization phase may be called from
+        // our overloaded operator new that based on cds::mihcael::Heap
+        // As a result, a deadlock may be occured
+        s_procMap = reinterpret_cast<processor_map *>(::malloc( sizeof(s_procMap[0]) * s_nProcMapSize ));
+        processor_map * pEnd = s_procMap + s_nProcMapSize;
+
+        for ( processor_map * p = s_procMap; p != pEnd; ++p ) {
+            p->nCell = 0;
+            p->nNativeProcNo = -1;
+            p->nProcNo = std::numeric_limits<unsigned int>::max();
+        }
+
+        // Fill processor map array
+        unsigned int nProcNo = 0;
+        nProc = ::mpctl( MPC_GETFIRSTSPU, 0, 0 );
+        s_procMap[ nProc ].nNativeProcNo = nProc;
+        s_procMap[ nProc ].nProcNo = nProcNo++;
+        s_procMap[ nProc ].nCell = ::mpctl( MPC_SPUTOLDOM, nProc, 0 );
+
+        while ( (nProc = ::mpctl( MPC_GETNEXTSPU, nProc, 0 )) != -1 ) {
+            processor_map * p = s_procMap + nProc;
+            p->nNativeProcNo = nProc;
+            p->nProcNo = nProcNo++;
+            p->nCell = ::mpctl( MPC_SPUTOLDOM, nProc, 0 );
+        }
+    }
+
+    void topology::init()
+    {
+        assert( s_procMap == NULL );
+        make_processor_map();
+    }
+
+    void topology::fini()
+    {
+        assert( s_procMap != NULL );
+        if ( s_procMap ) {
+            ::free( s_procMap );
+
+            s_procMap = NULL;
+        }
+    }
+
+}}} // namespace cds::OS::Hpux
+
+#endif  // #if CDS_OS_TYPE == CDS_OS_HPUX
diff --git a/src/topology_linux.cpp b/src/topology_linux.cpp
new file mode 100644 (file)
index 0000000..7adc14a
--- /dev/null
@@ -0,0 +1,45 @@
+//$$CDS-header$$
+
+#include <cds/os/topology.h>
+
+#if CDS_OS_TYPE == CDS_OS_LINUX
+
+#include <unistd.h>
+#include <fstream>
+
+namespace cds { namespace OS { CDS_CXX11_INLINE_NAMESPACE namespace Linux {
+
+    unsigned int topology::s_nProcessorCount = 0;
+
+    void topology::init()
+    {
+         long n = ::sysconf( _SC_NPROCESSORS_ONLN );
+         if ( n > 0 )
+            s_nProcessorCount = n;
+         else {
+            try {
+                std::ifstream cpuinfo("/proc/cpuinfo");
+                std::string line;
+
+                unsigned int nProcCount = 0;
+                while ( !cpuinfo.eof() ) {
+                    std::getline(cpuinfo,line);
+                    if (!line.size())
+                        continue;
+                    if ( line.find( "processor" ) !=0 )
+                        continue;
+                    ++nProcCount;
+                }
+                s_nProcessorCount = nProcCount;
+            }
+            catch ( std::exception& ex ) {
+                s_nProcessorCount = 1;
+            }
+         }
+    }
+
+    void topology::fini()
+    {}
+}}} // namespace cds::OS::Linux
+
+#endif  // #if CDS_OS_TYPE == CDS_OS_LINUX
diff --git a/src/topology_osx.cpp b/src/topology_osx.cpp
new file mode 100644 (file)
index 0000000..689dbbf
--- /dev/null
@@ -0,0 +1,25 @@
+//$$CDS-header$$
+
+#include <cds/os/topology.h>
+
+#if CDS_OS_TYPE == CDS_OS_OSX
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+namespace cds { namespace OS { CDS_CXX11_INLINE_NAMESPACE namespace OS_X {
+
+    unsigned int topology::s_nProcessorCount = 0;
+
+    void topology::init()
+    {
+        size_t len = sizeof( s_nProcessorCount );
+        if ( sysctlbyname("hw.logicalcpu", &s_nProcessorCount, &len, NULL, 0 ) != 0 )
+            s_nProcessorCount = 1;
+    }
+
+    void topology::fini()
+    {}
+}}} // namespace cds::OS::Linux
+
+#endif  // #if CDS_OS_TYPE == CDS_OS_OSX
diff --git a/src/urcu_gp.cpp b/src/urcu_gp.cpp
new file mode 100644 (file)
index 0000000..2acd85c
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#include <cds/urcu/details/gp.h>
+
+namespace cds { namespace urcu { namespace details {
+
+    template<> CDS_EXPORT_API singleton_vtbl * gp_singleton_instance< general_instant_tag >::s_pRCU = null_ptr<singleton_vtbl *>();
+    template<> CDS_EXPORT_API singleton_vtbl * gp_singleton_instance< general_buffered_tag >::s_pRCU = null_ptr<singleton_vtbl *>();
+    template<> CDS_EXPORT_API singleton_vtbl * gp_singleton_instance< general_threaded_tag >::s_pRCU = null_ptr<singleton_vtbl *>();
+
+}}} // namespace cds::urcu::details
diff --git a/src/urcu_sh.cpp b/src/urcu_sh.cpp
new file mode 100644 (file)
index 0000000..cceed18
--- /dev/null
@@ -0,0 +1,13 @@
+//$$CDS-header$$
+
+#include <cds/urcu/details/sh.h>
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+namespace cds { namespace urcu { namespace details {
+
+    template<> CDS_EXPORT_API singleton_vtbl * sh_singleton_instance< signal_buffered_tag >::s_pRCU = null_ptr<singleton_vtbl *>();
+    template<> CDS_EXPORT_API singleton_vtbl * sh_singleton_instance< signal_threaded_tag >::s_pRCU = null_ptr<singleton_vtbl *>();
+
+}}} // namespace cds::urcu::details
+
+#endif //#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
diff --git a/tests/cppunit/cppunit_mini.h b/tests/cppunit/cppunit_mini.h
new file mode 100644 (file)
index 0000000..89517ea
--- /dev/null
@@ -0,0 +1,385 @@
+//$$CDS-header$$
+
+/*
+ * Copyright (c) 2003, 2004
+ * Zdenek Nemec
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+    Partially changed and expanded by Maxim Khiszinsky (cds), 2009
+*/
+
+/* $Id$ */
+
+#ifndef _CPPUNITMPFR_H_
+#define _CPPUNITMPFR_H_
+
+#include <string.h>
+#include <sstream>
+#include <iostream>
+#include <vector>
+#include <string>
+#include <map>
+#include <assert.h>
+
+#include <boost/lexical_cast.hpp>
+
+namespace CppUnitMini
+{
+  class Reporter {
+  public:
+    virtual ~Reporter() {}
+    virtual void error(const char * /*macroName*/, const char * /*in_macro*/, const char * /*in_file*/, int /*in_line*/) {}
+    virtual void message( const char * /*msg*/ ) {}
+    virtual void progress( const char * /*in_className*/, const char * /*in_testName*/, bool /*ignored*/, bool /* explicit */) {}
+    virtual void end() {}
+    virtual void printSummary() {}
+  };
+
+  struct TestCfg
+  {
+      typedef std::map< std::string, std::string >  cfg_map;
+      cfg_map    m_Cfg ; // map param_name => value
+
+      template <typename T>
+      T get( const std::string& strParamName, T defVal ) const
+      {
+          cfg_map::const_iterator it = m_Cfg.find( strParamName );
+          if ( it == m_Cfg.end() )
+              return defVal ; // param not found -> returns default value
+          try {
+              return boost::lexical_cast< T >( it->second );
+          }
+          catch ( boost::bad_lexical_cast& ex )
+          {
+              std::cerr << "bad_lexical_cast encountered while getting parameter "
+                  << strParamName << "=" << it->second
+                  << ": " << ex.what()
+                  << std::endl
+;
+          }
+          return defVal;
+      }
+
+      template <typename T>
+      T get( const char * pszParamName, T defVal ) const
+      {
+          return get( std::string( pszParamName ), defVal );
+      }
+
+      int getInt( const char * pszParamName, int nDefVal = 0 ) const { return get( pszParamName, nDefVal ) ; }
+      unsigned int getUInt( const char * pszParamName, unsigned int nDefVal = 0 ) const { return get( pszParamName, nDefVal ) ; }
+      long getLong( const char * pszParamName, long nDefVal = 0 ) const { return get( pszParamName, nDefVal ) ; }
+      unsigned long getULong( const char * pszParamName, unsigned long nDefVal = 0 ) const { return get( pszParamName, nDefVal ) ; }
+
+      bool getBool( const char * pszParamName, bool bDefVal = false ) const
+      {
+          std::string strParamName( pszParamName );
+          cfg_map::const_iterator it = m_Cfg.find( strParamName );
+          if ( it == m_Cfg.end() )
+              return bDefVal ; // param not found -> returns default value
+          try {
+              return boost::lexical_cast< int >( it->second ) != 0;
+          }
+          catch ( boost::bad_lexical_cast& ex )
+          {
+              std::cerr << "bad_lexical_cast encountered while getting parameter "
+                  << strParamName << "=" << it->second
+                  << ": " << ex.what()
+                  << std::endl
+;
+          }
+          return bDefVal;
+      }
+
+  };
+
+  class Config {
+      std::map< std::string, TestCfg>  m_Cfg;
+
+  public:
+      Config() {}
+
+      void load( const char * fileName );
+
+      TestCfg& get( const std::string& strTestName )
+      {
+          return m_Cfg[ strTestName ];
+      }
+  };
+
+  class TestFixture {
+  public:
+    virtual ~TestFixture() {}
+
+    //! \brief Set up context before running a test.
+    virtual void setUp() {}
+
+    //! Clean up after the test run.
+    virtual void tearDown() {}
+  };
+
+  class TestCase : public TestFixture {
+  public:
+    TestCase() { registerTestCase(this); }
+
+    void setUp() { m_failed = false; }
+    static int run(Reporter *in_reporter = 0, const char *in_testName = "", bool invert = false);
+    int numErrors() { return m_numErrors; }
+    static void registerTestCase(TestCase *in_testCase);
+
+    static TestCase * current_test()
+    {
+        assert( m_pCurTestCase != NULL );
+        return m_pCurTestCase;
+    }
+
+    virtual void setUpParams( const TestCfg& cfg ) {}
+    virtual void endTestCase() {}
+    virtual void myRun(const char * /*in_name*/, bool /*invert*/ = false) {}
+
+    virtual void error(const char *in_macroName, const char *in_macro, const char *in_file, int in_line) {
+      m_failed = true;
+      if (m_reporter) {
+        m_reporter->error(in_macroName, in_macro, in_file, in_line);
+      }
+    }
+
+    static void message(const char *msg) {
+      if (m_reporter) {
+        m_reporter->message(msg);
+      }
+    }
+
+    bool equalDoubles(double in_expected, double in_real, double in_maxErr) {
+      double diff = in_expected - in_real;
+      if (diff < 0.) {
+        diff = -diff;
+      }
+      return diff < in_maxErr;
+    }
+
+    virtual void progress(const char *in_className, const char *in_functionName, bool ignored, bool explicitTest) {
+      ++m_numTests;
+      if (m_reporter) {
+        m_reporter->progress(in_className, in_functionName, ignored, explicitTest);
+      }
+    }
+
+    bool shouldRunThis(const char *in_desiredTest, const char *in_className, const char *in_functionName,
+                       bool invert, bool explicit_test, bool &do_progress) {
+      if ((in_desiredTest) && (in_desiredTest[0] != '\0')) {
+        do_progress = false;
+        const char *ptr = strstr(in_desiredTest, "::");
+        if (ptr) {
+            bool match = (strncmp(in_desiredTest, in_className, strlen(in_className)) == 0 && in_desiredTest[strlen(in_className)] == ':' )
+                      && (strncmp(ptr + 2, in_functionName, strlen(ptr + 2)) == 0);
+          // Invert shall not make explicit test run:
+          return invert ? (match ? !match : !explicit_test)
+                        : match;
+        }
+        bool match = (strcmp(in_desiredTest, in_className) == 0);
+        do_progress = match;
+        return !explicit_test && (match == !invert);
+      }
+      do_progress = true;
+      return !explicit_test;
+    }
+
+    void tearDown() {
+      print_gc_state();
+      if (m_failed)
+        ++m_numErrors;
+      m_reporter->end();
+    }
+
+    static void print_gc_state();
+
+    static std::vector<std::string> const &    getTestStrings();
+
+  protected:
+    static std::vector<std::string>  m_arrStrings ;   // array of test strings
+
+  public:
+      static bool m_bPrintGCState   ;   // print GC state after each test
+      static Config m_Cfg;
+      static std::string    m_strTestDataDir;
+
+  protected:
+    static int m_numErrors;
+    static int m_numTests;
+
+    static TestCase * m_pCurTestCase;
+
+  private:
+    static TestCase *m_root;
+    TestCase *m_next;
+    bool m_failed;
+
+    static Reporter *m_reporter;
+  };
+
+}
+
+#if !defined (CPPUNIT_MINI_HIDE_UNUSED_VARIABLE)
+#  if defined (_MSC_VER)
+#    define CPPUNIT_MINI_HIDE_UNUSED_VARIABLE(v) (v);
+#  else
+#    define CPPUNIT_MINI_HIDE_UNUSED_VARIABLE(v)
+#  endif
+#endif
+
+#define CPPUNIT_TEST_SUITE_(X, cfgBranchName) \
+    typedef CppUnitMini::TestCase Base; \
+    virtual void myRun(const char *in_name, bool invert = false) { \
+    const char *className = #X; CPPUNIT_MINI_HIDE_UNUSED_VARIABLE(className) \
+    bool ignoring = false; CPPUNIT_MINI_HIDE_UNUSED_VARIABLE(ignoring) \
+    setUpParams( m_Cfg.get( cfgBranchName ));
+
+#define CPPUNIT_TEST_SUITE_PART(X, func) \
+    void X::func(const char *in_name, bool invert /*= false*/) { \
+    const char *className = #X; CPPUNIT_MINI_HIDE_UNUSED_VARIABLE(className) \
+    bool ignoring = false; CPPUNIT_MINI_HIDE_UNUSED_VARIABLE(ignoring)
+
+#define CPPUNIT_TEST_SUITE(X) CPPUNIT_TEST_SUITE_(X, #X)
+
+#if defined CPPUNIT_MINI_USE_EXCEPTIONS
+#  define CPPUNIT_TEST_BASE(X, Y) \
+  { \
+    bool do_progress; \
+    bool shouldRun = shouldRunThis(in_name, className, #X, invert, Y, do_progress); \
+    if (shouldRun || do_progress) { \
+      setUp(); \
+      progress(className, #X, ignoring || !shouldRun, !ignoring && Y); \
+      if (shouldRun && !ignoring) { \
+        try { \
+          X(); \
+        } \
+        catch(...) { \
+          Base::error("Test Failed: An Exception was thrown.", #X, __FILE__, __LINE__); \
+        } \
+      } \
+      tearDown(); \
+    } \
+  }
+#else
+#  define CPPUNIT_TEST_BASE(X, Y) \
+  { \
+    bool do_progress; \
+    bool shouldRun = shouldRunThis(in_name, className, #X, invert, Y, do_progress); \
+    if (shouldRun || do_progress) { \
+      setUp(); \
+      progress(className, #X, ignoring || !shouldRun, !ignoring && Y); \
+      if (shouldRun && !ignoring) \
+        X(); \
+      tearDown(); \
+    } \
+  }
+#endif
+
+#define CPPUNIT_TEST(X) CPPUNIT_TEST_BASE(X, false)
+#define CPPUNIT_EXPLICIT_TEST(X) CPPUNIT_TEST_BASE(X, true)
+
+#define CPPUNIT_IGNORE \
+  ignoring = true
+
+#define CPPUNIT_STOP_IGNORE \
+  ignoring = false
+
+#define CPPUNIT_TEST_SUITE_END() endTestCase(); }
+#define CPPUNIT_TEST_SUITE_END_PART() }
+
+#define CPPUNIT_TEST_SUITE_REGISTRATION(X) static X local
+#define CPPUNIT_TEST_SUITE_REGISTRATION_(X, NAME) static X NAME
+
+#define CPPUNIT_CHECK(X) \
+  if (!(X)) { \
+    Base::error("CPPUNIT_CHECK", #X, __FILE__, __LINE__); \
+  }
+
+#define CPPUNIT_CHECK_CURRENT(X) \
+  if (!(X)) { \
+    CppUnitMini::TestCase::current_test()->error("CPPUNIT_CHECK", #X, __FILE__, __LINE__); \
+  }
+
+#define CPPUNIT_CHECK_EX(X, Y) \
+    if (!(X)) { \
+        std::stringstream st    ;   \
+        st << #X << ": " << Y   ;   \
+        Base::error("CPPUNIT_CHECK", st.str().c_str(), __FILE__, __LINE__); \
+    }
+
+#define CPPUNIT_CHECK_CURRENT_EX(X, Y) \
+    if (!(X)) { \
+        std::stringstream st    ;   \
+        st << #X << ": " << Y   ;   \
+        CppUnitMini::TestCase::current_test()->error("CPPUNIT_CHECK", st.str().c_str(), __FILE__, __LINE__); \
+    }
+
+#define CPPUNIT_ASSERT(X) \
+  if (!(X)) { \
+    Base::error("CPPUNIT_ASSERT", #X, __FILE__, __LINE__); \
+    return; \
+  }
+
+#define CPPUNIT_ASSERT_CURRENT(X) \
+    if (!(X)) { \
+        CppUnitMini::TestCase::current_test()->error("CPPUNIT_ASSERT", #X, __FILE__, __LINE__); \
+        return; \
+    }
+
+
+#define CPPUNIT_ASSERT_EX(A, X) \
+    if (!(A)) { \
+        std::stringstream st    ;   \
+        st << #A << ": " << X   ;   \
+        Base::error("CPPUNIT_ASSERT", st.str().c_str(), __FILE__, __LINE__); \
+        return; \
+    }
+
+#define CPPUNIT_FAIL { \
+    Base::error("CPPUNIT_FAIL", "", __FILE__, __LINE__); \
+    return; \
+  }
+
+#define CPPUNIT_ASSERT_EQUAL(X, Y) \
+  if ((X) != (Y)) { \
+    Base::error("CPPUNIT_ASSERT_EQUAL", #X","#Y, __FILE__, __LINE__); \
+    return; \
+  }
+
+#define CPPUNIT_ASSERT_DOUBLES_EQUAL(X, Y, Z) \
+  if (!equalDoubles((X), (Y), (Z))) { \
+    Base::error("CPPUNIT_ASSERT_DOUBLES_EQUAL", #X","#Y","#Z, __FILE__, __LINE__); \
+    return; \
+  }
+
+// added by cds
+#define CPPUNIT_MSG( X ) \
+    {   \
+        std::stringstream st    ;   \
+        st << X ;   \
+        if ( !st.str().empty() ) \
+            CppUnitMini::TestCase::message( st.str().c_str() );   \
+    }
+
+#define CPPUNIT_MESSAGE(m) CppUnitMini::TestCase::message(m)
+
+#define CPPUNIT_ASSERT_MSG( A, X ) \
+    if ( !(A) ){   \
+        std::stringstream st    ;   \
+        st << #A << ": " << X ;   \
+        error( "CPPUNIT_ASSERT_MSG", st.str().c_str(), __FILE__, __LINE__ )     ;   \
+    }
+
+#endif
diff --git a/tests/cppunit/cppunit_proxy.h b/tests/cppunit/cppunit_proxy.h
new file mode 100644 (file)
index 0000000..09b02c1
--- /dev/null
@@ -0,0 +1,34 @@
+//$$CDS-header$$
+
+/*
+ * Copyright (c) 2003, 2004
+ * Zdenek Nemec
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* $Id$ */
+
+#ifndef _CPPUNITPROXYINTERFACE_H_
+#define _CPPUNITPROXYINTERFACE_H_
+
+/*
+ * STLport specific
+ */
+#if !defined (CPPUNIT_MINI_USE_EXCEPTIONS) && \
+    (!defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS))
+#  define CPPUNIT_MINI_USE_EXCEPTIONS
+#endif
+
+#include "cppunit/cppunit_mini.h"
+#include <cds/cxx11_atomic.h>   // for cds::atomicity::empty_item_counter
+
+#endif
diff --git a/tests/cppunit/file_reporter.h b/tests/cppunit/file_reporter.h
new file mode 100644 (file)
index 0000000..dec5b48
--- /dev/null
@@ -0,0 +1,145 @@
+//$$CDS-header$$
+
+/*
+ * Copyright (c) 2003, 2004
+ * Zdenek Nemec
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* $Id$ */
+
+#ifndef _CPPUNITMINIFILEREPORTERINTERFACE_H_
+#define _CPPUNITMINIFILEREPORTERINTERFACE_H_
+
+#include <stdio.h>
+
+#include <cds/os/timer.h>
+
+namespace CppUnitMini {
+    typedef cds::OS::Timer    Timer;
+    //
+    // CppUnit mini file(stream) reporter
+    //
+    class FileReporter : public CppUnitMini::Reporter {
+    private:
+      FileReporter(const FileReporter&);
+      FileReporter& operator=(const FileReporter&);
+    public:
+      // reporting to stderr
+      explicit FileReporter(bool doMonitor = false):
+          m_numErrors(0), m_numIgnored(0), m_numExplicit(0), m_numTests(0), _myStream(false),
+          m_failed(false), m_doMonitor(doMonitor)
+      { _file = stderr; }
+
+      // reporting to the file with the given name
+      explicit FileReporter(const char* file, bool doMonitor = false):
+          m_numErrors(0), m_numIgnored(0), m_numExplicit(0), m_numTests(0), _myStream(true),
+          m_failed(false), m_doMonitor(doMonitor)
+      {
+    #ifndef _STLP_USE_SAFE_STRING_FUNCTIONS
+        _file = fopen(file, "w");
+    #else
+        fopen_s(&_file, file, "w");
+    #endif
+      }
+
+      // reporting to the given file
+      explicit FileReporter(FILE* stream, bool doMonitor = false):
+          m_numErrors(0), m_numIgnored(0), m_numExplicit(0), m_numTests(0), _myStream(false),
+          m_failed(false), m_doMonitor(doMonitor)
+      { _file = stream; }
+
+      virtual ~FileReporter() {
+        if (_myStream)
+          fclose(_file);
+        else
+          fflush(_file);
+      }
+
+      virtual void error(const char *in_macroName, const char *in_macro, const char *in_file, int in_line) {
+        // Error might be called several times between 2 progress calls, we shouldn't however consider
+        // that a test failed twice so we simply keep the info that test failed, number of failed tests
+        // is computed later in end method.
+        m_failed = true;
+        fprintf(_file, "\n\n%s(%d) : %s(%s);", in_file, in_line, in_macroName, in_macro);
+        fflush(_file);
+      }
+
+      virtual void message( const char *msg )
+      { fprintf(_file, "\n\t%s", msg ); fflush(_file); }
+
+      virtual void progress(const char *in_className, const char *in_shortTestName, bool ignored, bool explicitTest) {
+        if (m_doMonitor)
+          m_testTimer.reset();
+
+        ++m_numTests;
+        m_failed = false;
+        if (ignored)
+          ++m_numIgnored;
+        fprintf(_file, "%s::%s", in_className, in_shortTestName);
+        if (ignored) {
+          const char *ignoredReason;
+          if (explicitTest) {
+            ++m_numExplicit;
+            ignoredReason = " EXPLICIT";
+          }
+          else
+            ignoredReason = " IGNORED";
+
+          fprintf(_file, "%s", ignoredReason);
+        }
+      }
+
+      virtual void end() {
+        if (m_doMonitor) {
+          fprintf(_file, " %f msec", m_testTimer.duration());
+        }
+        if (m_failed) {
+          ++m_numErrors;
+        }
+        fprintf(_file, "\n");
+        fflush(_file);
+      }
+
+      virtual void printSummary() {
+        if (m_numErrors > 0) {
+          fprintf(_file, "\nThere were errors! %d of %d tests", m_numErrors, m_numTests);
+        }
+        else {
+          fprintf(_file, "\nOK %d tests", m_numTests);
+        }
+
+        if (m_numIgnored > 0) {
+          fprintf(_file, ", %d ignored", m_numIgnored);
+        }
+
+        if (m_numExplicit > 0) {
+          fprintf(_file, " (%d explicit)", m_numExplicit);
+        }
+
+        fprintf(_file, "\n\n");
+        fflush(_file);
+      }
+    private:
+      int m_numErrors;
+      int m_numIgnored;
+      int m_numExplicit;
+      int m_numTests;
+      // flag whether we own '_file' and are thus responsible for releasing it in the destructor
+      bool  _myStream;
+      bool m_failed;
+      bool m_doMonitor;
+      Timer m_testTimer;
+      FILE* _file;
+    };
+}
+#endif /*_CPPUNITMINIFILEREPORTERINTERFACE_H_*/
diff --git a/tests/cppunit/test_beans.h b/tests/cppunit/test_beans.h
new file mode 100644 (file)
index 0000000..f5be0f9
--- /dev/null
@@ -0,0 +1,29 @@
+//$$CDS-header$$
+
+// Forward declarations
+namespace cds {
+    namespace intrusive {}
+    namespace opt {}
+}
+
+// Including this header is a bad thing for header testing. How to avoid it?..
+#include <cds/cxx11_atomic.h>   // for cds::atomicity::empty_item_counter
+
+namespace test_beans {
+    template <typename ItemCounter>
+    struct check_item_counter {
+        bool operator()( size_t nReal, size_t nExpected )
+        {
+            return nReal == nExpected;
+        }
+    };
+
+    template <>
+    struct check_item_counter<cds::atomicity::empty_item_counter>
+    {
+        bool operator()( size_t nReal, size_t /*nExpected*/ )
+        {
+            return nReal == 0;
+        }
+    };
+} // namespace beans
diff --git a/tests/cppunit/test_main.cpp b/tests/cppunit/test_main.cpp
new file mode 100644 (file)
index 0000000..b22cf0c
--- /dev/null
@@ -0,0 +1,484 @@
+//$$CDS-header$$
+
+/*
+ * Copyright (c) 2003, 2004
+ * Zdenek Nemec
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+#if defined(_DEBUG) && _MSC_VER == 1500
+#    define _CRTDBG_MAP_ALLOC
+#    include <stdlib.h>
+#    include <crtdbg.h>
+#endif
+*/
+
+#include "cppunit/cppunit_proxy.h"
+#include "cppunit/file_reporter.h"
+
+#include <cds/init.h>
+#include <cds/gc/hp.h>
+#include <cds/gc/hrc.h>
+#include <cds/gc/ptb.h>
+#include <cds/urcu/general_instant.h>
+#include <cds/urcu/general_buffered.h>
+#include <cds/urcu/general_threaded.h>
+#include <cds/urcu/signal_buffered.h>
+#include <cds/urcu/signal_threaded.h>
+#include <cds/os/topology.h>
+
+#include "stdio.h"
+#include <fstream>
+#include <iostream>
+#include <set>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/thread/mutex.hpp>
+
+// Visual leak detector (see http://vld.codeplex.com/)
+#if defined(CDS_USE_VLD) && CDS_COMPILER == CDS_COMPILER_MSVC
+#   ifdef _DEBUG
+#       include <vld.h>
+#   endif
+#endif
+
+
+std::ostream& operator << (std::ostream& s, const cds::gc::hzp::GarbageCollector::InternalState& stat)
+{
+    s << "\nHZP GC internal state:"
+        << "\n\t\tHP record allocated=" << stat.nHPRecAllocated
+        << "\n\t\tHP records used=" << stat.nHPRecUsed
+        << "\n\t\tTotal retired ptr count=" << stat.nTotalRetiredPtrCount
+        << "\n\t\tRetired ptr in free HP records=" << stat.nRetiredPtrInFreeHPRecs
+        << "\n\tEvents:"
+        << "\n\t\tHPRec allocations=" << stat.evcAllocHPRec
+        << "\n\t\tHPRec retire events=" << stat.evcRetireHPRec
+        << "\n\t\tnew HPRec allocations from heap=" << stat.evcAllocNewHPRec
+        << "\n\t\tHPRec deletions=" << stat.evcDeleteHPRec
+        << "\n\t\tScan calling=" << stat.evcScanCall
+        << "\n\t\tHelpScan calling=" << stat.evcHelpScanCall
+        << "\n\t\tScan calls from HelpScan=" << stat.evcScanFromHelpScan
+        << "\n\t\tretired objects deleting=" << stat.evcDeletedNode
+        << "\n\t\tguarded objects on Scan=" << stat.evcDeferredNode
+        << std::endl;
+
+    return s;
+}
+
+std::ostream& operator << (std::ostream& s, const cds::gc::hrc::GarbageCollector::internal_state& stat)
+{
+    s << "\nHRC GC internal state:"
+        << "\n\t\tHRC record allocated=" << stat.nHRCRecAllocated
+        << "\n\t\tHRC records used=" << stat.nHRCRecUsed
+        << "\n\t\tTotal retired ptr count=" << stat.nTotalRetiredPtrCount
+        << "\n\t\tRetired ptr in free HRC records=" << stat.nRetiredPtrInFreeHRCRecs
+        << "\n\tEvents:"
+        << "\n\t\tHRCrec allocations=" << stat.evcAllocHRCRec
+        << "\n\t\tHRCrec retire events=" << stat.evcRetireHRCRec
+        << "\n\t\tnew HRCrec allocations from heap=" << stat.evcAllocNewHRCRec
+        << "\n\t\tHRCrec deletions=" << stat.evcDeleteHRCRec
+        << "\n\t\tScan calling=" << stat.evcScanCall
+        << "\n\t\tHelpScan calling=" << stat.evcHelpScanCalls
+        << "\n\t\tCleanUpAll calling=" << stat.evcCleanUpAllCalls
+        << "\n\t\tretired objects deleting=" << stat.evcDeletedNode
+        << "\n\t\tguarded nodes on Scan=" << stat.evcScanGuarded
+        << "\n\t\tclaimed node on Scan=" << stat.evcScanClaimGuarded
+#ifdef _DEBUG
+        << "\n\t\tnode constructed count=" << stat.evcNodeConstruct
+        << "\n\t\tnode destructed count=" << stat.evcNodeDestruct
+#endif
+        << std::endl;
+
+    return s;
+}
+
+namespace CppUnitMini
+{
+  int TestCase::m_numErrors = 0;
+  int TestCase::m_numTests = 0;
+  std::vector<std::string>  TestCase::m_arrStrings;
+  bool TestCase::m_bPrintGCState = false;
+  std::string TestCase::m_strTestDataDir(".");
+  Config TestCase::m_Cfg;
+
+  TestCase * TestCase::m_pCurTestCase = NULL;
+
+  TestCase *TestCase::m_root = 0;
+  Reporter *TestCase::m_reporter = 0;
+
+  void TestCase::registerTestCase(TestCase *in_testCase) {
+    in_testCase->m_next = m_root;
+    m_root = in_testCase;
+  }
+
+  int TestCase::run(Reporter *in_reporter, const char *in_testName, bool invert)
+  {
+    TestCase::m_reporter = in_reporter;
+
+    m_numErrors = 0;
+    m_numTests = 0;
+
+    TestCase *tmp = m_root;
+    while (tmp != 0) {
+      m_pCurTestCase = tmp;
+      try {
+        tmp->myRun(in_testName, invert);
+      } catch ( std::exception& ex ) {
+        in_reporter->message( "EXCEPTION: ");
+        in_reporter->message( ex.what() );
+      }
+      tmp = tmp->m_next;
+    }
+
+    return m_numErrors;
+  }
+
+  void TestCase::print_gc_state()
+  {
+      if ( m_bPrintGCState ) {
+          {
+              cds::gc::hzp::GarbageCollector::InternalState stat;
+              std::cout << cds::gc::hzp::GarbageCollector::instance().getInternalState( stat ) << std::endl;
+          }
+
+          {
+              cds::gc::hrc::GarbageCollector::internal_state stat;
+              std::cout << cds::gc::hrc::GarbageCollector::instance().getInternalState( stat ) << std::endl;
+          }
+      }
+  }
+
+  void Config::load( const char * fileName )
+  {
+      std::ifstream s;
+      s.open( fileName );
+      if ( !s.is_open() ) {
+          std::cerr << "WARNING: Cannot open test cfg file " << fileName
+              << "\n\tUse default settings"
+              << std::endl;
+          return;
+      }
+
+      std::cout << "Using test config file: " << fileName << std::endl;
+
+      char buf[ 4096 ];
+
+      TestCfg * pMap = NULL;
+      while ( !s.eof() ) {
+          s.getline( buf, sizeof(buf)/sizeof(buf[0]) );
+          char * pszStr = buf;
+          // trim left
+          while ( *pszStr != 0 && (*pszStr == ' ' || *pszStr == '\t' )) ++pszStr;
+          // trim right
+          char * pszEnd = strchr( pszStr, 0 );
+          if ( pszEnd == pszStr )    // empty srtring
+              continue;
+          --pszEnd;
+          while ( pszEnd != pszStr && (*pszEnd ==' ' || *pszEnd=='\t' || *pszEnd=='\n' || *pszEnd=='\r' )) --pszEnd;
+
+          if ( pszStr == pszEnd  )    // empty string
+              continue;
+
+          pszEnd[1] = 0;
+
+          if ( *pszStr == '#' )    // comment
+              continue;
+
+          if ( *pszStr == '[' && *pszEnd == ']' ) {    // chapter header
+              *pszEnd = 0;
+              pMap = &( m_Cfg[ pszStr + 1 ] );
+              continue;
+          }
+
+          if ( !pMap )
+              continue;
+
+          char * pszEq = strchr( pszStr, '=' );
+          if ( !pszEq )
+              continue;
+          if ( pszEq == pszStr )
+              continue;
+
+          pszEnd = pszEq;
+          while ( pszStr <= --pszEnd && (*pszEnd ==' ' || *pszEnd=='\t' || *pszEnd=='\n' || *pszEnd=='\r') );
+
+          if ( pszEnd <= pszStr )
+              continue;
+          pszEnd[1] = 0;
+          pMap->m_Cfg[ pszStr ] = pszEq + 1;
+      }
+      s.close();
+  }
+
+  std::vector<std::string> const &    TestCase::getTestStrings()
+  {
+      if ( m_arrStrings.empty() ) {
+          std::string strTestDir = m_strTestDataDir;
+
+          std::ifstream fDict;
+          char bufLine[1024];
+          std::cout << "Loading test data " << strTestDir << "/dictionary.txt..." << std::endl;
+          fDict.open( (strTestDir + "/dictionary.txt").c_str() );
+          if ( fDict.is_open() ) {
+              cds::OS::Timer timer;
+              std::string str;
+              fDict >> str    ;   // number of lines in file
+
+              // Assume that dictionary.txt does not contain doubles.
+              CppUnitMini::TestCase::m_arrStrings.reserve( atol(str.c_str()) );
+              while ( !fDict.eof() ) {
+                  fDict.getline( bufLine, sizeof(bufLine)/sizeof(bufLine[0]) );
+                  if ( bufLine[0] )
+                    m_arrStrings.push_back( bufLine );
+              }
+              fDict.close();
+
+              std::cout << "  Duration=" << timer.duration() << " String count " << CppUnitMini::TestCase::m_arrStrings.size() << std::endl;
+          }
+          else
+              std::cout << "  Failed, file not found" << std::endl;
+
+      }
+      return m_arrStrings;
+  }
+}
+
+static void usage(const char* name)
+{
+  printf("Usage : %s [-t=<class>[::<test>]] [-x=<class>[::<test>]] [-f=<file>] [-m]\n", name);
+  printf("\t[-t=<class>[::<test>]] : test class or class::test to execute;\n");
+  printf("\t[-x=<class>[::<test>]] : test class or class::test to exclude from execution;\n");
+  printf("\t[-d=dir] : test data directory (default is .);\n");
+  printf("\t[-f=<file>] : output file");
+  //printf(";\n\t[-m] : monitor test execution, display time duration for each test\n");
+  printf("\t[-gc_state] : print gc state after each test\n");
+  printf("\t[-cfg=<file>] : config file name for tests\n");
+}
+
+int main(int argc, char** argv)
+{
+
+#ifdef CDS_MSVC_MEMORY_LEAKS_DETECTING_ENABLED
+    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
+#endif
+
+  // CppUnit(mini) test launcher
+  // command line option syntax:
+  // test [Options]
+  // where Options are
+  //  -t=CLASS[::TEST]    run the test class CLASS or member test CLASS::TEST
+  //  -x=CLASS[::TEST]    run all except the test class CLASS or member test CLASS::TEST
+  //  -d=dir              test data directory (default is .)
+  //  -f=FILE             save output in file FILE instead of stdout
+  //  -m                  monitor test(s) execution
+  //  -gc_state           print GC state after test
+  const char *fileName = 0;
+  const char *testName = "";
+  const char *xtestName = "";
+  const char *testDataDir = ".";
+  const char *cfgFileName =
+#ifdef _DEBUG
+      "test-debug.conf"
+#else
+      "test.conf"
+#endif
+;
+  bool doMonitoring = false;
+
+  for (int i = 1; i < argc; ++i) {
+    if (argv[i][0] == '-') {
+      if (!strncmp(argv[i], "-t=", 3)) {
+        testName = argv[i]+3;
+        continue;
+      }
+      else if (!strncmp(argv[i], "-f=", 3)) {
+        fileName = argv[i]+3;
+        continue;
+      }
+      else if (!strncmp(argv[i], "-x=", 3)) {
+        xtestName = argv[i]+3;
+        continue;
+      }
+      else if (!strncmp(argv[i], "-d=", 3)) {
+          testDataDir = argv[i] + 3;
+          continue;
+      }
+      else if ( !strncmp(argv[i], "-m", 2)) {
+        doMonitoring = true;
+        continue;
+      }
+      else if (!strncmp(argv[i], "-gc_state", 9)) {
+          CppUnitMini::TestCase::m_bPrintGCState = true;
+          continue;
+      }
+      else if( !strncmp(argv[i], "-cfg=", 5)) {
+          cfgFileName = argv[i] + 5;
+          continue;
+      }
+    }
+
+    // invalid option, we display normal usage.
+    usage(argv[0]);
+    return 1;
+
+  }
+
+  {
+    boost::posix_time::ptime cur( boost::posix_time::second_clock::local_time());
+
+    std::cout << "libcds version " << CDS_VERSION_STRING << "\n";
+    std::cout << "Test started " << cur << std::endl;
+  }
+
+
+  CppUnitMini::TestCase::m_strTestDataDir = testDataDir;
+
+  CppUnitMini::Reporter* reporter;
+  if (fileName != 0)
+    reporter = new CppUnitMini::FileReporter(fileName, doMonitoring);
+  else
+    reporter = new CppUnitMini::FileReporter(stdout, doMonitoring);
+
+  // Load config params
+  CppUnitMini::TestCase::m_Cfg.load( cfgFileName );
+
+  // Init CDS runtime
+  cds::Initialize();
+
+  int num_errors;
+  {
+      size_t nHazardPtrCount = 0;
+      {
+        CppUnitMini::TestCfg& cfg = CppUnitMini::TestCase::m_Cfg.get( "General" );
+        nHazardPtrCount = cfg.getULong( "hazard_pointer_count", 0 );
+      }
+
+      // Safe reclamation schemes
+      cds::gc::HP hzpGC( nHazardPtrCount );
+      cds::gc::HRC hrcGC( nHazardPtrCount );
+      cds::gc::PTB ptbGC;
+
+      // RCU varieties
+      typedef cds::urcu::gc< cds::urcu::general_instant<> >    rcu_gpi;
+      rcu_gpi   gpiRCU;
+
+      typedef cds::urcu::gc< cds::urcu::general_buffered<> >    rcu_gpb;
+      rcu_gpb   gpbRCU;
+
+      typedef cds::urcu::gc< cds::urcu::general_threaded<> >    rcu_gpt;
+      rcu_gpt   gptRCU;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+      typedef cds::urcu::gc< cds::urcu::signal_buffered<> >    rcu_shb;
+      rcu_shb   shbRCU( 256, SIGUSR1 );
+
+      typedef cds::urcu::gc< cds::urcu::signal_threaded<> >    rcu_sht;
+      rcu_sht   shtRCU( 256, SIGUSR2 );
+#endif
+
+      // System topology
+      {
+          std::cout
+              << "System topology:\n"
+              << "    Logical processor count: " << cds::OS::topology::processor_count() << "\n";
+          std::cout << std::endl;
+      }
+
+      {
+        CppUnitMini::TestCfg& cfg = CppUnitMini::TestCase::m_Cfg.get( "General" );
+        std::string strHZPScanStrategy = cfg.get( "HZP_scan_strategy", std::string("classic") );
+        if ( strHZPScanStrategy == "inplace" )
+            hzpGC.setScanType( cds::gc::hzp::inplace );
+        else if ( strHZPScanStrategy == "classic" )
+            hzpGC.setScanType( cds::gc::hzp::classic );
+        else {
+            std::cout << "Error value of HZP_scan_strategy in General section of test config\n";
+        }
+
+        switch (hzpGC.getScanType()) {
+        case cds::gc::hzp::inplace:
+            std::cout << "Use in-place scan strategy for Hazard Pointer memory reclamation algorithm\n";
+            break;
+        case cds::gc::hzp::classic:
+            std::cout << "Use classic scan strategy for Hazard Pointer memory reclamation algorithm\n";
+            break;
+        default:
+            std::cout << "ERROR: use unknown scan strategy for Hazard Pointer memory reclamation algorithm\n";
+            break;
+        }
+
+        std::cout << "     Hazard Pointer count: " << hzpGC.max_hazard_count() << "\n"
+                  << "  Max thread count for HP: " << hzpGC.max_thread_count() << "\n"
+                  << "Retired HP array capacity: " << hzpGC.retired_array_capacity() << "\n";
+      }
+
+      if ( CppUnitMini::TestCase::m_bPrintGCState ) {
+        cds::gc::hzp::GarbageCollector::InternalState stat;
+        cds::gc::hzp::GarbageCollector::instance().getInternalState( stat );
+
+        std::cout << "HZP GC constants:"
+            << "\n\tHP count per thread=" << stat.nHPCount
+            << "\n\tMax thread count=" << stat.nMaxThreadCount
+            << "\n\tMax retired pointer count per thread=" << stat.nMaxRetiredPtrCount
+            << "\n\tHP record size in bytes=" << stat.nHPRecSize
+            << "\n" << std::endl;
+      }
+
+      if ( CppUnitMini::TestCase::m_bPrintGCState ) {
+          cds::gc::hrc::GarbageCollector::internal_state stat;
+          cds::gc::hrc::GarbageCollector::instance().getInternalState( stat );
+
+          std::cout << "HRC GC constants:"
+              << "\n\tHRC count per thread=" << stat.nHPCount
+              << "\n\tMax thread count=" << stat.nMaxThreadCount
+              << "\n\tMax retired pointer count per thread=" << stat.nMaxRetiredPtrCount
+              << "\n\tHRC record size in bytes=" << stat.nHRCRecSize
+              << "\n" << std::endl;
+      }
+
+    // Attach main thread to CDS GC
+    cds::threading::Manager::attachThread();
+
+    if (xtestName[0] != 0)
+        num_errors = CppUnitMini::TestCase::run(reporter, xtestName, true);
+    else
+        num_errors = CppUnitMini::TestCase::run(reporter, testName);
+
+    // Detach main thread from CDS GC
+    cds::threading::Manager::detachThread();
+
+  }
+
+  // Finalize CDS runtime
+  cds::Terminate();
+
+  reporter->printSummary();
+  delete reporter;
+
+  return num_errors;
+}
+
+// See doc/README.intel for explanation about this code
+#if defined (STLPORT) && defined (__ICL) && (__ICL >= 900) && \
+            (_STLP_MSVC_LIB < 1300) && defined (_STLP_USE_DYNAMIC_LIB)
+#  include <exception>
+
+#  undef std
+namespace std
+{
+  void _STLP_CALL unexpected() {
+    unexpected_handler hdl;
+    set_unexpected(hdl = set_unexpected((unexpected_handler)0));
+    hdl();
+  }
+}
+#endif
diff --git a/tests/cppunit/thread.cpp b/tests/cppunit/thread.cpp
new file mode 100644 (file)
index 0000000..39088d9
--- /dev/null
@@ -0,0 +1,126 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+namespace CppUnitMini {
+
+    void TestThread::threadEntryPoint( TestThread * pInst )
+    {
+        pInst->run();
+    }
+
+    void TestThread::create()
+    {
+        m_pThread = new boost::thread( threadEntryPoint, this );
+    }
+
+    void TestThread::run()
+    {
+        try {
+            init();
+            m_Pool.onThreadInitDone( this );
+
+            test();
+            m_Pool.onThreadTestDone( this );
+
+            fini();
+            m_Pool.onThreadFiniDone( this );
+        }
+        catch ( std::exception& ex )
+        {
+            m_Pool.m_Test.message( "EXCEPTION in working thread: ");
+            m_Pool.m_Test.message( ex.what() );
+        }
+    }
+
+    void TestThread::error(const char *in_macroName, const char *in_macro, const char *in_file, int in_line)
+    {
+        m_Pool.m_Test.error( in_macroName, in_macro, in_file, in_line );
+    }
+
+
+    ThreadPool::~ThreadPool()
+    {
+        if ( m_pBarrierStart )
+            delete m_pBarrierStart;
+        if ( m_pBarrierDone )
+            delete m_pBarrierDone;
+
+        for ( size_t i = 0; i < m_arrThreads.size(); ++i )
+            delete m_arrThreads[i];
+        m_arrThreads.resize( 0 );
+    }
+
+    void    ThreadPool::add( TestThread * pThread, size_t nCount )
+    {
+        pThread->m_nThreadNo = m_arrThreads.size();
+        m_arrThreads.push_back( pThread );
+        while ( --nCount ) {
+            TestThread * p = pThread->clone();
+            if ( p ) {
+                p->m_nThreadNo = m_arrThreads.size();
+                m_arrThreads.push_back( p );
+            }
+        }
+    }
+
+    void    ThreadPool::run()
+    {
+        const size_t nThreadCount = m_arrThreads.size();
+        m_pBarrierStart = new boost::barrier( (unsigned int) nThreadCount );
+        // nThreadCount threads + current thread
+        m_pBarrierDone = new boost::barrier( (unsigned int) (nThreadCount + 1) );
+
+        for ( size_t i = 0; i < nThreadCount; ++i )
+            m_arrThreads[i]->create();
+
+        // Wait while all threads is done
+        m_pBarrierDone->wait();
+        boost::this_thread::sleep(boost::posix_time::milliseconds(500));
+    }
+
+    void ThreadPool::run( unsigned int nDuration )
+    {
+        const size_t nThreadCount = m_arrThreads.size();
+        m_pBarrierStart = new boost::barrier( (unsigned int) nThreadCount );
+        m_pBarrierDone = new boost::barrier( (unsigned int) (nThreadCount + 1) );
+
+        for ( size_t i = 0; i < nThreadCount; ++i )
+            m_arrThreads[i]->create();
+
+        boost::system_time stEnd( boost::get_system_time() + boost::posix_time::seconds( nDuration ) );
+        do {
+            boost::this_thread::sleep( stEnd );
+        } while ( boost::get_system_time() < stEnd );
+
+        for ( size_t i = 0; i < nThreadCount; ++i )
+            m_arrThreads[i]->stop();
+
+        // Wait while all threads is done
+        m_pBarrierDone->wait();
+        boost::this_thread::sleep(boost::posix_time::milliseconds(500));
+    }
+
+    void    ThreadPool::onThreadInitDone( TestThread * pThread )
+    {
+        // Calls in context of caller thread
+        // Wait while all threads started
+        m_pBarrierStart->wait();
+
+        pThread->m_Timer.reset();
+    }
+
+    void    ThreadPool::onThreadTestDone( TestThread * pThread )
+    {
+        // Calls in context of caller thread
+        pThread->m_nDuration = pThread->m_Timer.duration();
+    }
+
+    void    ThreadPool::onThreadFiniDone( TestThread * pThread )
+    {
+        // Calls in context of caller thread
+        // Wait while all threads done
+        m_pBarrierDone->wait();
+    }
+}
diff --git a/tests/cppunit/thread.h b/tests/cppunit/thread.h
new file mode 100644 (file)
index 0000000..535463f
--- /dev/null
@@ -0,0 +1,133 @@
+//$$CDS-header$$
+
+#ifndef __CPPUNIT_THREAD_H
+#define __CPPUNIT_THREAD_H
+
+#include "cppunit/cppunit_mini.h"
+#include <boost/thread.hpp>
+#include <cds/os/timer.h>
+#include <cds/threading/model.h>    // for attach/detach thread
+#include <cds/cxx11_atomic.h>
+
+namespace CppUnitMini {
+    static inline unsigned int Rand( unsigned int nMax )
+    {
+        double rnd = double( rand() ) / double( RAND_MAX );
+        unsigned int n = (unsigned int) (rnd * nMax);
+        return n < nMax ? n : (n-1);
+    }
+
+    class ThreadPool;
+    class TestThread
+    {
+    protected:
+        typedef TestThread  Base;
+        friend class ThreadPool;
+
+        ThreadPool&         m_Pool;
+        boost::thread *     m_pThread;
+        cds::OS::Timer      m_Timer;
+        CDS_ATOMIC::atomic<bool>    m_bTimeElapsed;
+
+    public:
+        double              m_nDuration;
+        size_t              m_nThreadNo;
+
+    protected:
+        static void threadEntryPoint( TestThread * pThread );
+
+        TestThread( TestThread& src )
+            : m_Pool( src.m_Pool )
+            , m_pThread( NULL )
+            , m_bTimeElapsed( false )
+            , m_nDuration( 0 )
+            , m_nThreadNo( 0 )
+        {}
+
+        virtual ~TestThread()
+        {
+            if ( m_pThread )
+                delete m_pThread;
+        }
+
+        virtual TestThread *    clone() = 0;
+
+        void create();
+        void run();
+
+        virtual void init() {}
+        virtual void test() = 0;
+        virtual void fini() {}
+        void stop()
+        {
+            m_bTimeElapsed.store( true, CDS_ATOMIC::memory_order_release );
+        }
+        bool time_elapsed() const
+        {
+            return m_bTimeElapsed.load( CDS_ATOMIC::memory_order_acquire );
+        }
+
+        bool check_timeout( size_t nMaxDuration )
+        {
+            return m_Timer.duration() > nMaxDuration;
+        }
+
+        void error(const char *in_macroName, const char *in_macro, const char *in_file, int in_line);
+
+    public:
+        TestThread( ThreadPool& pool )
+            : m_Pool( pool )
+            , m_pThread( NULL )
+            , m_nDuration( 0 )
+            , m_nThreadNo( 0 )
+        {}
+    };
+
+    class ThreadPool
+    {
+    public:
+        TestCase&                       m_Test;
+
+    private:
+        typedef std::vector< TestThread * >     thread_vector;
+
+        boost::thread_group             m_Pool;
+        thread_vector                   m_arrThreads;
+
+        boost::barrier * volatile       m_pBarrierStart;
+        boost::barrier * volatile       m_pBarrierDone;
+
+    public:
+        typedef thread_vector::iterator    iterator;
+
+    public:
+        ThreadPool( TestCase& tc )
+            : m_Test( tc )
+            , m_pBarrierStart( NULL )
+            , m_pBarrierDone( NULL )
+        {}
+        ~ThreadPool();
+
+        void    add( TestThread * pThread, size_t nCount );
+
+        void    run();
+        void    run( unsigned int nDuration );
+
+        void    onThreadInitDone( TestThread * pThread );
+        void    onThreadTestDone( TestThread * pThread );
+        void    onThreadFiniDone( TestThread * pThread );
+
+        iterator begin() { return m_arrThreads.begin(); }
+        iterator end()   { return m_arrThreads.end() ;   }
+
+        double  avgDuration() const
+        {
+            double nDur = 0;
+            for ( size_t i = 0; i < m_arrThreads.size(); ++i )
+                nDur += m_arrThreads[i]->m_nDuration;
+            return nDur / m_arrThreads.size();
+        }
+    };
+}
+
+#endif    // #ifndef __CPPUNIT_THREAD_H
diff --git a/tests/data/split.pl b/tests/data/split.pl
new file mode 100644 (file)
index 0000000..3d0f4c7
--- /dev/null
@@ -0,0 +1,39 @@
+#!/bin/perl\r
+\r
+my %words ;\r
+\r
+open( my $f, "text.txt" ) ;\r
+binmode $f ;\r
+\r
+my $text = ''  ;\r
+$text .= $_ while (<$f>) ;\r
+close $f ;\r
+\r
+my @a = split /[^\w'-]/, $text ;\r
+foreach my $w (@a) {\r
+       $words{$w} += 1 if $w ;\r
+}\r
+for (my $j = 1; $j < 30; ++$j ) {\r
+       for ( my $i = 0; $i + $j - 1 < @a; $i += 1 ) {\r
+               my $s = '';\r
+               for ( my $k = 0; $k < $j; ++$k ) {\r
+                       $s .= ' '.$a[$i+$k];\r
+               }\r
+               $s =~ /\s*(\S.+\S)\s*/;\r
+               $s = $1 ;\r
+               $s =~ s/\s\s+/ /g ;\r
+               $words{$s} += 1 ;\r
+       }\r
+}\r
+\r
+open (my $dst, ">dictionary.txt") ;\r
+binmode $dst ;\r
+\r
+my $nCount = 0 ;\r
+$nCount++ foreach (keys %words) ;\r
+print $dst $nCount, "\n" ;\r
+\r
+print "Generate test dictionary...\n" ;\r
+print $dst $_, "\n" foreach (keys %words)      ;\r
+\r
+close $dst  ;\r
diff --git a/tests/data/test-debug.conf b/tests/data/test-debug.conf
new file mode 100644 (file)
index 0000000..c72ae73
--- /dev/null
@@ -0,0 +1,196 @@
+[General]\r
+# HZP scan strategy, possible values are "classic", "inplace". Default is "classic"\r
+HZP_scan_strategy=inplace\r
+hazard_pointer_count=72\r
+\r
+[Atomic_ST]\r
+iterCount=10000\r
+\r
+[thread_init_fini]\r
+ThreadCount=4\r
+PassCount=100000\r
+\r
+[Allocator_ST]\r
+PassCount=10\r
+# Total allocation per pass, Megabytes\r
+AllocPerPass=1024\r
+\r
+[Linux_Scale]\r
+# Allocation count per test\r
+PassCount=1000000\r
+# Max allocated block size in bytes\r
+MaxBlockSize=65000\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=0\r
+\r
+[Hoard_ThreadTest]\r
+MinBlockSize=16\r
+MaxBlockSize=64\r
+BlockCount=5000\r
+PassCount=25\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=0\r
+\r
+[Larson]\r
+MinBlockSize=8\r
+MaxBlockSize=1024\r
+PassCount=100000\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=0\r
+\r
+[Random_Alloc]\r
+DataSize=1000\r
+MinBlockSize=8\r
+MaxBlockSize=100000\r
+PassCount=100000\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=0\r
+\r
+\r
+[Spinlock_MT]\r
+ThreadCount=4\r
+LoopCount=100000\r
+\r
+[Stack_Push]\r
+ThreadCount=8\r
+StackSize=100000\r
+EliminationSize=4\r
+\r
+[Stack_PushPop]\r
+PushThreadCount=16\r
+PopThreadCount=16\r
+StackSize=1600000\r
+EliminationSize=4\r
+\r
+[IntrusiveStack_PushPop]\r
+PushThreadCount=16\r
+PopThreadCount=16\r
+StackSize=1600000\r
+EliminationSize=4\r
+# Flat combining stack parameters\r
+# FCIterate=1 - the test will be run iteratively\r
+#   for combine pass count from 1 to FCCombinePassCount\r
+#   and compact factor from 1 to FCCompactFactor\r
+# FCIterate=0 - the test runs only once for giving\r
+#   FCCombinePassCount and FCCompactFactor\r
+FCIterate=0\r
+FCCombinePassCount=4\r
+FCCompactFactor=64\r
+\r
+[Queue_Push]\r
+ThreadCount=8\r
+QueueSize=100000\r
+\r
+[Queue_Pop]\r
+ThreadCount=8\r
+QueueSize=100000\r
+\r
+[Queue_ReaderWriter]\r
+ReaderCount=3\r
+WriterCount=3\r
+QueueSize=100000\r
+\r
+[IntrusiveQueue_ReaderWriter]\r
+ReaderCount=3\r
+WriterCount=3\r
+QueueSize=100000\r
+\r
+[Queue_Random]\r
+ThreadCount=4\r
+QueueSize=500000\r
+\r
+[PQueue_Push]\r
+ThreadCount=4\r
+QueueSize=10000\r
+\r
+[PQueue_PushPop]\r
+PushThreadCount=4\r
+PopThreadCount=4\r
+QueueSize=10000\r
+\r
+[Map_Nonconcurrent_iterator]\r
+MapSize=1000000\r
+\r
+[Map_Nonconcurrent_iterator_MT]\r
+ThreadCount=4\r
+MapSize=1000000\r
+\r
+[Map_find_int]\r
+ThreadCount=2\r
+MapSize=10000\r
+PercentExists=50\r
+PassCount=2\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_find_string]\r
+ThreadCount=2\r
+MapSize=10000\r
+PercentExists=50\r
+PassCount=2\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_int]\r
+InsertThreadCount=4\r
+DeleteThreadCount=4\r
+ThreadPassCount=8\r
+MapSize=50000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_func]\r
+InsertThreadCount=4\r
+DeleteThreadCount=4\r
+EnsureThreadCount=4\r
+ThreadPassCount=8\r
+MapSize=5000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_Item_int]\r
+ThreadCount=4\r
+MapSize=10000\r
+GoalItem=5000\r
+AttemptCount=1000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_string]\r
+InsertThreadCount=4\r
+DeleteThreadCount=4\r
+ThreadPassCount=8\r
+MapSize=10000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_Item_string]\r
+ThreadCount=4\r
+MapSize=10000\r
+GoalItemIndex=5000\r
+AttemptCount=1000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsFind_int]\r
+ThreadCount=0\r
+MapSize=1000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDelFind]\r
+InitialMapSize=50000\r
+ThreadCount=4\r
+MaxLoadFactor=8\r
+InsertPercentage=5\r
+DeletePercentage=5\r
+Duration=7\r
+PrintGCStateFlag=1\r
+\r
+[Map_DelOdd]\r
+MapSize=500000\r
+InsThreadCount=2\r
+DelThreadCount=2\r
+ExtractThreadCount=2\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1
\ No newline at end of file
diff --git a/tests/data/test-express.conf b/tests/data/test-express.conf
new file mode 100644 (file)
index 0000000..e4f7da0
--- /dev/null
@@ -0,0 +1,194 @@
+[General]\r
+# HZP scan strategy, possible values are "classic", "inplace". Default is "classic"\r
+HZP_scan_strategy=inplace\r
+# Hazard pointer count per thread, for gc::HP and gc::HRC\r
+hazard_pointer_count=72\r
+\r
+[Atomic_ST]\r
+iterCount=1000000\r
+\r
+[thread_init_fini]\r
+ThreadCount=8\r
+PassCount=100000\r
+\r
+[Allocator_ST]\r
+PassCount=5\r
+# Total allocation per pass, Megabytes\r
+AllocPerPass=256\r
+\r
+[Linux_Scale]\r
+# Allocation count per test\r
+PassCount=100000\r
+# Max allocated block size in bytes\r
+MaxBlockSize=10000\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=4\r
+\r
+[Hoard_ThreadTest]\r
+MinBlockSize=16\r
+MaxBlockSize=64\r
+BlockCount=10000\r
+PassCount=10\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=4\r
+\r
+[Larson]\r
+MinBlockSize=8\r
+MaxBlockSize=1024\r
+BlocksPerThread=1000\r
+PassCount=1000000\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=4\r
+\r
+[Random_Alloc]\r
+DataSize=1000\r
+MinBlockSize=8\r
+MaxBlockSize=65000\r
+PassCount=100000\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=4\r
+\r
+[Spinlock_MT]\r
+ThreadCount=8\r
+LoopCount=1000000\r
+\r
+[Stack_Push]\r
+ThreadCount=8\r
+StackSize=500000\r
+EliminationSize=4\r
+\r
+[Stack_PushPop]\r
+PushThreadCount=4\r
+PopThreadCount=4\r
+StackSize=4000000\r
+EliminationSize=4\r
+\r
+[IntrusiveStack_PushPop]\r
+PushThreadCount=4\r
+PopThreadCount=4\r
+StackSize=4000000\r
+EliminationSize=4\r
+# Flat combining stack parameters\r
+# FCIterate=1 - the test will be run iteratively\r
+#   for combine pass count from 1 to FCCombinePassCount\r
+#   and compact factor from 1 to FCCompactFactor\r
+# FCIterate=0 - the test runs only once for giving\r
+#   FCCombinePassCount and FCCompactFactor\r
+FCIterate=0\r
+FCCombinePassCount=4\r
+FCCompactFactor=64\r
+\r
+[Queue_Push]\r
+ThreadCount=8\r
+QueueSize=500000\r
+\r
+[Queue_Pop]\r
+ThreadCount=8\r
+QueueSize=500000\r
+\r
+[Queue_ReaderWriter]\r
+ReaderCount=4\r
+WriterCount=4\r
+QueueSize=500000\r
+\r
+[IntrusiveQueue_ReaderWriter]\r
+ReaderCount=4\r
+WriterCount=4\r
+QueueSize=500000\r
+\r
+[Queue_Random]\r
+ThreadCount=8\r
+QueueSize=500000\r
+\r
+[Queue_bounded_empty_ST]\r
+PassCount=100\r
+QueueSize=256\r
+\r
+[PQueue_Push]\r
+ThreadCount=8\r
+QueueSize=1000000\r
+\r
+[PQueue_PushPop]\r
+PushThreadCount=4\r
+PopThreadCount=4\r
+QueueSize=500000\r
+\r
+[Map_find_int]\r
+ThreadCount=8\r
+MapSize=100000\r
+PercentExists=50\r
+PassCount=2\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_find_string]\r
+ThreadCount=8\r
+MapSize=100000\r
+PercentExists=50\r
+PassCount=2\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_int]\r
+InsertThreadCount=4\r
+DeleteThreadCount=4\r
+ThreadPassCount=2\r
+MapSize=100000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_func]\r
+InsertThreadCount=4\r
+DeleteThreadCount=4\r
+EnsureThreadCount=4\r
+ThreadPassCount=4\r
+MapSize=100000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_Item_int]\r
+ThreadCount=8\r
+MapSize=100000\r
+GoalItem=50000\r
+AttemptCount=100\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_string]\r
+InsertThreadCount=4\r
+DeleteThreadCount=4\r
+ThreadPassCount=2\r
+MapSize=100000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_Item_string]\r
+ThreadCount=8\r
+MapSize=100000\r
+GoalItemIndex=50000\r
+AttemptCount=100\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsFind_int]\r
+ThreadCount=0\r
+MapSize=1000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDelFind]\r
+InitialMapSize=500000\r
+ThreadCount=8\r
+MaxLoadFactor=4\r
+InsertPercentage=5\r
+DeletePercentage=5\r
+Duration=15\r
+PrintGCStateFlag=1\r
+\r
+[Map_DelOdd]\r
+MapSize=500000\r
+InsThreadCount=4\r
+DelThreadCount=3\r
+ExtractThreadCount=3\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1
\ No newline at end of file
diff --git a/tests/data/test.conf b/tests/data/test.conf
new file mode 100644 (file)
index 0000000..a5468fc
--- /dev/null
@@ -0,0 +1,189 @@
+[General]\r
+# HZP scan strategy, possible values are "classic", "inplace". Default is "classic"\r
+HZP_scan_strategy=inplace\r
+hazard_pointer_count=72\r
+\r
+[Atomic_ST]\r
+iterCount=1000000\r
+\r
+[thread_init_fini]\r
+ThreadCount=8\r
+PassCount=100000\r
+\r
+[Allocator_ST]\r
+PassCount=10\r
+# Total allocation per pass, Megabytes\r
+AllocPerPass=1024\r
+\r
+[Linux_Scale]\r
+# Allocation count per test\r
+PassCount=10000000\r
+# Max allocated block size in bytes\r
+MaxBlockSize=66000\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=0\r
+\r
+[Hoard_ThreadTest]\r
+MinBlockSize=16\r
+MaxBlockSize=1024\r
+BlockCount=10000\r
+PassCount=500\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=0\r
+\r
+[Larson]\r
+MinBlockSize=8\r
+MaxBlockSize=1024\r
+BlocksPerThread=1000\r
+PassCount=5000000\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=0\r
+\r
+[Random_Alloc]\r
+DataSize=1000\r
+MinBlockSize=8\r
+MaxBlockSize=100000\r
+PassCount=500000\r
+# Max thread count. 0 is processor_count * 2\r
+MaxThreadCount=0\r
+\r
+[Spinlock_MT]\r
+ThreadCount=8\r
+LoopCount=1000000\r
+\r
+[Stack_Push]\r
+ThreadCount=8\r
+StackSize=2000000\r
+EliminationSize=4\r
+\r
+[Stack_PushPop]\r
+PushThreadCount=16\r
+PopThreadCount=16\r
+StackSize=16000000\r
+EliminationSize=4\r
+\r
+[IntrusiveStack_PushPop]\r
+PushThreadCount=16\r
+PopThreadCount=16\r
+StackSize=32000000\r
+EliminationSize=4\r
+# Flat combining stack parameters\r
+# FCIterate=1 - the test will be run iteratively\r
+#   for combine pass count from 1 to FCCombinePassCount\r
+#   and compact factor from 1 to FCCompactFactor\r
+# FCIterate=0 - the test runs only once for giving\r
+#   FCCombinePassCount and FCCompactFactor\r
+FCIterate=0\r
+FCCombinePassCount=8\r
+FCCompactFactor=64\r
+\r
+[Queue_Push]\r
+ThreadCount=8\r
+QueueSize=5000000\r
+\r
+[Queue_Pop]\r
+ThreadCount=8\r
+QueueSize=5000000\r
+\r
+[Queue_ReaderWriter]\r
+ReaderCount=4\r
+WriterCount=4\r
+QueueSize=5000000\r
+\r
+[IntrusiveQueue_ReaderWriter]\r
+ReaderCount=4\r
+WriterCount=4\r
+QueueSize=5000000\r
+\r
+[Queue_Random]\r
+ThreadCount=8\r
+QueueSize=5000000\r
+\r
+[PQueue_Push]\r
+ThreadCount=8\r
+QueueSize=10000000\r
+\r
+[PQueue_PushPop]\r
+PushThreadCount=4\r
+PopThreadCount=4\r
+QueueSize=10000000\r
+\r
+[Map_find_int]\r
+ThreadCount=8\r
+MapSize=2000000\r
+PercentExists=50\r
+PassCount=1\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_find_string]\r
+ThreadCount=8\r
+MapSize=2000000\r
+PercentExists=50\r
+PassCount=1\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_int]\r
+InsertThreadCount=4\r
+DeleteThreadCount=4\r
+ThreadPassCount=2\r
+MapSize=1000000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_func]\r
+InsertThreadCount=4\r
+DeleteThreadCount=4\r
+EnsureThreadCount=4\r
+ThreadPassCount=2\r
+MapSize=1000000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_Item_int]\r
+ThreadCount=8\r
+MapSize=1000000\r
+GoalItem=500000\r
+AttemptCount=10000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_string]\r
+InsertThreadCount=4\r
+DeleteThreadCount=4\r
+ThreadPassCount=2\r
+MapSize=500000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDel_Item_string]\r
+ThreadCount=8\r
+MapSize=500000\r
+GoalItemIndex=250000\r
+AttemptCount=500\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsFind_int]\r
+ThreadCount=0\r
+MapSize=5000\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
+\r
+[Map_InsDelFind]\r
+InitialMapSize=500000\r
+ThreadCount=8\r
+MaxLoadFactor=4\r
+InsertPercentage=5\r
+DeletePercentage=5\r
+Duration=15\r
+PrintGCStateFlag=1\r
+\r
+[Map_DelOdd]\r
+MapSize=1000000\r
+InsThreadCount=4\r
+DelThreadCount=3\r
+ExtractThreadCount=3\r
+MaxLoadFactor=4\r
+PrintGCStateFlag=1\r
diff --git a/tests/data/text.txt b/tests/data/text.txt
new file mode 100644 (file)
index 0000000..8b800cf
--- /dev/null
@@ -0,0 +1,6611 @@
+
+                    <i>There  is  but one problem --
+                    the only one in the world --
+                    to restore to men a spiritual
+                    content, spiritual concerns....</i>
+                              <b>-- A de St. Exupery</b>
+
+
+     The customs  inspector  had  a  round  smooth  face  which
+registered   the   most   benevolent   of   attitudes.  He  was
+respectfully cordial and solicitous.
+     "Welcome," he murmured. "How do you like our sunshine?" He
+glanced at the passport in my hand. "Beautiful  morning,  isn't
+it?"
+     I  proffered him my passport and stood the suitcase on the
+white counter. The inspector rapidly leafed through it with his
+long careful fingers. He was dressed in a  white  uniform  with
+silver  buttons  and silver braid on the shoulders. He laid the
+passport aside and touched the suitcase with the  tips  of  his
+fingers.
+     "Curious,"  he  said.  "The  case has not yet dried. It is
+difficult to imagine that somewhere the weather can be bad."
+     "Yes," I said with a sigh, "we are already well  into  the
+autumn," and opened the suitcase.
+     The  inspector  smiled  sympathetically  and glanced at it
+absent-mindedly.  "It's  impossible  amid   our   sunshine   to
+visualize  an  autumn.  Thank  you,  that  will  be  quite  all
+right.... Rain, wet roofs, wind...
+     "And what if I have something hidden under the  linen?"  I
+asked -- I don't appreciate conversations about the weather. He
+laughed heartily.
+     "Just   an   empty  formality,"  he  said.  "Tradition.  A
+conditioned reflex of all customs inspectors, if you will."  He
+handed  me  a  sheet  of  heavy  paper.  "And  here  is another
+conditioned reflex. Please read it -- it's rather unusual.  And
+sign it if you don't mind."
+     I  read.  It  was a law concerning immigration, printed in
+elegant type on heavy paper and in four languages.  Immigration
+was absolutely forbidden. The customs man regarded me steadily.
+     "Curious, isn't it?" he asked.
+     "In  any  case  it's  intriguing,"  I  replied, drawing my
+fountain pen. "Where do I sign?"
+     "Where and how you please," said the  customs  man.  "Just
+across will do."
+     I signed under the Russian text over the line "I have been
+informed on the immigration laws."
+     'Thank  you,"  said the customs man, filing the paper away
+in his desk, 'Now you know practically all our laws. And during
+your entire stay -- How long will you be staying with us?"
+     I shrugged my shoulders.
+     "It's difficult to say in advance. Depends on how the work
+will go."
+     "Shall we say a month?"
+     'That would be about it. Let's say a month."
+     "And during this whole month," he bent over  the  passport
+making  some notation, "during this entire month you won't need
+any other laws." He handed me my passport.  "I  shouldn't  even
+have  to  mention that you can prolong your stay with us to any
+reasonable extent. But in the meantime, let it be thirty  days.
+If  you  find  it  desirable  to  stay longer, visit the police
+station on the 16th of May  and  pay  one  dollar...  You  have
+dollars?"
+     "Yes."
+     "That's  fine.  By  the way, it is not at all necessary to
+have exclusively a dollar.  We  accept  any  currency.  Rubles,
+pounds, cruzeiros."
+     "I  don't  have  cruzeiros," I said. 'I have only dollars,
+rubles, and some English pounds. Will that suit you?"
+     "Undoubtedly. By the way, so as not to forget,  would  you
+please deposit ninety dollars and seventy-two cents."
+     "With pleasure," I said, "but why?"
+     "It's  customary.  To guarantee the minimum needs. We have
+never had anyone with us who did not have some needs."
+     I counted out  ninety-one  dollars,  and  without  sitting
+down,  he  proceeded  to write out a receipt. His neck grew red
+from the awkward position. I looked around. The  white  counter
+stretched  along  the entire pavilion. On the other side of the
+barrier, customs inspectors in white smiled cordially, laughed,
+explained things  in  a  confidential  manner.  On  this  side,
+brightly  clad  tourists shuffled impatiently, snapped suitcase
+locks, and gaped excitedly. While they waited  they  feverishly
+thumbed through advertising brochures, loudly devised all kinds
+of plans, secretly and openly anticipated happy days ahead, and
+now  thirsted  to  surmount  the  white  counter  as quickly as
+possible.  Sedate  London  clerks  and  their  athletic-looking
+brides, pushy Oklahoma farmers in bright shirts hanging outside
+Bermuda  shorts  and sandals over bare feet, Turin workers with
+their  well-rouged  wives  and  numerous  children,  small-time
+Catholic  bosses from Spain, Finnish lumbermen with their pipes
+considerately banked,  Hungarian  basketball  players,  Iranian
+students, union organizers from Zambia...
+     The  customs  man  gave  me  my  receipt  and  counted out
+twenty-eight cents change.
+     "Well -- there is all the  formality.  I  hope  I  haven't
+detained you too long. May I wish you a pleasant stay!"
+     "Thank you," I said and took my suitcase.
+     He  regarded  me  with  his  head  slightly bent sideways,
+smiling out of his bland, smooth face.
+     "Through this turnstile, please. <i>Au revoir.</i>  May  I
+once more wish you the best."
+     I  went  out  on  the plaza following an Italian pair with
+four kids and two robot redcaps.
+     The sun stood high over mauve mountains. Everything in the
+plaza was bright and shiny and colorful. A bit too  bright  and
+colorful,   as   it   usually  is  in  resort  towns.  Gleaming
+orange-and-red buses surrounded by tourist  crowds,  shiny  and
+polished  green  of  the  vegetation in the squares with white,
+blue, yellow, and gold pavilions, kiosks, and tents. Mirrorlike
+surfaces, vertical, horizontal, and inclined, which flared with
+sunbursts. Smooth matte hexagons underfoot and under the wheels
+-- red, black, and gray, just slightly springy  and  smothering
+the  sound  of  footsteps.  I  put down the suitcase and donned
+sunglasses.
+     Out of all the sunny towns it has been my luck  to  visit,
+this  was without a doubt the sunniest. And that was all wrong.
+It would have been much easier if the day  had  been  gray,  if
+there had been dirt and mud, if the pavilion had also been gray
+with  concrete walls, and if on that wet concrete was scratched
+something obscene, tired, and pointless, born of boredom.  Then
+I  would  probably  feel like working at once. I am positive of
+this because such things are irritating and demand action. It's
+still hard to get used to the idea that poverty can be wealthy.
+And so the urge is lacking and there  is  no  desire  to  begin
+immediately,  but  rather  to take one of these buses, like the
+red-and-blue one, and take off to the beach, do a little  scuba
+diving, get a tan, play some ball, or find Peck, stretch out on
+the floor in some cool room and reminisce on all the good stuff
+so  that  he  could  ask  about  Bykov,  about  the Trans-Pluto
+expedition, about the new ships on which I too  am  behind  the
+times,  but  still  know  better  than he, and so that he could
+recollect the uprising and boast of  his  scars  and  his  high
+social  position....  It  would  be most convenient if Peck did
+have a high social position. It would be well if he  were,  for
+example, a mayor....
+     A  small  darkish  rotund individual in a white suit and a
+round white hat set at a rakish angle approached  deliberately,
+wiping  his  lips  with  a  dainty  handkerchief.  The  hat was
+equipped with a transparent green shade and a green  ribbon  on
+which  was  stamped "Welcome." On his right earlobe glistened a
+pendant radio.
+     "Welcome aboard," said the man.
+     "Hello," said I.
+     "A pleasure to have you with us. My name is Ahmad."
+     "And my name is Ivan,"  said  I.  "Pleased  to  make  your
+acquaintance."
+     We nodded to each other and regarded the tourists entering
+the buses.  They  were  happily  noisy and the warm wind rolled
+their discarded butts and crumpled  candy  wrappers  along  the
+square. Ahmad's face bore a green tint from the light filtering
+through his cap visor.
+     "Vacationers,"  he said. "Carefree and loud. Now they will
+be taken to their hotels and will immediately rush off  to  the
+beaches."
+     "I wouldn't mind a run on water skis," I observed.
+     "Really?  I  never would have guessed. There's nothing you
+look less like than a vacationer."
+     "So be it," I said. "In fact I did come to work"
+     "To work? Well, that happens too, some  do  come  to  work
+here.  Two  years  back  Jonathan  Kreis  came  here to paint a
+picture." He laughed. "Later there was  an  assault-and-battery
+case  in  Rome,  some papal nuncio was involved, can't remember
+his name."
+     "Because of the picture?"
+     "No, hardly. He didn't paint a thing here. The casino  was
+where  you  could  find  him  day  or night. Shall we go have a
+drink?"
+     "Let's. You can give me a few pointers."
+     "It's my pleasurable duty -- to give advice," said Ahmad.
+     We bent down simultaneously and both of us  took  hold  of
+the suitcase handle.
+     "It's okay -- I'll manage."
+     "No,"  countered Ahmad, "you are the guest and I the host.
+Let's go to yonder bar. It's quiet there at this time."
+     We went in under a blue  awning.  Ahmad  seated  me  at  a
+table,  put  my  suitcase  on  a  vacant chair, and went to the
+counter. It was cool and  an  air  conditioner  sighed  in  the
+background. Ahmad returned with a tray. There were tall glasses
+and flat plates with butter-gold tidbits.
+     "Not very strong," said Ahmad, "but really cold to make up
+for that."
+     "I don't like it strong in the morning either," I said.
+     I quaffed the glass. The stuff was good.
+     "A  swallow  --  a  bite,"  counseled Ahmad, "Like this: a
+swallow, a bite."
+     The tidbits crunched and melted in the mouth. In my  view,
+they  were  unnecessary. We were silent for some time, watching
+the square from under the marquee. gently  purring,  the  buses
+pulled  out  one after another into their respective tree-lined
+avenues. They looked ponderous yet strangely elegant  in  their
+clumsiness.
+     "It would be too noisy there," said Ahmad. "Fine cottages,
+lots of  women  -- to suit any taste -- and right on the water,
+but no privacy. I don't think it's for you."
+     "Yes," I agreed. "The noise would  bother  me.  Anyway,  I
+don't  like vacationers, Ahmad. Can't stand it when people work
+at having fun."
+     Ahmad nodded and carefully placed the next tidbit  in  his
+mouth. I watched him chew. There was something professional and
+concentrated   in   the  movement  of  his  lower  jaw.  Having
+swallowed, he said, "No, the synthetic will never compare  with
+the natural product. Not the same bouquet." He flexed his lips,
+smacked  them  gently,  and continued, "There are two excellent
+hotels in the center of town, but, in my view..."
+     "Yes, that won't do  either,"  I  said.  "A  hotel  places
+certain  obligations  on  you.  I  never  heard  that  anything
+worthwhile has ever been written in a hotel."
+     "Well, that's not quite true," retorted Ahmad,  critically
+studying  the last tidbit. "I read one book and in it they said
+that it was in fact written in a hotel -- the Hotel Florida."
+     "Aah," I said, "you are correct. But then your city is not
+being shelled by cannons."
+     "Cannons? Of course not. Not as a rule, anyway."
+     "Just as I thought. But, as a matter of fact, it has  been
+noted  that something worthwhile can be written only in a hotel
+which is under bombardment."
+     Ahmad took the last tidbit after all.
+     'That would be difficult to arrange,"  he  said.  "In  our
+times  it's  hard  to  obtain  a  cannon.  Besides,  it's  very
+expensive; the hotel could lose its clientele."
+     "Hotel  Florida  also  lost  its  clients  in  its   time.
+Hemingway lived in it alone."
+     "Who?"
+     "Hemingway."
+     "Ah... but that was so long ago, in the fascist times. But
+times have changed, Ivan."
+     "Yes,"  said  I,  "and  therefore in our times there is no
+point in writing in hotels."
+     "To blazes with hotels then," said Ahmad. "I know what you
+need. You need a boarding  house."  He  took  out  a  notebook.
+"State your requirements and we'll try to match them up."
+     "Boarding house," I said. "I don't know. I don't think so,
+Ahmad.  Do  understand  that I don't want to meet people whom I
+don't want to know. That's to begin with.  And  in  the  second
+place,  who  lives  in  private  boarding  houses?  These  same
+vacationers who don't have enough money for a cottage. They too
+work hard at having fun. They concoct picnics, meets, and  song
+fests.  At night they play the banjo. On top of which they grab
+anyone they can get  hold  of  and  make  them  participate  in
+contests  for the longest uninterrupted kiss. Most important of
+all, they are all transients.  But  I  am  interested  in  your
+country, Ahmad. In your townspeople. I'll tell you what I need:
+I  need a quiet house with a garden. Not too far from downtown.
+A relaxed family, with a respectable housewife.  An  attractive
+young daughter. You get the picture, Ahmad?"
+     Ahmad  took  the  empty glasses, went over to the counter,
+and returned with full ones. Now  they  contained  a  colorless
+transparent  liquid and the small plates were stacked with tiny
+multistoried sandwiches.
+     "I know of such a cozy house," declared Ahmad. "The  widow
+is forty-five and the daughter twenty. The son is eleven. Let's
+finish  the drinks and we'll be on our way. I think you'll like
+it. The rent is standard, but of course it's  more  than  in  a
+hoarding house. You have come to stay for a long time?"
+     "For a month."
+     "Good Lord! Just a month?"
+     "I  don't know how my affairs will go. Perhaps I may tarry
+awhile."
+     "By all means, you will," said Ahmad. "I can see that  you
+have  totally  failed to grasp just where you have arrived. You
+simply don't understand what a good time you can have here  and
+how you don't have to think about a thing."
+     We finished our drinks, got up, and went across the square
+under  the  hot  sun  to  the parking area. Ahmad walked with a
+rapid, slightly rolling gait, with the green visor of  his  cap
+set  low  over  his  eyes,  swinging the suitcase in a debonair
+manner.  The  next  batch  of  tourists  was  being  discharged
+broadcast from the customs house.
+     "Would you like me to... Frankly?" said Ahmad suddenly.
+     "Yes, I would like you to," said I. What else could I say?
+Forty years I have lived in this world and have yet to learn to
+deflect this unpleasant question.
+     "You  won't  write a thing here," said Ahmad. "It's mighty
+hard to write in our town."
+     "It's always hard to write anything. However,  fortunately
+I am not a writer."
+     "I  accept  this  gladly. But in that case, it is slightly
+impossible here. At least for a transient."
+     "You frighten me."
+     "It's not a case of being  frightened.  You  simply  won't
+want  to  work.  You  won't  be able to stay at the typewriter.
+You'll feel annoyed by the typewriter. Do you know what the joy
+of living is?"
+     "How shall I say?"
+     "You don't know anything, Ivan. So  far  you  still  don't
+know  anything  about  it. You are bound to traverse the twelve
+circles of paradise. It's funny, of course, but I envy you."
+     We stopped by a long open car. Ahmad  threw  the  suitcase
+into the back seat and flung the door open for me.
+     "Please," he said.
+     "Presumably  you  have  already  passed  through  them?" I
+asked, sliding into the seat.
+     He got in behind the wheel and started the engine.
+     "What exactly do you mean?"
+     "The twelve circles of paradise."
+     "As for me, Ivan, a long time ago I selected  my  favorite
+circle,"  said Ahmad. The car began to roll noiselessly through
+the square. "The others haven't existed  for  me  for  quite  a
+while.   Unfortunately.   It's  like  old  age,  with  all  its
+privileges and deficiencies."
+     The car rushed through a park and  sped  along  a  shaded,
+straight   thoroughfare.  I  kept  looking  around  with  great
+interest but couldn't recognize  a  thing.  It  was  stupid  to
+expect  to.  We had been landed at night, in a torrential rain;
+seven thousand exhausted tourists stood on the pier looking  at
+the  burning liner. We hadn't seen the city -- in its place was
+a black, wet emptiness dotted with red flashes. It had rattled,
+boomed, and screeched as though being rent asunder.  "We'll  be
+slaughtered  in the dark, like rabbits," Robert had said, and I
+immediately had sent him  back  to  the  barge  to  unload  the
+armored  car.  The gangway had collapsed and the car had fallen
+into the water, and when Peck had pulled Robert out,  all  blue
+from  the  cold,  he  had  come  over  to  me  and said through
+chattering teeth, "Didn't I tell you it was dark?"
+     Ahmad said suddenly, "When I was a boy, we lived near  the
+port  and we used to come out here to beat up the factory kids.
+Many of them had brass knuckles, and that got me a broken nose.
+Half of my life I put up with a crooked nose  until  I  had  it
+fixed last year. I sure loved to scrap when I was young. I used
+to  have a hunk of lead pipe, and once I had to sit in jail for
+six months, but that didn't help."
+     He stopped, grinning. I waited  awhile,  then  said,  "You
+can't  find  a good lead pipe these days. Now rubber truncheons
+are in fashion: you buy them used from the police."
+     "Exactly," said Ahmad. "Or else you buy  a  dumbbell,  cut
+off  one  ball and there you are, ready to go. But the guys are
+not what they used to be. Now you get deported for such stuff."
+     "Yes. And what else did you occupy yourself with  in  your
+youth?"
+     "And you?"
+     "I planned on joining the interplanetary force and trained
+to withstand  overstress.  We also played at who could dive the
+deepest."
+     "We too,"  said  Ahmad.  "We  went  down  ten  meters  for
+automatics  and  whiskey.  Over  by  the  piers they lay on the
+seabed by the case. I used to get nosebleeds. But when the fire
+fights started, we began to find corpses  with  weights  around
+their necks, so we quit that game."
+     "It's  a  very  unpleasant  sight, a corpse under water --
+especially if there is a current," said I.
+     Ahmad chuckled "I've seen worse. I had  occasion  to  work
+with the police."
+     "This was after the fracas?"
+     "Much later. When the anti-gangster laws were passed."
+     'They were called gangsters here too?"
+     "What  else  would you call them? Not brigands, certainly.
+'A group of brigands, armed with flame throwers and gas  bombs,
+have  laid  siege  to the municipal buildings,' " he pronounced
+expressively. "It doesn't sound right, you  can  feel  that.  A
+brigand  is  an  ax,  a  bludgeon, a mustache up to the ears, a
+cleaver --"
+     "A lead pipe," I offered.
+     Ahmad gurgled.
+     "What are you doing tonight?" he asked.
+     "Going for a walk."
+     "You have friends here?"
+     "Yes. Why?"
+     "Well... then it's different."
+     "How come?"
+     "Well, I was going to suggest something to you, but  since
+you have friends..."
+     "By the way, " I said, "who is your mayor?"
+     "Mayor?  The  devil  knows, I don't remember. Somebody was
+elected."
+     "Not Peck Xenai, by any chance?"
+     "I don't know." He sounded regretful. "I wouldn't want  to
+mislead you."
+     "Would you know the man anyway?"
+     "Xenai...  Peck  Xenai...  No,  I  don't knew him; haven't
+heard of him. What is he to you -- a friend?"
+     "Yes, an old friend. I have some others here, but they are
+all visitors."
+     "Well," said Ahmad, "if you should get bored and all kinds
+of thoughts begin to enter your head, come on over for a visit.
+Every single day from  seven  o'clock  on  I  am  at  the  Chez
+Gourmet. Do you like good eating?"
+     "Quite," said I.
+     "Stomach in good shape?"
+     "Like an ostrich's."
+     "Well,  then,  why  don't  you  come by? We'll have a fine
+time, and it won't be necessary to think about a thing."
+     Ahmad braked and turned cautiously into a driveway with an
+iron gate, which silently swung open before us. The car  rolled
+into the yard.
+     "We have arrived," announced Ahmad. "Here is your home."
+     The  house  was  two-storied,  white  with  blue trim. The
+windows were draped on the inside. A clean, deserted patio with
+multi-colored flagstones was surrounded by a fruit-tree garden,
+with apple branches touching the walls.
+     "And where is the widow?" I said.
+     "Let's go inside," said Ahmad.
+     He went up the steps, leafing through his notebook  I  was
+following  him  while looking around. I liked the mini-orchard.
+Ahmad found the right page and set up the  combination  on  the
+small  disc  by  the doorbell. The door opened. Cool, fresh air
+flowed out of the house. It was dark inside, but as soon as  we
+stepped  into  the hall, it lit up with concealed illumination.
+Putting away his notebook, Ahmad said, "To  the  right  is  the
+landlord's  half, to the left is yours. Please come in. Here is
+the living room, and there is the bar. In a minute we'll have a
+drink. And now here is your study. Do you have a phonor?"
+     "No."
+     "It's just as well. You have  everything  you  need  right
+here.  Come  on  over  here.  This is the bedroom. There is the
+control board for acoustic defense. You know how to use it?"
+     "I'll figure it out."
+     "Good. The defense is triple, you can have it quiet  as  a
+tomb  or  turn  the place into a bordello, whatever you like...
+Here's the air-conditioning control,  which,  incidentally,  is
+not  too  convenient,  as  you  can  only  operate  it from the
+bedroom."
+     "I'll manage," I said.
+     "What? Well, okay. Here is the bathroom and powder room."
+     "I  am  interested  in  the  widow,"  I  said,  "and   the
+daughter."
+     "All in good time. Shall I open the drapes?"
+     "What for?"
+     "Right you are, for no reason. Let's go have a drink."
+     We returned to the living room and Ahmad disappeared up to
+his waist in the bar.
+     "You want it on the strong side?" he asked.
+     "You have it backwards."
+     "Would you like an omelette? Sandwiches?"
+     "How about nothing?"
+     "No,"  said  Ahmad,  "an  omelette  it  shall  be  -- with
+tomatoes." He rummaged in the bar. "I don't know what does  it,
+but  this  autocooker  makes  an  altogether astonishingly good
+omelette with tomatoes. While we are at it, I will also have  a
+bite."
+     He  extracted  a  tray from the bar and placed it on a low
+table by a semicircular couch. We sat down.
+     "Now about the widow," I reminded him. "I would like to  .
+present myself."
+     "You like the rooms?"
+     "They'll do."
+     "Well, the widow is quite all right, too. And the daughter
+is not bad either."
+     He  extracted  a  flat  case from an inside pocket. Like a
+cartridge clip it was stacked with a  row  of  ampoules  filled
+with  colored  liquids.  Ahmad  ran his index finger over them,
+smelled the omelette, hesitated, and finally selected one  with
+a  green  fluid, broke it carefully, and dripped a few drops on
+the tomatoes. An aroma pervaded the room.  The  smell  was  not
+unpleasant,  but,  to  my taste, bore no particular relation to
+the food.
+     "Right now," continued Ahmad, "they are still asleep." His
+gaze turned abstracted. "They sleep and see dreams."
+     I looked at my watch.
+     "Well, well!"
+     Ahmad was enjoying his food.
+     "Ten-thirty!" I said.
+     Ahmad was enjoying his food. His cap was  pushed  back  on
+his  head,  and  the  green  visor stuck up vertically like the
+crest of an aroused mimicrodon. His eyes  were  half-closed.  I
+regarded him with interest.
+     Having  swallowed  the  last bit of tomato, he broke off a
+piece of the crust of white bread and carefully wiped  the  pan
+with it. His gaze cleared.
+     "What  were  you  saying?" he asked. "Ten-thirty? Tomorrow
+you too will get up at ten-thirty or maybe even at  twelve.  I,
+for one, will get up at twelve."
+     He got up and stretched luxuriously, cracking his joints.
+     "Well," he said, "it's time to go home, finally. Here's my
+card,  Ivan.  Put it in your desk, and don't throw it out until
+your very last day here." He went over  to  the  flat  box  and
+inserted another card into its slot. There was a loud click.
+     "Now  this  one,"  he said, examining the card against the
+light.  "Please  pass  on  to  the  widow  with  my  very  best
+compliments."
+     "And then what will happen?" said I.
+     "Money  will  happen.  I  trust  you  are not a devotee of
+haggling, Ivan? The widow will name a  figure,  Ivan,  and  you
+shouldn't haggle over it. It's not done."
+     "I  will try not to haggle," I said, "although it would be
+amusing to try it."
+     Ahmad raised his eyebrows.
+     "Well, if you really want to so much, then why not try it?
+Always do what you want to do. Then  you  will  have  excellent
+digestion. I will get your suitcase now."
+     "I  need  prospects,"  I  said. "I need guidebooks. I am a
+writer,  Ahmad.  I  will  require  brochures  on  the  economic
+situation  of  the  masses, statistical references. Where can I
+get all that? And when?"
+     "I will  give  you  a  guidebook,"  said  Ahmad.  "It  has
+statistics,  addresses, telephone numbers, and so on. As far as
+the masses are concerned, I don't think  we  publish  any  such
+nonsense.  Of  course,  you  can send an inquiry to UNESCO, but
+what  would  you  want  with  it?  You'll  see  everything  for
+yourself.  Just hold on a minute. I'll get the suitcase and the
+guidebook."
+     He went out and quickly returned with my suitcase  in  one
+hand and a fat bluish-looking little tome in the other.
+     I stood up.
+     "Judging by the look on your face," he announced, smiling,
+"you are debating whether it's proper to tip me or not."
+     "I confess," I said.
+     "Well then, would you like to do it or not?"
+     "No, I must admit."
+     "You  have  a  healthy, strong character," Ahmad approved.
+"Don't do it. Don't tip anybody. You could collect one  in  the
+face,  especially from the girls. But, on the other hand, don't
+haggle either. You could walk into one that  way  too.  Anyway,
+that's  all  a  lot of rot. For all I know you may like to have
+your face slapped, like that Jonathan  Kreis.  Farewell,  Ivan,
+have  fun,  and come to Chez Gourmet. Any evening at seven. But
+most important of all, don't think about a thing."
+     He waved his hand and left. I picked up the mixture in the
+dewy glass and sat down with the guidebook.
+
+
+<ul><a name=2></a><h2>Chapter TWO</h2></ul>
+
+     The guidebook was printed on bond paper with a gilt  edge.
+Interspersed  with  gorgeous  photographs,  it  contained  some
+curious information. In the  city  there  were  fifty  thousand
+people,  fifteen hundred cats, twenty thousand pigeons, and two
+thousand dogs (including seven hundred winners of medals).  The
+city  had fifteen thousand passenger cars, five thousand helis,
+a thousand taxis (with and without  chauffeurs),  nine  hundred
+automatic  garbage  collectors,  four  hundred  permanent bars,
+cafes, and snack bars, eleven restaurants, and four first-class
+hotels, and was a tourist establishment which served  over  one
+hundred  thousand  visitors  every  year.  The  city  had sixty
+thousand TV sets, fifty movie theaters, eight amusement  parks,
+two Happy Mood salons, sixteen beauty parlors, forty libraries,
+and  one  hundred  and  eighty  automated  barber shops. Eighty
+percent of the population were engaged  in  services,  and  the
+rest worked in two syntho-bakeries and one government shipyard.
+There  were  six  schools  and  one university housed in an old
+castle once the home of crusader Ulrich da Casa.  In  the  city
+there were also eight active civilian societies, among them the
+Society  of  Diligent  Tasters, the Society of Connoisseurs and
+Appraisers, and the Society for the Good  Old  Country  Against
+Evil  Influences.  In  addition,  fifteen hundred citizens were
+members of seven  hundred  and  one  groups  where  they  sang,
+learned  to  act,  to arrange furniture, to breast-feed, and to
+medicate  cats.  As  to  per-capita  consumption  of  alcoholic
+beverages, natural meat, and liquid oxygen, the city was sixth,
+twelfth,  and  thirteenth  highest  in Europe respectively. The
+city had seven men's clubs and five women's clubs, as  well  as
+sport  clubs  named  the  Bulls  and  Rhinos.  By a majority of
+forty-six votes, someone by the  name  of  Flim  Gao  had  been
+elected mayor. Peck was not among the municipal officials.
+     I  put the guidebook aside, took off my jacket, and made a
+thorough examination of my domain. I  approved  of  the  living
+room.  It  was done in blue, and I like that color. The bar was
+full of bottled and refrigerated victuals so that I could at  a
+moment's notice entertain a dozen starving guests.
+     I went into the study. There was a large table in front of
+the window  and  a comfortable chair. The walls were lined with
+shelves tightly filled with collected works. The  clean  bright
+bindings  were  arranged with great skill so that they formed a
+colorful and appealing layout. The top shelf  was  occupied  by
+the  fifty-volume  encyclopedia  of  UNESCO. Lower shelves were
+kaleidoscopic with the shiny wrappers of detective novels.
+     As soon as I saw the telephone  on  the  table,  I  dialed
+Rimeyer's  number,  perching  on  the  chair  arm. The receiver
+sounded with prolonged honkings and I waited, twirling a  small
+dictaphone which someone had left on the table. Rimeyer did not
+answer.  I  hung  up and inspected the dictaphone. The tape was
+half-used-up, and  after  rewinding,  I  punched  the  playback
+button.
+     "Greetings  and  more greetings," said a merry male voice.
+"I clasp your hand heartily or kiss you on the cheek, depending
+on your sex and age. I have lived  here  two  months  and  bear
+witness  that  it  was most enjoyable. Allow me a few points of
+advice. The best institution in town is the Hoity Toity in  the
+Park  of  Dreams. The best girl in town is Basi in the House of
+Models. The best guy in town is me, but I have already left. On
+television just watch Program Nine; everything else  is  chaff.
+Don't  get  involved  with  Intels,  and give the Rhinos a wide
+berth. Don't buy anything on credit -- there'll be  no  end  to
+the  runaround. The widow is a good woman but loves to talk and
+in general... As for Vousi, I didn't get to meet  her,  as  she
+had  left  the  country to visit her grandmother. In my opinion
+she is sweet, and there was a photograph of her in the  widow's
+album,  but I took it. There's more: I expect to come back next
+March, so be a pal, if you decide to return, pick another time.
+Have a --"
+     Music followed abruptly. I listened awhile and turned  off
+the machine.
+     There  wasn't  a  single  tome  I  could  extract from the
+shelves, so well were they stuck in, or maybe  even  glued  on,
+and  as there was nothing else of interest in the study, I went
+into the bedroom.
+     Here it was especially cool and cozy. I have always wanted
+just such a bedroom, but somehow never  had  the  time  to  get
+around to setting one up. The bed was big and low. On the night
+table stood an elegant phonor and a tiny remote-control box for
+the  TV.  The screen stood at the foot of the bed, while at the
+head the widow had hung a very natural-looking picture of field
+flowers in  a  crystal  vase.  The  picture  was  painted  with
+luminous  paints  and  the  dewdrops  glistened in the darkened
+room.
+     I punched the TV control at random and  stretched  out  on
+the bed. It was soft yet somehow firm. The TV roared loudly. An
+inebriated-looking  man  launched  himself  out  of the screen,
+crashed through some sort of railing, and  fell  from  a  great
+height  into a colossal fuming vat. There was a loud splash and
+the phonor exuded a smell. The man disappeared in the  bubbling
+liquid  and  then  reappeared,  holding  in his teeth something
+reminiscent of a well-boiled boot. The  unseen  audience  broke
+out in a storm of horse laughs. Fade out... soft lyrical music.
+A white horse pulling a phaeton appeared out of green woods and
+advanced  toward me. A pretty girl in a bathing suit sat in the
+carriage. I turned off the TV, got up, and went to look at  the
+bathroom.
+     There was a piny smell and flickering of germicidal lamps.
+I undressed,  threw  the underwear into the hopper, and climbed
+into the shower. Taking my time, I  dressed  in  front  of  the
+mirror,  combed  my  hair,  and shaved. The shelves were loaded
+with rows of vials, hygienic devices,  antiseptics,  and  tubes
+with  pastes  and greases. At the edge of one shelf there was a
+pile of flat colorful boxes with the logo "Devon."  I  switched
+off  the  razor  and  took  one of the boxes. A germicidal lamp
+flickered in the mirror, just as it did  that  day  in  Vienna,
+when  I  stood  just like this studiously regarding just such a
+little box, because I did not want to go out  to  the  bedroom,
+where  Raffy  Reisman  loudly  argued  about something with the
+doctor; while the green oily liquid  still  oscillated  in  the
+bath,  over  which hung the steamy vapor and a screeching radio
+receiver, attached to a  porcelain  hook  for  towels,  howled,
+hooted,  and  snorted  until Raffy turned it off in irritation.
+That was in Vienna, and just as here, it was  very  strange  to
+see  in  a bathroom a box of Devon -- a popular repellent which
+did an excellent job of chasing  mosquitoes,  chiggers,  gnats,
+and  other  bloodsucking  insects  which were long forgotten in
+Vienna and here in a seaside resort town. Only in Vienna  there
+had been an overlay of fear.
+     The  box  which  I  held in my hand was almost empty, with
+only one tablet remaining. The rest of  the  boxes  were  still
+scaled.  I finished shaving and returned to the bedroom. I felt
+like calling Rimeyer again, but  abruptly  the  house  came  to
+life.  The  pleated  drapes  flew  open  with a soft whine, the
+windowpanes slid away in their  frames,  and  the  bedroom  was
+flooded  with warm air, laden with the scent of apples. Someone
+was talking somewhere, light footsteps sounded overhead, and  a
+severe-sounding  female voice said, "Vousi -- at least eat some
+cake, do you hear?"
+     Thereupon I imparted a  certain  air  of  disorder  to  my
+clothes  (in  accordance  with  the current style), smoothed my
+temples, and went into the hall, taking one  of  Ahmad's  cards
+from the living room.
+     The  widow  turned  out  to  be  a  youthful  plump woman,
+somewhat languid, with a pleasant fresh face.
+     "How nice!" she said, seeing  me.  "You  are  up  already?
+Hello, my name is Vaina Tuur, but you can call me Vaina."
+     "My pleasure," I said, shuddering fashionably. "My name is
+Ivan."
+     "How   nice,"   said   Aunt   Vaina.   "What  an  original
+soft-sounding name! Have you had breakfast, Ivan?"
+     "With your permission, I intended  to  have  breakfast  in
+town," I said, and proffered her the card.
+     "Ah,"  said  Aunt  Vaina,  looking through the card at the
+light.  "That  nice  Ahmad,  if  you  only  knew  what  a  nice
+responsible fellow he is. But I see you did not have breakfast.
+Lunch you can have in town, but now I will treat you to some of
+my croutons. The major general always said that nowhere else in
+the world could you have such wonderful croutons."
+     "With pleasure," said I, shuddering for the second time.
+     The  door  behind  Aunt  Vaina  was  flung open and a very
+pretty young girl in a short  blue  skirt  and  an  open  white
+blouse  flew  in on clicking high heels. In her hand she held a
+piece of cake, which she  munched  while  humming  a  currently
+popular  song.  Seeing me, she stopped, flung her pocketbook on
+its long strap over her shoulder with a show  of  abandon,  and
+swallowed, bending down her head.
+     "Vousi!"  said  Aunt  Vaina, compressing her lips. "Vousi,
+this is Ivan."
+     "Not bad!" said Vousi. "Greetings."
+     "Vousi," reproached Aunt Vaina.
+     "You came with your wife?" said Vousi, extending her hand.
+     "No," said I. Her  fingers  were  soft  and  cool.  "I  am
+alone."
+     In  that  case,  I'll  show  you all there is to see," she
+said. "Till tonight. I must run now,  but  we'll  go  out  this
+evening."
+     "Vousi!" reproached Aunt Vaina.
+     Vousi  pushed  the rest of the cake into her mouth, bussed
+her mother on the cheek, and  ran  toward  the  door.  She  had
+smooth  sunburned  legs,  long and slender, and a close-cropped
+back of the head.
+     "Ach, Ivan," said Aunt Vaina, who was also looking at  the
+retreating  girl, "in our times it is so difficult to deal with
+young girls. They develop so early and leave us so  soon.  Ever
+since she started working in that salon..."
+     "She is a dressmaker?" I inquired.
+     "Oh  no!  She  works  in  the Happy Mood Salon, in the old
+ladies' department. And do you know, they value her highly. But
+last year she was late once and now she has to be very careful.
+As you can see she could not even have  a  decent  conversation
+with  you,  but it's possible that a client is even now waiting
+for her. You might not believe this,  but  she  already  has  a
+permanent  clientele.  Anyway,  why  are  we standing here? The
+croutons will get cold."
+     We entered the landlord's side. I tried with all my  might
+to  conduct  myself correctly, although I was a bit foggy as to
+what exactly was correct. Aunt Vaina sat me down  at  a  table,
+excused  herself,  and  left.  I looked around. The room was an
+exact copy of mine, except that the walls were rose instead  of
+blue,  and  beyond  the window, in place of the sea was a small
+yard with a low fence dividing it from the street.  Aunt  Vaina
+came  back  with  a  tray  bearing  boiled cream and a plate of
+croutons..
+     "You know," she said, "I think I will have some  breakfast
+too.  My  doctor  does not recommend breakfast, especially with
+boiled cream.  But  we  became  so  accustomed...  it  was  the
+general's  favorite  breakfast. Do you know, I try to have only
+men boarders. That nice Ahmad  understands  me  very  well.  He
+understands  how  much  I  need  to sit just like this, now and
+then, just as we are sitting, and have a cup of boiled cream."
+     "Your cream is wonderfully good," said I, not insincerely.
+     "Ach, Ivan." Aunt Vaina put down her cup and fluttered her
+hands. "But  you  said  that  almost  exactly  like  the  major
+general...  Strange,  you  even  look like him. Except that his
+face was a bit narrower and he  always  had  breakfast  in  his
+uniform."
+     "Yes," I said with regret, "I don't have a uniform."
+     "But there was one once," said she coyly, shaking a finger
+at me.  "Of  course!  I  can  see it. It's so senseless! People
+nowadays have to be ashamed of their military past. Isn't  that
+silly? But they are always betrayed by their bearing, that very
+special manly carriage. You cannot hide it, Ivan!"
+     I  made  a very elaborate non-committal gesture, said, "Mm
+-- yes," and took another crouton.
+     "It's all so out of place, isn't  that  right?"  continued
+Aunt  Vaina with great animation. "How can you confuse such two
+opposite concepts -- war and the army? We all detest  war.  War
+is  awful.  My  mother described it to me, she was only a girl,
+but she remembers everything. Suddenly, without warning,  there
+they  are  --  the  soldiers,  crude, alien, speaking a foreign
+tongue,  belching;  and  the  officers,  without  any  manners,
+laughing  loudly,  annoying  the  chambermaids, and smelling --
+forgive me; and that senseless commander's meeting hour... that
+is war and it deserves every condemnation! But the army! That's
+an altogether different affair! Surely you remember, Ivan,  the
+troops  lined  up by battalion, the perfection of the line, the
+manliness of the faces under the helmets, shiny arms, sparkling
+decorations, and  then  the  commanding  officer  riding  in  a
+special  staff car and addressing the battalions, which respond
+willingly and briefly like one man."
+     "No doubt," said I, "this has impressed many people."
+     "Yes! Very much indeed. We have always  said  that  it  is
+necessary  to  disarm,  but  did  we really need to destroy the
+army? It  is  the  last  refuge  of  manhood  in  our  time  of
+widespread  moral  collapse.  It's  weird  and  ridiculous -- a
+government without an army...."
+     "It is funny," I agreed. "You may not believe  it,  but  I
+have been smiling ever since they signed the Pact."
+     "Yes,  I can understand that," said Aunt Vaina. "There was
+nothing else for us to do,  but  to  smile  sarcastically.  The
+Major General Tuur" -- she extricated a handkerchief -- "passed
+away with just such a sarcastic smile on his face." She applied
+the  handkerchief  to  her eyes. "He said to us: 'My friends, I
+still hope to live to the day when everything will fall apart.'
+A broken man, who has lost the meaning of life... he could  not
+stand  the  emptiness  in  his  heart." Suddenly she perked up.
+"Here, let me show you, Ivan."
+     She bustled into the next room and returned with  a  heavy
+old-fashioned photo album.
+     I  looked at my watch at once, but Aunt Vaina did not take
+any notice, and sitting herself down at  my  side,  opened  the
+album at the very first page.
+     "Here is the major general."
+     The  major general looked quite the eagle. He had a narrow
+bony face and translucent eyes. His long body was spangled with
+medals. The biggest, a  multi-pointed  starburst  framed  in  a
+laurel  wreath,  sparkled in the region of the appendix. In his
+left hand the general tightly pressed a pair of gloves, and his
+right hand rested on the hilt of a ceremonial poniard.  A  high
+collar with gold embroidery propped up his lower jaw.
+     "And here is the major general on maneuvers."
+     Here  again  the  general looked the eagle. He was issuing
+instructions to his officers, who were bent over a  map  spread
+on  the  frontal  armor of a gigantic tank. By the shape of the
+treads  and  the  streamlined  appearance  of  the  turret,   I
+recognized it as one of the Mammoth heavy storm vehicles, which
+were  designed for pushing through nuclear strike zones and now
+are successfully employed by deep-sea exploration teams.
+     "And here is the general on his fiftieth birthday."
+     Here too, the general looked the  eagle.  He  stood  by  a
+well-set  table  with  a  wineglass in his hand, listening to a
+toast in his honor. The lower left corner  was  occupied  by  a
+halo  of light from a shiny pate; and to his side, gazing up at
+him with admiration, sat a very  young  and  very  pretty  Aunt
+Vaina.  I  tried  surreptitiously to gauge the thickness of the
+album by feel.
+     "Ah, here is the general on vacation."
+     Even on vacation, the general remained an eagle. With  his
+feet  planted  well  apart,  he  stood  an  the  beach sporting
+tiger-stripe trunks, as he scanned the misty horizon through  a
+pair  of  binoculars.  At his feet a child of three or four was
+digging in  the  sand.  The  general  was  wiry  and  muscular.
+Croutons  and cream did not spoil his figure. I started to wind
+my watch noisily.
+     "And here..." began Aunt Vaina, turning the page,  but  at
+this  point,  a  short  portly  man  entered  the  room without
+knocking. His face and in particular his dress seemed strangely
+familiar.
+     "Good morning," he enunciated, bending his smooth  smiling
+face slightly sideways.
+     It  was  my erstwhile customs man, still in the same white
+uniform with the silver buttons and the  silver  braid  on  the
+shoulders.
+     "Ah!  Pete!"  said  Aunt  Vaina.  "Here  you  are already.
+Please, let me introduce you. Ivan, this is Pete, a  friend  of
+the family."
+     The  customs  man  turned  toward  me without recognition,
+briefly inclined his head, and clicked his  heels.  Aunt  Vaina
+laid the album in my lap and got up.
+     "Have a seat, Pete," she said. "I will bring some cream."
+     Pete clicked his heels once more and sat down by me.
+     "This should interest you," I said, transferring the album
+to his  lap.  "Here is Major General Tuur. In mufti." A strange
+expression appeared on the face of the customs man.  "And  here
+is the major general on maneuvers. You see? And here --"
+     "Thank  you,"  said the customs man raggedly. "Don't exert
+yourself, because --"
+     Aunt Vaina returned with cream and croutons. From  as  far
+back  as  the  doorway,  she  said,  "How  nice to see a man in
+uniform! Isn't that right, Ivan?"
+     The cream for Pete was in a special cup with the  monogram
+"T" surrounded by four stars.
+     "It  rained  last  night,  so  it must have been cloudy. I
+know, because I woke up, and now there is not a  cloud  in  the
+sky. Another cup, Ivan?"
+     I got up.
+     'Thank  you,  I'm  quite full. If you'll excuse me, I must
+take my leave. I have a business appointment,"
+     Carefully closing the door behind me, I  heard  the  widow
+say,  "Don't  you find an extraordinary resemblance between him
+and Staff Major Polom?"
+     In the bedroom, I unpacked the  suitcase  and  transferred
+the  clothing to the wall closet, and again rang Rimeyer. Again
+no one answered. So I sat down at the desk and set to exploring
+the drawers. One contained a portable typewriter, another a set
+of writing paper and an empty bottle of grease  for  arrhythmic
+motors.  The  rest  was  empty,  if you didn't count bundles of
+crumpled receipts, a broken  fountain  pen,  and  a  carelessly
+folded sheet of paper, decorated with doodled faces. I unfolded
+the sheet. Apparently it was the draft of a telegram.
+     "Green  died  while  with  the Fishers receive body Sunday
+with condolences Hugger Martha boys." I read the writing twice,
+turned the sheet over and studied the faces, and read  for  the
+third  time. Obviously Hugger and Martha were not informed that
+normal people notifying of death first of all tell how and  why
+a  person  died  and not whom he was with when he died. I would
+have written, "Green drowned  while  fishing."  Probably  in  a
+drunken stupor. By the way, what address did I have now?
+     I  returned  to  the  hall.  A  small  boy  in short pants
+squatted in the doorway to the landlord's half. Clamping a long
+silvery tube under an armpit, he was panting and  wheezing  and
+hurriedly  unwinding  a  tangle of string. I went up to him and
+said, "Hi."
+     My reflexes are not what they used  to  be,  but  still  I
+managed to duck a long black stream which whizzed by my ear and
+splashed against the wall. I regarded the boy with astonishment
+while  he  stared at me, lying on his side and holding the tube
+in front of him. His face was damp and his  mouth  twisted  and
+open.  I turned to look at the wall. The stuff was oozing down.
+I looked at the boy again. He was getting  up  slowly,  without
+lowering the tube.
+     "Well, well, brother, you are nervous!" said I.
+     "Stand  where you are," said the boy in a hoarse voice." I
+did not say your name."
+     "To say the least," said I.  "You  did  not  even  mention
+yours, and you fire at me like I was a dummy."
+     "Stand where you are," repeated the boy, "and don't move."
+He backed  and  suddenly  blurted in rapid fire, "Hence from my
+hair, hence from my bones, hence from my flesh."
+     "I cannot," I said.  I  was  still  trying  to  understand
+whether he was playing or was really afraid of me.
+     "Why not?" said the boy. "I am saying everything right."
+     "I  can't go without moving," I said. "I am standing where
+I am."
+     His mouth fell open again.
+     "Hugger: I say to  you  --  Hugger  --  begone!"  he  said
+uncertainly.
+     "Why  Hugger?"  I  said.  "My name is Ivan; you confuse me
+with somebody else."
+     The boy closed his eyes and advanced upon me, holding  the
+tube in front of him.
+     "I surrender," I warned. "Be careful not to fire."
+     When  the  tube dented my midriff he stopped and, dropping
+it, suddenly went limp, letting his hands fall. I bent over and
+looked him in the face. Now he was brick-red. I picked  up  the
+tube.  It  was  something  like  a toy rifle, with a convenient
+checkered grip and a flat rectangular flask which was  inserted
+from below, like a clip.
+     "What kind of gadget is this?" I asked.
+     "A splotcher," he said gloomily. "Give it back."
+     I gave him back the toy.
+     "A  splotcher,"  I said, "with which you splotch. And what
+if you had hit me?" I looked at the wall. "Fine thing. Now  you
+won't  get it off inside of a year. You'll have to get the wall
+changed."
+     The boy looked up at me suspiciously. "But it's Splotchy,"
+he said.
+     "Really -- and I thought it was lemonade."
+     His face finally acquired a normal hue and demonstrated an
+obvious resemblance to the  manly  features  of  Major  General
+Tuur.
+     "No, no, it's Splotchy."
+     "So?"
+     "It will dry up."
+     "And then it's really hopeless?"
+     "Of course not. There will simply be nothing left."
+     "Hmm,"  said I, with reservation. "However, you know best.
+Let us hope so. But I am still glad that there will be  nothing
+left on the wall instead of on my face. What's your name?"
+     "Siegfried."
+     "And after you give it some thought?"
+     He gave me a long look.
+     "Lucifer."
+     "What?"
+     "Lucifer."
+     "Lucifer,"   said  I.  "Belial,  Ahriman,  Beelzebub,  and
+Azrael.  How  about  something  a  little  shorter?  It's  very
+inconvenient  to  call  for  help  to  someone with a name like
+Lucifer."
+     "But the doors are closed," he said and backed  one  step.
+His face paled again.
+     "So what?"
+     He  did not respond but continued to back until he reached
+the wall and began to sidle along it without  taking  his  eyes
+off  me. It finally dawned on me that he took me for a murderer
+or a thief and. that he wanted to escape. But for  some  reason
+he  did  not  call  for  help  and  went  by his mother's door,
+continuing toward the house exit.
+     "Siegfried,"  said  I,  "Siegfried,  Lucifer,  you  are  a
+terrible coward. Who do you think I am?" I didn't move but only
+Turned  to keep facing him. "I am your new boarder; your mother
+has just fed me croutons and cream and you go and  fire  at  me
+and  almost splotched me, and now you are afraid of me. It is I
+who should be afraid of you."
+     All this was very much  reminiscent  of  a  scene  in  the
+boarding  school  in Anyudinsk, when they brought me a boy just
+like this one, the son of a sect member.  Hell's  bells,  do  I
+really look so much the gangster?
+     "You  remind  me  of Chuchundra the Muskrat," I said, "who
+spent his life crying because he could not come  out  into  the
+middle  of the room. Your nose is blue from fear, your ears are
+freezing, and your pants are wet so that  you  are  trailing  a
+small stream...."
+     In  such  cases  it makes absolutely no difference what is
+said. It is important to speak calmly and not  to  make  sudden
+movements.  The expression on his face did not change, but when
+I spoke about the stream, he moved his eyes momentarily to take
+a look. But only for a second. Then he jumped toward the  door,
+fluttering  for  a second at the latch, and flew outside, dirty
+bottoms of his sandals flying. I went out after him.
+     He stood in the lilac bush, so that all I  could  see  was
+his  pale face. Like a fleeing cat looking momentarily over its
+shoulder.
+     "Okay, okay," said I. "Would you please explain to me what
+I must do? I have to send home my new address. The  address  of
+this  house  where I am now living." He regarded me in silence.
+"I don't feel right going to your mother -- in the first place,
+she has guests, and in the second--"
+     "Seventy-eight, Second Waterway," he said.
+     Slowly I sat down on the steps. There was  a  distance  of
+some ten meters between us.
+     'That's  quite  a  voice you have," I said confidentially.
+"Just like my friend the barman's at Mirza-Charles."
+     "When did you arrive?" said he.
+     "Well, let's see." I looked at my watch,  "About  an  hour
+and a half ago."
+     "Before  you  there  was  another  one,"  he said, looking
+sideways. "He was a  rat-fink.  He  gave  me  striped  swimming
+trunks, and when I went in the water, they melted away."
+     "Ouch!" I said. "That is really a monster of some sort and
+not a human -- he should have been drowned in Splotchy."
+     "Didn't have time -- I was going to, but he went away."
+     "Was it that same Hugger with Martha and the boys?"
+     "No -- where did you get that idea? Hugger came later."
+     "Also a rat-fink?"
+     He  didn't  answer.  I  leaned  back  against the wall and
+contemplated the street.  A  car  jerkily  backed  out  of  the
+opposite   driveway,   back   and   forthed,  and  roared  off.
+Immediately it was followed by another just such a  car.  There
+was the pungent smell of gasoline. Then cars followed one after
+another,  until  my eyes blurred. Several helis appeared in the
+sky. They were  the  so-called  silent  helis,  but  they  flew
+relatively  low, and while they flew, it was difficult to talk.
+In any case, the boy was apparently not going to talk.  But  he
+wasn't  going to leave, either. He was doing something with his
+splotcher in the bushes and was glancing at me now and then.  I
+was  hoping he wasn't going to splotch me again. The helis kept
+going and going, and the cars kept swishing  and  swishing,  as
+though all the fifteen thousand cars were speeding by on Second
+Waterway,  and all the five hundred helis were hung over Number
+78. The whole thing lasted  about  ten  minutes,  and  the  boy
+seemed to cease paying attention to me while I sat and wondered
+what  questions  I  should  ask  of  Rimeyer.  Then  everything
+returned to its previous state, the smell of exhaust was  gone,
+the sky was cleared.
+     "Where are they all going -- all at once?" I asked.
+     "Don't you know?"
+     "How would I know?"
+     "I don't know either, but somehow you knew about Hugger."
+     "About  Hugger,"  I  said.  "I  know  about  Hugger  quite
+accidentally. And about you I know nothing at  all...  how  you
+live and what you do. For instance, what are you doing now?"
+     "The safeguard is broken."
+     "Well then, give it to me, I'll fix it. Why are you afraid
+of me? Do I look like a rat-fink?"
+     "They all drove off to work," he said.
+     "You  sure  go  to  work late. It's practically dinnertime
+already. Do you know the Hotel Olympic?"
+     "Of course I know."
+     "Would you walk me there?"
+     He hesitated.
+     "No."
+     "Why not?" I asked.
+     "School is about to end -- I must be going home."
+     "Aha! So that's the way of it," said I. "You  are  playing
+hookey,  or  ditching it, as we used to say. What grade are you
+in?"
+     "Third."
+     "I used to be in third grade, too," I said.
+     He came a bit out of the bushes.
+     "And then?"
+     "Then I was in the fourth." I got up.  "Well,  okay.  Talk
+you  won't, go for a walk you won't, and your pants are wet, so
+I am going back in. You won't even tell me your name."
+     He looked at me in silence and  breathed  heavily  through
+his  mouth.  I went back to my quarters. The cream-colored hall
+was irreparably disfigured, it seemed to  me.  The  huge  black
+clot  was  not  drying.  Somebody  is  going to get it today, I
+thought. A ball of string was underfoot. I picked  it  up.  The
+end of the string was tied to the landlady's half-doorknob. So,
+I  thought,  this too is clear. I untied the string and put the
+ball in my pocket.
+     In the study, I got a clean sheet of paper from  the  desk
+and  composed  a  telegram to Matia. "Arrived safely, 78 Second
+Waterway. Kisses. Ivan." I telephoned it to the local PT&T  and
+again dialed Rimeyer's number. Again there was no answer. I put
+on  my  jacket, looked in the mirror, counted my money, and was
+about to set out when I saw that the door to  the  living  room
+was open and an eye was visible through the crack. Naturally, I
+gave  no  sign.  I  carefully  completed  the  inspection of my
+clothing, returned to the bathroom, and vacuumed myself  for  a
+while,  whistling  away  merrily. When I returned to the study,
+the  mouse-eared  head  sticking  through  the  half-open  door
+immediately  vanished.  Only  the silvery tube of the splotcher
+continued to protrude. Sitting down in the chair, I opened  and
+closed  all  the  twelve drawers, including the secret one, and
+only then looked at the door. The boy stood framed in it.
+     "My name is Len," he announced.
+     "Greetings, Len," I said  absent-mindedly.  "I  am  called
+Ivan.  Come  on  in -- although I was going out to have dinner.
+You haven't had dinner yet?"
+     "No."
+     "That's good. Go ask your mother's permission and we'll be
+off "
+     "It's too early," he said.
+     "What's too early? To have dinner?"
+     "No,  to  go.  School  doesn't  end  for  another   twenty
+minutes."  He was silent again. "Besides, there's that fat fink
+with the braid."
+     "He's a bad one?' I asked.
+     "Yeah," said Len. "Are you really leaving now?"
+     "Yes, I am," I said, and took the ball of string  from  my
+pocket. "Here, take it. And what if Mother comes out first?"
+     He shrugged.
+     "If  you  are  really  leaving," he said, "would it be all
+right if I stayed in your place?"
+     "Go ahead, stay."
+     "There's nobody else here?"
+     "Nobody."
+     He still didn't come to me to take the string, but let  me
+come to him, and even allowed me to take his ear. It was indeed
+cold.  I  ruffled  his  head  lightly and pushed him toward the
+table.
+     "Go sit all you want. I won't be back soon."
+     "I'll take a snooze," said Len.
+
+<ul><a name=3></a><h2>Chapter THREE</h2></ul>
+
+     The  Hotel  Olympic  was  a  fifteen-story   red-and-black
+structure. Half the plaza in front of it was covered with cars,
+and  in  its  center  stood  a  monument  surrounded by a small
+flowerbed. It represented a man with  a  proudly  raised  head.
+Detouring  the  monument,  I  suddenly realized that I knew the
+man. In puzzlement I stopped and examined it  more  thoroughly.
+There  was  no doubt about it. There in front of Hotel Olympic,
+in a funny old-fashioned suit  with  his  hand  resting  on  an
+incomprehensible   apparatus   which  I  almost  took  for  the
+extension of  the  abstract-styled  base,  and  with  his  eyes
+staring  at infinity through contemptuously squinting lids, was
+none other than Vladimir Sergeyevitch Yurkovsky. Carved in gold
+letters  on  the  base  was  the  legend  "Vladimir  Yurkovsky,
+December 5, Year of the Scales."
+     I couldn't believe it, because they do not raise monuments
+to Yurkovskys.  While  they live, they are appointed to more or
+less responsible positions, they are honored at jubilees,  they
+are  elected to membership in academies. They are rewarded with
+medals and are honored with international prizes, and when they
+die or perish; they are  the  subjects  of  books,  quotations,
+references,  but always less and less often as time passes, and
+finally they are forgotten altogether. They depart the halls of
+memory and linger on only in books. Vladimir Sergeyevitch was a
+general of the sciences and a remarkable man.  But  it  is  not
+possible  to erect monuments to all generals and all remarkable
+men, especially in  countries  to  which  they  had  no  direct
+relationship and in cities where if they did visit, it was only
+temporarily.  In any case, in that Year of the Scales, which is
+of significance only to them, he was not  even  a  general.  In
+March  he was, jointly with Dauge, completing the investigation
+of the Amorphous Spot on Uranus. That  was  when  the  sounding
+probe  blew up and we all got a dose in the work section -- and
+when we got back to the Planet in September, he was all spotted
+with lilac blotches, mad at the world, promising  himself  that
+he  would  take time out to swim and get sunburned and then get
+right back to the design of a new probe because the old one was
+trash.... I looked at the hotel again to reassure  myself.  The
+only  out  was  to assume that the life of the town was in some
+mysterious and potent manner highly dependent on the  Amorphous
+Spot  on  Uranus.  Yurkovsky  continued  to smile with snobbish
+superiority. Generally, the sculpture was  quite  good,  but  I
+could  not  figure  out  what  it  was  he  was leaning on. The
+apparatus didn't look like the probe.
+     Something hissed by my ear.  I  turned  and  involuntarily
+sprang back. Beside me, staring dully at the monument base, was
+a  tall  gaunt  individual closely encased from head to foot in
+some sort of gray scaly  material  and  with  a  bulky  cubical
+helmet  around  his  head. The face was obscured behind a glass
+plate with holes, from which smoke issued in  synchronism  with
+his  breathing.  The wasted visage behind the plate was covered
+with perspiration and the cheeks twitched in frantic tempo.  At
+first  I  took him for a Wanderer, then I thought that he was a
+tourist executing a curative routine, and only  finally  did  I
+realize that I was looking at an Arter.
+     "Excuse me," I said "Could you please tell me what sort of
+monument this is?"
+     The damp face contorted more desperately. "What?" came the
+dull response from inside the helmet.
+     I bent down.
+     "I am inquiring: what is this monument?"
+     The  man  glared at the statue. The smoke came thicker out
+of the holes. There was more powerful hissing.
+     "Vladimir Yurkovsky," he read, "Fifth of December, Year of
+the Scales... aha... December... so -- it must be some German."
+     "And who put up the monument?"
+     "I don't know," said the man. "But it's written down right
+there. What's it to you?"
+     "I was an acquaintance of his," I explained.
+     "Well then, why do you ask? Ask the man himself."
+     "He is dead."
+     "Aah... Maybe they buried him here?"
+     "No," I said, "he is buried far away."
+     "Where?"
+     "Far away. What's that thing he is holding?"
+     "What thing? It's an eroula."
+     "What?"
+     "I said, an eroula. An electronic roulette."-
+     My eyes popped.
+     "What's a roulette doing here?"
+     "Where?"
+     "Here, on the statue."
+     "I don't know," said the man after  some  thought.  "Maybe
+your friend invented it?"
+     "Hardly," said I. "He worked in a different field."
+     "What was that?"
+     "He was a planetologist and an interplanetary pilot."
+     "Aah...  well,  if he invented it, that was bully for him.
+It's a useful thing. I should remember it: Yurkovsky, Vladimir.
+He must have been a brainy German."
+     "I doubt he invented it," I said. "I repeat -- he  was  an
+interplanetary pilot."
+     The man stared at me.
+     "Well,  if  he  didn't  invent it, then why is he standing
+with it?"
+     "That's the point," I said. "I am amazed myself."
+     "You are a damn liar," said the man suddenly. "You lie and
+you don't even know why you are lying. It's early morning,  and
+he is stoned already.... Alcoholic!"
+     He  turned  away  and shuffled off, dragging his thin legs
+and hissing loudly. I shrugged my shoulders, took a  last  look
+at  Vladimir Sergeyevitch, and set off toward the hotel, across
+the huge plaza.
+     The gigantic doorman  swung  the  door  open  for  me  and
+sounded an energetic welcome.
+     I stopped.
+     "Would  you  be  so  kind," said I. "Do you know what that
+monument is?"
+     The doorman looked toward the plaza over my head. His face
+registered confusion.
+     "Isn't that written on it?"
+     "There is a legend," I said. "But who put it up and why?"
+     The doorman shuffled his feet.
+     "I beg your pardon,"  he  said  guiltily,  "I  just  can't
+answer
+     your  question.  The  monument has been there a long time,
+while I came here very recently. I don't wish to misinform you.
+Maybe the porter..."
+     I sighed.
+     "Well, don't worry about it. Where is a telephone?"
+     "To your right, if you please," he said looking delighted.
+     A porter started out in my direction, but I shook my  head
+and  picked  up  the receiver and dialed Rimeyer's number. This
+time I got a busy signal. I went to the elevator and up to  the
+ninth floor.
+     Rimeyer,  looking untypically fleshy, met me in a dressing
+gown, out of which stuck legs in pants and with shoes  on.  The
+room  stank  of  cigarette  smoke  and  the ashtray was full of
+butts. There was a general air of chaos in the whole suite. One
+of the armchairs was knocked over, a  woman's  slip  was  lying
+crumpled  on  the  couch,  and a whole battery of empty bottles
+glinted under the table.
+     "What can I do for you?" asked Rimeyer  with  a  touch  of
+hostility,  looking  at my chin. Apparently he was recently out
+of his bathroom, and his sparse colorless hair was wet  against
+his  long  skull. I handed him my card in silence. Rimeyer read
+it slowly  and  attentively,  shoved  it  in  his  pocket,  and
+continuing to look at my chin, said, "Sit down."
+     I sat.
+     "It  is  most  unfortunate. I am devilishly busy and don't
+have a minute's time."
+     "I called you several times today," said I.
+     "I just got back. What's your name?"
+     "Ivan."
+     "And your last name?"
+     "Zhilin."
+     "You see, Zhilin, to make it short, I have to get  dressed
+and  leave  again."  He  was  silent awhile, rubbing his flabby
+cheeks. "Anyway there's not much to talk about.... However,  if
+you  wish,  you can sit here and wait for me. If I don't return
+in an hour, come  back  tomorrow  at  twelve.  And  leave  your
+telephone  number and address, write it down right on the table
+there...."
+     He threw off the bathrobe, and dragging it  along,  walked
+off into the adjoining room.
+     "In  the  meantime,"  he continued, "you can see the town,
+and a miserable little town it is.... But you'll have to do  it
+in any case. As for me, I am sick to my stomach of it."
+     He  returned  adjusting his tie. His hands were trembling,
+and the skin on his face looked gray  and  wilted.  Suddenly  I
+felt  that  I  did  not  trust  him  --  the  sight  of him was
+repellent, like that of a neglected sick man.
+     "You look poorly," I  said.  "You  have  changed  a  great
+deal."
+     For the first time he looked me in the eyes.
+     "And how would you know what I was like before?"
+     "I  saw  you  at  Matia's.  You  smoke a lot, Rimeyer, and
+tobacco  is  saturated  regularly  with  all  kinds  of   trash
+nowadays."
+     "Tobacco -- that's a lot of nonsense," he said with sudden
+irritation.  "Here  everything  is  saturated with all kinds of
+tripe.... But perhaps you  may  be  right,  probably  I  should
+quit."  He  pulled  on his jacket slowly; "Time to quit, and in
+any case, I shouldn't have started."
+     "How is the work coming along?"
+     "It could be worse. And unusually absorbing work  it  is."
+He  smiled  in  a  peculiar unpleasant way. "I am going now, as
+they are waiting for me and I am late. So, till  an  hour  from
+now, or until tomorrow at twelve."
+     He nodded to me and left.
+     I  wrote my address and telephone number on the table, and
+as my foot plowed  into  the  mass  of  bottles  underneath,  I
+couldn't  help  but think that the work was indeed absorbing. I
+called room service and requested a chambermaid to clean up the
+room. The most polite of voices replied that  the  occupant  of
+the  suite categorically forbade service personnel to enter his
+room during his absence and had repeated the  prohibition  just
+now  on  leaving  the  hotel.  "Aha," I said, and hung up. This
+didn't sit well  with  me.  For  myself,  I  never  issue  such
+directions  and  have  never hidden even my notebooks, not from
+anyone. It's stupid to work at deception  and  much  better  to
+drink  less. I picked up the overturned armchair, sat down, and
+prepared for a  long  wait,  trying  to  overcome  a  sense  of
+displeasure and disappointment.
+     I  didn't  have  to wait for long. After some ten minutes,
+the door opened a crack and a pretty face  protruded  into  the
+room.
+     "Hey there," it pronounced huskily. "Is Rimeyer in?"
+     "Rimeyer is not in, but you can come in anyway."
+     She   hesitated,  examining  me.  Apparently  she  had  no
+intention of coming in, but was just saying hello, in passing.
+     "Come in, come in," said I. "I have nothing to do."
+     She entered with a light dancing  gait,  and  putting  her
+arms  akimbo,  stood  in front of me. She had a short turned-up
+nose and a disheveled boyish hairdo.  The  hair  was  red,  the
+shorts crimson, and the blouse a bright yolk yellow. A colorful
+woman   and   quite   attractive.  She  must  have  been  about
+twenty-five.
+     "You wait -- right?"
+     Her eyes were unnaturally bright and she smelled of  wine,
+tobacco, and perfume.
+     She  collapsed on the hassock and flung her legs up on the
+telephone table.
+     "Throw a cigarette to a working  girl,"  she  said.  "It's
+five hours since I had one."
+     "I don't smoke. Shall I ring for some?"
+     "Good  Lord,  another sad sack! Never mind the phone .. or
+that dame will show up again. Rummage around in the ashtray and
+find me a good long butt."
+     The ashtray did have a lot of long butts.
+     'They all have lipstick on them," said I.
+     "That's all right; it's my lipstick. What's your name?"
+     "Ivan."
+     She snapped a lighter and lit up.
+     "And mine is Ilina. Are you  a  foreigner,  too?  All  you
+foreigners seem so wide. What are you doing here?"'
+     "Waiting for Rimeyer."
+     "I  don't  mean  that!  What  brought  you  here,  are you
+escaping from your wife?"
+     "I am not married," I said quietly. "I  came  to  write  a
+book."
+     "A book? Some friends this Rimeyer has. He came to write a
+book.  <i>Sex  Problems  of  Impotent Sportsmen</i>. How's your
+situation with the sex problem?"
+     "It is not a problem to me," I said mildly. "And how about
+you?"
+     She lowered her legs from the table.
+     "That's a no-no. Take it slow. This isn't Paris, you know.
+All in good time. Anyway, you should have  your  locks  cut  --
+sitting there like a perch."
+     "Like  a  who?"  I  was  very  patient  as  I  had another
+forty-five minutes to wait.
+     "Like a perch. You know the type." She made vague  motions
+around her ears.
+     "I  don't know about that," I said. "I don't know anything
+yet as I have  just  arrived.  Tell  me  about  it,  it  sounds
+interesting."
+     "Oh no! Not I! We don't chatter. Our bit is a small one --
+serve, clean up, flash your teeth, and keep quiet. Professional
+secret. Have you heard of such an animal?"
+     "I've heard," I said. "But who's 'we' -- an association of
+doctors?
+     For some reason, she thought this was hilarious.
+     "Doctors!  Imagine  that."  She  laughed. "Well, wise guy,
+you're all right -- quite a tongue. We have  one  in  the  once
+like  you.  One  word,  and  we're  all  rolling in the aisles.
+Whenever we cater to the Fishers, he always gets the job,  they
+like a good laugh."
+     "Who doesn't?" said I.
+     "Well, you are wrong. The Intels, for instance, chased him
+out. 'Take  the  fool  away,' they said. Or also recently those
+pregnant males."
+     "Who?"'
+     "The sad ones. Well, I can  see  you  don't  understand  a
+thing. Where in heaven's name did you come from?"
+     "From Vienna."
+     "So -- don't you have the sad ones in Vienna?"
+     "You couldn't imagine what we don't have in Vienna."
+     "Could be you don't even have irregular meetings?"
+     "No,  we  don't  have  them. All our meetings are regular,
+like a bus schedule."
+     She was having a good time.
+     "Perhaps you don't have waitresses either?"
+     "Waitresses we do have, and you can  find  some  excellent
+examples. Are you a waitress then?"
+     She jumped up abruptly.
+     "That  won't  do  at all," she cried. "I've had enough sad
+ones for today. Now you're going to have a loving cup  with  me
+like a good fellow...." She began to search furiously among the
+bottles  by  the window. "Damn him, they're all empty! Could be
+you're a teetotaler? Aha, here's a little vermouth.  You  drink
+that, or shall we order whiskey?"
+     "Let's begin with the vermouth," said I.
+     She  banged  the  bottle on the table and took two glasses
+from the window sill.
+     "Have to wash them. Hold on a minute, everything's full of
+garbage." She went into the bathroom  and  continued  to  speak
+from  there.  "If  you  turned out to be a teetotaler on top of
+everything else. I don't know what I would do with you.... What
+a pigsty he's got in his bathroom -- I love it! Where  are  you
+staying? Here too?"
+     "No, in town," I replied. "On Second Waterway."
+     She came back with the glasses.
+     "Straight or with water?"
+     "Straight, I guess."
+     "All  foreigners  take  it  straight.  But we have it with
+water for some reason." She sat on my armchair and put her arms
+around my shoulders. We drank and kissed without  any  feeling.
+Her  lips  were  heavily lipsticked, and her eyelids were heavy
+from lack of  sleep  and  fatigue.  She  put  down  her  glass,
+searched  out  another butt in the ashtray, and returned to the
+hassock.
+     "Where is that Rimeyer?" she said. "After  all,  how  long
+can you wait for him? Have you known him a long time?"
+     "No, not very."
+     "I  think  maybe he is a louse," she said with sudden ire.
+"He's dug everything out of me, and now he plays hard  to  get.
+He doesn't open his door, the animal, and you can't get through
+to him by phone. Say, he wouldn't be a spy, would he?"
+     "What do you mean, a spy?"
+     "Oh,  there's  loads  of them.... From the Association for
+Sobriety and Morality.... The Connoisseurs and  Appraisers  are
+also a bad lot...."
+     "No, Rimeyer is a decent sort," I said with some effort.
+     "Decent...  you  are all decent. In the beginning, Rimeyer
+too was decent, so good-natured and full of fun... and  now  he
+looks at you like a croc."
+     "Poor fellow," I said. "He must have remembered his family
+and become ashamed of himself."
+     "He doesn't have a family. Anyway, the heck with him! Have
+another drink?"
+     We  had another drink. She lay down and put her hands over
+her head. Finally she spoke.
+     "Don't let it get to you. Spit on it! Wine we have  enough
+of, we'll dance, go to the shivers. Tomorrow there's a football
+game, we'll bet on the Bulls."
+     "I  am not letting it get to me. If you want to bet on the
+Bulls, we'd bet on the Bulls."
+     "Oh those Bulls! They are some boys! I  could  watch  them
+forever, arms like iron, snuggling up against them is just like
+snuggling against a tree trunk, really!"
+     There was a knock on the door.
+     "Come in!" yelled Ilina.
+     A  man  entered and stopped at once. He was tall and bony,
+of middle age, with a brush mustache and light protruding eyes.
+     "I beg your pardon, I was looking for Rimeyer," he said.
+     "Everyone here wants to see Rimeyer," said Ilina. "Have  a
+chair and we'll all wait together."
+     The  stranger  bowed  his  head and sat down by the table,
+crossing his legs.
+     Apparently he had  been  here  before.  He  did  not  look
+around,  but  stared  at  the  wall  directly  in front of him.
+However, perhaps he just was not a curious type. In  any  case,
+it  was  clear  that neither I nor Ilina was of any interest to
+him. This seemed unnatural to me, since I felt that such a pair
+as myself and  Ilina  should  arouse  interest  in  any  normal
+person.  Ilina  raised  up  on her elbow and scrutinized him in
+detail.
+     "I have seen you somewhere," she said.
+     "Really?" said the stranger coldly.
+     "What's your name?"
+     "Oscar. I am Rimeyer's friend."
+     "That's fine," said Ilina. She was obviously irritated  by
+the  stranger's  indifference,  but  she kept herself in check.
+"He's also a friend of Rimeyer." She stuck her  finger  at  me.
+"You know each other?"
+     "No," said. Oscar, continuing to look at the wall.
+     "My  name is Ivan," said I. "And this is Rimeyer's friend,
+Ilina. We just drank to our fraternal friendship."
+     Oscar  glanced  indifferently  in  Ilina's  direction  and
+nodded  his  head  politely. Ilina picked up the bottle without
+taking her eyes off him.
+     "There's still a little left here," she said.  "Would  you
+like a drink, Oscar?"
+     "No, thank you," he said, coldly.
+     "To fraternal friendship!" said Ilina. "No? You don't want
+to? Too bad!"
+     She  splashed  some  wine  in my glass, poured the rest in
+hers, and downed it at once.
+     "Never in my life would I have thought that Rimeyer  could
+have  friends  who  refuse  a  drink.  Still,  I  have seen you
+somewhere before."
+     Oscar shrugged his shoulders.
+     "I doubt it," he said.
+     Ilina was visibly becoming enraged.
+     "Some sort of a fink," she said to me loudly. "Say  there,
+Oscar, you wouldn't be an Intel?"
+     "No."
+     "What  do  you  mean, no?" said Ilina. "You're the one who
+had a set-to with that  baldy  Leiz  at  the  Weasel,  broke  a
+mirror, and had your face slapped by Mody."
+     The stone visage of Oscar grew a shade pinker.
+     "I  assure  you,"  he said courteously, "I am not an Intel
+and have never in my life been in the Weasel."
+     "Are you saying that I'm a liar?" said Ilina
+     At this point I took the bottle off the table and  put  it
+under my armchair, just in case.
+     "I am a visitor," said Oscar. "A tourist."
+     "When did you arrive?" I said to discharge the tension.
+     "Very  recently,"  replied  Oscar. He continued to gaze at
+the wall. Obviously here was a man with iron discipline.
+     "Oh, oh!" said Ilina suddenly. "Now I remember! I  got  it
+all mixed up."
+     She  burst  out  laughing, "Of course you're no Intel! You
+were at our office the day before last. You're the salesman who
+offered our manager some junk like... 'Dugong' or 'Dupont..."
+     "Devon," I prompted. "There is a repellent called Devon."
+     Oscar smiled for the first time.
+     "You are quite right, of course," he said. "But I am not a
+salesman. I was only doing a favor for a relative."
+     "That's different," said Ilina and jumped up. "You  should
+have  said  so.  Ivan,  we  all  need  to  drink to a pledge of
+friendship. I'll call... no, I'll go get it myself. You two can
+have a talk, I'll be right back."
+     She ran out of the room, banging the door.
+     "A fun girl," said I.
+     "Yes, extremely. You live here?"
+     "No, I'm a traveler, too....  What  a  strange  idea  your
+relative had!"
+     "What do you have in mind?"
+     "Who needs Devon in a resort town?"
+     Oscar shrugged.
+     "It's  hard  for me to judge; I'm no chemist. But you will
+agree that it's hard for us to comprehend the  actions  of  our
+fellow  men,  much less their fancies.... So Devon turns out to
+be - What did you call it, a res...?"
+     "Repellent," I said.
+     "That would be for mosquitoes?"
+     "Not so much for as against."
+     "I can see you are quite well up on it," said Oscar.
+     "I had occasion to use it."
+     "Well, well."
+     What the devil, thought I. What is he getting at?  He  was
+no longer staring at the wall He was looking me straight in the
+eyes  and smiling. But if he was going to say something, it was
+already said.
+     He got up.
+     "I don't think I'll wait any longer," he  pronounced.  "It
+looks like I'll have to drink another pledge. But I didn't come
+here  to  drink,  I  came here to get well. Please tell Rimeyer
+that I will call him again tonight. You won't forget?"
+     "No," I said, "I won't forget. If I tell  him  that  Oscar
+was in to see him, he will know whom I am talking about?"
+     "Yes, of course. It's my real name."
+     He   bowed,   and   walked   out  at  a  deliberate  pace,
+ramrod-straight and somehow unnatural-looking. I dipped my hand
+in the ashtray, found a  butt  without  lipstick,  and  inhaled
+several  times. I didn't like the taste and put out the stub. I
+didn't like Oscar, either. Nor Ilina. And especially Rimeyer --
+I didn't like him at all. I pawed through the bottles, but they
+were all empty.
+
+<ul><a name=4></a><h2>Chapter FOUR</h2></ul>
+
+     In the end I didn't wait long enough to see Rimeyer. Ilina
+never came back. Finally I got tired of sitting in  the  smoky,
+stale  atmosphere  of  the  room  and went down to the lobby. I
+intended to have dinner  and  stopped  to  look  around  for  a
+restaurant. A porter immediately materialized at my side.
+     "At  your service," he murmured discreetly. "An auto? Bar?
+Restaurant? Salon?"
+     "What kind of salon?" I asked, my curiosity piqued.
+     "A hair-styling  salon."  He  looked  at  my  hairdo  with
+delicate   concern.   "Master  Gaoway  is  receiving  today.  I
+recommend him most strenuously."
+     I recollected that Ilina had called me a disheveled  perch
+and said, "Well, all right."
+     "Please follow me," said the porter.
+     Crossing  the  lobby,  he  opened a wide low door and said
+into the spacious interior, "Excuse  me,  Master,  you  have  a
+client."
+     "Come in," replied a quiet voice.
+     I  entered.  The  salon  was  light  and  airy and smelled
+pleasantly. Everything in it shone -- the chrome, the  mirrors,
+the  antique  parquet  floor.  Shiny  half-domes  hung from the
+ceiling on glistening rods. In the center stood  a  huge  white
+barber  chair.  The  Master  was  advancing  to meet me. He had
+penetrating immobile eyes, a hooked nose, and a gray Van  Dyke.
+More than anything else he reminded me of a mature, experienced
+surgeon.  I  greeted  him  with  some  timidity, He nodded and,
+surveying me from head to foot, began to circle  around  me.  I
+began to feel uncomfortable.
+     "I  would like you to bring me up to the current fashion,"
+said I, trying not to let him out of my field of view.
+     But he restrained  me  gently  by  my  sleeve  and.  stood
+breathing  softly  behind my back for a few seconds. "No doubt!
+No doubt at all", he murmured, then touched me  lightly  on  my
+shoulder.  "Please," he said sternly, "take a few steps forward
+-- five or six -- then turn abruptly to face me."
+     I obeyed. He regarded me pensively, pulling on his  beard.
+I thought he was hesitating.
+     "On the other hand," he said, "sit down."
+     "Where?" I said.
+     "In the chair, in the chair."
+     I  lowered  myself  into  its  softness  and  watched  him
+approach me slowly. His intelligent face was suddenly  suffused
+with a look of profound chagrin.
+     "But  how  is  such  a  thing  possible?"  he  said. "It's
+absolutely awful."
+     I couldn't find anything to say.
+     "Gross disharmony," he muttered. "Repulsive... repulsive."
+     "Is it really that bad?" I asked.
+     "I don't understand why you came to me," he  said,  "since
+you obviously don't place any value at all on your appearance."
+     "I am beginning to, from this day on," I said.
+     He waved his hand.
+     "Never  mind...  I  will work on you, but..." He shook his
+head, turned impulsively, and went to a high table covered with
+shiny devices. The back of the chair depressed smoothly, and  I
+found  myself  in  a  half-reclining position. A big hemisphere
+descended  toward  me  from  above,  radiating  warmth,   while
+hundreds  of  tiny  needles  seemed to sink into the nape of my
+neck, eliciting a strange combination of simultaneous pain  and
+pleasure.
+     "Is it gone yet?" he asked.
+     The sensation abated.
+     "It's gone," I said.
+     "Your  skin  is  good,"  growled the Master with a certain
+satisfaction.
+     He returned  with  an  assortment  of  the  most  unlikely
+instruments and proceeded to palpate my cheeks.
+     "And  still  Mirosa  married  him,"  he  said suddenly. "I
+expected anything and everything, except that. After  all  that
+Levant  had done for her. Do you remember that moment when they
+were both weeping over the  dying  Pina?  You  could  have  bet
+anything that they would be together forever. And now, imagine,
+she is being wed to that literary fellow."
+     I  have  a  rule:  to pick up and sustain any conversation
+that comes along. When you don't know what it's all about, this
+can even be interesting.
+     "Not for long," I said with assurance. "Literary types are
+very inconstant, I can assure you, being one myself."
+     For a moment his hands paused on my temples.
+     "That didn't enter my head,"  he  admitted.  "Still,  it's
+wedlock,  even  though  only a civil one.... I must remember to
+call my wife. She was very upset."
+     "I can sympathize with her," I said. "But  it  did  always
+seem to me that Levant was in love with that... Pina."
+     "In  love?"  exclaimed  the  Master, coming around from my
+other side. "Of course he loved her! Madly! As only  a  lonely,
+rejected-by-all man can love."
+     "And so it was quite natural that after the death of Pina,
+he sought consolation with her best friend."
+     "Her  bosom  friend,  yes,"  said  the Master approvingly,
+while tickling me behind the ear. "Mirosa adored Pina!  It's  a
+very  accurate  term -- bosom friend! One senses a literary man
+in you at once! And Pina, too, adored Mirosa."
+     "But, you notice," I picked  up,  "that.  right  from  the
+beginning  Pina  suspected  that  Mirosa  was  infatuated  with
+Levant."
+     "Well, of course! They are extremely sensitive about  such
+things.  This  was  clear  to everyone -- my wife noticed it at
+once. I recollect that she would nudge me with her  elbow  each
+time  Pina  alighted on Mirosa's tousled head, and so coyly and
+expectantly looked at Levant."
+     This time I kept my peace.
+     "In general, I am  profoundly  convinced,"  he  continued,
+"that birds feel no less sensitively than people."
+     Aha,  thought  I,  and  said, "I don't know about birds in
+general, but Pina was a lot more sensitive than let's say  even
+you or I."
+     Something  bummed  briefly  over  my head, and there was a
+soft clink of metal.
+     "You speak like my wife,  word  for  word,"  observed  the
+Master,  "so  you  most  probably must like Dan. I was overcome
+when he was able  to  construct  a  bunkin  for  that  Japanese
+noblewoman...  can't  think  of  her  name.  After all, not one
+person believed Dan. The Japanese king, himself..."
+     "I beg your pardon," I said. "A bunkin?"
+     "Yes, of course, you are not a specialist.... You remember
+that moment when the Japanese noblewoman comes out  of  prison.
+Her  hair,  in  a high roller of blond hair, is ornamented with
+precious combs..."
+     "Aah," I guessed. "It's a coiffure."
+     "Yes, it even became fashionable for  a  time  last  year.
+Although a true bunkin could be made by a very few... even as a
+real  chignon, by the way. And, of course, no one could believe
+that Dan, with his  burned  hands  and  half-blind  ..  Do  you
+remember how he was blinded?"
+     "It was overpowering," I said.
+     "Oh  yes,  Dan was a true Master. To make a bunkin without
+electro-preparation, without biodevelopment... You know, I just
+had  a  thought,"  he  continued,  and  there  was  a  note  of
+excitement  in his voice. "It just struck me that Mirosa, after
+she parts with that literary guy,  should  marry  Dan  and  not
+Levant.  She  will  be  wheeling  him out on the veranda in his
+chair, and they will be listening to the  singing  nightingales
+in the moonlight -- the two of them together."
+     "And crying quietly out of sheer happiness," I said.
+     "Yes,"  the voice of the Master broke, "that would be only
+right. Otherwise I just don't know, I  just  don't  understand,
+what  all  our struggles are for. No... we must insist. I'll go
+to the union this very day...."
+     I kept quiet, again. The Master was breathing uneasily  by
+my ear.
+     "Let them go and shave at the automates," he said suddenly
+in a vengeful  tone,  "let them look like plucked geese. We let
+them have a taste once before of what it's like; now we'll  see
+how they appreciate it."
+     "I  am  afraid it won't be simple," I said cautiously, not
+-- having the vaguest idea of what this was about.
+     "We Masters are used to the complicated. It's not all that
+simple -- when a fat and sweaty stuffed shirt comes to you, and
+you have to make a human being out of him, or at the very best,
+something which under normal circumstances does not differ  too
+much  from  a  human being... is that simple? Remember what Dan
+said: 'Woman gives birth to a human being once in nine  months,
+but  we  Masters  have  to  do  it  every  day.'  Aren't  those
+magnificent words?"
+     "Dan was talking about barbers?" I said, just in case.
+     "Dan was talking about Masters. 'The beauty of  the  world
+rests  on  our  shoulders,'  he  would  say.  And again, do you
+remember: 'In order to make a man out of an ape, Darwin had  to
+be an excellent Master.'"
+     I decided to capitulate and confess.
+     "This I don't remember."
+     "How long have you been watching 'Rose of the Salon'?"
+     "Well, I have arrived just recently."
+     "Aah,  then you have missed a lot. My wife and I have been
+watching the program for seven years, every Tuesday. We  missed
+only  one  show; I had an attack and lost consciousness. But in
+the whole town there is only one man who hasn't missed even one
+show -- Master Mille at the Central Salon."
+     He moved off a few paces, turned various colored lights on
+and off, and resumed his work.
+     "The seventh year," he  repeated.  "And  now  --  can  you
+imagine  -- the year before last they kill off Mirosa and throw
+Levant into a Japanese prison for life, while Dan is burned  at
+the stake. Can you visualize that?"
+     "It's  impossible,"  I  said. "Dan? At the stake? Although
+it's true that they burned Bruno at the stake, too."
+     "It's possible," he said with impatience. "In any case, it
+became clear to us that they want to fold up the program  fast.
+But  we  didn't  put  up  with  that.  We declared a strike and
+struggled for three weeks. Mille  and  I  picketed  the  barber
+automates.  And  let  me  tell  you  that  quite  a  lot of the
+townspeople sympathized with us."
+     "I should think so," I said. "And what happened?  Did  you
+win?
+     "As you see. They grasped very well what was involved, and
+now the  TV  center knows with whom they are dealing. We didn't
+give one step, and if need be, we won't. Anyway we can rest  on
+Tuesdays now just like in the old days -- for real."
+     "And the other days?"
+     "The  other days we wait for Tuesday and try to guess what
+is awaiting us and what you literary fellows will do for us. We
+guess and make bets -- although  we  Masters  don't  have  much
+leisure."
+     "You have a large clientele?"
+     "No, that's not it. I mean homework. It's not difficult to
+become  a Master, it's difficult to remain one. There is a mass
+of literature, lots of new methods, new applications,  and  you
+have  to  keep  up  with  it  all  and  constantly  experiment,
+investigate and keep track of allied fields -- bionics, plastic
+medicine, organic  medicine.  And  with  time,  you  accumulate
+experience,  and  you  get the urge to share your knowledge. So
+Mille and I are writing our second book, and practically  every
+month,  we  have  to  update the manuscript. Everything becomes
+obsolete right before your eyes. I am now completing a treatise
+on a little-known  characteristic  of  the  naturally  straight
+nonplastic  hair;  and do you know I have practically no chance
+of being the first? In our  country  alone,  I  know  of  three
+Masters who are occupied with the same subject. It's only to be
+expected  --  the  naturally straight nonplastic hair is a real
+problem.     It's     considered     to      be      absolutely
+nonaestheticizable....  However, this may not be of interest to
+you? You are a writer?"
+     "Yes," I said.
+     "Well, you know, during the strike, I had a chance to  run
+through a novel. That would not be yours, by any chance?"
+     "I don't know," I said, "What was it about?"
+     "Well,  I  couldn't  say  exactly....  Son  quarrels  with
+father. He has a friend, an unpleasant fellow  with  a  strange
+name. He occupies himself by cutting up frogs."
+     "Can't remember," I lied -- poor Ivan Sergeyevitch.
+     "I  can't remember either. It was some sort of nonsense. I
+have a son, but  he  never  quarrels  with  me,  and  he  never
+tortures animals -- except perhaps when he was a child"
+     He  backed  away  again and made a slow circuit around me.
+His eyes were burning; he seemed to be very pleased.
+     "It looks as though we can stop here," he said.
+     I got out of  the  chair.  "Not  bad.  Not  bad  at  all,"
+murmured  the  Master.  I  approached  the mirror. He turned on
+spotlights, which illuminated me from all sides so  that  there
+were no shadows on my face.
+     In  the  first  instant  I did not notice anything unusual
+about myself. It was my usual self. Then I felt that it was not
+I at all. That it was something much better than I. A whole lot
+better.  Better  looking  than  I.  More  benevolent  than   I.
+Appreciably  more  significant than I. I experienced a sense of
+shame, as though I were deliberately passing myself  off  as  a
+man to whom I couldn't hold a candle.
+     "How did you do this thing?" I said in a strangled tone.
+     "It's nothing," said the Master, smiling in a very special
+way. "You  turned  out to be a fairly easy client, albeit quite
+neglected."
+     I stood before the mirror like Narcissus and couldn't tear
+myself away. Suddenly, I felt awed. The Master was a  magician,
+and an evil one at that, although he probably didn't realize it
+himself.  The  mirror reflected an extremely attractive lie. An
+intelligent, good-looking, monumental vapidity.  Well,  perhaps
+not  a  total  vacuum,  for after all I didn't have that low an
+opinion of myself. But the contrast was too great.  All  of  my
+inner  world,  everything  I valued in myself -- all that could
+just as well have not existed.  It  was  no  longer  needed.  I
+looked at the Master. He was smiling.
+     "You have many clients?" I asked.
+     He  did  not  grasp  my  meaning,  but after all, I didn't
+really want him to understand me.
+     "Don't worry," he replied, "I'll always work on  you  with
+pleasure. The rawest material is the most intriguing."
+     "Thank you," said I, lowering my eyes so as not to see his
+smile. "Thank you. Goodbye."
+     "Just  don't forget to pay," he said placidly. "We Masters
+value our work very highly."
+     "Yes, of course," I caught myself. "Naturally. How much do
+I owe you?"
+     He stated how much I owed.
+     'What?" said I regaining my equilibrium.
+     He repeated with satisfaction.
+     "Madness", I said forthrightly.
+     "Such is the price of beauty,"  he  explained.  "You  came
+here as an ordinary tourist, and you are leaving a king of this
+domain."
+     "An  impersonator  is  what  I am leaving as," I muttered,
+extracting the money.
+     "No, no, not that bad!" he said  confidentially.  "Even  I
+don't  know that for sure. And even you are not convinced of it
+entirely.... Two more dollars, please. Thank you.  Here  is  50
+pfennigs change. You don't mind pfennigs?"
+     I  had nothing against pfennigs. I wanted to leave as fast
+as possible.
+     I stood in the lobby for a while, becoming  myself  again,
+and  gazing  at  the  metallic figure of Vladimir Sergeyevitch.
+After all, all this is not new. After all, millions  of  people
+are  not what they pass themselves for. But the damnable barber
+had made me over into an empiriocritic. Reality was masked with
+gorgeous hieroglyphics. I no longer believed what I saw in this
+city. The plaza covered with  stereo-plastic  was  probably  in
+reality not beautiful at all. Under the elegant contours of the
+autos  lurked  ominous  and  ugly  shapes.  And  that beautiful
+charming woman is no  doubt  in  fact  a  repulsive  malodorous
+hyena,  a  promiscuous  dull-witted  sow.  I closed my eyes and
+shook my head. The old devil!
+     Two meticulously groomed oldsters stopped nearby and began
+to debate  heatedly  the  relative  merits  of  baked  pheasant
+compared  with  pheasant  broiled  with  feathers. They argued,
+drooling saliva, smacking  their  lips  and  choking,  snapping
+their  bony  fingers  under each other's noses. No Master could
+help these two. They were Masters themselves and they  made  no
+bones  about  it.  At  any  rate,  they restored my materialist
+viewpoint. I went to a porter and inquired about a restaurant.
+     "Right in front of you," said he and smiled at the arguing
+oldsters. "Any cuisine in the world."
+     I could have mistaken the entrance to the  restaurant  for
+the  gates  to  a  botanical  garden.  I  entered,  parting the
+branches of exotic trees, stepping alternately  on  soft  grass
+and  coral  flagstones. Unseen birds twittered in the luxuriant
+greenery, and the discreet clatter of utensils was  mixed  with
+the  sound  of  conversation  and  laughter. A golden bird flew
+right in front of my nose, barely able to carry the load  of  a
+caviar tartine in its beak.
+     "I am at your service," said the deep velvety voice.
+     An  imposing giant of a man with epaulettes stepped toward
+me cut of a thicket.
+     "Dinner," I said curtly. I don't like maitres-d'hotel.
+     "Dinner," he said  significantly.  "In  company?  Separate
+table?"'
+     "Separate table. On second thought..."
+     A notebook instantaneously appeared in his hand.
+     "A man of your age would be welcome at the table of
+     Mrs. and Miss Hamilton-Rey."
+     "Go on," I said.
+     "Father Geoffrois..."
+     "I would prefer an aborigine."
+     He turned the page.
+     "Opir,  doctor of philosophy, just now has sat down at his
+table."
+     "That's a possibility," said I.
+     He put away the book and led me along a  path  paved  with
+limestone  slabs. Somewhere around us there were people eating,
+talking,   swishing   seltzer.   Hummingbirds    darted    like
+multicolored  bees  in  the leaves. The maitre-d'hotel inquired
+respectfully, "How would you like to be introduced?"
+     "Ivan. Tourist and litterateur."
+     Doctor Opir was about fifty. I liked him at  once  because
+he immediately and without any ceremony sent the maitre-d'hotel
+packing  after  a  waiter. He was pink and plump, and moved and
+talked incessantly.
+     "Don't trouble yourself," he said when I reached. for  the
+menu.  "It's  all set already. Vodka, anchovies under egg -- we
+call them pacifunties -- potato soup..."
+     "With sour cream," I interjected.
+     "Of course!... steamed sturgeon a la Astrakhan... a  patty
+of veal..."
+     "I would prefer pheasant baked in feathers."
+     "No  -- don't; it's not the season... a slice of beef, eel
+in sweet marinade."
+     "Coffee," I said.
+     "Cognac," he retorted.
+     "Coffee with cognac."
+     "All right, cognac and coffee with cognac. Some pale  wine
+with the fish and a good natural cigar."
+     Dinner  with  Doctor Opir turned out to be most congenial.
+It was possible to eat, drink, and listen. Or  not  to  listen.
+Doctor  Opir  did  not  need  a  conversation.  He  required  a
+listener. I did not have  to  participate  in  the  talking,  I
+didn't  even  supply  any  commentaries,  while  he orated with
+enthusiastic delight, almost without interruption,  waving  his
+fork, while plates and dishes nonetheless became empty in front
+of him with mystifying speed. Never in my life have I met a man
+who was so skilled in conversation while his mouth was so fully
+packed and so busy masticating.
+     "Science!  Her  Majesty!"  he exclaimed. "She matured long
+and painfully, but her fruits turned out  to  be  abundant  and
+sweet. Stop, Moment, you are beautiful! Hundreds of generations
+were  born,  suffered,  and  died,  and not one was impelled to
+pronounce this incantation. We  are  singularly  fortunate.  We
+were  born  in  the  greatest  of  epochs,  the  Epoch  of  the
+Satisfaction  of  Desires.  It  may  be  that   not   everybody
+understands  this  as yet, but ninety-nine percent of my fellow
+citizens are already living in a world where, for all practical
+purposes, a man can have all he can think of. O,  Science!  You
+have  finally  freed  mankind.  You  have  given  us  and  will
+henceforth provide for us everything -- food -- wonderful  food
+-- clothing  of  the  best  quality and in any quantity, and to
+suit any taste! -- shelter -- magnificent shelter.  Love,  joy,
+satisfaction,  and  for  those  desiring  it, for those who are
+fatigued by happiness --  tears,  sweet  tears,  little  saving
+sorrows,  pleasant consoling worries which lend us significance
+in our own eyes.... Yes, we philosophers have maligned  science
+long  and  angrily.  We  called  forth  Luddites,  to  break up
+machines, we cursed Einstein, who changed our  whole  universe,
+we  vilified Wiener, who impugned our godlike essence. Well, so
+we really lost that godlike substance. Science robbed us of it.
+But in return! In return,  it  launched  men  to  the  feasting
+tables  of Olympus. Aha! Here is the potato soup, that heavenly
+porridge. No, no, do as I do... take this  spoon,  a  touch  of
+vinegar...  a  dash of pepper... with the other spoon, this one
+here, dip some sour cream and... no, no... gently,  gently  mix
+it.... This too is a science, one of the most ancient, older in
+any  cue  than  the  ubiquitous synthetic.... By the way, don't
+fail to visit  our  synthesizers,  Amalthea's  Horn,  Inc.  You
+wouldn't  be  a  chemist?  Oh  yes,  you are a litterateur! You
+should write about it,  the  greatest  mystery  of  our  times,
+beefsteaks  out of thin air, asparagus from clay, truffles from
+sawdust.... What a pity that Malthus is dead'! The whole  world
+would be laughing at him! Of course, he had certain reasons for
+his  pessimism.  I am prepared to agree with those who consider
+him a genius. But he was too ill-informed, he completely missed
+the possibilities in the natural sciences. He was one of  those
+unlucky  geniuses  who  discover  laws  of  social  development
+precisely at that moment when these laws cease to operate. I am
+genuinely sorry for him. The whole of humanity was but billions
+of hungrily gaping mouths to him. He must have lost sleep  from
+the  sheer horror of it. It is a truly monstrous nightmare -- a
+billion gaping maws and not one head. I  turned  back  and  see
+with  bitterness  how blind they were, the shakers of souls and
+the masters of the minds of the recent  past.  Their  awareness
+was dimmed by unbroken horror. Social Darwinists! They saw only
+the  press  of the struggle for survival: mobs of hunger-crazed
+people, tearing each other to pieces for a place in the sun, as
+though there was only that one single place, as though the  sun
+wasn't  sufficient  for  all!  And  Nietzsche...  maybe  he was
+suitable for the hungry slaves of the Pharaohs' times, with his
+ominous sermons about the master race, with his supermen beyond
+good and evil... who needs to be beyond now? It's not so bad on
+this side, don't you suppose? There were, of course,  Marx  and
+Freud.  Marx,  for example, was the first to understand that it
+all depended on  economics.  He  understood  that  to  rip  the
+economics   out   of   the  hands  of  greedy  nincompoops  and
+fetishists, to make  it  part  of  the  state,  to  develop  it
+limitlessly,  was  the  very  way  to  lay the foundations of a
+Golden Age. And Freud showed us for what, after all, we  needed
+this  Golden  Age.  Recollect  the  source of all human misery.
+Unsatisfied instincts, unrequited love, and unsated  hunger  --
+isn't  that  right?  But  here  comes Her Majesty, Science, and
+presents us with satisfactions. And how rapidly  all  this  has
+come  to  pass! The names of gloomy prognosticators are not yet
+forgotten, and already... How do you like the  sturgeon?  I  am
+under  the  impression  that the sauce is synthetic. Do you see
+the pinkish tint? Yes, it is  synthetic.  In  a  restaurant  we
+should  be  able  to  expect  natural  sauce. Waiter! On second
+thought -- the devil take it, let's not be so finicky.  Go  on,
+go  on...  Now what was I saying? Yes! Love and hunger. Satisfy
+love and hunger, and you'll see a happy man. On  condition,  of
+course,  that  your  man  is secure about the next day. All the
+utopias  of  all  times  are  based   on   this   simplest   of
+considerations.  Free  a man of the worry about his daily bread
+and about the morrow, and he will become truly free and  happy.
+I  am  deeply  convinced  that  children,  yes,  precisely  the
+children, are man's ideal. I see the most profound  meaning  in
+the  remarkable similarity between a child and the carefree man
+who is the object of utopia. Carefree means happy -- and we are
+so close to that ideal! Another few decades, or  maybe  just  a
+few  more  years,  and  we will attain the automated plenty, we
+will discard science as a healed man discards his crutches, and
+the whole of mankind will  become  one  huge  happy  family  of
+children.  The  adults  will be distinguished from the children
+only by their ability to love, and  this  ability  will,  again
+with  the  help  of  science,  become  the  source  of  new and
+unheard-of joys and pleasures.... Excuse me, what is your name?
+Ivan? So, you must be  from  Russia.  Communist?  Aha...  well,
+everything  is  different  there  I  know....  And  here is the
+coffee! Mm, not bad. But where is the cognac? Well, thank  you!
+By  the way, I hear that the Great Wine Taster has retired. The
+most grandiose  scandal  befell  at  the  Brussels  contest  of
+cognacs,  which  was  suppressed  only  with  the  greatest  of
+difficulties. The Grand Prix is awarded to  the  White  Centaur
+brand.   The   jury  is  delighted!  It  is  something  totally
+unprecedented! Such a phenomenal  extravaganza  of  sensations!
+The  declaratory  packet  is  opened,  and,  oh horrors, it's a
+synthetic! The Great Wine Taster turned as white as a sheet  of
+paper  and was physically ill. By the way, I had an opportunity
+to try this cognac, and it's really superb,  but  they  run  it
+from  crude  and  it  doesn't  even  have  a  proper name. H ex
+eighteen naphtha fraction  and  it's  cheaper  than  hydrolyzed
+alcohol....  Have a cigar. Nonsense, what do you mean you don't
+smoke? It's not right not to have a cigar after a  dinner  like
+this....  I  love  this  restaurant.  Every time I come here to
+lecture at the university, I dine at the  Olympic.  And  before
+returning, I invariably visit the Tavern. True, they don't have
+the greenery, nor the tropical birds, and it's a bit stuffy and
+warm  and  smells of smoke, but they have a genuine, inimitable
+cuisine. The Assiduous Tasters gather nowhere but there  --  at
+the  Gourmet.  In  that place you do nothing but eat. You can't
+talk, you can't laugh, it's totally  nonsensical  to  go  there
+with a woman -- you only eat there! Slowly, thoughtfully..."
+     Doctor  Opir  finally  ran down, leaned back in his chair,
+and inhaled deeply with total enjoyment. I sucked on the mighty
+cigar and contemplated the man. I had  him  well  pegged,  this
+doctor  of  philosophy. Always and in all times there have been
+such men, absolutely pleased with their  situation  in  society
+and  therefore  absolutely satisfied with the condition of that
+society. A marvelously well-geared tongue  and  a  lively  pen,
+magnificent  teeth  and  faultless innards, and a well-employed
+sexual apparatus.
+     "And so the world is beautiful, Doctor?"
+     "Yes," said  the  doctor  with  feeling,  "it  is  finally
+beautiful."
+     "You are a gigantic optimist," said I.
+     "Our  time  is the time of optimists. Pessimists go to the
+Good Mood Salon, void the gall  from  their  subconscious,  and
+become  optimists.  The  time of pessimists has passed, just as
+the time of tuberculars, of sexual maniacs, and of the military
+has passed. Pessimism, as an  intellectual  emotion,  is  being
+extirpated  by  that self-same science. And that not indirectly
+through the creation of affluence, but  concretely  by  way  of
+invasion  of  the  dark  world of the subcortex. Let's take the
+dream generator, currently the most popular  diversion  of  the
+masses.  It  is  completely harmless, unusually well adopted to
+general use,  and  is  structurally  simple.  Or  consider  the
+neurostimulators...."
+     I attempted to steer him into the desired channel.
+     "Doesn't   it   seem  to  you  that  right  there  in  the
+pharmaceutical field science is overdoing it a bit sometimes?"
+     Doctor Opir smiled  condescendingly  and  sniffed  at  his
+cigar.
+     "Science  has  always  moved  by trial and error," he said
+weightily. "And I am inclined to  believe  that  the  so-called
+errors  are  always  the  result  of  criminal  application. We
+haven't yet entered the Golden Age, we are just in the  process
+of  doing  so,  and all kinds of throwbacks, mobsters, and just
+plain dirt are under foot. So all kinds of drugs  are  put  out
+which  are  health-destroying,  but  which  are created, as you
+know, from the best of motives; all kinds of aromatics  ...  or
+this...  well,  that  doesn't  suit  a dinner conversation." He
+cackled suddenly and obscenely "You can guess my meaning --  we
+are  mature  people!  What  was  I  saying?  Oh  yes,  all this
+shouldn't disturb you. It will pass just like the atom bombs."
+     "I only wanted to emphasize," I remarked, "that  there  is
+still the problem of alcoholism, and the problem of narcotics."
+     Doctor  Opir's  interest  in  the conversation was visibly
+ebbing. Apparently he imagined that  I  challenged  his  thesis
+that  science  is  a boon. To conduct an argument on this basis
+naturally bored him, as  though,  for  instance,  he  had  been
+affirming  the  salubriousness  of  ocean  swimming  and  I was
+contradicting him on the basis that I had almost  drowned  last
+year.
+     "Well,  of  course..." he mumbled, studying his watch, "we
+can't have it all at once.... You must admit, after  all,  that
+it is the basic trend which is the most important.... Waiter!"
+     Doctor  Opir  had  eaten  well, had a good conversation --
+professing progressive philosophy -- felt well-satisfied, and I
+decided not to press the matter, especially as I really  didn't
+give  a  hang  about  his  progressive philosophy, while in the
+matters which interested me the most, he probably would not  be
+concretely informed at all in the final analysis.
+     We paid up and went out of the restaurant. I inquired, "Do
+you ]mow,  Doctor,  whose  monument  that is? Over there on the
+plaza."
+     Doctor Opir gazed absent-mindedly. "Sure  enough,  it's  a
+monument," he said. "Somehow I overlooked it before.... Shall I
+drop you somewhere?"
+     "Thank you, I prefer to walk."
+     "In  that case, goodbye. It was a pleasure to meet you....
+Of course it's hard to expect to convince  you."  He  grimaced,
+shifting  a  toothpick  around  his  mouth.  "But  it  would be
+interesting to try. Perhaps you will attend my lecture? I begin
+tomorrow at ten."
+     "Thank you," I said. "What is your topic?"
+     "Neo-optimist Philosophy. I will be sure to touch  upon  a
+series of questions which we have so pithily discussed today."
+     "Thank you," I said again. "Most assuredly."
+     I  watched as he went to his long automobile, collapsed in
+the seat, puttered with  the  auto-driver  control,  fell  back
+against  the seat back, and apparently dozed off instantly. The
+car began to roll cautiously across the plaza  and  disappeared
+in the shade and greenery of a side street.
+     Neo-optimism...      Neo-hedonism...      Neo-cretinism...
+Neo-capitalism... "No evil without good," said the fox.  So,  I
+have  landed in the Country of the Boobs. It should he recorded
+that the ratio of congenital fools does not vary as a  function
+of  time.  It  should  be  interesting  to  determine  what  is
+happening to the percentage of fools by conviction. Curious  --
+who  assigned  the  title  of Doctor to him? He is not the only
+one! There  must  have  been  a  whole  flock  of  doctors  who
+ceremoniously granted that title to Neo-optimist Opir. However,
+this occurs not only among philosophers.
+     I saw Rimeyer come into the hall and forgot Doctor Opir at
+once.  The  suit  hung on Rimeyer like a sack. Rimeyer stooped,
+and his face was flabby. I thought he wavered in his  walk.  He
+approached the elevator and I caught him by the sleeve there.
+     He jumped violently and turned on me.
+     "What in hell?" he said. He was clearly unhappy to see me.
+     "Why are you still here?"
+     "I waited for you."
+     "Didn't I tell you to come tomorrow at noon?"
+     "What's the difference?" I said. "Why waste time?"
+     He looked at me, breathing laboriously.
+     "I am expected. A man is waiting for me in my room, and he
+must not see you with me. Do you understand?"
+     "Don't shout," I said. "People are noticing."
+     Rimeyer glanced sideways with watery eyes.
+     "Go in the elevator," he said.
+     We  entered  and  he  pressed the button for the fifteenth
+floor.
+     "Get on with your business quickly," he said.
+     The  order  was  startlingly  stupid,  so   that   I   was
+momentarily disoriented.
+     "You mean to say that you don't know why I am here?"
+     He rubbed his forehead, and then said, "Hell, everything's
+mixed up.... Listen, I forgot, what is your name?"
+     "Zhilin."
+     "Listen, Zhilin, I have nothing new for you. I didn't have
+time to  attend  to  that  business.  It's  all a dream, do you
+understand? Matia's inventions. They sit there, writing papers,
+and invent. They should all be pitched the hell out."
+     We arrived at the  fifteenth  floor  and  he  pressed  the
+button for the first.
+     "Devil  take  it,"  he  said. "Five more minutes and he'll
+leave.... In general I am convinced  of  one  thing,  there  is
+nothing  to it. Not in this town, in any case." He looked at me
+surreptitiously, and turned his eyes away. "Here is something I
+can tell you. Look in at the Fishers. Just like that, to  clear
+your conscience."
+     "The Fishers? What Fishers?"
+     "You'll  find out for yourself," he said impatiently. "But
+don't get tricky with them. Do everything they ask."  Then,  as
+though   defending   himself,  he  added,  "I  don't  want  any
+preconceptions, you understand."
+     The elevator stopped at the first floor  and  he  signaled
+for the ninth.
+     "That's it," he said. "Then we'll meet and talk in detail.
+Let's say tomorrow at noon."
+     "All  right,"  I said slowly. He obviously did not want to
+talk to me. Maybe he didn't trust me. Well, it happens!
+     "By the way," I said, "you have been visited by a  certain
+Oscar."
+     It seemed to me that he started.
+     "Did he see you?"
+     "Naturally.  He  asked  me  to  tell  you  that he will be
+calling tonight."
+     "That's bad, devil take  it,  bad...."  muttered  Rimeyer.
+"Listen... damn, what is your name?"
+     "Zhilin."
+     The elevator stopped.
+     "Listen,  Zhilin,  it's  very bad that he has seen you....
+However, what the hell is the difference. I must  go  now."  Re
+opened  the  elevator  door,  "Tomorrow  we'll have a real good
+talk, okay? Tomorrow... and you look in on the Fishers. Is that
+a deal?"
+     He slammed the door with all his strength.
+     "Where will I look for them?" I asked.
+     I stood awhile, looking after him. He was almost  running,
+receding down the corridor with erratic steps.
+
+<ul><a name=5></a><h2>Chapter FIVE</h2></ul>
+
+     I  walked  slowly,  keeping to the shade of the trees. Now
+and then a car rolled by. One of these stopped and  the  driver
+threw  open  the door, leaned out, and vomited on the pavement.
+He cursed weakly, wiped his mouth with his  palm,  slammed  the
+door,  and  drove  off.  He was on the elderly side, red-faced,
+wearing a loud shirt with nothing under it.
+     Rimeyer  apparently  had  turned  into  a  drunkard.  This
+happens  fairly  often:  a  man  tries  hard,  works  hard,  is
+considered a valuable contributor, he is listened to  and  made
+out as a model, but just when he is needed for a concrete task,
+it  suddenly turns out that he has grown puffy and flabby, that
+wenches are running in and out of his place, and that he smells
+of vodka from early morning.... Your business does not interest
+him, while at  the  same  time,  he  is  frightfully  busy,  is
+constantly  meeting someone, talks confusingly and murkily, and
+is of no help whatsoever. And then he turns up in the alcoholic
+ward, or a mental clinic, or is involved in a legal process. Or
+he gets married unexpectedly -- strangely and  ineptly  --  and
+this  marriage  smells  strongly of blackmail. ... One can only
+comment: "Physician, heal thyself."
+     It would still be nice to hunt up Peck. Peck  is  hard  as
+flint, honest, and he always knows everything. You haven't even
+finished  the  rundown  on  the tech control, and haven't had a
+chance to get off the ship, before he is buddy-buddy  with  the
+cook,   is   already   fully   informed  and  involved  in  the
+investigation of the  dispute  between  the  Commander  of  the
+Pathfinders  and  the  chief  engineer,  who  didn't settle the
+matter of some prize; the technicians are already  planning  an
+evening  in  his honor, and the deputy director is listening to
+his advice in a quiet corner... Priceless Peck! He was born  in
+this city and has spent a third of his life here.
+     I  found  a telephone booth, and rang information for Peck
+Xenai's number and address. I was asked to wait. As usual,  the
+booth  smelled  of  cats.  The  plastic  shelf was covered with
+telephone numbers and obscene images. Someone had carved  quite
+deeply,  as with a knife, the strange word "SLUG." I opened the
+door,  to  lighten  the  string  atmosphere,  and  watched  the
+opposite  shady  side  of  the  street, where a barman stood in
+front of his establishment in a  white  jacket  with  rolled-up
+sleeves, smoking a cigarette. Then I was told that according to
+the  data  at the beginning of the year, Peck resided at No. 31
+Liberty Street, number  11-331.  I  thanked  the  operator  and
+dialed the number at once. A strange voice told me that I had a
+wrong  number.  Yes,  the  number  was  correct, and so was the
+address, but no Peck lived there, and if he  had,  they  didn't
+know  when  he  left  or where he had gone. I hung up, left the
+booth, and crossed the street to the shady side.
+     Catching my eye, the barman came to  life  and  said  from
+afar, "Come in, why don't you?"
+     "Don't know that I'd like to," I said.
+     "So  you won't be friendly, eh?" he said. "Come in anyway.
+We'll have a talk. I feel bored."
+     I stopped.
+     "Tomorrow morning,"  I  said,  "at  ten  o'clock,  at  the
+university, there will be a philosophy lecture on Neo-optimism.
+It will be given by the renowned Doctor Opir from the capital.
+     The  barman listened with avid interest -- he even stopped
+inhaling.
+     "How do you like that!" he said. "So  they  have  come  to
+that!  The  day before yesterday, they chased all the girls out
+of a night club, and now they'll be having lectures. We'll show
+them lectures!"
+     "It's about time," I said.
+     "I  don't  let  them  in,"  he  continued,  getting   more
+animated.  "I  have  a  sharp eye for them. A guy could be just
+approaching the  door,  when  I  can  spot  him  for  an  Intel
+'Fellows,'  I  say,  'an Intel is coming.' And the boys are all
+well picked; Dodd himself is here every night  after  training.
+So,  he  gets  up and meets this Intel at the door, and I don't
+even know what goes on between  them,  but  be  passes  him  on
+elsewhere.  Although  it's  true  that sometimes they travel in
+bunches. In that case, so there wouldn't be a  to-do,  we  lock
+the door -- let them knock. That's the right way, isn't it?"
+     'That's  okay  by  me,"  I  said. I had had enough of him.
+There are people who pall unusually quickly. "Let them."
+     "What do you mean -- let them?"
+     "Let them knock. In other words, knock on any door."
+     The barman looked at me with growing alertness.
+     "What say you move on," he said.
+     "How about a quick one," I offered.
+     "Move along, move along," he said. "You won't  get  served
+here."
+     We   looked   at  each  other  awhile,,  then  he  growled
+something, backed up, and slid the glass door in front of him.
+     "I am no Intel," I said. "I am  a  poor  tourist.  A  rich
+one."
+     He looked at me with his nose flattened against the glass.
+I made  a  motion  as  though knocking a drink back. Re mumbled
+something and went back into the darkness of  the  place  --  I
+could see him wandering aimlessly among empty tables. The place
+was called the Smile. I smiled and went on.
+     Around  the  corner  was  a wide main thoroughfare. A huge
+van, plastered with advertisements, was parked by the curb. Its
+back was  swung  down  for  a  counter,  on  which  were  piled
+mountains    of    cans,   bottles,   toys,   and   stacks   of
+cellophane-wrapped clothing and underwear.  Two  teenage  girls
+twittered  some  sort  of  nonsense  while  selecting  blouses.
+"Pho-o-ny," squeaked one. The other, turning  the  blouse  this
+way  and  that,  replied,  "Spangles,  spangles and not phony."
+"Here by the neck  it  phonies."  "Spangles."  "Even  the  star
+doesn't glimmer."
+     The  driver of the van, a gaunt man with huge, horn-rimmed
+dark glasses, sat on the step of the advertising  rotunda.  His
+eyes  were  not  visible, but, judging by his relaxed mouth and
+sweat-beaded nose, he was asleep. I approached the counter. The
+girls stopped talking and stared at me with parted mouths. They
+must have been about sixteen, and their eyes  were  vacant  and
+blue, like those of young kittens.
+     "Spangles," I said. "No phonying and lots of sparkle."
+     "And around the neck?" asked the one who was trying on the
+blouse.
+     "Around the neck it's practically a masterpiece."
+     "Spangles," said the other uncertainly.
+     "OK,  let's  look  at  another  one,"  offered  the  first
+peacefully. "This one here."
+     "This one is better, the silvery one with the frame."
+     I saw books. They were  magnificent  books.  There  was  a
+Strogoff  with such illustrations as I had never even heard of.
+There was  <i>Change  of  Dream</i>  with  an  introduction  by
+Saroyan.  There  was a Walter Mintz in three volumes. There was
+almost an entire Faulkner, <i>The New  Politics</i>  by  Weber,
+<i>Poles  of  Magnificence</i>  by Ignatova, The <i>Unpublished
+Sian She-Cuey</i>, <i>History of Fascism</i> in the "Memory  of
+Mankind"  edition.  There were current magazines, and almanacs,
+pocket Louvres, Hermitage, and Vatican. There  was  everything!
+"It  phonies too but it has a frame." "Spangles." I grabbed the
+Mintz. Holding the two volumes  under  my  arm,  I  opened  the
+third. Never have I seen such a complete Mintz. There were even
+the émigré letters.
+     "How much will that be?" I called.
+     The  girls  gaped again; the driver sucked in his lips and
+sat up.
+     "What?" he said huskily.
+     "Who is the owner here?" I said.
+     He got up and came to me.
+     "What would you like?"
+     "I want this Mintz. How much is it?"
+     The girls giggled.  He  stared  at  me  in  silence,  then
+removed his glasses.
+     "You are a foreigner?"
+     "Yes, I am a tourist."
+     "It's the most complete Mintz."
+     "Of course, I can see that. I was stunned when I saw it."
+     "Me too," he said, "when I saw what you were after."
+     "He is a tourist," twittered one of the girls. "He doesn't
+understand."
+     "It's all free," said the driver. "Personal needs fund. To
+take care of personal needs."
+     I looked back at the bookshelf.
+     "Did you see <i>Change of Dream</i>?" asked the driver.
+     "Yes, thank you, I have it."
+     "About Strogoff I will not even inquire."
+     "How about the <i>History of Fascism</i>?"
+     "An excellent edition."
+     The  girls  giggled  again.  The  driver's  eyes popped in
+sudden wrath.
+     "Scram, snot faces," he barked.
+     The girls jumped. One of them thievishly  grabbed  several
+blouse packages. They ran across the street, where they stopped
+and continued to gaze at us.
+     "With frames!" said the driver. His thin lips twitched. "I
+should drop this whole idea. Where do you live?"
+     "On Second Waterway."
+     "Aha, in the thick of the mire.... Let's go -- I will drop
+you off.  I  have a complete Schedrin in the van, which I don't
+even exhibit; I have the entire  classics  library;  the  whole
+Golden Library, the complete Treasures of Philosophic Thought."
+     "Including Doctor Opir's?"
+     "Bitch  tripe,"  said  the driver. "Salacious bum! Amoeba!
+Rut do you know Sliy?"
+     "Not much," I said. "I don't like him.  Neo-individualism,
+as Doctor Opir would say."
+     "Doctor  Opir  stinks,"  said the driver. "While Sliy is a
+real man. Of course, there is the individualism. But  at  least
+he  says  what  he  thinks and does what he says. I'll get some
+Sliy for you.... Listen, did you see this? And this!"
+     He dug himself up to his elbows in books. He stroked  them
+tenderly and his face shone with rapture.
+     "And this," he kept on. "And how about this Cervantes?"
+     An  oldish lady of imposing bearing approached and started
+to pick over the canned goods.
+     "You still don't have Danish pickles... didn't I  ask  you
+to get some?"
+     "Go to hell," said the driver absent-mindedly.
+     The woman was stunned. Her face slowly turned crimson.
+     "How dare you!" she hissed.
+     The driver looked at her bullishly.
+     "You heard what I said. Get out of here!"
+     "Don't you dare!" said the woman. "What is your number?"
+     "My    number   is   ninety-three,"   said   the   driver,
+"Ninety-three -- is that clear enough? And I  spit  on  all  of
+you. Is that clear? Any other questions?"
+     "What  a  hooliganism!"  said  the woman with dignity. She
+took two cans of delicacies,  scanned  the  counter,  and  with
+great  precision,  ripped  the  cover off the <i>Cosmic Man</i>
+magazine. "I'll remember you, number ninety-three! These aren't
+the old times for you." She wrapped the two cans in the  cover.
+"We'll see each other in the municipal court."
+     I  took a firm hold on the driver's arm. His rigid muscles
+gradually relaxed.
+     "The nerve!" said she majestically and departed.
+     She stepped  along  the  sidewalk,  proudly  carrying  her
+handsome  head,  which  was  topped  with  a  high  cylindrical
+coiffure. She stopped at the corner, opened one  of  the  cans,
+and proceeded to pick out chunks with elegant fingers.
+     I released the driver's arm.
+     "They  ought  to  be shot," he said suddenly. "We ought to
+strangle them instead of dispensing pretty books to  them."  He
+turned  toward  me,  and  I  could  see his eyes were tortured.
+"Shall I deliver your books?"
+     "Well, no," I said. "Where will I put them?"
+     "In that case, shove off," said the driver. "Did you  take
+your Mintz? Then go and wrap your dirty pantaloons in it."
+     He climbed up into the cab. Something clicked and the back
+door began  to  rise.  You  could  hear everything crashing and
+rolling inside the van. Several books and some  shiny  packets,
+boxes,  and  cans  fell on the pavement. The rear panel had not
+yet closed completely when the driver shut his door and the van
+took off with a jerk.
+     The girls had already disappeared. I stood  alone  on  the
+empty  street  and  watched  the  wind lazily turn the pages of
+History of Fascism at my feet. Later a gang of kids in  striped
+shorts  came  around the corner. They walked by silently, hands
+stuck in their pockets. One jumped down  on  the  pavement  and
+began  to  kick  a can of pineapple, with a slick pretty cover,
+like a football down the street.
+
+<ul><a name=6></a><h2>Chapter SIX</h2></ul>
+
+     On the way home, I was overtaken by the change of  shifts.
+The  streets  filled  up with cars. Controller copters appeared
+over the intersections, and sweaty  police  cleared  constantly
+threatening  jams  with  roaring  bull  horns.  The  cars moved
+slowly, and the drivers stuck heads out of windows to light  up
+from  each  other,  to  yell,  to talk and joke while furiously
+blowing their horns. There was a instant  screech  of  clashing
+bumpers.  Everyone  was  happy,  everyone was good-natured, and
+everyone glowed with savage glee. It seemed as though  a  heavy
+load  had  just  fallen  from  the  soul of the city, as though
+everyone was seized with an enviable anticipation. Fingers were
+pointed at me and the other pedestrians. Several  times  I  was
+prodded  with bumpers while crossing -- the girls doing it with
+the utmost good nature. One of  them  drove  alongside  me  for
+quite   a  while,  and  we  got  acquainted.  Then  a  line  of
+demonstrators  with  sober  faces  walked  by  on  the  median,
+carrying  signs.  The  signs  appealed  to  people  to join the
+amateur club ensemble Songs of the  Fatherland,  to  enter  the
+municipal  Culinary  Art  groups,  and to sign up for condensed
+courses in motherhood and childhood. The people with signs were
+nudged by bumpers with special enthusiasm.  The  drivers  threw
+cigarette  butts,  apple  cores,  and  paper wads at them. They
+yelled such things as "I'll subscribe at once, just wait till I
+put my galoshes on," or "Me,  I'm  sterile,"  or  "Say,  buddy,
+teach  me  motherhood."  The  sign  carriers continued to march
+slowly in between the two solid streams  of  cars,  unperturbed
+and sacrificial, looking straight ahead with the sad dignity of
+camels.
+     Not far from my house, I was set upon by a flock of girls,
+and when  I finally struggled through to Second Waterway, I had
+a white aster in my lapel and drying kisses on my  cheeks,  and
+it seemed I had met half the girls in town. What a barber! What
+a Master!
+     Vousi,  in  a  flaming  orange  blouse, was sitting in the
+chair in my study. Her long legs in pointy shoes rested on  the
+table,  while  her  slender fingers held a long slim cigarette.
+With her head thrown back, she was  blowing  thick  streams  of
+smoke at the ceiling, through her nose.
+     "At long last!" she cried, seeing me. "Where have you been
+all this time? As you can see, I've been waiting for you."
+     "I've  been delayed," I said, trying to recollect if I had
+indeed promised to meet her.
+     Wipe off the lipstick," she  demanded.  "You  look  silly!
+What's this? Books? What do you need books for?"
+     "What do you mean by that?"
+     "You  are  really  quite a problem! Comes back late, hangs
+around with books. Or are those pornos?"
+     "It's Mintz," I said.
+     "Let me have them!" She jumped up and snatched  the  books
+out  of  my  grasp.  "Good  God! What nonsense -- all three are
+alike. What is it?  <i>History  of  Fascism</i>...  are  you  a
+Fascist?"
+     "How can you say that, Vousi!"
+     "Then,  what do you need them for? Are you really going to
+read them?"
+     "Reread them."
+     "I just don't understand," she said  peevishly.  "I  liked
+you from the first. Mother says you're a writer, and I went and
+bragged  to  everyone, like a fool, and then you turn out to be
+the next thing to an Intel."
+     "How could you, Vousi!" I said with reproach. By now I had
+realized that it was impermissible to be taken  for  an  Intel.
+"These  bookos  were  simply  needed  in  my literary business,
+that's all."
+     "Bookos!" she laughed. "Bookos! Look at what  I  can  do."
+She threw back her head and blew two thick streams of smoke out
+of  her  nostrils.  "I  got  it on the second try. Pretty good,
+right?"
+     "Remarkable aptitude," I remarked.
+     "Instead of laughing at me, you should  try  it  yourself.
+... A lady taught me at the salon today. Slobbered all over me,
+the fat cow... Will you try it?"
+     "How come she did that?"
+     "Who?"
+     "The cow."
+     "Not  normal.  Or maybe a sad sack.... What's your name? I
+forgot."
+     "Ivan."
+     "An amusing name! You'll have to remind me again. Are  you
+a Tungus?"
+     "I don't think so."
+     "So-o...  and  I  went  and  told  everyone that you are a
+Tungus. Too bad.... Say, why not have a drink?"
+     "Let's."
+     "Today I  should  have  a  strong  drink  to  forget  that
+slobbering cow."
+     She  ran  out  into  the  living room and came back with a
+tray. We had some brandy and looked at each other,  not  having
+anything  to say. I felt ill at ease. I couldn't say why, but I
+liked her. I sensed something,  something  I  couldn't  put  my
+finger   on;   something   which  distinguished  her  from  the
+long-legged, smooth-skinned pin-up beauties, good only for  the
+bed. I had the impression that she sensed something in me, too.
+     "Beautiful day, today," she said, looking away.
+     "A bit hot," I observed.
+     She sipped some brandy; I did too. The silence stretched.
+     "What do you like to do the most?" she asked.
+     "It depends. And you?"
+     "Same with me. In general, I like to have fun and not have
+to think about anything."
+     "So do I," I said. "At least I do right now."
+     She seemed to perk up a little. I understood suddenly what
+was the  matter:  during  the whole day, I had not met a single
+truly pleasant person, and I simply had  gotten  tired  of  it.
+There was nothing to her, after all.
+     "Let's go somewhere," she said.
+     "We could," I said. I really didn't want to go anywhere, I
+wanted to sit and relax in the cool room for a while.
+     "I can see you're not too eager," she said.
+     "To  be  honest,  I  would prefer to sit around here for a
+bit."
+     "Well then, amuse me."
+     I considered the problem, and recounted the story  of  the
+traveling salesman in the upper bunk. She liked it, but I think
+she  missed  the point. I made a correction in my aim, and told
+her the one about the president and the old maid. She laughed a
+long time, kicking her  wonderfully  long  legs.  Then,  taking
+courage  from  another  shot  of brandy, I told about the widow
+with the mushrooms growing on the wall. She slid  down  to  the
+floor  and  almost knocked over the tray. I picked her up under
+the armpits, hoisted her back up in the  chair,  and  delivered
+the  story of the drunk spaceman and the college girl, at which
+point Aunt Vaina came rushing in and  inquired  fearfully  what
+was  going  on  with  Vousi,  and  whether  I  was tickling her
+unmercifully. I poured  Aunt  Vaina  a  glass,  and  addressing
+myself  to her personally, recounted the one about the Irishman
+who wanted to be a gardener. Vousi  was  completely  shattered,
+but  Aunt  Vaina  smiled  sorrowfully  and  confided that Major
+General Tuur liked to tell the same story, when  he  was  in  a
+good mood. But in it there was, she thought, a Negro instead of
+the Irishman, and he aspired to the duties of a piano tuner and
+not  a  gardener.  "And you know, Ivan, the story ended somehow
+differently," she added after some thought.  At  this  point  I
+noticed Len standing in the doorway, looking at us. I waved and
+smiled  at him. He seemed not to notice, so I winked at him and
+beckoned for him to come in.
+     "Whom are you winking at?" asked Vousi, through  lingering
+laughter.
+     "It's Len," I said. It was really a pleasure to watch her,
+as I love  to see people laugh, especially such a one as Vousi,
+beautiful and almost a child.
+     "Where's Len?" she wondered.
+     There was no Len in the doorway.
+     "Len isn't here," said Aunt Vaina, who  was  sniffing  the
+brandy with approval, and did not notice a thing. "The boy went
+to the Ziroks' birthday party today. If you only knew, Ivan..."
+     "But why does he say it was Len?" asked Vousi, glancing at
+the door again.
+     "Len  was here," I said. "I waved at him, and be ran away.
+You know, he looked a bit wild to me."
+     "Ach, we have a  highly  nervous  boy  there,"  said  Aunt
+Vaina.  "He  was  born  in a very difficult time, and they just
+don't know how to deal with a nervous  child  in  these  modern
+schools. Today I let him go visit."
+     "We'll  go,  too,  now," said Vousi. "You'll walk with me.
+I'll just fix myself up, because on account of  you  everything
+got  smeared.  In  the  meantime, you can put on something more
+decent."
+     Aunt Vaina wouldn't have minded staying behind to tell  me
+a  few  more things and maybe show me a photo album of Len, but
+Vousi dragged her off and I heard her ask her mother behind the
+door, "What's his name? I just can't remember it. He is a jolly
+fellow, isn't he?"
+     "Vousi!" admonished Aunt Vaina.
+     I laid out my entire wardrobe on  the  bed  and  tried  to
+imagine what Vousi would consider a decently dressed man. Until
+now,  I had thought I was dressed quite satisfactorily. Vousi's
+heels were already beating an impatient rat-a-tat on the  study
+floor. Not having come up with anything, I called her in.
+     "That's all you have?" she asked, wrinkling her nose.
+     "It really isn't good enough?"
+     "Well,  it  will pass. Take off the jacket and put on this
+Hawaiian shirt... or better yet, this one here. They sure  have
+dressing  problems in your Tungusia! Hurry up. No, no, take off
+the shirt you have on."
+     "You mean, without an undershirt?"
+     "You know, you really are a Tungus. Where do you think you
+are going -- to the pole or to Mars?  What's  this  under  your
+shoulder blade?"
+     "A  bee  stung me," I said, hurriedly pulling on my shirt.
+"Let's go!"
+     The street was already dark. The fluorescents shone palely
+through dark foliage.
+     "Which way are we bound?" I asked.
+     "Downtown, of course.... Don't grab my arm, it's  hot!  At
+least you know how to fight, I hope?"
+     "I know how."
+     "That's good. I like to watch."
+     "To watch, I like, too," I said.
+     There  were  a  lot more people out in the streets than in
+the daytime. Under  the  trees,  in  the  bushes,  and  in  the
+driveways  there  were groups of unsettled-looking individuals.
+They furiously smoked  crackling  synthetic  cigars,  guffawed,
+spat  negligently  and  often,  and spoke in loud rough voices.
+Over each group hung the racket of radio receivers.  Under  one
+streetlight  a  banjo  twanged, and two youngsters, twisting in
+weird contortions  and  yelling  out  wildly,  were  performing
+fling,  a  currently fashionable dance, a dance of great beauty
+when properly executed. The youngsters knew  how.  Around  them
+stood  a  small  crowd, also yelling lustily and clapping their
+hands in rhythm.
+     "Shall we have a dance?" I offered.
+     "But no, no..." hissed Vousi, taking me by  the  hand  and
+increasing her pace.
+     "And why not? You do fling?"
+     "I'd sooner hop with alligators than this crowd."
+     "Too bad," I said, "They look like regular fellows."
+     "Yes,  each  one  by  himself,"  said  Vousi,  "and in the
+daytime."
+     They  hung  around  on   the   corners,   huddled   around
+streetlights,   gauche,   smoked  to  the  gills,  leaving  the
+sidewalks  behind  them  strewn  with  bits  of  candy   paper,
+cigarette  butts,  and  spittle.  They  were  nervous and showy
+melancholic, yearning, constantly looking around, stooped. They
+were awfully anxious not to look like others, and at  the  same
+time,  assiduously imitated each other and two or three popular
+movie stars. There were really not that many,  but  they  stood
+out  like  sore  thumbs,  and it always seemed to me that every
+town and the whole  world  was  filled  with  them  --  perhaps
+because  every  city  and  the  whole world belonged to them by
+night. And to me, they seemed full of some dark mystery, But  I
+too used to stand around of evenings in the company of friends,
+until  some  real people turned up and took us off the streets,
+and many a time I have seen the same groups in all  the  cities
+of  the world, where there was a lack of capable men to get rid
+of them. But I never did understand to the very end what  force
+it  is  that turns these fellows away from good books, of which
+there are so many, from sport  establishments,  of  which  this
+town  had  plenty,  and even from ordinary television sets, and
+drives them out in the night streets with cigarettes  in  their
+teeth  and  transistor sets in their ears, to stand and spit as
+far as possible, to guffaw as offensively as possible,  and  to
+do  nothing.  Apparently at fifteen, the most attractive of all
+the  treasures  in  the  world  is  the  feeling  of  your  own
+importance  and  ability to excite everyone's admiration, or at
+least attract attention. Everything else seems unbearably  dull
+and  dreary,  including,  perhaps  above  all, those avenues of
+achieving the desirable which are offered by the tired world of
+adults.
+     "This is where old Rouen lives," said Vousi. "He has a new
+one with him every night. The old turnip has managed it so that
+they all come to him of their own will. During the fracas,  his
+leg  was  blown off.... You see there is no light in his place,
+they are listening to the hi-fi. On top of which, he's ugly  as
+mortal sin."
+     "He   lives   well   who   has   but   one  leg,"  I  said
+absent-mindedly.
+     Of course she had to giggle at this, and continued.
+     "And here lives Seus. He is a Fisher. Now  there's  a  man
+for you!"
+     "Fisher,"   I   said.   "And   what   does   he  do,  this
+Seus-Fisher?"'
+     "He Fishers. That's what Fishers do -- they Fisher. Or are
+you asking where he works?"
+     "No, I mean to ask where does he Fisher?"
+     "In the Subway." Suddenly she stopped. "Say, you  wouldn't
+be a Fisher?"
+     "Me? Why, does it show?"
+     "There  is something about you, I noticed at once. We know
+about these bees that sting you in the back."
+     "Is that right?" I said.
+     She slipped her arm through mine.
+     "Tell me a story," she said,  cajoling.  "I  never  had  a
+Fisher among my friends. Will you tell me a story?"
+     "Well  now...  shall  I  tell  you about the pilot and the
+cow?"
+     She tweaked my elbow.
+     "No, really..."
+     "What a hot evening," I said. "It's a good thing  you  had
+me take off my jacket!"
+     "Anyway,  everybody  knows. Seus talks about it, and so do
+others."
+     "Ah, so," I said with interest. "And what does Seus tell?"
+     She let go of my arm at once.
+     "I didn't hear it myself. The girls told me."
+     "And what did they tell?"
+     "Well, this and that.... Maybe they put it all on.  Maybe,
+you know. Seus had nothing to do with it."
+     "Hmmm," I said.
+     "Don't  think  anything about Seus, he's a good guy and he
+keeps his mouth closed."
+     "Why should I be thinking about Seus?"  I  said  to  quiet
+her. "I have never even laid eyes on him."
+     She  took my arm again and enthusiastically announced that
+we were going to have a drink now.
+     "Now's the very time for us to have a drink."
+     She was already using the familiar  address  with  me.  We
+turned  a  corner  and came out on a wide thoroughfare. Here it
+was lighter than day. The lamps shone, the  walls  glowed,  the
+display windows were lambent with multicolored fires. This was,
+apparently,  one of Ahmad's circles of paradise. But I imagined
+it differently. I expected roaring  bands,  grimacing  couples,
+half-naked  and naked people. But here it was relatively quiet.
+There were lots of people, and it seemed to me that  most  were
+drunk,  but they were all very well and differently dressed and
+all were gay. And almost all smoked. There  was  no  wind,  and
+waves of bluish smoke undulated around the lights and lanterns.
+Vousi  dragged  me  into  some establishment, found a couple of
+acquaintances, and  disappeared  after  promising  to  find  me
+later.  The crowd was dense, and I found myself pressed against
+the bar. Before I could gather my wits, I found myself  downing
+a  shot.  A brown middle-aged man with yellow whites of the eye
+was booming into my face.
+     "Kiven hurt his leg -- right? Brush became an antique  and
+is  now  quite  useless.  That makes three -- right? And on the
+right they haven't got nobody. Phinney is  on  the  right,  and
+that's worse than nobody. A waiter, that's what be is."
+     "What are you drinking?" I asked.
+     "I  don't  drink  at  all,"  replied  the  brown  one with
+dignity, breathing strong fumes at me. "I have  jaundice.  Ever
+hear of it?"
+     Behind  me,  someone fell off a stool. The noise modulated
+up and down. The brown  one,  sitting  down  next  to  me,  was
+shouting out some story about some character who almost died of
+fresh  air  after  breaking  some  pipe at work. It was hard to
+understand any part  of  it,  as  various  stories  were  being
+shouted from all sides.
+     "... Like a fool, he quieted down and left, and she called
+s taxi  truck,  loaded  up his stuff, and had it dumped outside
+the town..."
+     "... I wouldn't have your TV in  my  outhouse.  You  can't
+think  of  one  improvement  on  the  Omega,  my neighbor is an
+engineer, and that's just what he says -- you can't think up an
+improvement on the Omega..."
+     "... That's the  way  their  honeymoon  ended.  When  they
+returned  home, his father enticed him in the garage -- and his
+father  is  a  boxer  --  and  trounced  him  until   he   lost
+consciousness. They called a doctor later..."
+     "...  So, all right, we took enough for three... and their
+rule is, you know, take as much as you wish,  but  you  get  to
+swallow all of it... and they are watching us by now, and he is
+carried  away -- and says -- let's take more... well, I says to
+myself, enough of this, time to break knuckles..."
+     "... Dear child, with  your  bust,  I  wouldn't  know  any
+grief,  such  a bosom is one in a thousand, but don't think I'm
+flattering you, that's not my style..."
+     A scrawny girl with bangs down to  the  tip  of  her  nose
+climbed  up  on  the vacant stool next to me and began to pound
+with puny fists on the bar, yelling, "Barman, barman, a drink."
+     The din died down again, and I  could  hear  behind  me  a
+tragic  whisper  -- "Where did he get it?" "From Buba, you know
+him, he is an engineer." "Was it real?" "It's scary, you  could
+croak." "Then you need some kind of pill --" "Quiet, will you?"
+"Oh,  all  right,  who  would be listening to us? You got one?"
+"Buba gave me one package, he says any drugstore  has  them  by
+the ton... here, look." "De... Devon -- what is it?" "Some sort
+of  medicine,  how  would  I  know?"  I  turned around. One was
+red-faced with a shirt unbuttoned down to his navel, and with a
+hairy chest. The other was  strangely  haggard-looking  with  a
+large-pored nose. Both were looking at me.
+     "Shall we have a drink?" I said.
+     "Alcoholic," said the pore-nose.
+     "Don't,  Pete. Don't start up, please," said the red-faced
+one.
+     "If you need some Devon, I've got it," I said loudly.
+     They  jumped  back.  Pore-nose  began   to   look   around
+cautiously.  Out  of  the corner of my eye, I could see several
+faces turn toward us and grow still.
+     "Let's go, Pat," said red-face. "Let's go! The  hell  with
+him."
+     Someone put a hand on my shoulder. I turned around and saw
+a handsome sunburned man with powerful muscles.
+     "Yes?" I said.
+     "Friend,"  he said benevolently, "drop this business. Drop
+it while it's not too late. Are you a Rhinoceros?"
+     "I am a hippopotamus," I joked.
+     "No, don't. I'm serious. Did you get beat up, maybe?"
+     "Black and blue."
+     "All right, don't feel  bad  about  it.  Today  it's  you,
+tomorrow  it's  them....  As  for  Devon and all that -- that's
+crap, believe me. There's lots of crap in the world,  but  that
+is the crap of all crap."
+     The  girl  with  the  bangs  advised me, "Crack him in the
+teeth... what's he sticking his nose in for... lousy dick."
+     "Lapping it up, and doing it up brown, aren't  you?"  said
+the  sunburned  one coolly, and turned his back on us. His back
+was huge, and  studded  with  bulging  muscles  under  a  tight
+half-transparent shirt.
+     "None  of  your business," said the girl at his back. Then
+she said to me, "Listen, friend, call the barman for  me  --  I
+can't seem to get through to him."
+     I gave her my glass and asked, "What's to do?"
+     "In  a  minute,  we'll  all  go," replied the girl. Having
+swallowed the alcohol, she went limp all at once. "As  to  what
+to  do  -- that's up to luck. Without luck, you can't make out.
+Or you need money if you deal with promoters. You're probably a
+visitor? Nobody here drinks that dry vodka. How is it your way,
+you should tell me about it.... I'm not going  anywhere  today,
+I'll go to the salon instead. I feel terrible and nothing seems
+to  help....  Mother says -- have a child. But that's dull too,
+what do I need one for?"
+     She closed her eyes and lowered her chin on  her  entwined
+fingers. She looked brazen, but at the same time crestfallen. I
+attempted  to rouse her but she stopped paying attention to me,
+and suddenly started shouting again, "Barman, barman, a drink!"
+     I looked for Vousi. She was nowhere to be seen.  The  cafe
+began to empty. Everyone was in a hurry to get somewhere. I got
+off  my stool, too, and left the cafe. Streams of people flowed
+down the street. They were all going in the same direction, and
+in about five minutes, I was swept out onto a  big  square.  It
+was  huge and poorly lighted, a wide gloomy space bordered by a
+ring of streetlights and store windows. It was full of people.
+     They stood pressed against each  other,  men,  women,  and
+youngsters, boys and girls, shifting from foot to foot, waiting
+for  I  knew  not  what.  There was almost no talking. Here and
+there  cigarette  tips  flared,  lighting  hollow  cheeks   and
+compressed  lips.  Then  a  clock began to strike the hour, and
+over the square, gigantic luminous panels sprang  into  flaming
+light.  There  were  three  of  them  --  red, blue, and green,
+irregularly shaped rounded  triangles.  The  crowd  surged  and
+stood  still.  Around  me, cigarettes were put out with subdued
+movements. The panels went out momentarily and then started  to
+flash  in  rotation: red-blue-green, red-blue-green... I felt a
+wave of hot air on my face, and was suddenly dizzy.  They  were
+astir  around  me.  I  got  up on tiptoes. In the center of the
+square, the people stood motionless; I had the impression  that
+they  were seized rigid and did not fall only because they were
+pressed  in  by  the  crowd.  Red-blue-green,   red-blue-green.
+Wooden, upturned faces, blackly gaping mouths, staring, bulging
+eyes.  They  weren't  even  winking  there, under the panels. A
+total quiet fell, so that I  jumped  when  a  piercing  woman's
+voice  nearby  yelled:  "Shivers!"  All at once, tens of voices
+responded: "Shivers! Shivers!" People on the  sidewalk  on  the
+square's  perimeter  began  to  clap  hands  in rhythm with the
+flashes, and to chant  in  even  voices,  "Shi-vers!  Shi-vers!
+Shi-vers!"  Somebody prodded me in the back with a sharp elbow.
+I was pressed forward to the center, toward the panels. I  took
+a  step  and another and started through the crowd, pushing the
+stiffened bodies  aside.  Two  youngsters,  rigid  as  icicles,
+suddenly  started  thrashing  wildly,  grabbing  at each other,
+scratching and pounding with  all  their  strength,  but  their
+faces  remained  frozen in the direction of the flashing sky...
+red-blue-green, red-blue-green. And just as  suddenly  as  they
+started, they grew still again.
+     At  this  paint,  finally,  I understood that all this was
+extraordinarily amusing. Everyone laughed. There  was  lots  of
+room around me and music thundered forth. I swept up a charming
+girl  and  we began to dance, as they used to dance, as dancing
+should be done and was done a long, long time ago,  as  it  was
+done  always  with abandon, so that your head swam, and so that
+everyone admired you. We stepped out of the way, and I held  on
+to her hands, and there was no need to talk about anything, and
+she  agreed  that the van driver was a strange man. Can't stand
+alcoholics, said Rimeyer, and pore-nose  is  the  most  genuine
+alcoholic,  and  what  about  Devon  I  said,  how could you be
+without Devon when we have an excellent zoo, the buffaloes love
+to wallow in the mud, and bugs are constantly swarming  out  of
+it.  Rim,  I  said,  there are some fools who said that you are
+fifty years old -- such nonsense when I wouldn't give you  over
+twenty-five  --  and this is Vousi, I told her about you, but I
+am intruding on you, said Rimeyer; no one can  intrude  on  us,
+said  Vousi,  as  for Seus he's the best of Fishers, he grabbed
+the splotcher and got the ray right  in  the  eye,  and  Hugger
+slipped  and  fell  in  the  water  and  said -- wouldn't it be
+something for you to drown -- look your gear are melting  away,
+aren't  you  funny,  said  Len, there is such a game of boy and
+gangster, you know, you remember we played with Maris...  Isn't
+it  wonderful,  I  have  never  felt so good in my life, what a
+pity, when it could be like this  every  day.  Vousi,  I  said,
+aren't  we  great fellows, Vousi, people have never had such an
+important problem before, and we solved it and  there  remained
+only  one  problem,  Vousi,  the  sole problem in the world, to
+return to people a spiritual content, and  spiritual  concerns,
+no, Seus, said Vousi, I love you very much, Oscar, you are very
+nice,  but  forgive  me,  would  you,  I  want it to be Ivan, I
+embraced her and felt that it was right to kiss her and I  said
+I love you...
+     Boom! Boom! Boom! Something exploded in the dark night sky
+and tinkling  sharp  shards  began to fall on us, and at once I
+felt cold and uncomfortable. There were  machine  guns  firing!
+Again  the  guns  rattled.  "Down, Vousi," I yelled, although I
+could not yet understand what was going on, and threw her  down
+on the ground and covered her with my body against the bullets,
+whereupon blows began to rain on my face.
+     Bang, bang, rat-tat-tat-tat... around me people stood like
+wooden  pickets. Some were coming to and rolling their eyeballs
+inanely. I was half reclining on a man's chest,  which  was  as
+hard  as  a  bench,  and right in front of my eyes was his open
+mouth  and   chin   glistening   with   saliva...   Blue-green,
+blue-green, blue-green... Something was missing.
+     There were piercing screams, cursing, someone thrashed and
+screeched  hysterically. A mechanical roar grew louder over the
+square. I raised my head with difficulty. The panels were right
+overhead, the blue and green flashing regularly, while the  red
+was  extinguished and raining glass rubble. Rat-tat-tat-tat and
+the green panel broke and darkened. In the blue remaining light
+unhurried wings floated by, spewing the reddish lightning of  a
+fusillade.
+     Again  I  attempted  to throw myself on the ground, but it
+was impossible, as they  all  stood  around  me  like  pillars.
+Something  made  an ugly snap quite near me, and a yellow-green
+plume rose skyward from which puffed a repulsive  stench.  Pow!
+Pow!  Another two plumes hung over the square. The crowd howled
+and stirred. The yellow vapor was caustic like mustard, my eyes
+and mouth filled, and I began to cry and cough, and around  me,
+everyone began to cry and cough and yell hoarsely: "Lousy bums!
+Scoundrels!  Sock  the  Intels!"  Again  the roar of the engine
+could be heard, coming in louder and louder. The  airplane  was
+returning.  "Down,  you  idiots,"  I yelled. Everyone around me
+flopped down all over each other.  Rat-tat-tat-tat!  This  time
+the  machine  gunner  missed  and the string apparently got the
+building opposite us. To make up for the miss,  the  gas  bombs
+fell  again  right on target. The lights around the square went
+out, and with them the blue panel, as a free-for-all started in
+the pitch-black dark.
+
+<ul><a name=7></a><h2>Chapter SEVEN</h2></ul>
+
+     I'll never know how I arrived at that fountain. It must be
+that I have good instincts and ordinary cold water was  exactly
+what  I  needed. I crawled into the water without taking off my
+clothes, and lay down, feeling better immediately. I was  lying
+on  my back, drops rained on my face, and this was unbelievably
+pleasant. It was quite dark here, and dim stars  shone  through
+the  branches  and  the  water.  It was very quiet. For several
+minutes I was watching a brighter star, for some reason unknown
+to me, which was slowly moving across the sky, until I realized
+that I was watching the relay satellite Europa.  How  far  from
+all  this,  I  thought, how degrading and senseless to remember
+the revolting mess on the square, the disgusting foul mouthings
+and screechings, the wet phrumping of the gas  bombs,  and  the
+putrid  stench  which turned your stomach and lungs inside out.
+Understanding   freedom   as   the   rapid   satisfaction   and
+multiplication  of  needs  and  desires,  I recollected, people
+distort their natures as they engender within  themselves  many
+senseless  and  stupid  desires,  habits  and the most unlikely
+inventions....
+     Priceless Peck, he loved to quote old pundit Zosima as  he
+circled  around  a  well-laid table, rubbing his hands. We were
+snot-nosed undergrads then and ingenuously believed  that  such
+pronouncements,  in  our  time,  were  meant  only  to show off
+flashes  of  humor  and  erudition....  At  this  point  in  my
+reflections,  someone  noisily  plunged into the water some ten
+paces from me.
+     At first he coughed hoarsely, spat and blew his  nose,  so
+that  I  hurried to leave the water, then he started to splash,
+finally became quiet, and  suddenly  discharged  himself  of  a
+string of curses:
+     "Shameless  lice,"  he  growled. "Whores, swine... on live
+people! Stinking hyenas, rotten  scum...  learned  prostitutes,
+filthy  snakes."  He  hawked  furiously again. "It bothers them
+that people are having a good time! Stepped  on  my  face,  the
+crud!"  He  groaned  nasally and painfully, "The hell with this
+shiver business. That will be the day when I'll go again."
+     He moaned again and rose. I could hear the  water  running
+from his clothes. I could dimly perceive his swaying figure. He
+saw me too.
+     "Hey, friend, have a smoke on you?"
+     "I did," I replied.
+     "Low-lifers! I didn't think to take them out. Just fell in
+with everything  on."  He  splashed  over  to  me  and sat down
+alongside. "Some moron stepped on my cheek," he informed me.
+     "They marched over me, too,"  I  said.  "The  people  went
+ape."
+     "But,  you  tell  me,  where do they get the tear gas?" he
+said. "And machine guns?"
+     "And airplanes," I added.
+     "An airplane means nothing," he contradicted. "I have  one
+myself.  I bought it cheap for seven hundred crowns.... What do
+they want, that's what I don't understand."
+     "Hoodlums," I said. "They should have their  faces  pulped
+properly, and that would be the end of that argument."
+     He laughed bitterly.
+     "Someone  did!  For  that you get worked over good.... You
+think they didn't get beat up? And how they got  beat  up!  But
+apparently  that  isn't  enough....  We should have driven them
+right into the ground, together with their  excrement,  but  we
+passed  up  the  chance....  And  now  they  are  giving us the
+business! The people got soft, that's what, I tell you.  Nobody
+gives  a  damn.  They put their four hours in, have a drink and
+off to the shivers! And you can pot them like clay pigeons." He
+slapped his sides in desperation. "Those were  the  times,"  he
+cried.  "They didn't dare open their mouths! Should one of them
+even whisper, guys in black shirts or maybe white  hoods  would
+pay a night visit, crunch him in the teeth, and off to the camp
+he  went,  so  there wouldn't be a peep out of him again.... In
+the schools, my son says, everyone bad-mouths fascism: Oh dear,
+they hurt the Negroes' feelings; oh dear, the  scientists  were
+witch-hunted;  oh  dear,  the camps; oh dear, the dictatorship!
+Well, it wasn't witch-hunting that was needed,  but  to  hammer
+them  into  the  ground,  so  there  wouldn't  be  any left for
+breeding!" He drew his hand under his nose, slurping  long  and
+loud.
+     "Tomorrow  morning,  I have to go to work with my face all
+out of shape.... Let's go have a drink,  or  we'll  both  catch
+cold."
+     We crawled through the bushes and came out on the street.
+     "The Weasel is just around the corner," he informed me.
+     The  Weasel was full of wet-haired half-naked people. They
+seemed depressed, somehow embarrassed,  and  gloomily  bragging
+about their contusions and abrasions. Several young women, clad
+only  in  panties,  clustered  around  the  electric fireplace,
+drying their skirts. The men patted them platonically on  their
+bare  flesh. My companion immediately penetrated into the thick
+of the crowd, and swinging his arms and blowing his  nose  with
+his fingers, began to call for "hammering the bastards into the
+ground." He was getting some weak support.
+     I asked for Russian vodka, and when the girls left, I took
+off my  sport  shirt  and  sat  by  the  fireplace.  The barman
+delivered my glass and returned at once to his crossword in the
+fat magazine. The public continued its conversation.
+     "So, what's the shooting for? Haven't  we  had  enough  of
+shooting?  Just  like little boys, by God... just spoiling some
+good fun."
+     "Bandits, they're worse than gangsters, but like it or not
+that shiver business is no good, too."
+     "That's right. The other day mine says to me, 'Papa, I saw
+you; you were all blue like a corpse and  very  scary'  --  and
+she's only ten. So how can I look her in the eyes? Eh?"
+     "Hey  anybody! What's an entertainment with four letters?"
+asked the barman without raising his head.
+     "So, all right, but who dreamed all this up -- the  shiver
+and the aromatics? Eh and also..."
+     "If you got drenched, brandy is best."
+     "We were waiting for him on the bridge, and along he comes
+with his eyeglasses and some kind of pipe with lenses in it. So
+up he  goes over the rail with his eyeglasses and his pipe, and
+he kicked his legs once and that was that. And then  old  Snoot
+comes  running,  after having been revived, and he looks at the
+guy blowing bubbles. "Fellows," he says, "What the hell is  the
+matter with you, are you drunk or something, that's not the guy
+-- I am seeing him for the first time..."
+     "I  think  there  ought to be a law -- if you are married,
+you can't go to the shiver."
+     "Hey somebody," again the bartender,  "What's  a  literary
+work with seven letters -- a booklet, maybe?"
+     "So, I myself had four Intels in my squad, machine gunners
+they were.  It's  quite  true  that  they fought like devils. I
+remember we  were  retreating  from  the  warehouse,  you  know
+they're  still  building a factory there, and two stayed behind
+to cover us. By the way, nobody asked  them,  they  volunteered
+entirely  by  themselves.  Later  we  came  back and found them
+hanging side by side from the rail crane, naked, with all their
+appurtenances ripped off with hot pincers. You understand?  And
+now,  I'm  thinking, where were the other two today? Maybe they
+were the very same guys to treat me to some tear gas, those are
+the types that can do such things."
+     "So who didn't get hung? We got hung  by  various  places,
+too!"
+     "Hammer  them into the ground right up to their noses, and
+that'll be the end of that!"
+     "I'm going. There is no point in hanging around here,  I'm
+getting  heartburn.  They must have fixed everything up by now,
+back there."
+     "Hey, barman, girls, let's have one last one."
+     My shirt had dried, and as the cafe emptied, I  pulled  it
+on  and  went  over  to  sit  at  a  table  and  to  watch. Two
+meticulously dressed gentlemen in the corner were sipping their
+drinks through straws.  They  called  attention  to  themselves
+immediately  -- both were in severe black suits and black ties,
+despite the very warm night. They weren't talking, and  one  of
+them  constantly  referred  to his watch. After a while, I grew
+tired of observing them. Well, Doctor Opir, how do you like the
+shivers? Were you at the square? But of course  you  were  not.
+Too  bad.  It  would  have  been  interesting  to know what you
+thought of it. On the other hand, to the devil with  you.  What
+do  I  care  what  Doctor Opir thinks? What do I think about it
+myself? Well, high-grade barber's raw  material,  what  do  you
+think? It's important to get acclimatized quickly
+     and  not  stuff  the  brain with induction, deduction, and
+technical procedures.  The  most  important  thing  is  to  get
+acclimatized as rapidly as possible. To get to feel like one of
+them....  There,  they  all  went  back  to the square. Despite
+everything that happened, they still went back  to  the  square
+again.  As for me, I don't have the slightest desire to go back
+there. I would, with the greatest of pleasure at this point, go
+back to my room and check out my new bed. But when would  I  go
+to  the  Fishers?  Intels,  Devon, and Fishers. Intels -- maybe
+they are the local version of the Golden Youth? Devon...  Devon
+must be kept in mind, together with Oscar. But now the Fishers.
+     "The Fishers; that's a little bit vulgar," said one of the
+black suits, not whispering, but very quietly.
+     "It  all  depends on temperament," said the other. "As for
+me, personally I don't condemn Karagan in the slightest."
+     "You see, I  don't  condemn  him  either.  It's  a  little
+shocking  that  he picked up his options. A gentleman would not
+have behaved that way."
+     "Forgive me, but Karagan is no gentleman.  He  is  only  a
+general   manager.   Hence   the   small-mindedness   and   the
+mercantilism and a certain what I might call commonness..."
+     "Let's not be so  hard  on  him.  The  Fishers  --  that's
+something  intriguing. And to be honest, I don't see any reason
+why we should not involve ourselves. The old Subway  --  that's
+quite  respectable.  Wild is much more elegant than Nivele, but
+we don't reject Nivele on that account."
+     "'You really are seriously considering?"
+     "Right now, if you wish.... It's five to two, by the  way.
+Shall we go?"
+     They  got  up,  said  a friendly and polite goodbye to the
+bartender, and proceeded toward the exit. They looked  elegant,
+calm,  and  condescendingly remote. This was astounding luck. I
+yawned loudly, and muttering, "Off  to  the  square,"  followed
+them,  pushing  stools  out  of  my  way. The street was poorly
+illuminated, but I saw them immediately. They were in no hurry.
+The one on the right was the  shorter,  and  when  they  passed
+under  the  street lights, you could see his safe, sparse hair.
+As near as I could tell, they were no longer conversing.
+     They detoured  the  square,  turned  into  a  dark  alley,
+avoided  a  drunk  who  tried  to strike up a conversation, and
+suddenly, without one backward glance, turned abruptly  into  a
+garden  in  front of a large gloomy house. I heard a heavy door
+thud shut. It was a minute before two.
+     I pushed off the drunk, entered the garden, and  sat  down
+on  a silver-painted bench under a lilac bush. The wooden bench
+was situated on a sandy path which ran through  the  garden.  A
+blue  lamp  illuminated  the  entrance  of  the  house,  and  I
+discerned two caryatids supporting the balcony over  the  door.
+This  didn't  look  like the entrance to the old subway, but as
+yet, I couldn't tell for sure, so I decided to wait.
+     I didn't have to wait long. There was a  rustle  of  steps
+and  a  dark  figure  in a cloak appeared on the path. It was a
+woman. I did not grasp immediately why her proudly raised  head
+with  a  high  cylindrical  coiffure,  in  which  large  stones
+glistened in the starlight, seemed familiar. I  arose  to  meet
+her,  and  said,  trying  to sound both respectful and mocking,
+"You are late, madam, it's after two."
+     She was not in the least startled.
+     "You don't say!" she exclaimed. "Can it be my watch is  so
+slow?"
+     It  was  the  very same woman who had the altercation with
+the van driver, but of course she did not recognize  me.  Women
+with  such  disdainful-looking lower lips never remember chance
+meetings. I took her by the arm, and we mounted the wide  stone
+steps.  The  door  turned  out to be as heavy as a reactor-well
+cover. There was no  one  in  the  entrance  hall.  The  woman,
+without  turning, flung the cloak on my arm and went ahead, and
+I paused for a second to look at myself  in  the  huge  mirror.
+Good  man,  Master  Gaoway, but it still behooved me to stay in
+the shadows. We entered the ballroom.
+     No, this was anything but a subway. The room was  enormous
+and  incredibly  old-fashioned.  The walls were lined with dark
+wood, and fifteen feet up, there was a gallery with a  railing.
+Pink  blond-curled angels smiled down with only their blue lips
+from a far-flung ceiling. Almost the entire floor of  the  room
+was  covered  with  rows  of  soft  massive chairs covered with
+embossed leather. Elegantly dressed people, mostly  middle-aged
+men,  sat  in  them  in  relaxed and negligent poses. They were
+looking at the far end  of  the  room,  where  a  brightly  lit
+picture blazed against a background of black velvet.
+     No  one  turned to look at us. The woman glided toward the
+front rows, and I sat down near the door. By now, I was  almost
+sure  that  I  had come here for nothing. There was silence and
+some coughs, and lazy streams of smoke curled upward  from  the
+fat cigars; many bald pates glistened under the chandeliers. My
+attention   turned   to   the  picture.  I  am  an  indifferent
+connoisseur of paintings, but it looked like a Raphael, and  if
+it was not genuine, it was certainly a perfect copy.
+     There  was  a deep brassy gong, and simultaneously a tall,
+thin man in a black mask appeared by the side of the picture. A
+black leotard covered  his  body  from  head  to  toe.  He  was
+followed by a limping, hunchbacked dwarf in a red smock. In his
+short, extended pawlike arms, he held a dully glinting sword of
+a  most  wicked appearance. He went to the right of the picture
+and stood still, while the masked  individual  stepped  forward
+and  spoke  in  a measured tone: "In accordance with the bylaws
+and directives of the Honorable Society of Patrons, and in  the
+name  of  Art,  which is holy and irreproducible, and the power
+granted me by you, I have examined the  history  and  worth  of
+this painting and now --"
+     "Request a halt," sounded a curt voice behind me.
+     Everyone  turned around. I also turned around and saw that
+three young, obviously very powerful, and immaculately  dressed
+men  were  looking at me full in the face. One had a monocle in
+his right eye. We studied each other for a few seconds, and the
+man with the monocle twitched his cheek and let it drop. I  got
+up  at once. They moved toward me together, stepping softly and
+soundlessly. I tried the chair, but it was  too  massive.  They
+jumped  me.  I met them as best I could and at first everything
+went well, but very quickly it became evident  that  they  wore
+brass  knuckles,  and I barely managed to evade them. I pressed
+my back against  the  wall  and  looked  at  them  while  they,
+breathing  heavily,  looked at me. There were still two of them
+left. There was the usual coughing in the auditorium. Four more
+were coming down the gallery steps, which squeaked and  groaned
+loudly enough to reverberate in the hall. Bad business, thought
+I, and launched myself to force a breach.
+     It  was hard going, just like the time in Manila, but then
+there were two of us. It would have been better  if  they  were
+armed, as I would have had a chance to expropriate a gun.
+     But  all  six of them met me with knuckles and truncheons.
+Luckily for me it was very crowded. My left  arm  went  out  of
+commission,  and  then the four suddenly jumped back, while the
+fifth drenched me with a clammy liquid from a  flat  container.
+Simultaneously, the lights were extinguished.
+     These tricks were well known to me: now they could see me,
+but I  could  not  see them. In all probability that would have
+been the end of me, were it not that some idiot threw open  the
+door  and announced in a greasy basso, "I beg forgiveness, I am
+terribly late and so sorry..." I charged toward the light, over
+some bodies, mowed down the latecomer, flew across the entrance
+hall, threw open the front door, and pelted down the sandy path
+holding my left arm with my right hand. No one was pursuing me,
+but I traversed two blocks before it dawned on me to stop.
+     I flung myself down on a lawn and lay for a long  time  in
+the short grass, grabbing lungfuls of the warm moist air. In no
+time,   the  curious  gathered  around  me.  They  stood  in  a
+semicircle and ogled me avidly, not saying a word. "Take  off,"
+I  said,  getting  up  finally. Hurriedly, they scooted away. I
+stood awhile, figuring out where I was, and began  a  stumbling
+journey  homeward.  I  had had enough for today. I still didn't
+get it, but I had had quite enough. Whoever  they  were,  these
+members  of  the Honorable Society of Art Patrons -- secret art
+worshippers, extant aristocrat-conspirators or whoever else  --
+they  fought  cruelly and without quarter, and the biggest fool
+in that hall of theirs was still apparently none other than I.
+     I passed by the  square,  where  again  the  color  panels
+pulsed   rhythmically,   and   hundreds  of  hysterical  voices
+screamed, "Shi-vers! Shi-vers!" Of this too I had  had  enough.
+Pleasant dreams are, of course, more attractive than unpleasant
+ones,  but  after  all,  we  do  not  live  in  a dream. In the
+establishment where Vousi had taken  me,  I  had  a  bottle  of
+ice-cold  soda water, observed with curiosity a squad of police
+peacefully camped by the bar, and went out, turning into Second
+Waterway.
+     A lump the size of a tennis ball was rising behind my left
+ear. I weaved badly and walked slowly,  keeping  close  to  the
+fences. Later, I heard the tap of heels behind me and voices:
+     "... Your place is in the museum, not in a cabaret."
+     "Nothing   of   the  sort,  I  am  not  drunk.  Can't  you
+und-derstand, only one measly bottle of wine..."
+     "How disgusting! Soused and picking up a wench."
+     "What's the girl got to do with it? She is a m-model!"
+     "Fighting over a wench. Making us fight over her."
+     "Why in hell d-do you believe them and don't believe me?"
+     "Just because you're drunk! You're a bum, just  like  they
+all are, maybe worse...."
+     "That's  all  right. I'll remember that scoundrel with the
+bracelet quite well.... Don't hold me! I'll walk by myself!"
+     "You'll  remember  nothing,  friend.  Your  glasses   were
+knocked  off in the first instant, and without them, you aren't
+even a man, but a blind sausage.... Stop kicking, or it will be
+the fountain for you...."
+     "I'm warning you, one more  stunt  like  that,  and  we'll
+throw  you out. A drunken <i>kulturfuhrer</i> -- it's enough to
+make you sick."
+     "Stop preaching at him, give a man a chance  to  sleep  it
+off."
+     "Fellows! There he is, the l-louse!"
+     The  street  was  empty,  and  the louse was clearly me. I
+could bend my left arm already, but it hurt like the devil, and
+I stepped back to let them pass. There were three of them. They
+were young, in identical caps, pushed  over  their  eyes.  One,
+thickset and low-slung, was obviously amused and held the other
+one,  a tall, open-faced, loose-jointed fellow, with a powerful
+grip, restraining  his  violent  and  sporadic  movements.  The
+third,  long  and  skinny,  with a narrow and darkish face, was
+following at some distance with his hands behind his  back.  As
+he got alongside me, the loose-jointed one braked determinedly.
+The short one attempted to nudge him off the spot, but in vain.
+     The  long  one  passed  by  and then stopped, looking back
+impatiently over his shoulder.
+     "Thought  you  were  gonna  get  away,  pig!"  he   yelled
+drunkenly,  attempting  to  seize me by the chest with his free
+hand.
+     I retreated to the fence and said,  addressing  myself  to
+the short fellow, "I had no business with you."
+     "Stop being a rowdy," said the distant one sharply.
+     "I  remember  you  very  well  indeed,"  yelled the drunk.
+"You're not going to get away from me! I'll get even with you!"
+     He advanced upon me in surges, dragging the short one,
+     who hung on with bulldog grimness, behind him.
+     "It's not him," cajoled the low-slung one, who  was  still
+very  merry.  "That guy went off to the shivers and this one is
+sober."
+     "You won't fool me."
+     "I'm warning you for the last time. We are going to  expel
+you."
+     "Got scared, the bum! Took off his bracelet."
+     "You  can't  even  see  him. You're worthless without your
+glasses."
+     "I can see everything pe-erfectly!... And even if he isn't
+the one..."
+     "Stop it! Enough is enough!"
+     The long one finally came back and grasped the drunk  from
+the other side.
+     "Will  you  move  on!" he said to me with irritation, "Why
+the devil are you  stopping  here!  Haven't  you  ever  seen  a
+drunk?"
+     "Oh, no! You aren't going to get away from me."
+     I  continued  on  my  way. I had not far to go by now. The
+trio dragged along behind me noisily.
+     "I can see right through  him,  if  you  please.  King  of
+Nature!  Drunk  enough  to  retch, and to beat up whoever comes
+along. Got beat up himself, and that's all he needs.... Let  go
+of me, I'll hang a few good ones on his mug...."
+     "What  have  you come to, we have to walk you along like a
+hood."
+     "So don't walk me!... I loathe them.... Shivers,  wenches,
+whiskey... brainless jelly..."
+     "Sure, sure, take it easy, just don't fall."
+     "Enough  of  your reproofs... I am sick of your hypocrisy,
+your puritanism. We should  blow  them  up,  shoot  them!  Raze
+everything off the face of the earth!"
+     "Drunk as a coot, and I thought he was sobered up!"
+     "I  am  sober. I remember everything... the twenty-eighth,
+right?"
+     "Shut up, you fool."
+     "Shh! Right  you  are!  The  enemy  is  on  the  alert....
+Fellows,  there  was  a spy here somewhere.... Didn't I talk to
+him?... The son of a bitch took off his  bracelet...  but  I'll
+get that dick before the twenty-eighth!"
+     "Will you be quiet!"
+     "Shh!  And  not  another word. That's it! And don't worry,
+the grenade launchers are my baby."
+     "I am going to kill him right now, the bum!"
+     "Lay it on the enemies of civilization.... Fifteen hundred
+meters of tear gas -- personally... six sectors... awk!"
+     I was already by the gate  to  my  house.  When  I  turned
+around  to  look,  the burly man was lying face down, the short
+one was  squatting  alongside,  while  the  long  fellow  stood
+rubbing the edge of his right hand.
+     "Why  did you do that?" said the short man. "You must have
+maimed him."
+     "Enough prattle," said the long one furiously.  "We  can't
+seem  to  learn  to  stop  prattling.  We  can't  learn to stop
+boozing. Enough!"
+     Let us be as children, Doctor Opir,  thought  I,  slipping
+into  the yard as quietly as possible. I held the latch to keep
+it from clicking into place.
+     "Where did he go?" said the long one, lowering his voice.
+     "Who?"
+     "The guy who went ahead of us."
+     "Turned off somewhere."
+     "Where? Did you notice?"
+     "Listen, I wasn't concerned about him."
+     "Too bad. But all right, pick him up, and let's go."
+     Stepping into the shadow of the  apple  trees,  I  watched
+them drag the drunk by the gate. He was wheezing horribly.
+     The house was quiet. I went to my quarters, undressed, and
+took a  hot shower. My shirt and shorts smelled of tear gas and
+were covered with the greasy spots of the  luminous  liquid.  I
+threw  them  into  the  hamper. Next, I inspected myself in the
+mirror and marveled once more at how lightly I had gotten away:
+a bump  behind  the  ear,  a  sizable  contusion  on  the  left
+shoulder, and some scraped ribs. Also skinned knuckles.
+     On   the   night   table,  I  discovered  a  notice  which
+respectfully suggested that I deposit a sum to cover  the  rent
+for  the apartment for the first thirty days. The sum was quite
+considerable, but tolerable. I counted out a  few  credits  and
+stuffed  them into the thoughtfully provided envelope, and then
+lay down on the bed with my hands behind my  head.  The  sheets
+were cool and crisp, and a salty sea breeze blew in through the
+open  window.  The  phonor  susurrated  cozily behind my ear. I
+intended to think awhile before falling  asleep,  but  was  too
+exhausted and quickly dozed off.
+     Later,  some  noise  in  the background awakened me, and I
+grew alert and listened with eyes wide open.
+     Somewhere nearby, someone either cried or sang in  a  thin
+childish  voice.  I  got  up cautiously and leaned out the open
+window. The thin halting voice was intoning: "... having stayed
+in the grave but a short time, they come out and live among the
+living as though alive." There was the sound of sobs. From  far
+away  like  the keening of a mosquito came the chant "Shi-vers!
+Shi-vers!" The pitiable little voice  went  on  --  "Blood  and
+earth  mixed  together  they  can't eat." I thought that it was
+Vousi, drunk and lamenting upstairs in her room, and called out
+softly, "Vousi!" No one replied,  The  thin  voice  cried  out:
+"Hence from my hair, hence from my flesh, hence from my bones,"
+and  I  knew who it was. I climbed over the window sill, jumped
+onto the lawn, and went to the apple grove,  listening  to  the
+sobbing. Light appeared through the trees, and soon I came to a
+garage. The doors were cracked open and I looked in. Inside was
+a  huge  shiny Opel. Two candles were burning on the workbench.
+There was a smell of gasoline and hot wax.
+     Under the candles,  seated  on  a  work  stool,  was  Len,
+dressed  in  a  full-length  white  gown,  in bare feet, with a
+thick, well-worn  book  on  his  knees.  He  regarded  me  with
+wide-open  eyes,  his  face  completely  white  and frozen with
+terror.
+     "What are you doing here?" I said loudly and entered.
+     He continued to look at  me  in  silence  and  started  to
+tremble. I could hear his teeth chattering.
+     "Len,  old  friend," I said, "I guess you didn't recognize
+me. It's me -- Ivan."
+     He dropped the book and hid his hands in his  armpits.  As
+earlier today, in the morning, his face beaded with cold sweat.
+I  sat  down  alongside  of  him  and  put  my  arm  around his
+shoulders. He collapsed against me weakly. He shook all over. I
+looked at the book. A certain Doctor Neuf had blessed the human
+race with <i>An Introduction to  the  Science  of  Necrological
+Phenomena</i>. I kicked the book under the bench.
+     'Whose ear is that?" I asked loudly.
+     "Mo... Mama's..."
+     "A very nice Ford."
+     "It's not a Ford. It's an Opel."
+     "You're right -- it is an Opel... a couple of hundred
+     miles per hour I would guess..."
+     "Yes."
+     "Where did you get the candles?"
+     "I bought them."
+     "Is  that  right!  I didn't know that they sold candles in
+our time. Is your bulb burned out? I went out  in  the  garden,
+you  know, to get an apple off a tree, and then I saw the light
+in the garage."
+     He moved closer to me and said, "Don't leave for  a  while
+yet, will you?"
+     "OK.  What  do you say we blow out the lights and go to my
+place?"
+     "No, I can't go there."
+     "Where can't you go?"
+     "In the house and to your  place."  He  was  talking  with
+tremendous  conviction. "For quite a while yet. Until they fall
+asleep."
+     "Who?"
+     "They."
+     "Who are -- they?"
+     "They -- you hear?"
+     I listened. There was only the rustle of branches in the
+     wind and somewhere very far away the  cry  of:  "Shi-vers!
+Shi-vers!"'
+     "I don't hear anything special," I said.
+     "That's because you don't know. You are new here and
+     they don't bother the new ones."
+     "But who are they, after all?"
+     "All of them. You've seen the fink with the buttons?"
+     "Pete? Yes, I saw him. But why is he a fink? In my
+     opinion, he's an entirely respectable man."
+     Len jumped up.
+     "Come  on,"  he  said in a whisper, "I'll show you. But be
+quiet."
+     We came out of the garage, crept  up  to  the  house,  and
+turned  a  corner.  Len held my hand all the time; his palm was
+cold and wet..
+     "There -- look," he said.
+     Sure enough, the sight was frightening. My customs  friend
+was  lying  on  the  porch  with his head stuck at an unnatural
+angle through the railing. The mercury  vapor  light  from  the
+street  fell  on  his  face, which looked blue and swollen, and
+covered with dark welts. Through half-open lids, the eyes could
+be seen, crossed toward the bridge of the nose.
+     'They walk among the living, like  living  people  in  the
+daytime," murmured Len, holding on to me with both hands. "They
+bow  and  smile,  but at night their faces are white, and blood
+seeps through  their  skin."  I  approached  the  veranda.  The
+customs  man  was  dressed  in pajamas. He breathed noisily and
+exuded a smell of cognac. There  was  blood  on  his  face,  as
+though he'd fallen on his face into some broken glass.
+     "He's  just  drunk,"  I  said  loudly.  "Simply  drunk and
+snoring. Very disgusting."
+     Len shook his head.
+     "You are a newcomer," he whispered. "You see nothing.  But
+I saw." He shook again. "Many of them came. She brought them...
+and  they  carried her in... there was a moon... they sawed off
+the top of her head... and she  screamed  and  screamed...  and
+then  they  started  to eat with spoons. She ate, too, and they
+all laughed when she screamed and flopped around..."
+     "Who? Who was it?"
+     "And then they piled on wood  and  burned  it  and  danced
+around  the  fire...  and  then  they  buried everything in the
+garden... she went out to get the shovel in the car... I saw it
+all... do you want to see where they buried her?"
+     "You know what, friend?" I said. "Let's go to my place."
+     "What for?"
+     "To get some sleep, that's what for. Everyone is  sleeping
+-- only you and I are palavering here."
+     "Nobody  is sleeping. You really are new. Right now no one
+is sleeping. You must not sleep now."
+     "Let's go, let's go," said I, "over to my place."
+     "I won't go," he said. "Don't touch me. I didn't say  your
+name."
+     "I  am  going  to  take a belt," I said menacingly, "and I
+will strap your behind."
+     Apparently this calmed him. He clutched my hand again  and
+became silent.
+     "Let's  go,  old  pal, let's go," I said. "You're going to
+sleep and I will sit alongside you.  And  if  anything  at  all
+happens, I will awaken you at once."
+     We  climbed into my room through the window (he absolutely
+refused to enter the house by the front door), and I put him to
+bed. I intended  to  tell  him  a  tale,  but  he  fell  asleep
+immediately. His face looked tortured, and every few minutes he
+quivered  in  his  sleep.  I  pushed  the  chair by the window,
+wrapped myself in a bathrobe, and smoked a cigarette to calm my
+nerves. I attempted  to  think  about  Rimeyer  and  about  the
+Fishers,  with whom I had not met up after all; about what must
+happen on the twenty-eighth; and about  the  Art  Patrons,  but
+nothing  came of it and this irritated me. It was annoying that
+I was unable  to  think  about  my  business  as  something  of
+importance.   The   thoughts  scattered  and  jumbled  emotions
+intruded, and I did not think so much as I felt. I felt that  I
+hadn't  come for nothing, but at the same time, I sensed that I
+had come for altogether the wrong reason.
+     But Len slept. He  did  not  even  awake  when  an  engine
+snorted at the gate, car doors were slammed, there were shouts,
+chokes, and howls in different voices, so that I almost decided
+that a crime was being committed in front of the house, when it
+became  clear  that  it  was  just  Vousi  coming back. Happily
+humming, she began  to  undress  while  still  in  the  garden,
+negligently  draping her blouse, skirt, and other garments over
+the apple branches. She didn't notice me, came into the  house,
+shuffled  around upstairs for a while, dropped something heavy,
+and finally settled down. It was close  to  five  o'clock.  The
+glow of dawn was kindling over the sea.
+
+<ul><a name=8></a><h2>Chapter EIGHT</h2></ul>
+
+     When I woke up, Len was already gone. My shoulder ached so
+badly  that  the pain pounded in my head, and I promised myself
+to take it easy the whole day. Grunting and  feeling  sick  and
+forlorn,  I executed a feeble attempt at set-ting-up exercises,
+approximated a wash-up, took the envelope with the  money,  and
+set  out  far Aunt Vaina, moving edge-wise through the doorway.
+In the hall, I stopped in  indecision:  it  was  quiet  in  the
+house,  and  I wasn't sure that my landlady was up. But at this
+point the door to her side of the house opened, and  Pete,  the
+customs  man, came out into the hall. Well, well, thought I. At
+night he had looked like a drowned drunk. Now in the  light  of
+day, he resembled a victim of a hooligan attack. The lower part
+of  his  face was dark with blood. Fresh blood glistened on his
+chin, and he held a handkerchief under  his  jaw  to  keep  his
+snow-white braided uniform clean. His face was strained and his
+eyes   tended  to  cross,  but  in  general,  he  held  himself
+remarkably calm, as though falling face-down into broken  glass
+was  a  most ordinary event for him. A slight misadventure, you
+know, can happen to anybody; please don't pay it any attention;
+every-thing will be all right.
+     "Good morning," I mumbled.
+     "Good morning," he responded, politely  dabbing  his  chin
+cautiously and sounding a bit nasal.
+     "Anything the matter? Can I help?"
+     "A trifle," he said. ' The chair fell."
+     He  bowed courteously, and passing by me, unhurriedly left
+the  house.  I  observed  his  departure  with   a   thoroughly
+unpleasant  feeling,  and when I turned back toward the door, I
+found Aunt Vaina standing in front of  me.  She  stood  in  the
+doorway,  gracefully  leaning on the jamb, all clean, rosy, and
+perfumed, and looking at me as though I was Major General  Tuur
+or, at least, Staff Major Polom.
+     "Good  morning,  early bird," she cooed. "I was puzzled --
+who would be talking at this hour?"
+     "I  couldn't  bring  myself  to  disturb  you,"  I   said,
+shuddering  fashionably  and mentally howling at the pain in my
+shoulder. "Good morning, and may I take the  }liberty  to  hand
+you --"
+     "How nice! You can tell a real gentleman right away. Major
+General  Tuur  used  to  say  that a true gentleman never makes
+anyone wait. Never. Nobody..."
+     I became aware that slowly but very persistently, she  was
+herding  me  away  from her door. The living room was darkened,
+with the drapes apparently drawn, and some strange sweet  smell
+was wafting out of it into the hall.
+     "But you did not have to be in such a rush, really..."
+     She was finally in a convenient position to close the door
+with a smooth negligent gesture. "However, you can be sure that
+I will  value  your  promptness  appropriately.  Vousi is still
+asleep, and it's time for me to get Len off to  school.  So  if
+you will excuse me... By the way, we have the newspapers on the
+veranda."
+     "Thank you," I said, retreating.
+     "If  you'll  have the patience, I would like to ask you to
+join me for breakfast and a cup of cream."
+     "Unfortunately, I will have to be going," I  said,  bowing
+out.
+     As  to newspapers, there were six. Two local, illustrated,
+fat as almanacs; one from the capital; two luxurious  weeklies;
+and,  for some reason, the Arab <i>El Gunia</i>. The last I put
+aside, and sifted through the  others,  accompanying  the  news
+with sandwiches and hot cocoa.
+     In  Bolivia,  government  troops, after stubborn fighting,
+had occupied the town of Reyes. The rebels were  pushed  across
+the  River  Beni.  In  Moscow,  at the international meeting of
+nuclear physicists, Haggerton and Soloviev announced a  project
+for  a  commercial  installation  to  produce  anti-matter. The
+Tretiakoff  Gallery  had  arrived  in  Leopoldville,   official
+opening  being  scheduled for tomorrow. The scheduled series of
+pilotless craft had been launched from the Staryi  Vostok  base
+on Pluto into the totally free flight zone; communications with
+two  of  the  craft  were  temporarily  disrupted.  The General
+Secretary of  the  UN  had  directed  an  official  message  to
+Orolianos, in which he warned that in the event of a repetition
+of  the  use  of  atomic  grenades by the extremists, UN police
+forces would be introduced into Eldorado. In Central Angola, at
+the sources of the River Kwando, an  archaeological  expedition
+of the Academy of Sciences of the UAR had uncovered the remains
+of a cyclopean construction, apparently dating from well before
+the  ice  age.  A group of specialists of the United Center for
+the Investigation of Subelectronic (Ritrinitive) Structures had
+evaluated  the  energy  reserves  available   to   mankind   as
+sufficient for three billion years. The cosmic branch of Unesco
+had   announced   that   the   relative  population  growth  of
+extraterrestrial  centers  and   bases   now   approached   the
+population  growth on Earth. The head of the British delegation
+to the UN had put forth a proposal, in the name  of  the  great
+powers, for the total demilitarization, by force if need be, of
+the remaining militarized regions on the globe.
+     Information  about how many kilos were pressed by whom and
+about who drove how many balls through whose goal posts  I  did
+not bother to read. Of the local announcements, I was intrigued
+by three. The local paper, Joy of Life, reported: "Last night a
+group of evil-minded men again carried out a private plane raid
+on  Star  Square,  which  was  full  of  citizens  taking their
+leisure. The hooligans fired  several  machine-gun  bursts  and
+dropped  eleven  gas  bombs.  As a result of the ensuing panic,
+several men and women  suffered  severe  injuries.  The  normal
+recreation of hundreds of respectable people was disrupted by a
+small group of bandit (excuse the term) intelligentsia with the
+obvious  connivance of the police. The president of the Society
+for the Good Old Country Against Evil Influences  informed  our
+correspondent  that  the  Society intended to take into its own
+hands the matter of the protection of the well-earned  rest  of
+fellow  citizens.  In no equivocal manner, the president let it
+be known whom specifically the people regarded as the source of
+the   harmful    infection,    banditism,    and    militarized
+hooliganism..."
+     On  page  twelve, the paper devoted a column to an article
+by "the outstanding proponent of  the  latest  philosophy,  the
+laureate  of  many  literary prizes, Doctor Opir." The treatise
+was titled "World Without Worry." With beautiful words and most
+convincingly indeed, Doctor Opir established the omnipotence of
+science, called  for  optimism,  derided  gloomy  skeptics  and
+denigrators, and invited all "to be as children." He assigned a
+specially  important  role  in  the  formation  of contemporary
+(i.e.,    anxiety-free)    psychology    to    electric    wave
+psychotechnics. "Recollect what a wonderful charge of vigor and
+good feeling is imparted by a bright, happy, and joyful dream!"
+exclaimed  this representative of the latest philosophy. "It is
+no wonder that sleep has been known for over a hundred years to
+be a curative agent for many psychic disturbances. But  we  are
+all  a touch ill: we are sick with our worries, we are overcome
+by the trivia of daily routine, we are irritated  by  the  rare
+but  still remaining few malfunctions, the inevitable frictions
+among individuals, the normal healthy  sexual  unsatisfiedness,
+the  dissatisfaction with self which is so common in the makeup
+of each person. ... As fragrant bath salts wash away  the  dust
+of  travel  from  our tired bodies, so does a joyful dream wash
+away and purify a tired psyche. So now, we no  longer  have  to
+fear  any  anxieties  or malfunctions. We well know that at the
+appointed hour, the invisible radiation of the dream generator,
+which together with the public I tend to call by  the  familiar
+name of 'the shivers,' will heal us, fill us with optimism, and
+return  to us the wonderful feeling of the joy of being alive."
+Further, Doctor Opir expounded that the shivers were absolutely
+harmless physically and psychologically, and that  the  attacks
+of detractors who wished to see in the shivers a resemblance to
+narcotics and who demagogically ranted about a "doped mankind,"
+could  not  but  arouse  in  us a painful incomprehension, and,
+conceivably, some stronger public-spirited emotions that  could
+be   dangerous   to  the  malevolently  inclined  citizens.  In
+conclusion, Doctor Opir pronounced a happy dream to be the best
+kind of rest, vaguely hinted that the shivers  constituted  the
+best antidote to alcoholism and drug addiction, and insistently
+warned  that the shivers should not be confused with other (not
+medically approved) methods of electric wave application.
+     The weekly Golden Days informed the public that a valuable
+canvas, ascribed in the opinion of experts to the  gifted  band
+of  Raphael,  had  been stolen from the National Art Galleries.
+The weekly called the attention of the authorities to the  fact
+that  this  criminal  act  was  the  third during the past four
+months of this year, and that neither of the previously  stolen
+works of art had ever been found.
+     All  in  all,  there  was  really  nothing  to read in the
+weeklies. I glanced through them quickly, and they left me with
+the most depressing impression.
+     All  were  filled  with   desolate   witticisms,   artless
+caricatures,  among  which  the  "captionless" series stood out
+with   particular   imbecility,   with   biographies   of   dim
+personalities, slobbering sketches of life in various layers of
+society, nightmarish series of photos with such titles as "Your
+husband  at work and at home," endless amounts of useful advice
+on how to occupy your time without, God forbid, burdening  your
+head,   passionately   idiotic   sallies   against  alcoholism,
+hooliganism, and  debauchery,  and  calls  to  join  clubs  and
+choruses  with  which  I  was already familiar. There were also
+memoirs of participants in the "fracas"  and  in  the  struggle
+against  organized  crime, which were served up in the literary
+style of jackasses totally  lacking  in  taste  or  conscience.
+These   were   obviously   exercises  of  addicts  of  literary
+sensationalism, loaded with suffering  and  tears,  magnificent
+feats  and  saccharine  futures. There were endless crosswords,
+chainwords, rebuses, and puzzle pictures.
+     I flung the pile of papers into the corner. What a  dreary
+place  they  had  here!  The  boob  was  coddled,  the boob was
+lovingly nurtured, and the boob was cultivated;  the  boob  had
+become  the  norm; a little more and he would become the ideal,
+while jubilant doctors of  philosophy  would  exultantly  dance
+attendance  upon him. But the papers were in full choreographic
+swing even now. Oh, what a wonderful  boob  we  have!  Such  an
+optimistic  boob,  and such an intelligent boob, such a healthy
+alert boob, and with such a fine sense of humor; and  oh  boob,
+how well and adroitly you can solve crossword puzzles! But most
+important  of  all,  boob,  don't  you  worry  about  a  thing,
+everything is  quite  all  right,  everything  is  just  dandy,
+everything  is in your service, the science and the literature,
+just so you can be amused and  don't  have  to  think  about  a
+thing....  As  for those seditious skeptics and hoodlums, boob,
+we'll take care of them! With your help, we can't help but take
+care of them! What are they complaining about, anyway? Do  they
+have more needs than other people?
+     Dreariness and desolation! There had to be some curse upon
+these   people,   some   awful  predilection  for  dangers  and
+disasters. Imperialism, fascism, tens  of  millions  of  people
+killed  and  lives  destroyed, including millions of these same
+boobs, guilty and innocent, good and bad. The last  skirmishes,
+the  last  putsches,  especially pitiless because they were the
+last. Criminals,  the  military  driven  berserk  by  prolonged
+uselessness,  all kinds of leftover trash from intelligence and
+counterintelligence,  bored  by  the  sameness  of   commercial
+espionage,  all  slavering  for  power. Again we were forced to
+return  from  space,  to  come  out  of  our  laboratories  and
+factories,  to call back our soldiers. And we managed it again.
+The zephyr was  gently  turning  the  pages  of  <i>History  of
+Fascism</i> by my feet. But hardly had we had the time to savor
+the  cloudless  horizons,  when  out  of  these  same sewers of
+history crept the scum with submachine guns,  homemade  quantum
+pistols, gangsters, syndicates, gangster corporations, gangster
+empires.  "Minor  malfunctions  are  still encountered here and
+there," soothed and calmed Doctor Opir,  while  napalm  bottles
+flew through university windows, cities were seized by bands of
+outlaws,   and  museums  burned  like  candles....  All  right.
+Brushing aside Doctor Opir and his kind, once again we came out
+of space, out of the labs and factories, recalled the soldiers,
+and once again managed the problem. And again  the  skies  were
+clear. Once more the Opirs were out, the weeklies were purring,
+and once more filth was flowing out of the same sewers. Tons of
+heroin,  cisterns  of  opium, and oceans of alcohol, and beyond
+all that something new, something for which we had no  name....
+Again  everything  was  hanging by a thread for them, and boobs
+were solving crosswords, dancing the fling, and desired but one
+thing: to have fun. But somewhere  idiot  children  were  being
+born,  people  were  going insane, some were dying strangely in
+bathtubs, some were dying no less  strangely  with  some  group
+called  the  Fishers,  while art patrons defended their passion
+for art with brass knuckles. And the weeklies  were  attempting
+to  cover  this  foul-smelling  bog  with a crust, fragile as a
+meringue,  of  cloyingly  sweet  prattle,  and  this  or   that
+diplomaed  fool glorified sweet dreams, and thousands of idiots
+surrendered with relish to dreams in lieu  of  drunkenness  (so
+that they need not think)... and again the boobs were persuaded
+that  all  was  well,  that  space  was  being  developed at an
+unprecedented pace (which was true), and that sources of energy
+would last for billions of years (which was  also  true),  that
+life  was  becoming  unquestionably more interesting and varied
+(which was also undoubtedly true, but  not  for  boobs),  while
+demagogue-denigrators (real-thinking men who considered that in
+our times any drop of pus could infect the whole of mankind, as
+once upon a time a beer putsch turned into a world menace) were
+foreign  to  the  people's  interests and deserved of universal
+condemnation. Boobs and criminals, criminals and boobs.
+     "Have to  work  at  it,"  I  said  aloud.  "To  hell  with
+melancholy! We'd show you skeptics!"
+     It  was  time  to  go see Rimeyer. Although there were the
+Fishers. But all right, the Fishers could be attended to later.
+I was tired of poking around in the dark. I  went  out  in  the
+yard. I could hear Aunt Vaina feeding Len.
+     "But, Mom, I don't want any!"
+     "Eat, son, you must eat. You are so pale."
+     "I don't want to. Disgusting lumps l"
+     "What lumps? Here, let me have some myself! Mm! Delicious!
+Just try some and you'll see it's very tasty."
+     "But I don't want any! I'm ill, I'm not going to school."
+     "Len, what are you saying? You've skipped a lot of days as
+it is."
+     "So what?"
+     "What  do  you  mean,  so  what?  The director has already
+called me twice. We'll be fined."
+     "Let them fine us!"
+     "Eat, son, eat. Maybe you didn't get enough sleep?"
+     "I didn't. And my stomach hurts... and my head...  and  my
+tooth, this one here, you see?"
+     Len's  voice sounded peevish, and I immediately visualized
+his pouting lips and his swinging stockinged foot.
+     I went out the gate. The day was again  clear  and  sunny,
+full of bird twitter. It was still too early, so that on my way
+to  the Olympic, I met only two people. They walked together by
+the curb, monstrously out of place in the joyful world of green
+branch and clear blue sky. One was painted  vermilion  and  the
+other  bright  blue.  Sweat  beaded  through the paint on their
+bodies. Their  breaths  heaved  through  open  mouths  and  the
+protruding  eyes were bloodshot. Unconsciously I unbuttoned all
+the buttons of my shirt and  breathed  with  relief  when  this
+strange pair passed me.
+     At  the hotel I went right up to the ninth floor. I was in
+a very determined mood. Whether Rimeyer wanted to  or  not,  he
+would  have to tell me everything I wanted to know. As a matter
+of fact, I needed him now for other things as well. I needed  a
+listener,  and in this sunny bedlam I could talk openly only to
+him, so far. True, this was not the Rimeyer I had  counted  on,
+but this too had to be talked cut in the end....
+     The red-headed Oscar stood by the door to Rimeyer's suite,
+and, seeing  him,  I slowed my steps. He was adjusting his tie,
+gazing pensively at the ceiling. He looked worried.
+     "Greetings," I said -- I had to start somehow.
+     He wiggled his eyebrows and looked  me  over,  and  I  was
+aware that he remembered me. He said slowly, "How do you do."
+     "You want to see Rimeyer, too?" l asked.
+     "Rimeyer  is  not feeling well," he said. He stood hard by
+the door and apparently had no intention of letting me by.
+     "A pity," I said, moving up  on  him.  "And  what  is  his
+problem?"
+     "He is feeling very bad."
+     "Oh, oh!" I said. "Someone should have a look."
+     I  was  now  right up against Oscar. It was obvious he was
+not about to give way. My shoulder responded  at  once  with  a
+flare of pain.
+     "I am not sure it's all that necessary," he said.
+     "What do you mean? Is it really that bad?"
+     "Exactly.  Very  bad.  And  you  shouldn't bother him. Not
+today, or any other day!"
+     It seems I arrived in time, I thought, and  hopefully  not
+too late.
+     "Are you a relative of his?" I asked. My attitude was most
+peaceable.
+     He grinned.
+     "I  am  his  friend.  His  closest  friend in this town. A
+childhood friend, you might say."
+     'This is most touching," I said. "But I am  his  relative.
+Same as a brother. Let's go in together and see what his friend
+and brother can do for poor Rimeyer."
+     "Maybe his brother has already done enough for Rimeyer."
+     "Really now... I only arrived yesterday."
+     "You  wouldn't,  by any chance, have other brothers around
+here?"
+     "I don't think there are any among your friends, with  the
+exception of Rimeyer."
+     While  we  were  carrying  on  with  this  nonsense, I was
+studying him most carefully. He didn't look too nimble  a  type
+-- even  considering  my  defective  shoulder.  But he kept his
+hands in his pockets all the time, and although I didn't  think
+he  would  risk  shooting  in the hotel, I was not of a mind to
+chance it. Especially as I had  heard  of  quantum  dischargers
+with limited range.
+     I  have been told critically many times that my intentions
+are  always  clearly  readable  on  my  face.  And  Oscar   was
+apparently  an  adequately  keen  observer. I was coming to the
+conclusion that he obviously did not  have  anything  there  at
+all,  that  the  hands-in-the-pocket  act was a bluff. He moved
+aside and said, "Go on in."
+     We entered. Rimeyer was indeed in a bad way. He lay on the
+couch covered with a torn  drape,  mumbling  in  delirium.  The
+table was overturned, a broken bottle stained the middle of the
+floor,  and  wet  clothes  were  strewn  all  over  the room. I
+approached Rimeyer and sat down by him so as not to lose  sight
+of  Oscar,  who  stood by the window, half-sitting on the sill.
+Rimeyer's eyes were open. I bent over him.
+     "Rimeyer," I called. "It's Ivan. Do you recognize me?"
+     He regarded me dully. There was a fresh cut  on  his  chin
+under the stubble.
+     "So  you got there already..." he muttered. "Don't prolong
+the Fishers... doesn't happen... don't  take  it  so  hard  ...
+bothered me a lot... I can't stand..."
+     It  was pure delirium. I looked at Oscar. He listened with
+interest, his neck stretched out.
+     "Bad when you wake up..." mumbled Rimeyer. "Nobody... wake
+up... they start... then they don't wake up..."
+     I disliked Oscar more and more.  I  was  annoyed  that  he
+should  be  hearing  Rimeyer's ravings. I didn't like his being
+here ahead of  me.  And  again,  I  didn't  like  that  cut  on
+Rimeyer's  chin -- it was quite fresh. How can I be rid of you,
+red-haired mug, I wondered.
+     "We should call a doctor," I said. "Why didn't you call  a
+doctor, Oscar? I think it's delirium tremens."
+     I  regretted  the  words  immediately.  To my considerable
+surprise, Rimeyer did not smell of alcohol at  all,  and  Oscar
+apparently knew it. He grinned and said, "Delirium tremens? Are
+you sure?"
+     "We  have  to call a doctor at once," I said. "Also, get a
+nurse."
+     I put my hand on the phone. He jumped up instantly and put
+his hand on mine.
+     "Why should you do it?" he said. "Better  let  me  call  a
+doctor. You are new here and I know an excellent doctor."
+     "Well,  what kind of a doctor is he?" I objected, studying
+the cut on his knuckles -- which was also quite new.
+     "An exemplary doctor. Just happens to be a  specialist  on
+the DT's."
+     Rimeyer   said   suddenly,   "So  I  commanded...  <i>also
+spracht</i> Rimeyer... alone with the world..."
+     We turned to look at him. He spoke haughtily, but his eyes
+were closed, and his face, draped in loose, gray  skin,  seemed
+pathetic.  That  swine  Oscar, I thought, where does he get the
+gall to linger here? A sudden wild thought flashed  through  my
+head -- it seemed at that moment exceedingly well conceived: to
+disable  Oscar with a blow to the solar plexus, tie him up, and
+force him then and there  to  expose  everything  he  knew.  He
+probably  knew  quite  a lot. Possibly everything. He looked at
+me, and in his pale eyes was a blend of fear and hatred.
+     "All right," I said. "Let the hotel call the doctor."
+     He removed his hand and I called  service.  While  waiting
+for  the doctor, I sat by Rimeyer, and Oscar walked from corner
+to corner, stepping over the liquor puddle. I followed him  out
+of  the  corner  of  my  eye. Suddenly he stooped and picked up
+something off the floor. Something small and multicolored.
+     "What have you got there?" I inquired indifferently.
+     He hesitated a bit and then threw a small flat box with  a
+polychrome sticker on my knees.
+     "Ah!" I said, and looked at Oscar. "Devon."
+     "Devon," he responded. "Strange that it's here rather than
+in the bathroom."
+     The  devil,  I  thought.  Maybe  I  was still too green to
+challenge him openly. I still knew  but  very  little  of  this
+whole mess.
+     "Nothing strange about that," I said at random. "I believe
+you distribute  that  repellent.  It's  probably a sample which
+fell out of your pocket."
+     "Out of my pocket?" He was astonished. "Oh, you think that
+I... But I finished my assignments a long time ago, and now I'm
+just taking it easy. But if you're interested, I can be of some
+help."
+     That s very interesting, I said. "I will consult --"
+     Unfortunately, the door flew open at  this  point,  and  a
+doctor accompanied by two nurses entered the room.
+     The  doctor  turned  out  to  be a decisive individual. He
+gestured me off the couch and flung the drape off  Rimeyer.  He
+was completely naked.
+     "Well, of course," said the doctor. "Again..."
+     He raised Rimeyer's eyelid, pulled down his lower lip, and
+felt his  pulse.  "Nurse - cordeine! And call some chambermaids
+and have them clean out these  stables  till  they  shine."  He
+stood up and looked at me. "A relative?"
+     "Yes," I said, while Oscar kept still.
+     "You found him unconscious?"
+     "He was delirious," said Oscar.
+     "You carried him out here?"
+     Oscar hesitated.
+     "I  only  covered  him  with  the drape," he said. "When I
+arrived, he was lying as he is now. I was afraid he would catch
+cold."
+     The doctor regarded him for a while, and  then  said,  "In
+any  case,  it  is immaterial. Both of you can go. A nurse will
+stay with him. You can call this evening. Goodbye."
+     "What is the matter with him, Doctor?" I asked.
+     "Nothing special. Overtired, nervous exhaustion... besides
+which he apparently smokes too much. Tomorrow he can be  moved,
+and  you  can take him home with you. It would be unhealthy for
+him to stay here with us. There are too many  amusements  here.
+Goodbye."
+     We went out into the corridor.
+     "Let's go have a drink," I said.
+     "You forgot that I don't drink," corrected Oscar.
+     "Too  bad.  This  whole  episode  has upset me. I'd like a
+snort. Rimeyer always was such a healthy specimen."
+     "Well, lately he has slipped a lot," said Oscar carefully.
+     "Yes, I hardly recognized him when I saw him yesterday."
+     "Same here," said Oscar. He didn't believe a word  of  it,
+and neither did I.
+     "Where are you staying?" I asked.
+     "Right  here,"  said  Oscar.  "On  the floor below, number
+817."
+     "Too bad that you don't drink. We could go  to  your  room
+and have a good talk."
+     "Yes,  that wouldn't be a bad idea. But, regretfully, I am
+in a great rush." He was  silent  awhile.  "Let  me  have  your
+address. Tomorrow morning, I'll be back and drop in to see you.
+About ten -- will that suit you? Or you can ring me up."
+     "Why  not?"  I said and gave him my address. "To be honest
+with you, I am quite interested in Devon."
+     "I think we'll be able to come to an understanding,"  said
+Oscar. "Till tomorrow!"
+     He  ran  down  the  stairs.  Apparently he really was in a
+hurry. I went down in the elevator and sent off a  telegram  to
+Matia: "Brother very ill, feeling very lonesome, but keeping up
+spirits,  Ivan."  I truly did feel very much alone. Rimeyer was
+out of the game again, at least for a day. The only hint he had
+given me was the advice about the Fishers. I had  nothing  more
+definite. There were the Fishers, who were located somewhere in
+the  old  subway; there was Devon, which in same peripheral way
+could have something to do with my  business,  but  also  could
+just  as  well  have  no  connection  with it at all; there was
+Oscar, clearly connected  with  Devon  and  Rimeyer,  a  player
+sufficiently ominous and repulsive, but undoubtedly only one of
+many  such  unpleasant  types  on the local cloudless horizons;
+then again there was a certain "Buba," who  supplied  pore-nose
+with  Devon....  After  all,  I have been here just twenty-four
+hours, I thought. There is time. Also, I could still  count  on
+Rimeyer in the final analysis, and there was the possibility of
+finding  Peck.  Suddenly  I  remembered the events of the night
+before and sent a wire to  Sigmund:  "Amateur  concert  on  the
+twenty-eighth,  details  unknown,  Ivan."  Then I beckoned to a
+porter and inquired as to the shortest way to the old subway.
+
+<ul><a name=9></a><h2>Chapter NINE</h2></ul>
+
+     "You would do better to come  at  night.  It's  too  early
+now."
+     "I prefer now."
+     "Can't wait, eh? Perhaps you've got the wrong address?"
+     "Oh no, I haven't got it wrong."
+     "You must have it now, you are sure?"
+     "Yes, now and not later."
+     He clicked his tongue and pulled on his lower lip. He was
+     short,  well  knit,  with  a  round  shaved head. He spoke
+hardly moving his tongue and rolling his eyes  languidly  under
+the lids. I thought he had not had enough sleep. His companion,
+sitting  behind  the  railing in an easy chair, apparently also
+had missed some. But he did not utter a word  and  didn't  even
+look in my direction. It was a gloomy place, with stale air and
+warped  panels  which  had  sprung away from the walls. A bulb,
+dimmed with dust, hung shadeless from the ceiling  on  a  dirty
+cable.
+     "Why not come later?" said the round-head. "When everybody
+comes."
+     "I just got the urge," I said diffidently.
+     "Got  the  urge..."  He  searched  in his table drawer. "I
+don't even have a form left. Eli, do you have some?"
+     The latter, without breaking his silence,  bent  over  and
+pulled  out  a  crumpled sheet of paper from somewhere near the
+railing.
+     The round-head said, yawning, "Guys that come at break  of
+day...  nobody  here...  no  girls... they're still in bed." He
+proffered the form. "Fill it out and sign. Eli and I will  sign
+as  witnesses.  Turn  in  your  money.  Don't worry, we keep it
+honest. Do you have any documents?"
+     "None."
+     "That's good, too."
+     I scanned the form. "In open deposition and of my own
+     free  will,  I,  the  undersigned,  in  the  presence   of
+witnesses,  earnestly request to be subjected to the initiation
+trials toward the mutual quest of membership in the Society  of
+VAL."  There  were  blank spaces for signature of applicant and
+signatures of witnesses.
+     "What is VAL?" I asked.
+     "That's the way we are registered,"  answered  round-head.
+He was counting my money.
+     "But how do you decipher it?"
+     "Who  knows? That was before my time. It's VAL, that's all
+there is to it. Maybe  you  know,  Eli?"  Eli  shook  his  bead
+lazily. "Well, really, what do you care?"
+     "You are absolutely right." I inserted my name and signed.
+     Round-head  looked it over, signed it, and passed the form
+to Eli.
+     "You look like a foreigner," he said.
+     "Right."
+     "In  that  case,  add  your  home  address.  Do  you  have
+relatives?"
+     "No."
+     "Well then, you don't have to. All set, Eli? Put it in the
+folder. Shall we go?"
+     He lifted up the gate in the railway and walked me over to
+a massive  square  door,  probably left over from the days when
+the subway had been fitted out as an atomic shelter.
+     "There is no choice," he said as though  in  self-defense.
+He   pulled   the   slides  and  turned  a  rusty  handle  with
+considerable effort. "Go straight down the  corridor  and  then
+you'll see for yourself."
+     I thought that I heard Eli snickering behind him. I turned
+around.  A  small  screen was fitted in the railing in front of
+Eli. Something was moving on the screen, but I  could  not  see
+what  it  was.  Round-bead put all his weight on the handle and
+swung back the door. A dusty passage became visible. For a  few
+seconds   he  listened  and  then  said,  "Straight  down  this
+corridor."
+     "What will I find there?" I said.
+     "You'll get what you were looking for. Or have you changed
+your mind?"
+     All of which was clearly not what I was looking  for,  but
+as  is  well known, nobody knows anything until he has tried it
+himself I stepped over the high sill and the door  shut  behind
+me with a clang. I could hear the latches screeching home.
+     The  corridor  was  lit  by  a few surviving lamps. It was
+damp, and mold grew an the cement walls. I stood still  awhile,
+listening, but there was nothing to be heard but the infrequent
+tap  of  water drops. I moved forward cautiously. Cement rubble
+crunched underfoot. Soon the corridor came to  an  end,  and  I
+found  myself in a vaulted, poorly lit concrete tunnel. When my
+eyes accommodated to the darkness, I discerned a set of tracks.
+The rails were badly rusted and puddles of dark  water  gleamed
+motionless  along  their  length.  Sagging cables hung from the
+ceiling. The dampness seeped to  the  marrow  of  my  bones.  A
+repulsive  stench  of sewer and carrion filled my nostrils. No,
+this was not what I was looking for. I was not  of  a  mind  to
+fritter away my time and thought of going back and telling them
+that  I would be back some other time. But first, simply out of
+curiosity, I decided to take a short walk along the  tunnel.  I
+went  to  the right toward the light of distant bulbs. I jumped
+puddles, stumbled over the rotting ties, and got  entangled  in
+loose wires. Reaching a lamp, I stopped again.
+     The  rails  had  been  removed. Ties were strewn along the
+walls, and holes filled with water gaped  along  the  right  of
+way.  Then  I  saw the rails. I have never seen rails in such a
+condition.  Some  were  twisted  into  corkscrews.  They   were
+polished  to  a  high  shine  and reminded me of gigantic drill
+bits. Others were driven with titanic force into the floor  and
+walls  of  the  tunnel.  A third group were tied into knots. My
+skin crawled at this sight. Some were simple knots, some with a
+single bow, some with a double bow like  shoelaces.  They  were
+mauve and brown.
+     I looked ahead into the depths of the tunnel. The smell of
+rotting  carrion  wafted  out  of it, and the dim yellow lights
+winked rhythmically as though something swayed  in  the  draft,
+covering  and uncovering them periodically. My nerves gave way.
+I felt that this was nothing more than a  stupid  joke,  but  I
+couldn't  control  myself. I squatted down and looked around. I
+soon found what I was looking  for  --  a  yard-long  piece  of
+reinforcing  rod.  I  stuck it under my arm and went ahead. The
+iron was wet and cold and rough with rust.
+     The reflection of the winking lights glinted  on  slippery
+wet   walls.   I   had   noticed  some  time  back  the  round,
+strange-looking marks on them, but at first did  not  pay  them
+any  attention. Then I became interested and examined them more
+closely. As far as the eye could reach, there were two sets  of
+round  prints on the walls at one-meter intervals. It looked as
+though an elephant had run along the wall -- and not  too  long
+ago at that. On the edge of one of the prints, the remains of a
+crushed  centipede  still  struggled feebly. Enough, I thought,
+time to go back. I looked along the tunnel. Now I could plainly
+see the swaying curves of black cables under the lamps. I  took
+a  better  grip on the rod and went ahead, holding close to the
+wall.
+     The whole thing was getting  through  to  me.  The  cables
+sagged under the arch of the tunnel, and on them, tied by their
+tails  into  hairy clusters, hung hundreds upon hundred of dead
+rats, swaying in the draft. Tiny teeth glinted horribly in  the
+semi-dark,  and  rigid little legs stuck out in all directions.
+The clusters  stretched  in  long  obscene  garlands  into  the
+distance.  A thick, nauseating stench oozed from under the arch
+and flowed along the tunnel, as palpable as glutinous jelly.
+     There was a piercing  screech  and  a  huge  rat  scurried
+between  my  feet.  And  then another and another. I backed up.
+They were fleeing from there, from the dark where there was not
+a single lamp. Suddenly, warm air came pulsing  from  the  same
+direction.  I  felt  a  hollow  space with my elbow and pressed
+myself into the niche. Something  live  squirmed  and  squeaked
+under  my  heel;  I swung my iron rod without looking. I had no
+time for rats, because I could hear something  running  heavily
+but softly along the tunnel, splashing in the puddles. It was a
+mistake  to  get involved in this business, thought I. The iron
+rod seemed very light and insignificant in comparison with  the
+bow-tied  rails.  This was no flying leech, nor a dinosaur from
+the Kongo... don't let  it  be  a  giganto-pithek,  I  thought,
+anything but a giganto-pithek. These donkeys would have the wit
+to  catch  one  and  let it loose in the tunnel. I was thinking
+very poorly in those few seconds. And suddenly for no reason at
+all I thought of Rimeyer. Why had he sent me here? Had he  gone
+out of his mind? If only it was not a giganto-pithek!
+     It  raced  by  me  so fast that I couldn't discern what it
+was.
+     The tunnel boomed from its  gallop.  Then  there  was  the
+despairing  scream  of  a  caught  rat  right  close  by and...
+silence. Cautiously I peeked out. He stood about ten paces away
+directly under one of the lamps, and my legs suddenly went limp
+from relief.
+     "Smart-alec entrepreneurs," I said aloud,  almost  crying.
+'They would dream up something like this."
+     He  heard my voice and raising his stern legs, pronounced:
+"Our temperature is two meters,  twelve  inches,  there  is  no
+humidity, and what there isn't is not there."
+     "Repeat your orders," I said, approaching him.
+     He  let  the  air  out  of  his  suction  cups with a loud
+whistle, twitched his  legs  mindlessly,  and  ran  up  on  the
+ceiling.
+     "Come down," I said sternly, "and answer my question."
+     He  hung  over  my  head,  this  poor long-obsolete cyber,
+intended for work an the asteroids, pitiable and out of  place,
+covered with flakes of corrosion and blobs of black underground
+dirt.
+     "Get down," I barked.
+     He flung the dead rat at me and sped off into the dark.
+     "Basalts!   Granites!"  he  yelled  in  different  voices.
+"Pseudo-metamorphic types! I am over Berlin! Do you copy!  Time
+to get to bed!"
+     I  threw  away  the rod and followed him. He ran as far as
+the next lamp,  came  down,  and  began  to  dig  the  concrete
+rapidly,  like  a  dog,  with his heavy work manipulators. Poor
+chap, even in better times his brain was capable of  performing
+properly only in less than one one-hundredth of a G, and now he
+was  altogether  out  of his mind. I bent over him and began to
+search for the control center under his armor. "The rotters," I
+said aloud. The controls were peened over  as  though  battered
+with a sledge. He stopped digging and grabbed me by the leg.
+     "Stop!" I shouted. "Desist!"
+     He  desisted,  lay  down on his side, and informed me in a
+basso voice, "I am deathly tired of him, Eli. Now would be  the
+time for a shot of brandy."
+     Contacts  clicked  inside  him  and  music  poured  forth.
+Hissing and whistling, he gave a  rendition  of  the  "Hunters'
+March."  I  was  looking  at  him  and  thinking how stupid and
+repulsive it all was, how  ridiculous  and  at  the  same  time
+frightening.  If  I  had  not  been  a  spaceman, if I had been
+frightened and run, he would almost certainly have  killed  me.
+But  nobody  here  knew  I  had  been in space. Nobody. Not one
+person. Even Rimeyer didn't know.
+     "Get up," I said.
+     He buzzed and started to dig the wall, and I turned around
+and went back. All  the  time  while  I  was  returning  to  my
+turn-off  I could hear him rattling and clanging in the pile of
+contorted rails, hissing with  the  electrowelder  and  ranting
+nonsense in two voices.
+     The  anti-atomic door was already open, and I stepped over
+the sill, swinging it shut behind me.
+     "Well, how was it?" asked round-head.
+     "Dumb," I replied.
+     "I had no idea you were a spaceman. You have worked out on
+the planets?"
+     "I have. But it's still dumb. For  fools.  For  illiterate
+keyed-up boobs."
+     "What kind?"
+     "Keyed-up."
+     "Well  --  there you got it wrong. Lots of people like it.
+Anyway, I told you  to  come  at  night.  We  don't  have  much
+amusement  for  singles." He poured some whiskey and added some
+soda from the siphon. "Would you like some?"
+     I took the glass and leaned on the railing.  Eli  gloomily
+regarded  the  screen,  a cigarette sticking to his lip. On the
+screen careened shifting views of the glistening tunnel  walls,
+twisted  rails,  black  puddles,  and  flying  sparks  from the
+welder.
+     'That's  not  for  me,"  I  announced.  "Let  barbers  and
+accountants  enjoy  it. Of course, I have nothing against them,
+but what I need is something the likes of which I have not seen
+in my entire life."
+     "So  you  don't  know  yourself  what  you   want,"   said
+roundhead. "It's a hard case. Excuse me, you aren't an Intel?"
+     "Why?"
+     "Well,  don't  take offense -- we are all equal before the
+grim reaper, you understand. What am  I  trying  to  say?  That
+Intels  are  the most difficult clients, that's all. Isn't that
+right, Eli? If one of your barbers or bookkeepers  comes  here,
+he  knows  very  well  what it is he needs. He needs to get his
+blood going, to show off and be proud of himself,  to  get  the
+girls  squealing,  and exhibit the punctures in his side. These
+fellows are simple, each one wants to consider himself  a  man.
+After  all,  who  is  he  --  our  client? He has no particular
+capabilities, and he doesn't need any. In earlier times, I read
+in a book, people used to be  envious  of  each  other  --  the
+neighbor  is  rolling  in  luxury  and  I  can't  save up for a
+refrigerator -- how could you put up with that?  They  hung  on
+like bulldogs to all kinds of trash, to money, to cushy jobs --
+they  laid  down  their  lives  for such things. The guy with a
+foxier head or a stronger fist would wind up on  top.  But  now
+life  has  become  affluent  and  dull and there is a plenty of
+everything. What shall a man apply himself to? A man is  not  a
+fish, for all that, he is still a man and gets bored, but can't
+dream  up  something  to  do  for  himself. To do that you need
+special talents, you need to read a mountain of books, and  how
+can  he  do  that  when  they  make  him  throw  up.  To become
+world-famous or to invent some new  machine,  that's  something
+that  wouldn't  pop  into his head, but even if it did, of what
+use would it be? Nobody really needs you,  not  even  your  own
+wife  and  children if you examine it honestly. Right, Eli? And
+you don't need  anybody  either.  Nowadays,  it  seems,  clever
+people  think  things  up  for  you,  something  new like these
+aerosols, or the shivers, or a new dance.  There  is  that  new
+drink -- it's called a polecat. Wanna me knock one together for
+you?  So  he  downs some of this polecat, his eyes crawl out of
+their sockets, and he's happy. But as long as his eyes  are  in
+their sockets, life is just as dull as rainwater for him. There
+is an Intel that comes here to us, and every time he complains:
+Life,  he  says,  is dull, my friends... but I leave here a new
+man; after, say, 'bullets' or 'twelve to one,' I see myself  in
+a  completely  new  light. Right, Eli? Everything becomes sweet
+all over again, food, drink, women."
+     "Yes," I said  sympathetically.  "I  understand  you  very
+well. But for me it's all too stale."
+     "Slug is what he needs," said Eli in his bass voice.
+     "What's that again?"
+     "Slug is what I said."
+     Round-head puckered in distaste.
+     "Aw, come on, Eli. What's with you today?"
+     "I  don't  give a hoot for the likes of him," said Eli. "I
+just don't like these guys.  Everything  is  insipid  for  him,
+nothing suits him."
+     "Don't  listen  to him," said round-head. "He hasn't slept
+all night and is very tired."
+     "Well, why not," I contradicted. "I am  quite  interested.
+What is this slug?"
+     Round-head puckered his face again.
+     "It's  not decent, you understand?" he said. "Don't listen
+to Eli, he is a good enough guy,  a  simple  fellow,  but  it's
+nothing  for  him  to  lambaste a man. It's a bad term. Certain
+types have taken to writing it all over the  walls.  Hooligans,
+that's  what  they  are, right? The snot-noses hardly know what
+it's about, but they write anyway. See how we had to plane  off
+the railing? Some son of a bitch carved into it, and if I catch
+him,  I'll  turn  his  hide inside out. We do have women coming
+here too."
+     "Tell  him,"  pronounced  Eli,   addressing   himself   to
+roundhead,  "that  he should get hold of a slug and quiet down.
+Let him find Buba..."
+     "Will you shut  up,  Eli?"  said  round-head,  now  angry.
+"Don't pay any attention to him."
+     Having  heard  the  name  Buba, I helped myself to another
+drink and settled more comfortably on the railing.
+     "What's it all about?" I said. "Some kind of secret vice?"
+     "Secret!" boomed Eli, and let out an obscene horselaugh.
+     Round-head laughed, too.
+     "Nothing can be a secret here,"  he  said.  "What  had  of
+secrets can there be when people are living it up at the age of
+fifteen?  The  dopes,  the  Intels, manufacture secrets. They'd
+like to get a fracas going on the twenty-eighth, they  are  all
+in  a  huddle, took some mine launchers out of town recently to
+hide them, like kids, honest to God! Right, Eli?"
+     "Tell him," the good simple  fellow  Eli  was  persisting.
+"Tell  him  to be off to Hell and gone. And don't go protecting
+him. Just tell him to go to Buba at the Oasis and that's that."
+     He threw my wallet and form on the railing. I finished the
+whiskey. Round-head said soberly, "Of course, it's entirely  up
+to  you,  but  my advice is to stay away from that stuff. Maybe
+we'll all come to it someday, but  the  later,  the  better.  I
+can't  even  explain it to you, I only feel that it is like the
+grave: never too late and always too soon."
+     "Thank you," I said.
+     "He even thanks you." Eli let  loose  another  horselaugh.
+"Have you seen anything like it! He thanks you!"
+     "We kept three dollars," said round-head. "You can tear up
+the blank.  Or  let  me tear it up. God forbid something should
+happen to you, the police will come looking to us."
+     "To be honest with you," I said, putting the wallet  away,
+"I  don't  understand  how  they  haven't  closed  your  office
+already."
+     "Everything is on the up and up with us," said round-head.
+"If you don't want any, no one is forcing you. But if something
+should happen, it's your own fault."
+     "No one is forcing the drug addicts either," I retorted.
+     "That's some comparison! Drugs are a profiteering  corrupt
+business!"
+     "Well,  okay,  I'll  be  seeing  you,"  I  said.  "Thanks,
+fellows. Where did you say to look for Buba?"
+     "At the Oasis," boomed Eli. "It's a cafe. Beat it."
+     "What a polite fellow you are, my  friend,"  I  said.  "It
+gets me right in my heart."
+     "Go on, beat it," repeated Eli. "Stinking Intel."
+     "Don't  get  so  excited,  pal,"  I  said, "or you'll earn
+yourself an ulcer. Save your stomach, it's your  most  valuable
+possession."
+     Eli  started  to  move slowly out from behind the railing,
+and I left. My shoulder had started to ache again.
+     A warm, heavy rain was falling outside. The leaves on  the
+trees  shone  wetly  and  joyfully, there was a smell of ozone,
+freshness and thunderstorm. I stopped  a  taxi  and  named  the
+Oasis.  The  street ran with fresh streams, and the city was so
+pretty and comfortable that it seemed improper to think of  the
+moldy and abandoned Subway.
+     The  rain  was  pelting in full swing when I jumped out of
+the car, ran across the sidewalk, and  burst  into  the  Oasis.
+There  were  quite  a  few  people,  most  of them were eating,
+including the bartender, who was spooning some soup  out  of  a
+dish  placed  among  drinking  glasses.  Those who had finished
+eating  sat  smoking  and  abstractedly  staring  out  of   the
+streaming  window  at  the  street.  I  approached  the bar and
+inquired in a low voice whether Buba was there.  The  bartender
+put down his spoon and surveyed the room.
+     "Naah," he said. "Why don't you have something to eat now,
+and he'll be along soon enough."
+     "How soon?"
+     "Twenty minutes, half an hour maybe."
+     "So!"  I  said.  "In  that case I'll have dinner, and then
+I'll come over and you can point him out to me."
+     "Uhuh," said the bartender, returning to his soup.
+     I picked up a tray, collected some sort of a meal, and sat
+down by the window away from the rest of the patrons. I  wanted
+to  think.  I  sensed  that there was enough data to ponder the
+problem effectively. Some sort of pattern seemed to be forming.
+Boxes of Devon in the bathroom. Pore-nose spoke about Buba  and
+Devon  (in  whispers).  Eli  talked of Buba and "slug." A clear
+chain of  links  --  bath,  Devon,  Buba,  slug.  Further:  the
+sunburned  fellow with the muscles cautioned that Devon was the
+worst of junk, while the roundhead saw  no  difference  between
+slug and the grave. It all had to fit together. It seemed to be
+what  we  were  looking  for.  If so, then Rimeyer had done the
+right thing to send me to  the  Fishers.  Rimeyer,  I  said  to
+myself,  why  did you send me to the Fishers? And even order me
+to do as I was told and not to fuss about it?  And  you  didn't
+know,  after  all,  that  I was a spaceman, Rimeyer. If you did
+know, there were still the other games with  bullets  and  "one
+against  twelve," besides the demented cyber. You really took a
+dislike to me for something or other, Rimeyer. Somehow  I  have
+crossed  you. But no, said I, this cannot be. It is simply that
+you did not trust me, Rimeyer.  It  is  simply  that  there  is
+something  that  I  do not know yet. For example, I do net know
+just who this Oscar is who trades in Devon in this resort  city
+and  who  is  connected with you, Rimeyer. Most likely you have
+been meeting with Oscar before our conversation in the elevator
+... I don't want to think about that.
+     There he was lying like a dead man and here I was thinking
+such things  about  him  when  he  could  not  defend  himself.
+Suddenly  I  felt a repulsive cold crawling feeling inside. All
+right, suppose we trapped this gang.  What  would  change?  The
+shivers  would  remain,  lop-eared Len would be up all night as
+before, Vousi would be coming home  disgustingly  drunk,  while
+customs  inspector  Pete would be smashing his face into broken
+glass. And all would  be  concerned  about  the  "good  of  the
+people."  Some  would be irrigated with tear gas, some would be
+driven into the ground  up  to  their  ears,  others  would  be
+converted  from  apehood  into something which passes muster as
+human.... And then the shivers would go out of  style  and  the
+people would be presented with the super-shivers, while in lieu
+of  the  extirpated slug a super-slug would surface. Everything
+would be for the good of the people. Have  fun,  Boobland,  and
+don't think about a thing!
+     Two  men  in  cloaks sat down at the next table with their
+trays. One of them seemed to me in some way familiar. He had  a
+haughty  thoroughbred  face,  and were it not for a thick white
+bandage on the left side  of  his  jaw,  I  was  sure  I  would
+recognize  him.  The other was a ruddy man with a bald pate and
+fussy movements. They were speaking quietly, but not so  as  to
+be  inaudible,  and  I  could  hear them quite well where I was
+sitting.
+     "Understand  me  correctly,"  the  ruddy  one  said   with
+conviction  while  hurriedly consuming his schnitzel, "I am not
+at all against theaters and museums. But the allocation for the
+municipal theater for the  past  year  has  not  been  expended
+fully, while only tourists visit the museums."
+     "Also picture thieves," inserted the man with the bandage.
+     "Drop  that, please, we don't have pictures that are worth
+the theft. Thank God,  they  have  learned  how  to  synthesize
+Sistine  Madonnas out of sawdust. I wish to call your attention
+to the point that dissemination of culture  in  our  time  must
+occur  in  an  entirely  different  manner. Culture must not be
+inculcated into the people, rather it  must  emanate  from  the
+people.  Public chorister, do-it-yourself groups, mass games --
+that is what our public needs."
+     "What our public needs is a good army of occupation," said
+the man with the bandage.
+     "Please stop talking that way,  when  you  actually  don't
+believe  what  you  are  saying.  Our  coverage  by the various
+associations is really  at  an  unacceptably  poor  level.  For
+instance,  Boella complained to me last night that only one man
+attends her readings, and he apparently only  does  so  out  of
+matrimonial intentions. But we need to distract the people from
+the  shivers,  from  alcohol,  from sexual pastimes. We need to
+raise the tone --"
+     The other interrupted, "What do you want from me?  That  I
+should  defend  your  project  against  that ass, our honorable
+mayor, today? Be my guest! It is absolutely all the same to me.
+But if you would like to hear my opinion about tone and spirit,
+let me tell you it does not exist, my dear Senator; it is  long
+dead! It has been smothered in belly fat! And if I were in your
+place I would take that into account and only that!"
+     The  ruddy  man  seemed to be crushed. He was silent for a
+while and then groaned suddenly, "Dear God, dear God, to  think
+of  what  we  have been driven to concern ourselves with! But I
+ask you -- is not someone flying to the stars? Somewhere  meson
+reactors  are  being  built,  new  learning  systems  are being
+devised! Dear God, I just recently grasped that we are not even
+a backwater, we are a preserve! In the eyes of the whole  world
+we  are  a  sanctuary  of stupidity, ignorance, and pornocracy.
+Imagine, Professor Rubenstein has a chair in our city  for  the
+second  year.  A  sociopsychologist  of  world  renown.  He  is
+studying us like animals.  Instinctive  Sociology  of  Decaying
+Economic  Structures  --  that's  the  name  of his work. He is
+interested in people as bearers of primeval instincts,  and  he
+complained  to  me that it was very difficult for him to gather
+data in countries where instinctive activity is  distorted  and
+suppressed by pedagogical systems! But with us he is in seventh
+heaven! In his own words, we don't have any activity other than
+instinctive!  I  was  insulted,  I was ashamed, but, good Lord,
+what could I say to contradict him? You must understand me! You
+are an intelligent man, my friend, I know you are a  cold  man,
+but  I  can't really believe that you are indifferent to such a
+degree."
+     The man with the bandage looked at him haughtily and then,
+abruptly, his cheek twitched. I recognized him at once: he  was
+the character with the monocle who had thrown the luminous slop
+all over me so deftly yesterday at the Art Patrons' hall.
+     Why,  you  vulture,  thought  I. You thief. So you need an
+army of occupation! Spirit smothered in lard indeed!
+     "Forgive me, Senator," he said. "I do understand  it  all,
+and  that's  precisely  why  it  is  perfectly clear to me that
+everything surrounding you is in a state of dementia. The final
+spasm! Euphoria!"
+     I got up and approached their table.
+     "May I join you?" I asked.
+     He stared at me in astonishment. I sat down.
+     "Please excuse me," I said.  "I  am,  to  be  specific,  a
+tourist  and  just  a  short  time  here;  while you seem to be
+natives and even to have some  connection  with  the  municipal
+government.  So  I  decided  to  inflict  myself on you. I keep
+hearing about Art Patrons, Art Patrons. But what it's all about
+no one seems to know."
+     The man with the bandage experienced another  tie  in  his
+cheek. His eyes grew wide -- he too recognized me.
+     "Art  Patrons?"  said the ruddy one. "Yes, there is such a
+barbarous organization with us here. It is very sad  that  such
+is the case, but it's so."
+     I  nodded,  studying  the  bandage.  My  acquaintance  had
+already regained his composure and was eating  his  jelly  with
+his accustomed haughty look.
+     "In  essence  they are simply modern-age vandals. I simply
+couldn't  find  a  more  appropriate  word.  They  pool   their
+resources  and  buy  up stolen paintings, statues, manuscripts,
+unpublished literary works, patents, and destroy them. Can  you
+imagine  how  revolting  that  is?  They  And some pathological
+delight in the destruction of examples of world  culture.  They
+gather in a large, well-dressed crowd and slowly, deliberately,
+orgiastically destroy them!"
+     "Oh  my,  my,  my!"  I  said,  not  taking my eyes off the
+bandage. "Such people should be hung by their legs."
+     "And we are after them," said the ruddy one.  "We  are  in
+pursuit of them on the legal level. We are unfortunately unable
+to  get  after  the  Artiques  and  the  Perchers,  who are not
+breaking any laws, but as far as the Art Patrons are  concerned
+--"
+     "Are  you  finished  yet,  Senator?" inquired the bandaged
+one, ignoring me.
+     The ruddy one caught himself.
+     "Yes, yes. It's time for us to go.  You  will  excuse  us,
+please,"  he  said,  turning  to  me. "We have a meeting of the
+municipal council."
+     "Bartender!" called the bandaged one in a metallic  voice.
+"Would you call us a taxi."
+     "Have you been here long?" asked the ruddy man.
+     "Second day," I replied.
+     "Do you like it?"
+     "A beautiful city."
+     "Mm -- yes," he mumbled.
+     We  were  silent.  The  man  with  the  bandage impudently
+inserted his monocle and pulled out a cigar.
+     "Does it hurt?" I asked sympathetically.
+     "What, exactly?"
+     "The jaw," I said.  "And  the  liver  should  hurt,  too."
+"Nothing ever hurts me," he replied, monocle glinting. "Are you
+two acquainted?" the ruddy one asked in astonishment.
+     "Slightly," I said. "We had an argument about art."
+     The  bartender  called  out that the taxi had arrived. The
+man with the bandage immediately got up.
+     "Let's go, Senator," he said.
+     The ruddy one smiled at me abstractedly and also got up.
+     They set off for the exit. I followed them  with  my  eyes
+and went to the bar.
+     "Brandy?" asked the bartender.
+     "Quite,"  I  said.  I  shuddered with rage. "Who are those
+people I just spoke to?"
+     'The  baldy  is  a  municipal  counselor,  his  field  are
+cultural  affairs.  The  one  with  the  monocle  is  the  city
+comptroller."
+     "Comptroller," I said. "A scoundrel is what he is."
+     "Really?" said the barman with interest.
+     'That's right, really," I said. "Is Buba here?"
+     "Not yet. And how about the comptroller, what is he up
+     to?"
+     "A scoundrel, an embezzler, that's what he is," I said.
+     The bartender thought awhile.
+     "It could well be," he said. "In fact he's a baron -- that
+is, he used to be,  of  course.  His  ways,  sure  enough,  are
+unsavory.  Too  bad  I  didn't  go  vote  or I would have voted
+against him. What's he done to you?"
+     "It's you he's done. And I've given  him  some  back.  And
+I'll give him some more in due time. Such is the situation."
+     The  bartender,  not  understanding  anything,  nodded and
+said, "Hit it again?"
+     "Do," I said.
+     He poured me more brandy and said,
+     "And here is Buba, coming in."
+     I turned around and barely managed to keep the glass in my
+grip. I recognized Buba.
+
+<ul><a name=10></a><h2>Chapter TEN</h2></ul>
+
+     He stood by the door looking about him as though trying to
+remember where he had come and what he was  to  do  there.  His
+appearance was very unlike his old one, but I recognized him at
+once  anyway,  because for four years we sat next to each other
+in the lecture halls of the school, and then there were several
+years when we met almost daily.
+     "Say," I addressed the bartender. "They call him Buba?"
+     "Uhuh," said the bartender.
+     "What is it -- a nickname?"
+     "How should I know? Buba is Buba,  that's  what  they  all
+call him."
+     "Peck," I cried.
+     Everyone  looked  at me. He too slowly turned his head and
+his eyes searched for the caller. But he paid no  attention  to
+me.  As  though  remembering  something, he suddenly started to
+shake the water out of his cape with  convulsive  motions,  and
+then,  dragging  his heels, hobbled over to the bar and climbed
+with difficulty on the stool next to mine.
+     "The usual," he said to the bartender. His voice was  dull
+and strangled, as though someone held him by the throat.
+     "Someone  has  been  waiting  for  you,"  said the barman,
+placing before him a glass of neat  alcohol  and  a  deep  dish
+filled with granulated sugar.
+     Slowly he turned his head and looked at me, saying, "Well,
+what is it you want?"
+     His  drooping  eyelids were inflamed red, with accumulated
+slime in the corners. He breathed through his mouth  as  though
+suffering with adenoids.
+     "Peck  Xenai,"  I said quietly. "Undergraduate Peck Xenai,
+please return from earth to heaven."
+     He continued to regard me without a change in his  manner.
+Then he licked his lips and said, "A classmate, perhaps?"
+     I felt numb and terrified. He turned around, picked up his
+glass,  drank  it  down, gagging in revulsion, and began to eat
+the sugar with a large soup spoon.  The  bartender  poured  him
+another glass.
+     "Peck," I said, "old friend, don't you remember me?"
+     He looked me over again.
+     "I wouldn't say that. I probably did see you somewhere."
+     "Saw  me  somewhere!"  I  said  in desperation. "I am Ivan
+Zhilin. Could it be you have completely forgotten me?"
+     His hand holding the glass quivered almost  imperceptibly,
+and that was all.
+     "No,  friend,"  he  said, "forgive me, please, but I don't
+remember you."
+     "And you don't remember the 'Tahmasib' or Iowa Smith?"
+     "This heartburn has really got to me today,"  he  informed
+the bartender. "Let me have some soda, Con."
+     The bartender, who had listened with curiosity, poured him
+a soda.
+     "Bad  day,  today,  Con,"  he  said. "Can you imagine, two
+automates failed on me today."
+     The bartender shook his head and sighed.
+     "The manager is bitching," continued Buba, "called  me  on
+the  carpet and bawled me out. I am going to quit that place. I
+told him to go to hell and he fired me."
+     "Complain to the union," the bartender advised.
+     "To hell with them." He drank his soda and wiped his mouth
+with the palm of his hand. He did not look at me.
+     I sat as though spat upon, forgetting completely  what  it
+was  I  wanted  Buba for. I needed Buba, not Peck -- that is, I
+needed Peck too. But not this one. This was not Peck, this  was
+some  strange and repulsive Buba, and I watched in horror as he
+sucked up  the  second  glass  of  alcohol  and  again  set  to
+shoveling spoonfuls of sugar into himself. His face effloresced
+with  red  spots,  and  he  kept  gagging  and listening to the
+bartender  as  he  animatedly  recounted  the  latest  football
+exploits. I wanted to cry out, "Peck, what has happened to you?
+Peck, you used to hate all this!" I put my hand on his shoulder
+and said imploringly, "Peck, dear friend, hear me out, please."
+     He shied away.
+     "What's  the matter, friend?" His eyes were now completely
+unseeing. "I am not Peck, I am Buba, do you understand? You are
+confusing me with someone else, there isn't any  Peck  here....
+So what did the Rhinos do then, Con?"
+     I  reminded  myself  where  I  was,  and  forced myself to
+understand that there was no more Peck, and that  there  was  a
+Buba,  here,  an agent of a criminal organization, and this was
+the only reality, while Peck Xenai was a  mirage  --  a  memory
+which must be quickly extirpated if I intended to press on with
+my work.
+     "Hold on, Buba," I said. "I want to talk business to you."
+     He was quite drunk by now.
+     "I  don't  talk  business  at the bar," he announced. "And
+anyway I am through with work. Done. I have no more business of
+any kind. You can apply to the city hall, friend. They'll  help
+you out."
+     "I  am  applying to you, not the city hall," I said. "Will
+you listen to me!"
+     "You I hear all the time, as it is. To the detriment of my
+health."
+     "My business is quite simple," I said. "I need a slug."
+     He shuddered violently.
+     "Are you out of your mind, pal?"
+     "You should be ashamed," said the bartender. "Right out in
+front of people... you have lost all sense of decency."
+     "Shut up," I told him.
+     "You be quiet," the barman said menacingly.  "It  must  be
+some  time  since you've been busted? Watch your step or you'll
+get exported."
+     "I don't give  a  damn  about  the  exportation,"  I  said
+insolently.   "Don't   stick   your  snoot  in  other  people's
+business."
+     "Lousy sluggard," said the bartender.
+     He was visibly incensed, but spoke in a low voice. "A slug
+he wants. I'll call an officer right now and he'll give  you  a
+slug."
+     Buba  slid  off the stool and hurriedly hobbled toward the
+door.
+     I left off with the bartender and hurried  after  him.  He
+shot  out  into  the rain, and forgetting to cover himself with
+his cape, started to look around in search of a taxi. I  caught
+up with him and grasped him by the sleeve.
+     "What  in  God's  name  do  you  want  from  me?"  he said
+miserably. "I'll call the police."
+     "Peck," I said. "Come out of it, Peck. I am  Ivan  Zhilin,
+and you must remember me."
+     He kept looking around and wiping the streaming water from
+his face  with  the palm of his hand. He looked pitiful and run
+down, and I, trying to suppress my irritation,  kept  insisting
+to  myself that this was my Peck, priceless Peck, irreplaceable
+Peck, good, intelligent, joyful Peck, kept trying  to  remember
+him  as he was in front of the Gladiator's control console, and
+I couldn't because I couldn't imagine him  anywhere  except  at
+the bar over a glass of alcohol.
+     "Taxi," he screeched, but the car flew by, full of people.
+     "Peck,"  I  said,  "come  with me. I'll tell you all about
+it."
+     "Leave me alone," he said, his teeth chattering. "I  won't
+go  anywhere with you. Leave off! I didn't bother you, I didn't
+do anything to you, leave me be, for God's sake."
+     "All right," I said, "I'll let you  alone.  But  you  must
+give me a slug and also your address."
+     "I don't know of any slugs," he moaned. "God, what kind of
+a day is this!"
+     Favoring  his  left leg, he wandered off and suddenly dove
+into a  basement  under  an  elegant  and  restrained  sign.  I
+followed.  We  sat  down  at  a  table and a waiter immediately
+brought us hot  meat  and  beer,  although  we  hadn't  ordered
+anything.  Buba  was shivering and his wet face turned blue. He
+pushed the plate away with revulsion and began to  swallow  the
+beer,  both  hands  around  the mug. The basement was quiet and
+empty. Over the sparkling counter hung a white sign  with  gold
+letters reading, "Paid Service Only."
+     Buba  raised  his  head from the beer and said pleadingly,
+"Can I go, Ivan? I can't... What's the point of all this  talk?
+Let me go, please."
+     I put my hand on his.
+     "What's  happening to you, Peck? I searched for you. There
+is no address listed anywhere. I met you quite by accident, and
+I don't understand anything. How did you get involved  in  this
+mess?  Can  I  help you possibly, with anything? Maybe we could
+--"
+     Suddenly he jerked his hand away in a rage.
+     "What an executioner," he hissed. "The devil lured  me  to
+that  Oasis....  Stupid chatter, drivel. I have no slug, do you
+understand? I have one, but I won't give it to you.  What'll  I
+do then -- like Archimedes? Don't you have any conscience? Then
+don't torture me, let me go."
+     "I  can't  let you go," I said, "until I get the slug. And
+your address. We must talk."
+     "I don't want to talk to  you,  can't  you  understand?  I
+don't want to talk to anyone about anything. I want to go home.
+I  won't  give  you my slug. What am I -- a factory? Give it to
+you and then chase all over town?"
+     I kept silent. It was clear that he hated me now. That  if
+he  thought he had the strength he would kill me and leave. But
+he knew that he did not have the strength.
+     "Scum," he  said  in  a  fury.  "Why  can't  you  buy  one
+yourself?  Don't  you  have the money? Here! Here!" he began to
+search  convulsively  in  his  pockets,  throwing  coppers  and
+crumpled bills on the table. "Take it, there's plenty."
+     "Buy what? Where?"
+     "There's  a damned jackass! It's... what is it? Hmm... how
+do you call it... Oh hell!" he cried. "May you drop straight to
+hell!"
+     He stuck his fingers into his shirt pocket and pulled  out
+a  flat plastic case. Inside it was a shiny metal tube, similar
+to a pocket radio local oscillator-mixer subassembly. "Here  --
+get  fat!"  He  proffered me the tube. It was quite small, less
+than an inch long and a millimeter thick.
+     "Thank you," I said. "And how do I use it?"
+     Peck's eyes opened wide. I think he even smiled.
+     "Good God!" he said almost tenderly. "Can it be you really
+don't know?"
+     "I know nothing," I said.
+     "Well then, you should have said so from the start. And  I
+thought  you  were  tormenting  me  like a torturer. You have a
+radio? Insert it in place of  the  mixer,  hang  it,  stand  it
+somewhere in the bath, and go to!"
+     "In the tub?"
+     "Yes."
+     "It must be in the bath?"
+     "But yes! It is absolutely necessary that your body be
+     immersed in water. In hot water. What an ass you are!"
+     "And how about Devon?"
+     "The  Devon  goes  in the water. About five tablets in the
+water and one orally. The taste is awful, but you won't  regret
+it  later. And one more thing, be sure to add bath salts to the
+water. And before you  start,  have  a  couple  of  glasses  of
+something  strong. This is required so that... how shall I say?
+-- so you can loosen up, sort of."
+     "So," I said. "I got  it.  Now  I've  got  everything."  I
+wrapped the slug in a paper napkin and put it in my pocket. "So
+it's electric wave psychotechnics?"
+     "Good Lord, now what do you care about that?"
+     He was up already, pulling the hood over his head.
+     "No matter," I said. "How much do I owe you?"
+     "A trifle, nonsense! Let's go quickly... what the hell are
+we losing time for?"
+     We went up into the street.
+     "You  made  the  right  decision," said Peck. What kind of
+world is this? Are we men in it? Trash is what it is and not  a
+world. Taxi!" he yelled. "Hey, taxi!"
+     He shook in sudden excitement. "What possessed me to go to
+that Oasis...  Oh  no...  from  now  on  I'll  go  nowhere  ...
+nowhere."
+     "Let me have your address," I said.
+     "What do you want with my address?"
+     A taxi drew up and Buba tore at the door.
+     "Address," I said, grabbing him by the shoulder.
+     "What a dumbhead," said Buba..  "Sunshine  Street,  number
+eleven... Dumbhead!" he repeated, seating himself.
+     "I'll come to see you tomorrow."
+     He paid no more attention to me.
+     "Sunshine," he threw at the driver. "Through downtown, and
+hurry, for God's sake."
+     How  simple,  I thought, looking after his car. How simple
+everything turned out to be. And everything fits. The bath  and
+Devon. Also the screaming radios, which irritated us so, and to
+which we never paid any attention. We simply turned them off. I
+took a taxi and set out for home.
+     But what if he deceived me, I thought. Simply wanted to be
+rid of  me  sooner.  But I would determine that soon enough. He
+doesn't look like a runner, an agent, at all, I thought.  After
+all,  he is Peck. However, no, he is no longer Peck. Poor Peck.
+You are no agent, you are simply a victim. You  know  where  to
+buy  this  filth,  but  you  are only a victim. I don't want to
+interrogate Peck, I don't want to  shake  him  down  like  some
+punk.  True,  he  is  no  longer Peck. Nonsense, what does that
+mean, that he is not Peck. He is  Peck,  and  still  I'll  have
+to...  Electric  wave psychotechnics... But the shivers they're
+wave psychotechnics too.... Somehow, it's a bit too  simple.  I
+haven't passed two days here yet, while Rimeyer has been living
+here  since  the  uprising. We left him behind, and he had gone
+native and everyone was  pleased  with  him,  although  in  his
+latest  reports he wrote that nothing like what we were looking
+for existed here. True, he has nervous exhaustion... and  Devon
+on  the  floor. Also there is Oscar. Further, he did not beg me
+to leave him be, but simply pointed me in the direction of  the
+Fishers.
+     I  didn't  meet  anyone either in the front yard or in the
+hall.. It was almost five.  I  went  to  my  rooms  and  called
+Rimeyer. A quiet female voice answered.
+     "How is the patient?" I asked.
+     "He is asleep. He shouldn't be disturbed."
+     "I won't do that. Is he better?"
+     "I  told  you  he  fell  asleep. And don't call too often,
+please. The phone disturbs him."
+     "You will be with him all the time?"
+     "Till morning, at least. If you call again, I'll have  the
+phone disconnected."
+     "Thank  you,"  I said. "Just, please, don't leave him till
+morning, I'll not trouble you again."
+     I hung up and sat awhile in the big comfortable  chair  in
+front  of  the huge absolutely bare table. Then I took the slug
+out of my pocket and laid it in front  of  me.  A  small  shiny
+tube,  inconspicuous  and  completely  harmless  to all outward
+appearances, an ordinary electronic component. Such can be made
+by the millions. They should cost pennies.
+     "What's that you got there?" asked Len, right next to my
+     He stood alongside and regarded the slug.
+     "Don't you know?" I asked.
+     "It's from a radio. I have one like it  in  my  radio  and
+it's breaking all the time."
+     I pulled my radio out of my pocket and extracted its mixer
+and laid it alongside the slug. The mixer looked like the slug,
+but it was not a slug.
+     "They are not the same," said Len. "But I have seen one of
+those gadgets, too."
+     "What gadget?"
+     "Like the one you have."
+     All at once, his face clouded over and he looked grim.
+     "Did you remember?"
+     "No, I didn't," he said. "I didn't remember anything."
+     "All right, then." I picked up the slug and inserted it in
+place of the mixer in the radio. Len grabbed me by the hand.
+     "Don't," he said.
+     "Why not?"
+     He didn't reply, eyeing the radio warily.
+     "What are you afraid of?" I asked.
+     "I'm not afraid of anything. Where did you get that idea?"
+     "Look  in the mirror," I said. "You look as though you are
+afraid for me." I put the radio in my pocket.
+     "For you?" he said in astonishment.
+     "Obviously for me. Not for yourself, of course, though you
+are still scared of those... necrotic phenomena."
+     He looked sideways.
+     "Where did you  get  that  idea,"  he  said.  "We're  just
+playing."
+     I snorted in disdain.
+     "I am well acquainted with these games. Rut one thing I
+     don't  know:  where in our time do necrotic phenomena come
+from?"
+     He glanced around and began backing up.
+     "I'm going," he said.
+     "O no," I said decisively. "Let's finish what we  started.
+Man to man. Don't think that I am altogether an ignoramus."
+     "What  do  you  know?"  He  was  already near the door and
+talking very quietly.
+     "More than you," I said severely. "But  I  don't  want  to
+shout  it all over the house. If you want to talk, come on over
+here. Climb up on the desk and have yourself  a  seat.  Believe
+me, I'm not a necrotic phenomenon."
+     He  hesitated for a whole minute, and everything for which
+he hoped and everything of which he  was  afraid  appeared  and
+disappeared  on  his face. At last, he said, "Just let me close
+the door."
+     He ran into the  living  room,  closed  the  door  to  the
+hallway, returned to close the study door tight, and approached
+me.  His hands were in his pockets, the face white, contrasting
+with the protruding ears, which were red but cold.
+     "In the first  place,  you  are  a  dope,"  I  pronounced,
+dragging him toward me and standing him between my knees. "Once
+there  was  a boy who lived in such a fear that his pants never
+dried out, not even when he was on a beach, and his  ears  were
+as  cold  as  though  they  had  been  left  in  a refrigerator
+overnight. This boy trembled constantly and so well  that  when
+he  grew  up his legs were all wiggly, and his skin became like
+that of a plucked goose."
+     I was hoping  that  he  would  smile  just  once,  but  he
+listened  very  intently and very seriously inquired, "And what
+was he afraid of?"
+     "He had an elder brother, who was a  nice  fellow,  but  a
+great  one  for  drinking.  And,  as  often  happens, the tipsy
+brother was not at all like the sober brother. He got  to  look
+very  wild  indeed.  And  when he really drank a lot, he got to
+look like a dead man. So this boy..."
+     A contemptuous smile appeared on Len's face.
+     "He sure found something to be scared of.  When  they  are
+drunk is when they turn good."
+     "Who are they?" I asked immediately. "Mother? Vousi?"
+     "That's  it. Mother is just the opposite -- in the morning
+when she gets up, she's  always  nasty,  and  then  she  drinks
+vermouth once, then twice, and that's it. Toward evening she is
+altogether nice because night is near."
+     "And at night?"
+     "At night that creep comes around," Len said reluctantly.
+     "We  are  not  concerned  with  the  creep,"  I  said in a
+businesslike manner. "It's not from him that  you  run  to  the
+garage."
+     "I don't run," he said stubbornly. "It's a game."
+     "I  don't  know,  I  don't  know,"  I said. "There are, of
+course, certain things in this world of which even I am afraid.
+For instance when a boy is crying and trembling. I  can't  look
+at  such things, and it just turns me over inside. Or when your
+teeth hurt and it is required by circumstances that you keep on
+smiling -- that's pretty bad and there is no  way  of  ignoring
+it.  But  there  are  also  just  plain  stupidities. When, for
+example, some idiots help themselves, out of sheer boredom  and
+surfeit,  to  the  brain  of  a living monkey. That's no longer
+frightening, it's just plain  disgusting.  Especially  as  they
+didn't  think  it up by themselves. It was a thousand years ago
+when they thought of  it  first,  and  also  out  of  excessive
+affluence,  the  fat  tyrants of the Far East. And contemporary
+idiots heard and rejoiced.  But  they  should  be  pitied,  not
+feared."
+     "Pity  them?" said Len. "But they don't pity anybody. They
+do whatever they like. It's all the same  to  them,  don't  you
+see?  It  they  are bored, then they don't care whose head they
+saw apart. Idiots... Maybe in the daytime they are idiots,  but
+you don't seem to understand that at night they are not idiots,
+they are all accursed."
+     "How can that be?"
+     "They  are  cursed  by  the  whole  world They can have no
+peace, and they won't ever have it. You  don't  know  anything.
+What's it to you? As you arrived, so you will leave... but they
+are  alive  at  night,  and  in  the  daytime  they  are  dead,
+corpselike."
+     I went to the living room and brought him some  water.  He
+drank down the glass and said, "Will you leave soon?"
+     "Of  course not, how can you think that? I just got here,"
+I said, patting him on the shoulder.
+     "Could I sleep with you?"
+     "Of course."
+     "At first I had a padlock, but she took it away  for  some
+reason. But why she took it she won't say."
+     "OK,"  I  said.  "You will sleep in my living room. Do you
+want to?"
+     "Yes."
+     "Go ahead and lock yourself in and sleep to  your  heart's
+content. And I will climb into the bedroom through the window."
+     He raised his head and gazed at me intently.
+     "You think your doors lock? I know all about this place.
+     Yours don't lock either."
+     "It's  for  you they don't lock," I said as negligently as
+possible. "But for me they'll lock.  It's  only  a  half-hour's
+work."
+     He laughed unpleasantly, like an adult.
+     "You  are afraid, too. All right, I was only joking. Don't
+be afraid, your locks do work"
+     "You dope," I said. "Didn't I tell you I wasn't afraid  of
+anything  of  that  sort?"  He  looked  at me questioningly. "I
+wanted to make the lock work for you in the living room, so you
+could sleep in peace, as long as you are so afraid. As for  me,
+I always sleep with the window open."
+     "I told you, I was joking."
+     We were silent for a bit.
+     "Len,"  I said, "what will you be when you grow up?" "What
+do you mean?" he said. He was  quite  astonished.  "What  do  I
+care?"
+     "Now,  now  --  what do you care. It's all the same to you
+whether you will be a chemist or a bartender?"
+     "I told you -- we are all under a  curse.  You  can't  get
+away  from  it,  why  can't you understand that? When everybody
+knows it?"
+     "So what?" I said. "There were  accursed  peoples  before.
+And then children were born who grew up and removed the curse."
+     "How?"
+     "That  would  take  a long time to explain, old friend." I
+got up. "I'll be sure to tell you all about it. For now, go  on
+out and play. You do play in the daytime? Okay then, run along.
+When the sun sets, come on over, I'll make your bed."
+     He  stuck  his  hands in his pockets and went to the door.
+There he stopped and said aver his shoulder, "That gadget you'd
+better take it out of the radio. What do you think it is?"
+     "A local oscillator-mixer," I said.
+     "It's not a mixer at all. Take it out or it  will  be  bad
+for you." "Why will it be bad for me?" I said.
+     "Take  it out," be said. "You'll hate everybody. Right now
+you are not cursed, blat you will become cursed. Who gave it to
+you? Vousi?"
+     "No."
+     He looked at me imploringly.
+     "Ivan, take it out!"
+     "So be it," I said. "I'll take it out. Run along and play.
+And never be afraid of me. Do you hear?"
+     He didn't say anything and went out, leaving me sitting in
+my chair, with my hands on the desk. Soon I heard him puttering
+about in the lilacs under  the  windows.  He  rustled,  stamped
+about,   muttering  something  under  his  breath,  and  softly
+exclaimed, talking to himself, "Bring the flags  and  put  them
+here  and here... that's it... that's it... and then I got on a
+plane and flew away into the mountains."  I  wondered  when  he
+went  to bed. It would be all right if it were eight o'clock or
+even nine; maybe it was a mistake to start  all  this  business
+with him. I could have locked myself in the bathroom and in two
+hours I would know everything. But no, I couldn't refuse him --
+just imagine I was in his place, I thought. But this is not the
+way;  I  am  catering  to  his  fears,  when  I should think of
+something more clever. But try to come up with it -- this is no
+Anyudinsk boarding school.
+     A boarding school this certainly is not,  I  thought.  How
+different  everything  is, and what lies ahead of me now, which
+circle of paradise, I wonder? But if it  tickles,  I  won't  be
+able  to stand it! Interesting -- the Fishers -- they too are a
+circle of paradise, for sure.  The  Art  Patrons  are  for  the
+aristocrats  of the mind, and the old Subway is for the simpler
+types, although the Intels are also aristocrats of the mind and
+they get intoxicated like swine  and  become  totally  useless,
+even  they are useless. There is too much bate, not enough love
+-- it's easy to teach hate, but love  is  hard  to  teach.  But
+then,  love has been too well overdone and slobbered over so it
+has become passive. How is it that love is always  passive  and
+hate  always  active and is thus always attractive? And then it
+is said that hate is natural, while love is  of  the  mind  and
+springs from deep thought.
+     It  should be worthwhile to have a talk with the Intels, I
+thought. They can't all be hysterical  fools,  and  what  if  I
+should  succeed  in  finding a Man. What in fact is good in man
+that comes from nature -- a pound of gray matter. But this  too
+is  not  always good, so that he always must start from a naked
+nothing; maybe it would be good if  man  could  inherit  social
+advances,  but then again, Len would now be a small-scale major
+general. No, better not -- better to start from zero.  True  he
+would  not  now  be afraid of anything, but instead he would be
+frightening others -- those who weren't major generals.
+     I was startled to suddenly see Len perched in the branches
+of the apple tree regarding me fixedly. The next moment he  was
+gone,  leaving only the crash of branches and falling apples as
+an aftermath.  He  doesn't  believe  me  in  the  slightest,  I
+thought.  He  believes  nobody.  And  whom do I believe in this
+town? I went over everyone I could recall. No, I  didn't  trust
+anyone. I picked up the telephone, dialed the Olympic and asked
+for number 817.
+     "Hello! Yes?" said Oscar's voice.
+     I kept quiet, covering the radio with my hand.
+     "Hello,  I'm listening," repeated Oscar irritably. "That's
+the second time," he  said  to  someone  aside.  "Hello!...  Of
+course  not,  what  sort  of  women could I be carrying on with
+here?" He hung up.
+     I picked up the Mintz volume, lay down on the  couch,  and
+read  until  twilight.  I  dearly  love  Mintz,  but I couldn't
+remember a word I read that day. The evening  shift  roared  by
+noisily.  Aunt  Vaina fed Len his supper, stuffing him with hot
+milk and crackers. Len whimpered  and  was  fretful  while  she
+cajoled  him  gently  and  patiently.  Customs  inspector  Pete
+propounded in a commanding yet benevolent tone,  "You  have  to
+eat, you have to eat, if Mother says eat, you must comply."
+     Two  men  of  loose character, if one could judge by their
+voices, came around looking for Vousi and made a play for  Aunt
+Vaina.  I thought they were drunk. It was growing dark rapidly.
+At eight o'clock the phone in the study rang. I ran  barefooted
+and  grabbed  the receiver, but no one spoke. As you holler, so
+it echoes. At eight-ten, there was a knock on the door.  I  was
+delighted, expecting Len, but it turned out to be Vousi.
+     "Why  don't  you  ever come around?" she asked indignantly
+from  the  doorway.  She  was  wearing  shorts  decorated  with
+suggestively  winking  faces,  a tight-fitting sleeveless shirt
+exposing her navel, and a huge translucent scarf: she was fresh
+and firm as a ripe apple. To a surfeit.
+     "I sit and wait for him all day, and all the  time  he  is
+sacked out here. Does something hurt?"
+     I got up and stuck my feet into my shoes.
+     "Have a chair, Vousi." I patted the couch alongside me.
+     "I  am  not going to sit by you. Imagine -- he is reading.
+You could at least offer me a drink."
+     "In the bar," I said, "How is your sloppy cow?"
+     "Thank  God  she  was  not  around  today,"  said   Vousi,
+disappearing in the bar. "Today I drew the mayor's wife. What a
+moron.  Why, she wants to know, doesn't anyone love her?... You
+want yours with water? Eyes white, face red, and a rear end  as
+wide  as a sofa, just like a frog, honest to God. Listen, let's
+make a polecat, nowadays everybody makes polecats."
+     "I don't go for doing like everybody."
+     "I can see that for myself. Everyone is  out  for  a  good
+time, and he is here -- sacked out. And reading to boot."
+     "He -- is tired," I said.
+     "Oh, so? Well then, I can leave!"
+     "But  I  won't let you," I said, catching her by the scarf
+and pulling her down beside me. "Vousi, dear girl,  are  you  a
+specialist  only  for  ladies'  good  humor  or in general? You
+wouldn't be able to put a lonely man whom nobody loves  into  a
+good humor?"
+     "What's  to  love?"  She  looked  me over. "Red eyes and a
+potato for a nose."
+     "Like an alligator's."
+     "Like a dog's. Don't go putting your arm about me, I won't
+allow it. Why didn't you come over?"
+     "And why did you abandon me yesterday?"
+     "How do you like that --.abandoned him!"
+     "All alone in a strange town."
+     "I abandoned him! Why, I locked for you all over.  I  told
+everyone  that you are a Tungus, and you got lost -- that was a
+poor thing for you to do. No -- I won't permit that! Where were
+you last night? Fishering, no doubt. And the same thing  today,
+you won't tell any stories."
+     "Why  shouldn't  I tell?" I said. And I told her about the
+old  Subway.  I  sensed  at  once  that  the  truth  would   be
+inadequate,  and  so  I  spoke  of  men in metallic masks, of a
+terrible oath, of a wall wet with blood, of a sobbing skeleton,
+and I let her feel the bump behind my ear. She liked everything
+very well.
+     "Let's go right now," she said.
+     "Not for anything," I said and lay down.
+     "What kind of manners is that? Get up at once and we'd go.
+Of course, no one will believe me. But you will show your bump,
+and everything will be just perfect."
+     "And then we'll go to the shivers?" I wanted to know.
+     "But yes! You know that turns out to he even good for your
+health."
+     "And we'll drink brandy?"
+     "Brandy and vermouth and a polecat and whiskey."
+     "Enough, enough... and no doubt we'll  also  squeeze  into
+cars  and  drive  at  a  hundred  and  fifty miles per hour?...
+Listen, Vousi, why should you go there?"
+     She finally understood and smiled in discomfiture.
+     "And what's wrong with it? The Fishers also go."
+     "There is nothing bad," I said.  "But  what's  good  about
+it?"
+     "I  don't know. Everybody does it. Sometimes it's a lot of
+fun... and the shivers. There everything  --  all  your  wishes
+come true."
+     "And that's it? That's all there is?"
+     "Well, not everything, of course. But whatever you think
+     about,  whatever  you would like to happen, often happens.
+Just like in a dream."
+     "Well then maybe it would be better to go to bed?"
+     "What's the matter with you?" she said sulkily. "In a real
+dream all kinds of things happen... as though you  don't  know!
+But with the shivers, only what you like!"
+     "And what do you like?"
+     "We-e-ll! Lots of things."'
+     "Still...  imagine I am a magician. And I say to you, have
+three wishes. Anything at all,  whatever  you  wish.  The  most
+impossible. And I will make them come true. Well?"
+     She  thought  very hard so that even her shoulders sagged.
+Then her face lit up.
+     "Let me never grow old," she said.
+     "Excellent," I said. "That's one."
+     "Let me..." she began inspiredly and stopped.
+     I used to enjoy tremendously asking my friends  this  very
+question  and  used  to  ask it at every available opportunity.
+Several times I even assigned compositions to my youngsters  on
+the  theme of three wishes. And it was always most amusing that
+out of a thousand men and women, oldsters  and  children,  only
+two or three dozen figured that it is possible to wish not only
+for  themselves  personally, or their immediate close ones, but
+also for the world at large, for mankind as a whole.  No,  this
+was  not  witness to the ineradicable human egotism; the wishes
+were not invariably  strictly  selfish,  and  the  majority  in
+subsequent  discussions,  when reminded of missed opportunities
+and the large problems of all mankind, did a double take and in
+honest anger reproached me  that  I  hadn't  explained  at  the
+beginning.  But  one  way or another they all began their reply
+along the lines of "Let me..." This was a manifestation of some
+kind of ancient subconscious conviction that your own  personal
+wishes  cannot  change anything in the wide world, and it makes
+no difference whether you do or do not have a magic wand.
+     "Let me..." began Vousi once more, and again was silent. I
+was watching  her  surreptitiously.  She  noticed   this,   and
+dissolving  into  a  broad smile, said with a wave of her hand,
+"So that's your game. Some card you are!"
+     "No -- no -- no," I said. "You should always  be  prepared
+to  answer  this question. Because I knew a man once who always
+asked it of everyone, and then was inconsolable -- 'Oh what  an
+opportunity  I missed, how could I not have figured it out?' So
+you see it's entirely in earnest. Your first wish is  never  to
+grow old. And then?"
+     "Let's  see  --  what else? Of course, it would be nice to
+have a handsome fellow, whom they  would  all  chase,  but  who
+would be with me only. Always."
+     "Wonderful," I said. "That's two. And what else?"
+     Her  face  showed that the game had already palled on her,
+and that any second she'd drop a bomb. And she did. All I could
+do was blink my eyes.
+     "Yes," I said, "of course that, too. But that happens even
+without any magic."
+     "Yes and no," she argued and began to  develop  the  idea,
+based  on the misfortunes of her clients. All of which was very
+gay and amusing to her,  while  I,  in  ignominious  confusion,
+gulped brandy with lemon and tittered in embarrassment, feeling
+like a virgin wall flower. Well, if all this went on in a night
+club,  I  could  handle  it.  Well,  well,  well...  some  fine
+activities go on in those salons of the Good Mood. How  do  you
+like these elderly ladies...
+     "Enough,"  I  said. "Vousi, you embarrass me, and anyway I
+understand it all very well now. I can  see  that  it's  really
+impossible to do without magic. It's a good thing that I am not
+a magician."
+     "I  really  stung  you  well," she said happily. "And what
+would you wish for yourself, now?"
+     I decided I'd reciprocate in kind.
+     "I don't need anything of that sort," I said.  "Anyway,  I
+am not good at things like that. I'd like a good solid slug."
+     She smiled gaily.
+     "I  don't  need three wishes," I explained, "I can do with
+one."
+     She was still smiling, but the smile  became  empty,  then
+crooked, and then disappeared altogether.
+     "What?" she said in a small voice.
+     "Vousi!" I said, getting up. "Vousi!"
+     She didn't seem to know what to do. She jumped up and then
+sat down  and  then jumped up again. The coffee table fell over
+with all the bottles. There were tears in  her  eyes,  and  her
+face  looked  pitiable,  like  that  of  a  child  who has been
+brutally, insolently, cruelly,  tauntingly  deceived.  Suddenly
+she  bit  her  lip  and  with all her strength slapped my face.
+While I was blinking, she, now in full tears, kicked  away  the
+overturned  table and ran out of the room. I sat, with my mouth
+open. An engine roared into life and lights sprang  up  in  the
+dark  garden, followed by the sound of the motor traversing the
+yard and disappearing in the distance.
+     I felt my face. Some joke. Never in my life have  I  joked
+so  effectively.  What  an old fool I was! How do you like that
+for a slug?
+     "May we?" asked Len. He stood in the door, and he was  not
+alone.  With him was a gloomy, freckle-faced boy with a cleanly
+shaved head.
+     "This is Reg," said Len. "Could he sleep here too?"
+     "Reg," I said, pensively smoothing my eyelids. "Of  course
+-- even  two  Regs  would  be okay. Listen, Len, why didn't you
+come ten minutes earlier!"
+     "But she was here," said Len.  "We  were  looking  in  the
+window, waiting for her to leave."
+     "Really?"  I  said.  "Very interesting. Reg, old chum, how
+about what your parents will say?"
+     Reg didn't reply. Len said, "He doesn't have parents."
+     "Well, all right," I said, feeling a  bit  tired.  "You're
+not going to have a pillow fight?"
+     "No," said Len, not smiling, "we are going to sleep."
+     "Fair  enough,"  I  said. "I'll make your beds and you can
+give all this a quick clean-up."
+     I made their beds on the couch and the big chair and  they
+took  off  their  clothes at once and went to bed. I locked the
+door to the hall, turned out their lights,  and  went  into  my
+bedroom,  where  I  sat  awhile  listening  to them whispering,
+moving furniture, and settling  down.  Then  they  were  quiet.
+About  eleven  o'clock  there  was  the  sound  of broken glass
+somewhere in the house.  Aunt  Vaina's  voice  could  be  heard
+singing  some  sort of marching song, followed by more breaking
+glass. Apparently the tireless Pete again was falling down face
+first. From the center  of  town  came  the  cry  of  "Shivers,
+shivers." Someone was loudly sick on the street.
+     I  locked the window and lowered the shades. I also locked
+the door to the study. Then I went to the bathroom  and  turned
+on  the hot water. I did everything per instructions. The radio
+went on the soap shelf, I threw several Devon  tablets  in  the
+water,  together  with  some  salt  crystals,  and was about to
+swallow the tablet when I remembered that it was propitious  to
+"loosen  up."  I didn't want to disturb the boys, but it wasn't
+necessary -- an open bottle of brandy  stood  in  the  medicine
+chest.  I took a few swallows right out of the bottle, stripped
+down to the skin, climbed into the  bath,  and  turned  on  the
+radio.
+
+<ul><a name=11></a><h2>Chapter ELEVEN</h2></ul>
+
+     I  intentionally did not set the thermo-regulator, so that
+when the water cooled off, I  returned  to  consciousness.  The
+radio was still shrieking and the sparkle of white light on the
+walls  hurt  my eyes. I was thoroughly chilled and covered with
+goose bumps. Switching off the radio, I turned on the hot water
+and remained in the bath, basking in the flooding warmth and  a
+very   strange,  very  novel  sensation  of  total,  cosmically
+enormous emptiness. I expected a  hangover,  but  there  wasn't
+any.  I  simply  felt  good. And there were very many memories.
+Also my thoughts flowed inordinately well, as  though  after  a
+long rest in the mountains.
+     In  the  middle  of  the last century, Olds and Miller had
+conducted  experiments  on  brain  stimulation.  They  inserted
+electrodes  into  the  brains  of  white  rats. They employed a
+primitive technology and a barbarous  methodology,  but  having
+located pleasure centers in the rats' brains, they succeeded in
+having the animals press the lever which closed the contacts to
+the electrodes, hour after hour, producing up to eight thousand
+auto-excitations  per hour. These rats did not need anything in
+the real world. They weren't in  the  slightest  interested  in
+anything  but  the  lever.  They  ignored  food, water, danger,
+females;  they  were  indifferent  to  everything  except   the
+stimulation  lever.  Later,  these  experiments  were  tried on
+monkeys and produced the same results. Rumors were  about  that
+someone  carried out similar experiments on criminals condemned
+to death....
+     That was a difficult time for mankind: a time of  struggle
+against  atomic  destruction, a time of increasing limited wars
+over the entire face of the planet, a time when the majority of
+mankind was starving, but even  so,  the  contemporary  English
+writer   and  critic  Kingsley  Amis,  having  learned  of  the
+experiments with rats, wrote:  "I  cannot  be  sure  that  this
+frightens  me  more  than  a  Berlin or a Taiwan crisis, but it
+should, I believe, frighten me more." He feared much about  the
+future,  this  brilliant  and venomous author of <i>New Maps of
+Hell</i>, and: in particular, he foresaw the  possibilities  of
+brain  stimulation  for  the creation of an illusory existence,
+just as intense as the actual, or more intense.
+     By the end of the century, when the first triumphs of wave
+psychotechnology were  realized,  and  when  psychiatric  wards
+began  to  empty,  amid the chorus of exulting cries of science
+commentators, the little brochure by Krinitsky and  Milanovitch
+had  sounded  like  an irritating dissonance. In its concluding
+section the Soviet educators wrote approximately as follows: In
+the overwhelming majority of countries, the  education  of  the
+young  exists  on  the  level  of the eighteenth and nineteenth
+centuries. This ancient system  of  education  always  did  and
+continues  to  posit  as  its objective, first of all and above
+all, the preparation for society  of  qualified  but  stupefied
+contributors  to  the  production  process.  This system is not
+interested in all the other potentialities of the  human  mind,
+and for this reason, outside of the production process, man, en
+masse,   remains   psychologically  a  cave  dweller,  Man  the
+Uneducated. The  disuse  of  these  potentialities  causes  the
+individuals'  inability  to comprehend our complex world in all
+its contradictions, to correlate  psychologically  incompatible
+concepts and phenomena, to obtain pleasure from the examination
+of  connections  and laws when these do not pertain directly to
+the satisfaction of the most  primitive  social  instincts.  In
+other  words,  this  system  of  education  for  all  practical
+purposes does not develop in man pure imagination,  untrammeled
+vision,  and  as  an immediate consequence, the sense of humor.
+The  Uneducated  Man  perceives  the  world  as  some  sort  of
+essentially trivial, routine, and traditionally simple process,
+a  world from which it is possible only by dint of great effort
+to extract pleasures which are, in the end,  also  compulsively
+routine and traditional. But even the unutilized potentialities
+remain,  apparently,  a  hidden reality of the human brain. The
+problem  for  scientific  education   consists   precisely   in
+initiating  the  action of these possibilities, in teaching man
+to dream,  in  bringing  the  multiordinality  and  variety  of
+psychic   associations   into   quantitative   and  qualitative
+coordination  with   the   multiordinality   and   variety   of
+interrelationships in the world of reality. This problem is the
+one  which,  as  is well known, must become the fundamental one
+for mankind in the  coming  proximate  epoch.  But  until  this
+problem  is resolved, there remains some basis to fear that the
+successes of  psychotechnics  will  lead  to  such  methods  of
+electrical  stimulation  as  will  endow  man  with an illusory
+existence which can exceed the real existence in intensity  and
+variety  by  a  considerable  margin. And if one remembers that
+imagination allows man to  be  both  a  rational  being  and  a
+sensual  animal,  and  if  one  adds  to that the fact that the
+psychic subject matter evoked by the  Uneducated  Man  for  his
+illusory  life  of  splendor  derives  from  the  darkest, most
+primitive reflexes, then it is not hard to perceive  the  awful
+temptation hidden in such possibilities.
+     And therefore -- slug.
+     It  is  now  understandable, I thought, why they write the
+word "slug" on fences.
+     Everything is now  understandable.  It's  odious,  that  I
+understand....  Better if I understood nothing, better if, upon
+regaining consciousness, I shrugged my  shoulders  and  climbed
+out  of the bath. Would it have been understandable to Strogoff
+and Einstein and Petrarch? Imagination is a priceless gift, but
+it must not be given an inward direction.  Only  outward,  only
+outward...  What  a  tasty worm some corrupter has dropped from
+his rod into this stagnant pool! And how accurately timed!  Yes
+indeed,  if  I  were  commander of Wells' Martians, I would not
+have bothered with fighter tripods, heat rays, and  other  such
+nonsense.  Illusory existence ... no, this is not a narcotic, a
+narcotic has a long way to go to approach it. In a. way this is
+exactly appropriate. Here. Now. To each  time  its  own.  Poppy
+seeds  and hemp, the kingdom of sweet blurred shadows and peace
+-- for the beggar, the worn-out, the downtrodden... But here no
+one wants peace, here no one is dying of hunger, here is simply
+a bore. A well-fed, well-heated, drunken bore.  It's  not  that
+the  world  is  bad,  it's  just  plain  dreary.  World without
+prospects, world without promise. But in the end man is  not  a
+carp,  he still remains a man. Yes, it is no kingdom of shades,
+it is indeed the real existence,  without  detraction,  without
+dreary  confusion.  Slug  is  moving on the world and the world
+will not mind subjecting itself to it.
+     Suddenly, for a fraction of a moment, I felt  that  I  was
+lost.  And  it  was  cozy  to  be destroyed. Fortunately I grew
+angry. Splashing out water, I climbed out of the bath,  cursing
+and  stoking  my  ire,  pulled  my shorts and shirt over my wet
+body, and grabbed my watch. It was three o'clock, and it  could
+have been three in the afternoon or three the following morning
+or  three  o'clock  after  a  hundred  years. Idiot, I thought,
+pulling on my trousers. Softened up and let Buba go when he was
+ready to give  me  the  address  of  the  gangsters'  den.  The
+operatives  could  have  been  there  by  now and we could have
+nabbed the whole accursed nest, the vile nest. The vermin nest.
+The repulsive cloaca... And at this instant  against  the  very
+depth  of  my  consciousness,  like  a  dancing  spot of light,
+flicked a very calm thought. But I could not fasten upon it.
+     I located  some  Potomac  in  the  medicine  cabinet,  the
+strongest  stimulant  which  I could find in it. I started into
+the living room, but the youngsters were snoring away there, so
+I climbed out the window. The  city  was  resting,  of  course.
+Guffawing  louts hung around under the street lamp on Waterway,
+bawling crowds surged on the brightly  lit  avenues.  Somewhere
+songs  were  shouted,  somewhere  they  were yelling "Shivers!"
+Somewhere glass was being broken. I picked out a  chauffeurless
+taxi, found the index for Sunshine Street, and dialed it on the
+control  console. The car took off across town. The cab smelled
+sour and bottles  rolled  underfoot.  At  one  intersection  it
+almost  plowed  into  a daisy chain of howling humanity, and at
+another there was the rhythmic flashing of  colored  lights  --
+apparently it was possible to set up the shivers elsewhere than
+the  plaza.  They  were  resting, resting with all their might,
+these benevolent patrons from  the  Happy  Mood  Salons,  these
+polite  customs  inspectors, clever barbers, tender mothers and
+manly  fathers,  innocent  youths  and  maidens  --  they   all
+exchanged  their  diurnal  aspects  for the nocturnal, they all
+worked hard to have fun and so that it wouldn't be necessary to
+think about a thing....
+     The taxi braked. It was  the  very  same  place.  It  even
+seemed as though there was that same burning smell...
+     ...  Peck registered a hit on the armored carrier with the
+Fulminator. It spun on a single tread, hopping in the piles  of
+broken bricks, and two fascists immediately jumped out in their
+unbuttoned  camouflage  shirts,  flung  a grenade apiece in our
+direction, and sped off into the darkness. They moved knowingly
+and adeptly, and it was obvious that these were not  youngsters
+from  the  Royal Academy or lifers from the Golden Brigade, but
+genuine full-blown tank corps officers. Robert  cut  them  down
+point-blank  with a burst from his machine gun. The carrier was
+bulging with cases of beer. It  struck  us  that  we  had  been
+constantly  thirsty for the last two days. Iowa Smith clambered
+into the carrier and began handing out the  cans.  Peck  opened
+them  with a knife. Robert, putting the machine gun against the
+carrier, punched holes into the cans with a sharp point on  the
+armor. And the Teacher, adjusting his pince-nez, tripped on the
+Fulminator  straps  and  muttered, "Wait a minute, Smith; can't
+you see I've got my hands full?" A five-story  building  burned
+briskly  at  the  end of the street, there was a thick smell of
+smoke and hot metal, and we avidly downed the  warm  beer,  and
+were  drenched through and through, and it was very hot and the
+dead officers lay on the broken and crushed bricks, with  their
+legs  identically  flung  out  in  their  black  pants, and the
+camouflage shirts bunched at their necks, and  the  skin  still
+glistening with perspiration on their backs.
+     'They are officers," said the Teacher. "Thank God. I can't
+bear the sight of any more dead kids. Accursed politics! People
+forget God on account of it."
+     "What  god  is  that?"  inquired  Iowa  Smith  out  of the
+carrier. "I've never heard of him."
+     "Don't jest about that, Smith," said  the  Teacher.  "This
+will  all  end  soon,  and  from then on no one nowhere will be
+permitted to poison the souls of men with vanity."
+     "And how then shall they multiply?" asked Iowa  Smith.  He
+bent  over  the  beer again, and we could see the burn holes in
+his pants.
+     "I am talking about politics," said the Teacher  modestly.
+"The  fascists  must be destroyed. They are beasts. But that is
+not enough. There are many other political parties,  and  there
+is no place for them and all their propaganda in our land." The
+Teacher  came from this town and lived within two blocks of our
+post.  "Social  anarchists,  technocrats,  communists,  are  of
+course -- "
+     "I  am  a  communist,"  announced Iowa Smith, "at least by
+conviction. I am for the commune."
+     The Teacher looked at him in bewilderment.
+     "Also I am a godless man," added Iowa Smith. "There is  no
+god, Teacher, and there's nothing you can do about it."
+     At  which  point  we  all  began  to  say that we were all
+atheists, and Peck  said  that  on  top  of  that  he  was  for
+technocracy,  while  Robert  announced  that  his  father was a
+social anarchist and his grandfather was a social anarchist and
+he, Robert, probably could not escape being a social anarchist,
+although he didn't know what it was all about.
+     "Well now, if the  beer  would  get  ice-cold,  said  Peck
+pensively, "I would at once believe in God with great delight."
+     Teacher  smiled embarrassedly and kept wiping his glasses.
+He was a good man and we always kidded him, but he  never  took
+offense.  From the very first night I observed that his courage
+was not great, but he never retreated without being  commanded.
+We were still chattering and joking when there was a thunderous
+crash, the burning building wall collapsed, and straight out of
+the  swirling  flames  and  clouds  of  smoke and sparks swam a
+Mammoth attack tank, floating a yard above the  pavement.  This
+was  a  new  horror,  the  likes  of  which we hadn't seen yet.
+Floating out in the  middle  of  the  street,  it  rotated  its
+thrower as though looking around, and then, hovering on its air
+cushion,  began  to  move  in  our  direction,  screeching  and
+clanking metallically. I regained my wits only by  the  time  I
+was  behind  a gate post. The tank was now considerably closer,
+and at first I couldn't see anyone at all, but then Iowa  Smith
+stood up in full view out of the carrier, and propping the butt
+of  the  Fulminator  against his stomach, took aim. I could see
+the recoil double him up. I saw  a  bright  flash  against  the
+black  brow  of  the  tank. And then the street was filled with
+roar and flame, and when I raised my burned eyelids with  great
+effort, the street was empty and contained only the tank. There
+was  no carrier, no mounds of broken brick, no leaning kiosk by
+the neighboring house -- there was only the  tank.  It  was  as
+though the monster had come awake and was spewing waterfalls of
+flame and the street ceased being a street and became a square.
+Peck  slapped  me  hard  on the neck and I could see his glassy
+eyes right in front of my face, but there was no  time  to  run
+toward the trench and break out the launcher.
+     We  both picked up the mine and started running toward the
+tank, and all I remember is looking continually at the back  of
+his  head,  and gasping for breath and counting steps, when the
+helmet flew off Peck's head, and he fell, so I  almost  dropped
+the  mine  and  fell  on  top  of him. The tank was blown up by
+Robert and Teacher. I still don't know how they did it or when;
+it must be they were running behind us with another mine. I sat
+until morning in  the  middle  of  the  street  holding  Peck's
+bandaged  head on my knees and staring at the awesome treads of
+the tank sticking out of the asphalt lake.  That  same  morning
+the  whole  bloody thing came to an end all at once. Zun Padana
+surrendered with all his staff and was shot in  the  street  by
+some crazed woman when already a prisoner....
+     This  was  the  very  same place. I even thought I smelled
+smoke and burned metal. Even the kiosk stood on the corner, and
+it too was a bit crooked in the latest style  of  architecture.
+The  part  of  the  street  which  the tank turned into a plaza
+remained a plaza, and on the site of the asphalt lake there was
+a small square in which someone was being  beaten.  Iowa  Smith
+was  an urban planner from Iowa, U.S.A., Robert Sventisky was a
+movie  director  form  Krakow,  Poland.  The  Teacher   was   a
+schoolteacher  from this town. No one ever saw them again, even
+dead. And Peck was Peck, who had now become Buba
+     Buba lived in the same sort of cottage as I, and its front
+door was open. I knocked, but no one responded  and  no  one  -
+came  out  to  meet me. I entered the dark hall. The lights did
+not go on. The door to the right was locked, and I looked  into
+the  one  on  the  left. In the living room a bearded man, in a
+jacket, but without pants, was sleeping on  a  tattered  couch.
+Someone's feet stuck out from under the overturned table. There
+was  a  smell  of brandy, tobacco smoke, and of something else,
+cloyingly sweet, like in Aunt Vaina's room the  other  day.  In
+the  door  to the study, I bumped into a handsome florid woman,
+who was not in the slightest surprised to see me.
+     "Good evening," I said. Please excuse me,  but  does  Buba
+live here?"
+     "Here,"   she   said,   examining  me  out  of  glistening
+oily-looking eyes.
+     "Can I see him?"
+     "And why not -- all you want."
+     "Where is he?"
+     "Funny man. Where would he be?" she laughed.
+     I could guess where, but said, "In the bedroom?"
+     "You are warm," she said.
+     "What do you mean -- warm?"
+     "What a dunce, and sober yet! Would you like a drink?"
+     "No," I said, angry. "Where is he? I need him right away."
+     "Your prospects are poor," she said gaily. "But search on,
+search on. As for me, I must go."
+     She patted me on the cheek and went out.
+     The study was empty. There was a large crystal vase on the
+table with some kind of reddish fluid in it. Everything smelled
+of that nauseatingly sweet odor. The bedroom  was  also  empty;
+crumpled  sheets and pillows were scattered about. I approached
+the bathroom door. The door was full of holes,  obviously  made
+by  bullets  shot  from  the  inside, judging by their shape. I
+hesitated, then took hold of the handle. The door was locked.
+     I opened it with considerable difficulty. Buba lay in  the
+bath  up  to  his  neck  in greenish water; steam rose from its
+surface. The radio howled and wheezed on the edge of the tub. I
+stood  and  looked  at  Buba.  At   the   erstwhile   cosmonaut
+experimenter,  Peck  Xenai.  At the once-upon-a-time supple and
+well-muscled fellow, who at eighteen left his warm city by  the
+warm  sea, and went into space for the glory of man, and who at
+thirty returned to  his  country  to  fight  the  last  of  the
+fascists  and  to  remain here forever. I was repelled to think
+that only an hour ago, I had looked like  him.  I  touched  his
+face  and  pulled  his  thin hair. He did not stir. Then I bent
+over him to let him sniff some Potomac, and suddenly  saw  that
+he was dead.
+     I knocked the radio off the edge of the tub and crushed it
+under  heel.  There was a pistol on the floor. But Peck had not
+shot himself; it must have been simply that someone  interfered
+with  him  and  he  shot  through  the door in order to be left
+alone. I stuck my arms in the hot water,  picked  him  up,  and
+carried  him  to  the  bed. He lay there all limp and terrible,
+with eyes sunken under his  brows.  If  only  he  were  not  my
+friend...  if  only he were not such a wonderful guy... if only
+he were not such an outstanding worker...
+     I called emergency aid on the phone and  sat  down  beside
+Peck.  I  tried not to think of him. I tried to think about the
+business at hand. And I tried to be cold and harsh, because  at
+the  very  bottom  of  my  conscious  mind,  that flick of warm
+feeling, like a speck of light, flashed again, and this time  I
+understood what the thought was.
+     By  the  time  the doctor came, I knew what I was going to
+do. I would find Eli. I would pay any sum. Maybe I  would  beat
+him.  If  necessary, I would torture him. And he would tell me,
+whence this plague flows out upon  the  world.  He  would  name
+names  and  addresses.  He would tell me all. And we would find
+these men. We would locate and burn their secret  laboratories,
+and  as for themselves, we would ship them out so far that they
+would never return. Whoever they might be. We would catch  them
+all,  we  would catch all who ever tried slug and isolate them,
+too. Whoever they were. Then I would demand  that  I,  too,  be
+isolated  because  I knew what slug was. Because I grasped what
+sort of thought I had, because I was socially  dangerous,  just
+as  they all are. And all that would be only the beginning. The
+beginning of all beginnings, and ahead would remain that  which
+was  most  important:  to  make  it so that people would never,
+never, wish to know what  slug  was.  Probably  that  would  be
+outlandish. Probably many would say that it was too outlandish,
+too harsh, too stupid -- but we would still have to do it if we
+wanted mankind not to stop....
+     The  doctor,  an  old  gray  man, put down his white case,
+leaned over Buba, looked  him  over,  and  said  indifferently,
+"Hopeless."
+     "Call the police," I said.
+     Slowly he put away his instruments.
+     "There  is  no need of that whatsoever," he said. "There's
+no criminal content, here. It is a neurostimulator...."
+     "Yes, I know."
+     "There you are -- the second case this  night.  They  just
+don't know when to stop."
+     "When did it start?"
+     "Not very long ago... a few months."
+     "Then why in hell do you keep it quiet?"
+     "Keep  it quiet? I don't understand. This is my sixth call
+tonight, young man. The second case of nervous  exhaustion  and
+four cases of brain fever. Are you a relative?"
+     "No."
+     "Well,  all  right,  I'll send some men." He stood awhile,
+looking at Peck. "Join some  choruses,"  he  said.  "Enter  the
+League of Reformed Sluts..."
+     He  was  mumbling something else as he left, an old, bent,
+uncaring man. I covered Peck with a sheet,  pulled  the  drape,
+and  went  out  into  the  living room. The drunks were snoring
+obscenely, filling the air with alcoholic  fumes,  and  I  took
+them  both  by  the  heels  and  dragged  them out in the yard,
+leaving them in the puddle by the fountain.
+     Dawn was breaking once more and the stars were dimming  in
+the  paling  sky. I got into the taxi and dialed the old Subway
+on the console.
+     It was full of people. It was impossible to get through to
+the railing, although it seemed to me that only  two  or  three
+men  were  filling  out  the  forms,  while  the rest were just
+looking,  stretching   their   necks   eagerly.   Neither   the
+round-headed  man  nor  Eli were to be seen behind the barrier,
+and no one knew where  they  could  be  found.  Below,  in  the
+cross-passages  and tunnels, drunken, shouting, half-crazed men
+and hysterical women were  milling  about.  There  were  shots,
+distant  and  muffled  and  some  loud  and close, the concrete
+underfoot shook with the detonations, and a mixture  of  smells
+-- gunpowder,  sweat,  smoke, gasoline, perfume, and whiskey --
+coated in the air.
+     Squealing and arm-waving teenagers surrounded a big fellow
+who dripped blood and whose pale face  shone  with  a  look  of
+triumph. Somewhere wild beasts roared menacingly. In the halls,
+the  audience  was  going wild in front of huge screens showing
+somebody blindfolded, firing a spray of bullets from a  machine
+gun  held  against  his  belly,  and someone else sat up to his
+chest in some black and heavy liquid, blue from  the  cold  and
+smoking   a   crackling   cigar,   and   another   one  with  a
+tension-twisted face, suspended as though cast in stone in some
+sort of web of taut cords...
+     Then I found out where Eli was.  I  saw  round-head  by  a
+dirty  room  full of old sandbags. He stood in the doorway, his
+face covered with soot, smelling of burnt gunpowder, the pupils
+of his eyes fully distended. Every few seconds he bent down and
+brushed his knees, not hearing me at all,  so  that  I  had  to
+shake him to make him take notice of me.
+     "There  is  no  Eli," he barked. "Gone, do you understand?
+Nothing but smoke -- get  it?  Twenty  kilovolts,  one  hundred
+amperes, see? He didn't leap far enough!"
+     He  pushed  me away vigorously and took off into the dirty
+room, jumping over the sandbags. Elbowing the  curious  out  of
+the way, he got to a low metal door.
+     "Let  me through," he howled. "Let me at it once more. God
+favors a third time!"
+     The door shut heavily and the mob surged  away,  stumbling
+and  falling  over the bags. I didn't wait for him to come out.
+Or not to come out. He was no longer of any use  to  me.  There
+was  only  Rimeyer  left.  There was also Vousi, but I couldn't
+count on her. So there was really only Rimeyer. I was not going
+to wake him. I'd wait outside his room.
+     The sun was already  up  and  the  filthied  streets  were
+empty.
+     The   auto-streetcleaners   were   coming   out  of  their
+underground garages to do their job. All they  knew  was  work;
+they  had  no potentialities to be developed, but they also had
+no primitive reflexes. Near the Olympic, I had to  stop  for  a
+long  chain of red and green men followed by a string of people
+enclosed in some sort of scales, who  dragged  their  shuffling
+feet  from one street into the next, leaving behind a stench of
+sweat and paint. I stood and waited for them to pass, while the
+sun had already lit up the huge mass of  the  hotel  and  shone
+gaily  in  the metallic face of Yurkovsky, who, as he had while
+alive, looked out over the heads of all men. After they passed,
+I went into the hotel. The clerk was dozing behind his counter.
+Awaking, he smiled professionally and asked in a cheery  voice,
+"Would you like a room?"
+     "No," I replied, "I am visiting Rimeyer."
+     ' Rimeyer? Excuse me -- room 902?"
+     I stopped.
+     "I believe so. What's the matter?"
+     "I beg your pardon, but he is not in."
+     "What do you mean, not in?"
+     "He checked out."
+     "Can't  be,  he  has  been ill. You are not mistaken? Room
+902?"
+     "Exactly right, 902, Rimeyer. Our perpetual  client.  It's
+an  hour  and a half since he left. More accurately, flew away.
+His friends helped him down and aboard a copter."
+     "What friends?" I asked hopelessly.
+     "Friends,  as  I  said,  but,   excuse   me,   they   were
+acquaintances.  There  were three of them, two of whom I really
+don't know. Just young athletic-looking men. But I do know  Mr.
+Pebblebridge,  he was our permanent guest. But he signed out --
+today."
+     "Pebblebridge?"
+     "Exactly. Lately he has been meeting Rimeyer quite  often,
+so  I concluded that they were quite well acquainted. He stayed
+in  room  817.  A  fairly  imposing   gentleman,   middle-aged,
+red-headed..."
+     "Oscar!"
+     "Exactly, Oscar Pebblebridge.
+     'That  makes  sense,"  I  said,  trying  to keep a hold on
+myself. "You say they helped him?"
+     "That's right. He has been very sick and they even sent  a
+doctor  up:  to  him  yesterday. He was still very weak and the
+young men held him up by his elbows, and almost carried him."
+     "And the nurse? He had an attendant nurse with him?"
+     "Yes, there was one. But she left right after them -- they
+let her go."
+     "And what is your name?"
+     "Val, at your service."
+     "Listen, Val," I said. "You are sure it didn't  look  like
+they were taking him away forcibly?"
+     I looked hard at him. He blinked in confusion.
+     "No,"  he  said.  "Although,  now  that you have mentioned
+it..."
+     "All right," I said. "Give me the key to his room and come
+with me."
+     Clerks are, as a rule, quite savvy types. Their  sense  of
+smell, at least for certain things, is quite impressive. It was
+perfectly obvious that he had guessed who I was. And maybe even
+where  I  came from. He called a porter, whispered something to
+him, and we went up to the ninth floor.
+     "What currency did he pay in?" I asked.
+     "Who? Pebblebridge?"
+     "Yes."
+     "I think... ah yes, marks, German marks."
+     "And when did he arrive here?"
+     "One minute... it will come to  me...  sixteen  marks  ...
+precisely four days ago."
+     "Did he know that Rimeyer stayed with you?"
+     "Excuse me, but I can't say. But the day before yesterday,
+they had  dinner  together. And yesterday, they had a long talk
+in the foyer. Early in the morning while  everybody  was  still
+up."
+     It  was  unusually  clean  and  tidy  in Rimeyer's room. I
+walked about looking over the place.  Suitcases  stood  in  the
+closet.  The  bed  was  rumpled,  but  I  could see no signs of
+struggle. The bathroom also was clean and tidy. Boxes of  Devon
+were stacked on the shelf.
+     "What do you think -- should I call the police?" asked the
+clerk.
+     "I    don't   know,"   I   replied.   "Check   with   your
+administration."
+     "You understand that I am in doubt again. True, he  didn't
+say  goodbye.  But  it all looked completely innocent. He could
+have given me a sign, and I would have  understood  him  --  we
+have  known  each  other  a  long  time.  He  was  pleading Mr.
+Pebblebridge: 'The radio, please don't forget the radio.'"
+     The radio lay under the mirror, hidden  by  a  negligently
+thrown towel.
+     "Yes?"  I  said.  "And  what  did  Mr. Pebblebridge say to
+that?"
+     Mr. Pebblebridge was soothing him, saying, "Of course,  of
+course, don't worry..."
+     I  took  the  radio, and leaving the bathroom, sat down at
+the desk. The clerk looked back and forth from the radio to me.
+     So, I thought, now he knows why I came here. I  turned  it
+an. It moaned and howled. They all know about slug. No need for
+Eli,  nor  Rimeyer;  you can take anyone at random. This clerk,
+for instance. Right now, for instance.  I  turned  it  off  and
+said, "Please be good enough to turn on the combo."
+     He  ran  over  to it with mincing steps, turned it on, and
+eyed me questioningly.
+     "Leave it on that station. A little softer. Thank you."
+     "So you don't advise me to call the police?"
+     "As you wish."
+     "It seemed you had something quite definite in  mind  when
+you questioned me."
+     "It  only  seemed  so,"  I  said coldly. "It's just that I
+dislike Mr. Pebblebridge. But that does not concern you."
+     The clerk bowed.
+     "I'll stay here for a while,  Val,"  I  said.  "I  have  a
+notion  that  this  Mr.  Pebblebridge will be back. It won't be
+necessary to announce that I am here. In the meantime, you  are
+free to go."
+     "Yes, sir," he said.
+     When  he left, I rang up the service bureau and dictated a
+telegram; "Have found the meaning of life but am lonely brother
+departed unexpectedly come at once Ivan." Then I turned on  the
+radio  again, and again it howled and screeched. I took off the
+back and pulled out  the  local  oscillator-mixer.  It  was  no
+mixer.  It  was  a  slug. A beautiful precision subassembly, of
+obviously mass-produced derivation, and the more  I  looked  at
+it, the more it seemed that somewhere, sometime, long before my
+arrival  here,  and  more  than  once, I had already seen these
+components  in  some  very  familiar  device.  I  attempted  to
+recollect  where I had seen them, but instead, I remembered the
+room  clerk  and  his  face  with  a   weak   smile   and   his
+understanding,  commiserating  eyes. They are all infected. No,
+they hadn't tried slug -- heaven forbid! They hadn't even  seen
+one!  It  is  so indecent! It is the worst of the worst! Not so
+loud, my dear, how can you say that in front of the boy...  but
+I've  been told it's something out of this world.... Me?... How
+can you think that, you must have a low  opinion  of  me  after
+all....  I don't know, they say over at the Oasis, Buba has it,
+but as for myself -- I don't know....  And  why  not?  I  am  a
+moderate man -- if I feel something is not right, I'll stop....
+Let  me  have  five packets of Devon, we have made up a fishing
+party (hee, hee!). Fifty thousand people. And their friends  in
+other  towns.  And  a hundred thousand tourists every year. The
+problem is not with the gang. That's the least of our  worries,
+for what does it take to scatter them? The problem is that they
+are  all  ready,  all  eager,  and  there  is not the slightest
+prospect of the  possibility  to  prove  to  them  that  it  is
+terribly  frightening,  that it is the end, that it is the last
+debasement.
+     I clasped the slug in my fist, propped up my head  on  it,
+and stared at Rimeyer's dress jacket with the ribbon bar on it,
+hanging  on  the  back of the chair. Just like me, he must have
+sat in this chair a few months ago, and also held the slug  and
+radio  for  the  second time, and the same warm flick of desire
+wandered through the depths  of  his  consciousness:  there  is
+nothing  to  worry  about,  because  now  there is light in any
+darkness, sweetness in any grief, joy in any pain....
+     ...There, there, said Rimeyer. Now you have  got  it.  You
+just  have  to be honest with yourself. It is a little shameful
+at first, and then you begin to understand how  much  time  you
+have lost for nothing.... ...Rimeyer, I said, I wasted time not
+for  myself.  This  cannot  be  done,  it  simply cannot, it is
+destruction  for  everyone,  you  can't   replace   life   with
+dreams.... ...Zhilin, said Rimeyer, when man does something, it
+is  always  for himself. There may be absolute egotists in this
+world, but perfect altruists are just impossible.  If  you  are
+thinking  of  death  in a bathtub, then, in the first place, we
+are all mortal, and in the second place,  if  science  gave  us
+slug,  it will see to it that it will be rendered harmless. And
+in the meantime, all that is required is moderation. And  don't
+talk  to me of the substitution of reality with dreams. You are
+no novice, you know perfectly well that these dreams  are  also
+part  of  reality.  They constitute an entire world. Why do you
+then call this acquisition ruin?... ...Rimeyer, I said, because
+this world is still illusory, it's all within you, not  outside
+of  you, and everything you do in it remains in yourself. It is
+the opposite of the real  world,  it  is  antagonistic  to  it.
+People  who  escape  into this illusory world cease to exist in
+the real world. They become as dead. And when  everyone  enters
+the  illusory  world  --  and you know it could end thus -- the
+history of man  will  terminate....  ...Zhilin,  said  Rimeyer,
+history  is  the  history  of people. Every man wants to live a
+life which has not been in vain, and  slug  gives  you  such  a
+life....  Yes, I know that you consider your life as not having
+been in vain without slug, but, admit it, you have never  lived
+so luminously, so fully as you have today in the tub. You are a
+bit  ashamed  to recollect it, and you wouldn't risk recounting
+it to others. Don't. They have their life, you  have  yours....
+...Rimeyer,  I  said,  all  that  is true. But the past! Space,
+schools, the struggle with fascists, gangsters -- is  all  that
+for naught? Forty years for nothing? And the others -- they did
+it all for nothing, too?... ...Zhilin, said Rimeyer, nothing is
+for  nothing  in  history.  Some  fought  and did not live long
+enough to have slug.  You  fought  and  lived  long  enough....
+...Rimeyer, I said, I fear for mankind. This is really the end.
+It's  the  end  of  man interacting with nature, the end of the
+interplay of man  with  society,  the  end  of  liaisons  among
+individuals, the end of progress, Rimeyer. AU these billions of
+people  submerged  in.  hot  water and in themselves... only in
+themselves....  ...  Zhilin,  said  Rimeyer,  it's  frightening
+because it's unfamiliar. And as for progress -- it will come to
+an  end  only for the real society, only for the real progress.
+But each separate man will lose nothing,  he  will  only  gain,
+since  his world will become infinitely brighter, his ties with
+nature,  illusory  though  they  may  be,  will   become   more
+multifaceted;  and  ties with society, also illusory but not so
+known to him, will become more powerful and fruitful.  And  you
+don't  have  to  mourn  the  end  of progress. You do know that
+everything comes to an end. So now comes the end of progress in
+the objective world. Heretofore, we didn't know how  if,  would
+end,  But  we  know  now. We hadn't had time to realize all the
+potential intensity of objective existence, it could be that we
+would have reached such knowledge in a few hundred  years,  but
+now  it  has  been  put  in  our  grasp.  Slug brings a gift of
+understanding of our remotest ancestors which you  cannot  ever
+have  in  real life. You are simply the prisoner of an obsolete
+ideal, but be logical, the ideal which slug offers you is  just
+as  beautiful.  Hadn't  you  always  dreamed  of  man  with the
+greatest  scope  of  fantasy   and   gigantic   imagination....
+...Rimeyer,  I  replied,  if  you  only  knew how tired I am of
+arguing. All my life I have argued with myself and with others.
+I have always loved to argue, because  otherwise  life  is  not
+worth  living. But I am tired right now and don't wish to argue
+over  slug,  of  all  things....  ...Then  go  on,  Ivan,  said
+Rimeyer....
+     I  inserted the slug into the radio. As he had then, I got
+up. As he did then, I was past thought, past belonging in  this
+world, but I still heard him say: don't forget to lock the door
+tight so that you won't be disturbed.
+     And  then I sat down. ...So that's the way of it, Rimeyer!
+said I. So that's how it went. You surrendered. You closed  the
+door  tight.  And  then  you sent lying reports to your friends
+that there wasn't any slug. And then  again,  after  hesitating
+but  a  moment,  you  sent  me  to  my death so that I wouldn't
+disturb you. Your ideal, Rimeyer,  is  offal.  If  man  has  to
+perform what is base in the name of an ideal, then the worth of
+such ideal is -- less than dross....
+     I  glanced at the watch and shoved the radio in my pocket.
+I was past waiting for Oscar. I was hungry. And beyond  that  I
+had  the  feeling  that for once I had done something useful in
+this town. I left my phone number with the  room  clerk  --  in
+case  Oscar  or  Rimeyer should return -- and went out onto the
+plaza. I did not believe that Rimeyer would come back  or  even
+that  I  would  ever see him again, but Oscar could hold to his
+promise, though more likely, I would have to seek him out.  And
+probably not alone. And probably not here.
+
+<ul><a name=12></a><h2>Chapter TWELVE</h2></ul>
+
+     There   was   but  one  visitor  in  the  automated  cafe.
+Barricaded behind bottles and hors d'oeuvres at a corner  table
+sat a dark man of oriental cast, magnificently but outlandishly
+dressed.  I  took  some yogurt and blintzes with sour cream and
+set to, glancing at him now and then. He ate and drank much and
+avidly, his face shiny with sweat, hot  inside  his  ridiculous
+formal  clothes.  He  sighed,  leaning  back  in  his chair and
+loosening his belt. The motion exposed a  long  yellow  holster
+glistening in the sunlight under the clothing.
+     I  was  on  my  way  into the last of the blintzes when he
+hailed me: "Hello," he said. "Are you a native here?"
+     "No," I said. "A tourist."
+     "So that means you don't understand anything either."
+     I went to the bar, threw a juice  cocktail  together,  and
+approached him.
+     "Why  is  it  empty  here?"  he continued. He had a lively
+spare face and a bold gaze. "Where are the inhabitants? Why  is
+everything  closed  up?  Everyone  is asleep, you can't get any
+service."
+     "You just arrived?"
+     "Yes."
+     He pushed an empty plate away, moved up a  full  one,  and
+gulped some light beer.
+     "Where are you from?" I asked. He glared at me menacingly,
+and I added quickly, "If it's not a secret, of course."
+     "No,"  he  said, "it's not a secret," and went back to his
+eating.
+     I finished the juice and got ready to leave. Then he said,
+"They live well, the dogs. Such food and as much as  you  want,
+and all for free."
+     "Well, not quite for free," I contradicted.
+     "Ninety dollars! Pennies! I'll show them how to eat ninety
+dollars   within   three   days!"   His   eyes  stopped  roving
+momentarily, "D-dogs!" he muttered and fell to again.
+     I was quite familiar  with  such  types.  They  came  from
+minuscule,  totally milked kingdoms and prefectdoms, reduced to
+utter poverty, and greedily ate and drank, mindful of  the  hot
+dusty  streets  of  their  home  towns,  where in the niggardly
+ribbons  of  shade,  moribund  men  and  women  lay  dying  and
+immobile, while children with distended bellies rummaged in the
+garbage  piles of foreign consulates. They were surcharged with
+hatred and needed only two things -- food and weapons. Food for
+their own gang, which was the opposition, and weapons to  fight
+the  other gang, which was in power. They were the most flaming
+patriots, who spoke hotly and effusively of their love for  the
+people,  but  resolutely refused all help from without, because
+they loved nothing but their power and no one  but  themselves,
+and  were  ready  in  the name of the people and the victory of
+high principles to mortify the same people, right down  to  the
+last   man,   if   necessary,  with  hunger  and  machine  gun.
+Microhitlers!
+     "Weapons? Food?" I asked.
+     He grew wary.
+     "Yes," he said. "Food and weapons. Only without any  silly
+conditions.  And  as  free  as  possible.  Or  on  credit. True
+patriots never have any money. While the ruling  clique  drowns
+in luxury...."
+     "Famine?" I asked.
+     "Anything  you  want.  While  you here swim in luxury." He
+gazed at me with hatred. "The whole world is drowning in wealth
+and we alone are starving. But your  hopes  are  in  vain!  The
+revolution cannot be stopped!"
+     "Yes," I said. "And whom is the revolution against?"
+     "We  are  fighting  the  blood leeches of Boadshah! We are
+against corruption and debauchery of the ruling top  layer,  we
+are for freedom and true democracy. The people are with us, but
+they  have  to be fed. And you tell us that you'll give us food
+only after we disarm. And even threaten  intervention....  What
+filthy,  lying  demagogy!  What  deception of the revolutionary
+masses! To disarm in the face of  those  bloodsuckers  --  that
+means to throw a hangman's noose over the heads of all the true
+freedom fighters! We answer you -- no! You will not deceive the
+people.  Let  Boadshah and his brutes disarm! Then we shall see
+what needs doing!"
+     "Yes," I said. "But Boadshah  also,  in  all  probability,
+does not wish a noose thrown over his neck."
+     He  put  the beer down savagely, and his hand moved toward
+the holster in a habitual gesture. But then he  quickly  caught
+himself.
+     "I  should  have known you don't understand a damn thing,"
+he said. "You who are well fed have grown drowsy  from  a  full
+stomach,  you  are too conceited to understand us. You wouldn't
+have dared to talk to me like that in the jungle."
+     In the jungle, I would have  talked  differently  to  you,
+bandit, I thought, and said:
+     "I  really  don't  understand many things. For instance, I
+don't understand what will happen when you gain the upper hand.
+Let us imagine that you have won, Boadshah has been hanged,  if
+be, in his turn, hasn't fled to seek food and weapons --"
+     "He  won't  get  away.  He'll  get  his  just deserts. The
+revolutionary people will tear him to shreds. That's when we'll
+go to work. We will regain the  territory  seized  from  us  by
+affluent  neighbors, we will carry out the entire program which
+the lying Boadshah  constantly  shouts  about  to  deceive  the
+people....  I'll  show  them how to strike! They'll learn about
+strikes with me on top -- there'll be no strikes!  They'll  all
+go under arms and forward march! We will win and then..."
+     He shut his eyes and moaned a bit, shaking his head.
+     "And  then  you  will be well fed, you will swim in luxury
+and sleep till noon?"
+     He laughed.
+     "I deserve that. The people deserve it. No one  will  dare
+reproach  us. We will eat and drink as much as we wish, we will
+live in real houses, we will say to the  people:  now  you  are
+free -- divert yourselves!"
+     "And  don't  think about a thing," I added. "But don't you
+think that all that could come out badly for you?"
+     "Forget it," he said. "That's sheer demagogy.  You  are  a
+demagogue.   Also  a  dogmatist.  We  too  have  all  kinds  of
+dogmatists similar to yourself. Man, they say,  will  lose  the
+meaning  of life. No, we reply, man will lose nothing. Man will
+acquire and not lose. You have to feel the people. You have  to
+be  from  the  people yourself. The people don't like sophists.
+What the hell for do I let myself be fed on by wood leeches and
+feed on worms myself?" Suddenly he smiled  amiably.  "You  must
+have  taken  offense  at me a bit, for calling you well fed and
+other things. Please don't. Affluence is  bad  when  you  don't
+have  it,  but  your  neighbor  does. But achieved affluence --
+that's a great thing! It's worth fighting for. Everybody fought
+for it. It must be obtained  with  weapons  in  hand,  and  not
+traded for freedom and democracy."
+     "So your final goal is still abundance? Just abundance?"
+     "Obviously!  The  final objective always is abundance. The
+difference is that we are choosy about the means to get it."
+     "I have already grasped that. But what about man?"
+     "What do you mean, man?"
+     I did understand that it was futile to argue.
+     "You have never been here before?" I asked.
+     "Why?"
+     "Look into it, I said. This town gives excellent practical
+lessons in abundance."
+     He shrugged his shoulders.
+     "So far, I like it here." Again he pushed  away  an  empty
+plate  and  replaced  it with a full one. "These hors d'oeuvres
+are strange to me.... Everything is tasty  and  cheap....  It's
+enviable."  He  swallowed  a few forkfuls of salad and growled.
+"We know that all great revolutionaries fought  for  abundance.
+We  don't  have  time to theorize, but there is no need for it,
+anyway. There are  enough  theories  without  us.  Furthermore,
+abundance is in no way threatening us. It won't threaten us for
+quite a while yet. We have much more pressing problems."
+     "To hang Boadshah," I said.
+     "Yes  --  to begin with. Next we will need to do away with
+the dogmatists. I can perceive that even now.  Next  comes  the
+realization  of  our  legitimate  claims. After that, something
+else will come up. And only then, and after many other  things,
+will  abundance arrive. I am an optimist, but I don't believe I
+will live to see it. Don't you worry -- we'll  manage  somehow.
+If  we can stand hunger then we can take abundance for sure....
+The dogmatists prattle that abundance is  not  an  end,  but  a
+means.  We  reply  that  every  means  was once an goal. Today,
+abundance is a goal. Tomorrow, perhaps it may become a means."
+     I got up.
+     "Tomorrow may be too late," I said. "It  is  incorrect  of
+you  to fall back on great revolutionaries. They would not have
+accepted your shibboleth: now you are free -- enjoy yourselves.
+They spoke otherwise: now that you are free -- work. After all,
+they never fought  for  abundance  for  the  belly,  they  were
+interested in abundance for the soul and the mind."
+     His  hand  twitched toward the holster again, and again he
+caught himself.
+     "A Marxist!" he said with astonishment. "But  then  again,
+you  are  a  visitor.  We have almost no Marxists, we take them
+and..."
+     I kept control of myself.
+     Passing by the window, I took another look at him. He  sat
+with  his  back to the street and ate and ate, his elbows stuck
+out.
+     When I got home, the living room was already  vacant.  The
+youngsters  had  piled the bedsheets and pillows in the corner.
+There was a note under the telephone on the desk. Written in  a
+childish   scrawl,   it  read:  "Take  care.  She  has  plotted
+something. She was fussing in the bedroom." I  sighed  and  sat
+down in the armchair.
+     There  was  still  an  hour  until the meeting with Oscar,
+assuming he came. There was no sense in going to sleep, but  in
+addition,  it  might  not be safe -- Oscar could bring company,
+and come earlier than expected, possibly not through the  door.
+I  got  the  pistol  out  of  the  suitcase, put in a clip, and
+dropped it in my side pocket. Next  I  climbed  into  the  bar,
+brewed myself some coffee, and went back to the study.
+     I  took  the  slug  out  of  my  radio  and the one out of
+Rimeyer's, lay them down in front  of  me  on  the  table,  and
+attempted  again to recollect where indeed I had seen just such
+components and why I thought that I had seen  them  before  and
+more than once. And then it came to me. I went into the bedroom
+and  brought in the phonor. I didn't even need a screwdriver. I
+took the case off the phonor, stuck my index finger  under  the
+odorizer  horn, and, catching it with my finger nail, extracted
+a vacuum tubusoid FX-92-U, four outputs, static field, capacity
+equals two. Sold in consumer electronic stores at  fifty  cents
+each. In local patois -- a slug.
+     It   had   to   be,  I  thought.  We  are  disoriented  by
+conversations about a new drug. We are constantly  derailed  by
+talk  about  horrific  new  inventions.  We  have  already made
+several similar blunders.
+     There was the time when Alhagana and Burris  served  up  a
+complaint  in  the  U.N.  that the separatists were using a new
+type of weapon -- freeze bombs. We  threw  ourselves  furiously
+into  a  search  for underground laboratories and even arrested
+two genuine underground inventors (sixteen and ninety-six years
+old, respectively). And then it turned out that  the  inventors
+were  in  no  way  connected,  and  the awful freeze bombs were
+acquired by the  separatists  in  Munich  from  a  refrigerator
+warehouse  -- and were in fact reject super-freezers. True, the
+effect of these super-freezers was  indeed  horrible.  Used  in
+conjunction  with molecular detonators (widely used by undersea
+archaeologists  in  the  Amazon  for   dispersing   crocs   and
+piranhas),  the  super-freezers  were  capable of instantaneous
+temperature  depression  of  one  hundred  and  fifty   degrees
+centigrade  over a radius of twenty meters. Afterward, we spent
+much effort indoctrinating ourselves with the concept  that  we
+should  keep  in mind that in our times, literally every month,
+masses of new inventions  appear  with  the  most  peaceful  of
+applications,  but with the most unexpected side effects. These
+characteristics are often such that lawbreaking in the area  of
+weapons  manufacture  and  stockpiling  becomes meaningless. We
+became extremely cautious about new types of armament, employed
+by various extremists, and only a  year  later  got  caught  by
+another  twist, when we went looking for a mysterious apparatus
+with which poachers lured pterodactyls from the Uganda Preserve
+at  a  great  distance.  We  found  a   clever   do-it-yourself
+adaptation  of  the  "Up-down" toy in combination with a fairly
+generally available medical device.
+     And now we had caught slug -- a combination of a  standard
+radio with a standard tubusoid and a standard chemical and very
+common plumbing-supplied hot water.
+     To  make  a  long  story  short, there would be no need to
+search for secret factories. We'd have to look  for  some  very
+adroit  and unprincipled speculators who sensed very delicately
+indeed that  they  found  themselves  in  the  Country  of  the
+Boob....  They'd  be  like  trichinae  in  a  ham.  Five or six
+enterprising self-seekers. An innocent cottage somewhere in the
+suburbs. Just go to a department store, buy the vacuum tubusoid
+for fifty cents, peel off the plastic wrapping, and place in an
+elegant box with a glassite cover. And then sell it  for  fifty
+marks  --  "only  to you and only through friends." True, there
+was still the inventor. Probably he was  not  alone,  and  most
+certainly he was not the only one.... But probably they had not
+survived;  for  this  was nothing like a lure for pterodactyls.
+Anyway, was the matter really one of speculators? Let them sell
+another forty slugs, or a hundred. Even in the City  of  Boobs,
+people  had to figure out in the end what it was all about. And
+when that happened, slug would spread like wildfire.
+     The first ones to see to that would be the moralists  from
+the  Joy  of  Living.  They  would be followed by Dr. Opir, who
+would sally forth and announce  that  according  to  scientific
+endings,  slug  was  conducive  to  clarity  of thought and was
+unsurpassed in the treatment of alcoholism and  depression.  In
+general,  the  future  ideal  was a vast trough filled with hot
+water. Then they would stop writing  the  word  "slug"  on  the
+fences.
+     That's  who  should  be taken by the throat, I thought, if
+anybody. The trouble is not the profiteers. The trouble is that
+there  exists  this  Country   of   the   Boob,   this   filthy
+misconstruction.  It  has  taken the shivers under its wing and
+can't wait to legalize slug....
+     There was a knock on the door. Oscar came into the  study,
+and he was not alone. With him was Matia himself, stocky, gray,
+with  dark  glasses  and  thick cane, as always, looking like a
+veteran  who  has  lost   his   sight.   Oscar   was   smirking
+self-satisfiedly.
+     "Hello,  Ivan,"  said  Matia.  "Meet  your  back-up, Oscar
+Pebblebridge, from the southwest section."
+     We shook hands. What I  have  always  disliked  about  our
+Security  Council  is  the  plethora  of  mossy traditions, and
+especially   infuriating   is    the    idiotic    system    of
+cross-investigation,  due  to  which we are constantly tripping
+over each other's sleuthing, busting each other's mugs, and not
+uncommonly shooting each other with fair accuracy. I can hardly
+see that as serious work -- more like  adolescents  playing  at
+detectives. Let them go soak their heads in a swamp.
+     "I was going to take you in today," confided Oscar. "Never
+in my life have I seen such a suspicious character."
+     Without saying a word, I took the pistol out of my pocket,
+unloaded it, and threw it in the desk drawer. Oscar followed my
+actions  with approval. I said, addressing Matia, "I guess that
+the  investigation  would  simply  collapse,  without   getting
+started,  had I known about Oscar. But I must inform you that I
+almost maimed him yesterday."
+     "I read you right," said Oscar smugly.
+     Grunting, Matia lowered himself into the armchair.
+     "I can't ever remember a situation," he said,  "when  Ivan
+was  pleased  with everything. But conspiracy is the foundation
+of our business.... Take a chair and sit  down,  both  of  you.
+You,  Oscar,  had  no right to be maimed, and you, Ivan, had no
+right to be arrested. That's how you should regard it. And what
+have you got here?" he said, taking off  his  dark  glasses  to
+look  at the slugs, "Taking up radio as a hobby in between your
+work? Laudable, laudable!"
+     It was evident that they didn't know a  thing.  Oscar  was
+leafing through his notebook, where everything was encrypted in
+his  own personal code, and was apparently preparing himself to
+make a report, while Matia scanned  over  the  slugs  with  his
+fleshy  nose,  holding the glasses aloft in his hand. There was
+something symbolic in this spectacle.
+     "And so, agent Zhilin is enriching his leisure with  radio
+technology," continued Matia, restoring his glasses and leaning
+back  in  his chair. "He has lots of free time, he has switched
+to a four-hour day.... And bow do you stand on the question  of
+the  meaning  of  life,  agent  Zhilin? It appears you may have
+found it. I hope it won't be necessary to take  you  away  like
+agent Rimeyer?"
+     "It  won't be required," I said. "I had not enough time to
+become addicted. Did Rimeyer tell you anything?"
+     "But of course not,"  he  said  with  vast  sarcasm.  "Why
+should he do that? He was ordered to find the drug, and he did,
+and  he  used  it,  and  now  he  apparently considers his duty
+discharged. He became an addict himself, don't you see.  He  is
+silent.  He  is  loaded with this brew up to his ears, and it's
+useless to talk to him! He raves that he has murdered  you  and
+constantly  asks  for his radio." Matia stopped short and gazed
+at the radios. "Strange," he said and looked at me. "However, I
+like orderliness. Oscar got here  first,  and  he  has  certain
+deductions  both  about  the  goodies  and  the  conduct of the
+operation. Let's begin with him."
+     I looked at Oscar.
+     "About what operation?"
+     "The devil knows," said Matia.
+     "The raiding of the center. You haven't located the center
+yet?"
+     The hunt is on, I thought, and  said,  "No,  I  didn't.  A
+center I haven't latched on to. But --"
+     "All  in good order, in proper order," said Matia severely
+and banged the table with the flat of his hand. "Oscar, you may
+begin, and as for you, Ivan, you listen  attentively  and  make
+your deductions. If you are still capable, that is."
+     Oscar  began.  Obviously  he  was  a good worker. He moved
+fast,  energetically,  and  purposefully.  True,  Rimeyer   had
+twisted   him   around  his  finger  as  well  as  he  had  me.
+Nevertheless, Oscar had been able to grasp much in spite of it.
+He understood that the sought-for "goodies" were known  locally
+as  "slug."  Very rapidly he had grasped the connection between
+slug and Devon. He divined that neither the  Fishers,  nor  the
+Perches,  nor the Sorrowers had any relation to our problem. He
+had deduced with superb  insight  that  in  this  town  it  was
+practically  impossible  to  hide  any secret. He had even been
+able to insinuate himself into the confidence  of  the  Intels,
+and  had  established beyond any doubt that there were only two
+truly secret societies -- the Art Patrons and the Intels. Since
+the Art  Patrons  could  be  eliminated,  that  left  only  the
+Intels....
+     "It  was  not  contrary  to  the  conviction  which  I had
+formed," said Oscar, "that  the  only  people  with  access  to
+laboratories   and   capable   of   conducting   scientific  or
+quasi-scientific research were the students and  professors  in
+the  university.  It's true that the factories in the city also
+have laboratories. There are only four  of  them,  and  I  have
+investigated  them  all.  These  laboratories  are  stringently
+specialized and are loaded to the limit with ongoing  work.  As
+the  factories  work  around  the  clock,  there  is  no  basis
+whatsoever to postulate that the industrial labs  could  become
+centers  of  slug  manufacture.  On  the other hand, out of the
+seven university labs, two are  obviously  surrounded  with  an
+atmosphere  of  mystery. I was unable to determine what goes on
+in them, but I spotted three students, who, I  believe,  should
+know for sure...."
+     I listened to him intently, amazed at how much he had been
+able to accomplish here, but it was already all too clear to me
+where  his main error lay. I could see he was following a false
+trail, and alongside of that, there  grew  within  me  a  vague
+feeling  of an even more significant error, of a most important
+error, the error in the underlying premises of the Council.
+     "I arrived at the  visualization,"  he  continued,  "of  a
+gangsterlike  organization of the vertical type with rigorously
+separated functions in decentralized sections.  The  production
+section  is  involved  in the manufacture and perfection of the
+slug.... I should inform you that slug, whatever it may be,  is
+being perfected: I was able to establish that in the beginning.
+Devon  was  not employed at all.... Next, the marketing section
+is concerned with expanding the slug  distribution,  while  the
+strong-arm section terrorizes the population and interdicts all
+debate on that topic.... The intimidation of the people..."
+     Now I understood it all.
+     "Just a minute, Oscar," I said. "Can you guarantee that in
+the entire city there are only two secret organizations?"
+     "Yes," he said. "Only the Art Patrons and the Intels."
+     "Please  continue, Oscar," said Matia with displeasure. "I
+would ask you not to interrupt, Ivan."
+     "Sorry," I said. Oscar continued to talk,  but  I  was  no
+longer  listening. Something flared in my mind. The traditional
+initial model for all  our  undertakings,  with  its  invariant
+axiom  predicating  the existence of a ramified organization of
+evildoers, had been shattered into dust, and I was only  amazed
+that  I had failed heretofore to recognize its inane complexity
+in the context of this simple-minded  country.  There  were  no
+secret  shops  guarded  by  gloomy persons with brass knuckles,
+there were no wary, unprincipled  businessmen,  there  were  no
+traveling  salesmen  with  double-walled  shirt collars stuffed
+with contraband, and it was quite for nothing  that  Oscar  was
+drafting the elegant chart of squares and circles, connected by
+a  confusion  of  lines, and inscribed with the words "center,"
+"staff," and numerous question  marks.  There  was  nothing  to
+demolish  and  be and no one to send off to Baffin Land.... But
+there was modern industry involved  in  everyday  trade,  there
+were state stores where slugs were sold for fifty cents apiece,
+and  there  were  --  but  only  in  the  beginning  one or two
+individuals not devoid of inventiveness and dying of inactivity
+and  thirsting  for  new  sensations.   And   there   was   the
+medium-sized  country  where,  once  upon a time, abundance and
+affluence were the end to  be  attained,  and  they  never  did
+become  the  means  to  another  end. And that was all that was
+needed.
+     Someone inserted a slug into a radio by  mistake  and  lay
+down  in  the bath to relax and maybe listen to some good music
+or to hear the latest news -- and it started.  The  news  oozed
+and remnants of phonors found their way into the garbage ducts,
+then  someone figured out that slugs could be obtained not only
+from phonors, but could simply be bought in stores. Someone was
+inspired to use aromatic  salts  and  someone  employed  Devon.
+People  started  to die in their baths from nervous exhaustion,
+and  the  statistical  department  of  the   Security   Council
+submitted  a  top  secret  report  to  the Presidium. It became
+apparent at once that all such deaths occurred with people  who
+had come here as tourists. And furthermore, that there were far
+more  such  deaths  in  this  country than anywhere else on the
+planet. As so often happens, a false theory was constructed  on
+well-verified  facts,  and we, one after another, well schooled
+in conspiracy, were sent here to uncover  the  secret  gang  of
+dealers  in a new and unknown drug, and we arrived here and did
+stupid things. But, as always, no labor goes for naught, and if
+you must look for the guilty, then all were  guilty,  from  the
+mayor to Rimeyer, and if so, then no one was guilty, and now we
+have to --
+     "Ivan," said Matia irritably, "are you asleep?"
+     They  were  both looking at me. Oscar was extending me his
+notebook with the diagrams. I took the notebook and threw it on
+the table.
+     "Listen," I said. "Oscar has done wonders, of course,  but
+we  have come a cropper again! Oscar, you have seen such a lot,
+but you understood nothing. If there are  any  people  in  this
+land  who  hate  slug,  it's  the  Intels.  The  Intels are not
+gangsters, they are desperate men and patriots. They  have  but
+one  aim  --  to stir this bog. By any means. To give this city
+some kind of purpose, to force it away from the trough They are
+sacrificing themselves, do you  understand?  They  invite  fire
+upon themselves, they are attempting to arouse the town to come
+sort  of common emotion, even if it has to be hatred. Can it be
+you haven't heard of the tear  gas,  the  shooting  up  of  the
+shivers? They are not making slug in the laboratories, they are
+building  bombs and cooking tear gas ... and generally breaking
+the laws on weapons technology. They are preparing a putsch for
+the twenty-eighth, but as for slug -- here it is!"
+     I shoved one at each of them, and simultaneously expounded
+everything I thought on the subject.
+     At first, they listened to  me  in  disbelief.  Then  they
+stared  at  the slugs, not taking their eyes off them until I'd
+finished, and when I did, they were quiet for  quite  a  while.
+Matia held his slug as though it were a buzzing wasp. There was
+displeasure written on his face.
+     "Vacuum  tubusoid...  Hmmm...  In  fact...  and radios ...
+there is something to it."
+     Matia stuck the slug in his  shirt  pocket  and  announced
+decisively,  "There  is nothing in it. That is, of course, I am
+very pleased with you, Ivan, since you  have  apparently  found
+that  which was needed, but your work is in the Council and not
+with the Commission of World Problems.  They  adore  philosophy
+there,  and  haven't done a single useful thing to date. As for
+you, you have been working with us for ten years now,  but  you
+still  haven't  grasped  the simple truth: if there is a crime,
+there must be a criminal."
+     'That's not true," I said.
+     "That is true!" said Matia. "Don't start a debate with me!
+You are eternally debating!... Be quiet, Oscar. It's my turn to
+talk. I am asking you, Ivan, what is the worth of your version?
+What do  you  propose  to  do?  But  be  concrete,  please!  Be
+concrete!"
+     "Concretely..." I faltered.
+     True enough, my version did not suit them.
+     They probably didn't even consider it a version.
+     For  them it was just philosophizing. They were men, so to
+say,  of  resolute  action,  knights  of   immediate   decisive
+measures.,  They  let nothing slide. They cut through knots and
+demounted Damocles' swords.  They  made  rapid  decisions,  and
+having  made them, they no longer doubted. They didn't know how
+to be otherwise. That was their world-view --  and  I  was  the
+only  one  to  consider that their time had passed. Patience, I
+thought. I am going to need an awful lot of patience. Suddenly,
+I understood that life's logic was again ripping me  away  from
+my  best comrades, and that now it would be especially hard for
+me, since the resolution of this argument  would  take  a  long
+time, a very long time.... They were both looking at me.
+     "Concretely," I repeated. "Concretely I suggest a plan for
+the development  and  spread  of a humanistic viewpoint in this
+country."
+     Oscar grimaced with distaste, and Matia said biliously:
+     "Nah! I am talking seriously."
+     "So am I. What we need is not detectives, nor squads armed
+with machine pistols."
+     "We need a decision!" said Matia, "not conversations,  but
+decisions!"
+     'That's precisely what I am proposing -- a decision."
+     Matia reddened
+     "We  have  to  save  people,"  he said. "Souls we can save
+after we save the people.... Don't annoy me, Ivan!"
+     "While you are  restructuring  world-views,"  said  Oscar,
+"people will be dying or turning into idiots."
+     I  didn't  want  to  argue,  but  said anyway, "As long as
+world-views are not restructured,  people  will  be  dying  and
+turning   into  idiots,  and  no  squads  will  help.  Remember
+Rimeyer!"
+     "Rimeyer forgot his duty," raged Matia.
+     "Exactly," said I.
+     Matia slammed his mouth shut and, tearing off his glasses,
+was silent for a while, his  eyes  rotating  angrily.  He  was,
+without  a  doubt, a man of iron; you could actually watch turn
+drive his rage inward. In a minute he  was  entirely  calm  and
+smiling placidly.
+     "Yes,"  he  said. "It seems that I am forced to admit that
+intelligence as a  social  institution  has  regressed  to  the
+piteous  end.  Apparently  we  destroyed  the  last of the true
+operatives in  the  time  of  the  last  putsches.  "Knife"  --
+Dannziger;  "Bamboo"  --  Savada;  "Doll"  --  Grover; "Ram" --
+Boas... True, they were bought and they were sold, they had  no
+country,  they were scum, lumpens, but they worked! "Sirius" --
+Haram... worked for four intelligences and was a scoundrel.  He
+was  a  filthy  animal. But if he gave information, it was real
+information,  clear,  precise,  and  timely.  I  can  recollect
+ordering  him  hung without the slightest pity, but when I look
+at my current co-workers, I can understand what a loss
+     that was.... Granted, a man can fail in the end and become
+a drug addict, as "Bamboo" Savada did finally.  But  why  write
+lying  reports? Rather resign, excuse yourself, don't write any
+reports at all.... I  arrive  in  this  town  in  the  profound
+conviction  that  I know it through and through, because I have
+had here for ten years an experienced, proved, resident  agent.
+And  suddenly  I determine that I know precisely nothing. Every
+local kid knows who the Fishers are. But I don't know.  I  know
+only  that the KVS Society which occupied itself with about the
+same things as the Fishers was  disbanded  and  outlawed  three
+years ago. I know this from the reports of the resident. But at
+the  local police I am informed that the VAL Society was formed
+two years ago, which  I  did  not  learn  from  the  resident's
+reports.  I  am  employing a simplified example, since I really
+don't  give  a  damn  about  the  Fishers,  but  this   becomes
+transformed  into a general style of work. Reports are delayed,
+reports lie, reports misinform... in the end reports are simply
+invented. One man openly resigns from the Council  and  doesn't
+consider  it  incumbent  upon him to so inform his superior. He
+has enough, you see;  he  had  intentions  to  communicate  but
+somehow couldn't find the time.... Another, instead of fighting
+the  drug  problem, becomes an addict himself.... And the third
+philosophizes."
+     He nodded at me with regretful bitterness.
+     "Understand me correctly, Ivan," he continued. "I  am  not
+opposed to philosophy. But philosophy is one thing and our work
+altogether  another.  Judge  for yourself, Ivan. If there is no
+secret  headquarters,  if  we  are  faced  with  a  deluge   of
+do-it-yourself  enterprise, then why all the secretiveness? All
+this conspiratorial atmosphere? Why is slug enveloped  in  such
+mystery?  I  allow  that  Rimeyer is silent because of pangs of
+conscience in general and specifically on your  account,  Ivan.
+But  the rest? Slug is not illegal; everyone knows about it and
+yet  everyone  keeps  it  a  secret.   Oscar,   here,   doesn't
+philosophize;  he  postulates  that  the inhabitants are simply
+terrorized. I can understand that. And what do  you  postulate,
+Ivan?"
+     "In  your  pocket,"  I  said,  "there is a slug. Go in the
+bathroom. There's Devon on the shelf -- one tablet orally, four
+in the water. There's some whiskey in the medicine chest. Oscar
+and I will wait. And then you can tell  us  aloud,  so  we  can
+hear,  we your comrades in work and your underlings, about your
+sensations and experiences. And we -- better it should be Oscar
+-- should listen, but as for me, I think I'll leave."
+     Matia put on his glasses and stared at me.
+     "You are implying that I won't tell? You propose  that  I,
+too, will be derelict in my duty?"
+     "What  you  will learn will have no relation whatsoever to
+your duty.  That  you  will  renege  on  subsequently.  As  did
+Rimeyer.  Comrades,  this  is  slug.  It's a cute device, which
+awakens fantasy and directs  it  where  it  will,  particularly
+where  you yourself subconsciously -- and I mean subconsciously
+-- would like to direct it. The further you  are  removed  from
+the  animal, the more inoffensive would slug be, but the closer
+to the animal, the more you would be impelled to adhere to  the
+conspiratorial  way.  The  animals  themselves  are  altogether
+silent. They just know how to press the lever."
+     "What lever?"
+     I explained about the rats to them.
+     "Did you try it yourself?" asked Matia.
+     "Yes."
+     "And?"
+     "As you can see, I tend to silence."
+     Matia sibilated for some time and then said, "Well,  I  am
+no nearer to the animal than you are. How do you put it in?"
+     I  loaded  the  radio  and  handed  it  to  him. Oscar was
+following all this with interest.
+     "God be with me," said Matia, "Where is  your  bath?  I'll
+wash after my trip while I'm at it."
+     He  locked  himself  in,  and  we  could hear him dropping
+things.
+     "Strange affair," said Oscar.
+     "It's really not an affair," I contradicted. "It's a piece
+of history, Oscar, and you would like to fit it into a file and
+tie it with a ribbon. But this  is  no  gangster  business.  It
+should be obvious to a hedgehog, as Yurkovsky used to say."
+     "Who?"
+     "Yurkovsky,   Vladimir  Sergeyevitch.  There  was  such  a
+renowned planetologist. I worked with him."
+     "Aah," said Oscar, "By the way, on the plaza by the  Hotel
+Olympic there is a monument to a Yurkovsky."
+     "The very same man."
+     "Really?"  said  Oscar.  "On  the  other  hand, it's quite
+possible. However, the monument was not put up because he was a
+renowned planetologist. It's simply that for the first time  in
+the history of the city, he broke the electronic roulette bank.
+It was decided to immortalize such a feat."
+     "I  expected  something  of  the sort," I murmured. I felt
+depressed.
+     The shower began to hiss in the bathroom, and there was  a
+frightful  roar  from Matia, At first, I decided that he turned
+on ice water instead of warm, but  he  kept  yelling  and  then
+began  to  curse  in  the  most  horrendous  terms. Oscar and I
+exchanged glances. He was generally calm, interpreting this  as
+the   typical   action  of  slug,  and  his  face  exhibited  a
+compassionate expression. The latch rattled  wildly,  the  door
+flew  open with a crash. Bare heels slapped in the bedroom, and
+a naked Matia rolled into the study.
+     "Are you some kind of an idiot?" he bellowed at me.  "What
+sort of filthy trick is this?"
+     I  went  numb.  Matia  resembled  a  grotesque  zebra. His
+well-fed body was covered with poison-green  vertical  stripes.
+He reared and stamped his feet, spraying emerald drops. When we
+regained  our  composure  and  investigated  the  site  of  the
+accident, we learned that the shower head had been stuffed with
+a sponge saturated with a green dye. I  remembered  Len's  note
+and guessed that Vousi was the culprit. It took a long while to
+restore  a  normal  atmosphere.  Matia viewed the incident as a
+boorish joke  and  an  inadmissible  disregard  of  subordinate
+discipline  and behavior. Oscar horse-laughed. I scrubbed Matia
+with a brush and explained. Then Matia announced that from  now
+on  he wouldn't trust anyone and would try out slug when he got
+home. He dressed and went into conference  with  Oscar  on  the
+plans for blockading the city.
+     I was cleaning up in the bath and thinking that with this,
+my work  in  the Council was coming to an end, and another kind
+of work was beginning -- which I did not know how to  begin.  I
+would  have  liked  to include myself in the blockade planning,
+not because I considered it necessary, but because  it  was  so
+simple,  so  much  more  simple  than to return to people their
+souls which had been devoured by affluence, and to  teach  each
+one  to  think  of  world  problems  in the same way as his own
+personal ones.
+     "Isolate this pus bag from the rest of the world,  isolate
+it  totally, that's the total of our philosophy," orated Matia.
+That was aimed at me. But perhaps not even me. For Matia was  a
+brilliant  mind.  He  understood  too  well  that isolation was
+always a defense, but here we had to attack. But he knew how to
+advance only with squads, and this was embarrassing to him.
+     To rescue. For how long  would  you  need  rescuing?  When
+would  you  learn  to rescue yourselves? Why were you eternally
+harkening to priests, fascists, demagogues, and imbecile Opirs?
+Why didn't you want to exert your brains? Why  did  you  resist
+thinking  so?  Why  couldn't  you  understand that the world is
+vast, complex, and fascinating? Why was everything  simple  and
+boring  tc  you? In what way did your mind differ from the mind
+of Rabelais, Swift, Lenin, Einstein, Makarenko, Hemingway,  and
+Strogoff?  Someday I would grow tired of all this. Someday when
+I had no more strength and conviction. For  I  was  similar  to
+you.  But  I  wanted  to  help you, and you didn't want to help
+me....
+     <i>Reg and Len came over after school, and Len  said,  "We
+have decided, Ivan. We will go to the Gobi Central." He had red
+fuzz  on  his  lip  and huge red hands, and I could see that it
+divas he who had thought up the Gobi trip, and  quite  recently
+-- not  more  than  ten minutes ago. Reg, as usual, was silent,
+chewing on a blade of grass and placidly studying me  with  his
+calm  gray  eyes. He has become altogether a square, I thought,
+and said, "Wonderful book, isn't it?" "Yes, indeed," said  Len.
+"We  understood  at  once  where  we should go." Reg was quiet.
+"Heat and stench are suspended in  the  shadow  of  these  hard
+laboring  dragons," I said from memory. "They devour everything
+under them -- the ancient Mongolian prayer gate, the bones of a
+two-humped beast fallen in some sand storm..." "Yes," said Len,
+while Reg went on chewing his blade of grass. "Every  time,"  I
+continued  (now  from  Ichin-dagli), "that the sun arrives at a
+mathematically precise  required  position,  a  strange  mirage
+blossoms out in the East -- of a strange city with white towers
+which  no  one  has yet seen in reality. " "One should see that
+with his own eyes," said Len,  and  laughed.  "Friend  Len,"  I
+said,  "it's too fascinating and therefore too simple. You will
+see that it's  too  simple  yourself  and  it  will  become  an
+unpleasant disappointment." No, I hadn't said it right. "Friend
+Len,"  I  said,  "what  sort  of a mirage is that? Here is one.
+Seven years  ago,  in  your  mother's  house,  I  saw  a  truly
+marvelous  mirage:  both of you standing before me almost grown
+up..." No -- I was saying that for myself,  not  for  them.  It
+should  be said differently. "Friend Len," I said, "seven years
+ago you explained to me that your people were accursed. We came
+here and removed the curse from you and Reg and from many other
+children who had no parents. And now it's your turn to  remove,
+the curse, which..."
+     It  will  be  very difficult, but I'll explain it to them.
+One way or another, I'll get it  across.  We  have  known  from
+childhood  how  to  remove  the curses on the barricades and on
+construction sites and in laboratories, and you will remove the
+last of the  curses,  you  will  be  the  future  teachers  and
+educators.  In  the last war -- the most bloodless and the most
+difficult for its soldiers.</i>
+     Upstairs Vousi screeched and Len started to cry piteously.
+Oscar's voice boomed in the  study.  How  well  off  he  is,  I
+thought. Simple: slug is bad, harmful, unnatural. Therefore, it
+must  be  destroyed,  forbidden by law, and then you must watch
+closely that the  law  is  strictly  enforced.  Only  Matia  is
+smarter  than  that,  because he is older and more experienced.
+Matia can still be pulled over to my side. My word doesn't mean
+anything to him, but others will  be  found  to  whom  he  will
+listen....  How  wonderful  that I can now cry out to the whole
+world and be heard by millions of like-thinkers!
+     And then I thought that I would not leave  this  place.  I
+had  been  here only three days. It could not be that there was
+no one here who would be with us. No one  who  hated  all  this
+with a deadly hatred, who wanted to blast this dull sated world
+out  of its stasis. Such people always existed and always will.
+Perhaps that bibliophile driver or that tall, harsh one of  the
+Intels...  and  who  knew how many more. They stumbled about as
+though they were blind. We would do everything in our power  to
+help  them so that they would not waste their anger on trifles.
+It was our place to be here now. And my place, too.
+     What a labor lies ahead, I thought, what a task!  For  the
+time being, I didn't know where to begin in this Country of the
+Boob,  caught  unprepared  in  a flood of affluence, but I knew
+that I wouldn't leave here as  long  as  the  immigration  laws
+permitted.  And  when they stopped permitting it, I would break
+them....
diff --git a/tests/test-hdr/deque/hdr_deque.h b/tests/test-hdr/deque/hdr_deque.h
new file mode 100644 (file)
index 0000000..7f9862e
--- /dev/null
@@ -0,0 +1,390 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include "cppunit/test_beans.h"
+
+namespace deque {
+
+    class DequeHeaderTest: public CppUnitMini::TestCase
+    {
+    public:
+        struct value_type {
+            int     nVal;
+
+            value_type()
+            {}
+            value_type( int i )
+                : nVal(i)
+                {}
+        };
+
+        struct assign_functor
+        {
+            template <typename T>
+            void operator()( value_type& dest, T i ) const
+            {
+                dest.nVal = i;
+            }
+        };
+
+        struct pop_functor
+        {
+            template <typename T>
+            void operator()( T& dest, value_type const& v )
+            {
+                dest = v.nVal;
+            }
+        };
+
+        static void assign_func( value_type& dest, int i )
+        {
+            dest.nVal = i;
+        }
+        static void pop_func( int& dest, value_type const& v )
+        {
+            dest = v.nVal;
+        }
+
+        template <class Deque>
+        void test()
+        {
+            test_beans::check_item_counter<typename Deque::item_counter> check_ic;
+
+            Deque q;
+            value_type v;
+            int i;
+
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+
+            // push_right/pop_right
+            CPPUNIT_ASSERT( q.push_back( value_type(5) ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.push_back( 10, assign_functor() )) ; // functor
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.push_back( 20, assign_func )) ;     // function
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 3 ));
+
+            CPPUNIT_ASSERT( q.pop_back(v) );
+            CPPUNIT_ASSERT( v.nVal == 20 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_back( i, pop_functor()) );
+            CPPUNIT_ASSERT( i == 10 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.pop_back(i, pop_func) );
+            CPPUNIT_ASSERT( i == 5 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+
+            v.nVal = -1;
+            CPPUNIT_ASSERT( !q.pop_back(v) );
+            CPPUNIT_ASSERT( v.nVal == -1 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+
+#ifdef CDS_EMPLACE_SUPPORT
+            CPPUNIT_ASSERT( q.emplace_back( 157 ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.emplace_back( 158 ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_back(i, pop_func) );
+            CPPUNIT_ASSERT( i == 158 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.pop_back(i, pop_functor()) );
+            CPPUNIT_ASSERT( i == 157 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+#endif
+
+#ifdef CDS_CXX11_LAMBDA_SUPPORT
+            CPPUNIT_ASSERT( q.push_back( value_type(511), [](value_type& dest, value_type const& i){ dest.nVal = i.nVal * 2; } ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.push_back( 512, [](value_type& dest, int i){ dest.nVal = i; } ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_back( i, []( int& dest, value_type const& v){ dest = v.nVal; } ) );
+            CPPUNIT_ASSERT( i == 512 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            v.nVal = i = 0;
+            CPPUNIT_ASSERT( q.pop_back( i, [&v]( int& dest, value_type const& val){ dest = -val.nVal; v.nVal = val.nVal; }) );
+            CPPUNIT_ASSERT( i == -511 * 2 );
+            CPPUNIT_ASSERT( v.nVal == 511 * 2);
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+#endif
+
+            // push_right/pop_left
+            CPPUNIT_ASSERT( q.push_back( value_type(5) ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.push_back( 10, assign_functor() )) ; // functor
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.push_back( 20, assign_func )) ;     // function
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 3 ));
+
+            CPPUNIT_ASSERT( q.pop_front(v) );
+            CPPUNIT_ASSERT( v.nVal == 5 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_front(i, pop_functor() ) );
+            CPPUNIT_ASSERT( i == 10 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.pop_front( i, pop_func ) );
+            CPPUNIT_ASSERT( i == 20 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+
+            v.nVal = -1;
+            CPPUNIT_ASSERT( !q.pop_back(v) );
+            CPPUNIT_ASSERT( v.nVal == -1 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+
+#ifdef CDS_EMPLACE_SUPPORT
+            CPPUNIT_ASSERT( q.emplace_back( 157 ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.emplace_back( 158 ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_front(i, pop_func) );
+            CPPUNIT_ASSERT( i == 157 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.pop_front(i, pop_functor()) );
+            CPPUNIT_ASSERT( i == 158 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+#endif
+
+#ifdef CDS_CXX11_LAMBDA_SUPPORT
+            CPPUNIT_ASSERT( q.push_back( value_type(511), [](value_type& dest, value_type const& i){ dest.nVal = i.nVal * 2; } ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.push_back( 512, [](value_type& dest, int i){ dest.nVal = i; } ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_front( i, []( int& dest, value_type const& v){ dest = v.nVal; } ) );
+            CPPUNIT_ASSERT( i == 511 * 2 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            v.nVal = i = 0;
+            CPPUNIT_ASSERT( q.pop_front( i, [&v]( int& dest, value_type const& val){ dest = -val.nVal; v.nVal = val.nVal; }) );
+            CPPUNIT_ASSERT( i == -512 );
+            CPPUNIT_ASSERT( v.nVal == 512);
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+#endif
+
+
+            // push_left/pop_left
+            CPPUNIT_ASSERT( q.push_front( value_type(5) ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.push_front( 10, assign_functor() )) ; // functor
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.push_front( 20, assign_func )) ;     // function
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 3 ));
+
+            CPPUNIT_ASSERT( q.pop_front(v) );
+            CPPUNIT_ASSERT( v.nVal == 20 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_front(v) );
+            CPPUNIT_ASSERT( v.nVal == 10 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.pop_front(v) );
+            CPPUNIT_ASSERT( v.nVal == 5 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+
+#ifdef CDS_EMPLACE_SUPPORT
+            CPPUNIT_ASSERT( q.emplace_front( 157 ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.emplace_front( 158 ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_front(i, pop_func) );
+            CPPUNIT_ASSERT( i == 158 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.pop_front(i, pop_functor()) );
+            CPPUNIT_ASSERT( i == 157 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+#endif
+
+#ifdef CDS_CXX11_LAMBDA_SUPPORT
+            CPPUNIT_ASSERT( q.push_front( value_type(511), [](value_type& dest, value_type const& i){ dest.nVal = i.nVal * 2; } ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.push_front( 512, [](value_type& dest, int i){ dest.nVal = i; } ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_front( i, []( int& dest, value_type const& v){ dest = v.nVal; } ) );
+            CPPUNIT_ASSERT( i == 512 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            v.nVal = i = 0;
+            CPPUNIT_ASSERT( q.pop_front( i, [&v]( int& dest, value_type const& val){ dest = -val.nVal; v.nVal = val.nVal; }) );
+            CPPUNIT_ASSERT( i == -511 * 2 );
+            CPPUNIT_ASSERT( v.nVal == 511 * 2);
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+#endif
+
+            // push_left/pop_right
+            CPPUNIT_ASSERT( q.push_front( value_type(5) ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.push_front( 10, assign_functor() )) ; // functor
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.push_front( 20, assign_func )) ;     // function
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 3 ));
+
+            CPPUNIT_ASSERT( q.pop_back(v) );
+            CPPUNIT_ASSERT( v.nVal == 5 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_back(v) );
+            CPPUNIT_ASSERT( v.nVal == 10 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.pop_back(v) );
+            CPPUNIT_ASSERT( v.nVal == 20 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+
+#ifdef CDS_EMPLACE_SUPPORT
+            CPPUNIT_ASSERT( q.emplace_front( 157 ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.emplace_front( 158 ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_back(i, pop_func) );
+            CPPUNIT_ASSERT( i == 157 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.pop_back(i, pop_functor()) );
+            CPPUNIT_ASSERT( i == 158 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+#endif
+
+#ifdef CDS_CXX11_LAMBDA_SUPPORT
+            CPPUNIT_ASSERT( q.push_front( value_type(511), [](value_type& dest, value_type const& i){ dest.nVal = i.nVal * 2; } ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            CPPUNIT_ASSERT( q.push_front( 512, [](value_type& dest, int i){ dest.nVal = i * 3; } ));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+
+            CPPUNIT_ASSERT( q.pop_back( i, []( int& dest, value_type const& v){ dest = v.nVal; } ) );
+            CPPUNIT_ASSERT( i == 511 * 2 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+
+            v.nVal = i = 0;
+            CPPUNIT_ASSERT( q.pop_back( i, [&v]( int& dest, value_type const& val){ dest = -val.nVal; v.nVal = val.nVal; }) );
+            CPPUNIT_ASSERT( i == -512 * 3 );
+            CPPUNIT_ASSERT( v.nVal == 512 * 3);
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+#endif
+
+            // clear test
+            for ( int i = 0; i < 1000; i++ ) {
+                CPPUNIT_ASSERT( q.push_back( value_type(i) ));
+                CPPUNIT_ASSERT( q.push_front( value_type(i * 1024) ));
+            }
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2000 ));
+            q.clear();
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+
+        }
+
+        void test_MichaelDeque_HP();
+        void test_MichaelDeque_HP_ic();
+        void test_MichaelDeque_HP_stat();
+        void test_MichaelDeque_HP_noalign();
+
+        void test_MichaelDeque_PTB();
+        void test_MichaelDeque_PTB_ic();
+        void test_MichaelDeque_PTB_stat();
+        void test_MichaelDeque_PTB_noalign();
+
+        CPPUNIT_TEST_SUITE(DequeHeaderTest)
+            CPPUNIT_TEST( test_MichaelDeque_HP);
+            CPPUNIT_TEST( test_MichaelDeque_HP_ic);
+            CPPUNIT_TEST( test_MichaelDeque_HP_stat);
+            CPPUNIT_TEST( test_MichaelDeque_HP_noalign);
+
+            CPPUNIT_TEST( test_MichaelDeque_PTB);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_ic);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_stat);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_noalign);
+
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+}   // namespace deque
diff --git a/tests/test-hdr/deque/hdr_fcdeque.cpp b/tests/test-hdr/deque/hdr_fcdeque.cpp
new file mode 100644 (file)
index 0000000..11e72dd
--- /dev/null
@@ -0,0 +1,175 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include "cppunit/test_beans.h"
+#include <cds/container/fcdeque.h>
+#include <boost/container/deque.hpp>
+
+namespace deque {
+
+    class HdrFCDeque: public CppUnitMini::TestCase
+    {
+        template <class Deque>
+        void test_with( Deque& dq )
+        {
+            size_t const c_nSize = 100;
+
+            // push_front/pop_front
+            for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
+                CPPUNIT_CHECK( dq.push_front( i ) );
+            CPPUNIT_CHECK( dq.size() == c_nSize );
+
+            size_t nCount = 0;
+            int val;
+            while ( !dq.empty() ) {
+                CPPUNIT_CHECK( dq.pop_front( val ) );
+                ++nCount;
+                CPPUNIT_CHECK( static_cast<int>(c_nSize - nCount) == val );
+            }
+            CPPUNIT_CHECK( nCount == c_nSize );
+
+            // push_back/pop_back
+            for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
+                CPPUNIT_CHECK( dq.push_back( i ) );
+            CPPUNIT_CHECK( dq.size() == c_nSize );
+
+            nCount = 0;
+            while ( !dq.empty() ) {
+                CPPUNIT_CHECK( dq.pop_back( val ) );
+                ++nCount;
+                CPPUNIT_CHECK( static_cast<int>(c_nSize - nCount) == val );
+            }
+            CPPUNIT_CHECK( nCount == c_nSize );
+
+            // push_back/pop_front
+            for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
+                CPPUNIT_CHECK( dq.push_back( i ) );
+            CPPUNIT_CHECK( dq.size() == c_nSize );
+
+            nCount = 0;
+            while ( !dq.empty() ) {
+                CPPUNIT_CHECK( dq.pop_front( val ) );
+                CPPUNIT_CHECK( static_cast<int>( nCount ) == val );
+                ++nCount;
+            }
+            CPPUNIT_CHECK( nCount == c_nSize );
+
+            // push_front/pop_back
+            for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
+                CPPUNIT_CHECK( dq.push_front( i ) );
+            CPPUNIT_CHECK( dq.size() == c_nSize );
+
+            nCount = 0;
+            while ( !dq.empty() ) {
+                CPPUNIT_CHECK( dq.pop_back( val ) );
+                CPPUNIT_CHECK( static_cast<int>( nCount ) == val );
+                ++nCount;
+            }
+            CPPUNIT_CHECK( nCount == c_nSize );
+
+            // clear
+            for ( int i = 0; i < static_cast<int>( c_nSize ); ++i )
+                CPPUNIT_CHECK( dq.push_front( i ) );
+            CPPUNIT_CHECK( dq.size() == c_nSize );
+
+            CPPUNIT_CHECK( !dq.empty() );
+            dq.clear();
+            CPPUNIT_CHECK( dq.empty() );
+        }
+
+        template <class Deque>
+        void test()
+        {
+            Deque dq;
+            test_with( dq );
+        }
+
+        void fcDeque()
+        {
+            typedef cds::container::FCDeque<int> deque_type;
+            test<deque_type>();
+        }
+
+        void fcDeque_elimination()
+        {
+            typedef cds::container::FCDeque<int, std::deque<int>,
+                cds::container::fcdeque::make_traits<
+                    cds::opt::enable_elimination< true >
+                >::type
+            > deque_type;
+            test<deque_type>();
+        }
+
+        void fcDeque_stat()
+        {
+            typedef cds::container::FCDeque<int, std::deque<int>,
+                cds::container::fcdeque::make_traits<
+                    cds::opt::stat< cds::container::fcdeque::stat<> >
+                >::type
+            > deque_type;
+            test<deque_type>();
+        }
+
+        void fcDeque_mutex()
+        {
+            typedef cds::container::FCDeque<int, std::deque<int>,
+                cds::container::fcdeque::make_traits<
+                    cds::opt::enable_elimination< true >
+                    ,cds::opt::lock_type< cds_std::mutex >
+                >::type
+            > deque_type;
+            test<deque_type>();
+        }
+
+        void fcDeque_boost()
+        {
+            typedef cds::container::FCDeque<int, boost::container::deque<int> > deque_type;
+            test<deque_type>();
+        }
+
+        void fcDeque_boost_elimination()
+        {
+            typedef cds::container::FCDeque<int, boost::container::deque<int>,
+                cds::container::fcdeque::make_traits<
+                    cds::opt::enable_elimination< true >
+                >::type
+            > deque_type;
+            test<deque_type>();
+        }
+
+        void fcDeque_boost_stat()
+        {
+            typedef cds::container::FCDeque<int, boost::container::deque<int>,
+                cds::container::fcdeque::make_traits<
+                    cds::opt::stat< cds::container::fcdeque::stat<> >
+                >::type
+            > deque_type;
+            test<deque_type>();
+        }
+
+        void fcDeque_boost_mutex()
+        {
+            typedef cds::container::FCDeque<int, boost::container::deque<int>,
+                cds::container::fcdeque::make_traits<
+                    cds::opt::enable_elimination< true >
+                    ,cds::opt::lock_type< cds_std::mutex >
+                >::type
+            > deque_type;
+            test<deque_type>();
+        }
+
+        CPPUNIT_TEST_SUITE(HdrFCDeque)
+            CPPUNIT_TEST(fcDeque)
+            CPPUNIT_TEST(fcDeque_elimination)
+            CPPUNIT_TEST(fcDeque_stat)
+            CPPUNIT_TEST(fcDeque_mutex)
+            CPPUNIT_TEST(fcDeque_boost)
+            CPPUNIT_TEST(fcDeque_boost_elimination)
+            CPPUNIT_TEST(fcDeque_boost_stat)
+            CPPUNIT_TEST(fcDeque_boost_mutex)
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+} // namespace deque
+
+CPPUNIT_TEST_SUITE_REGISTRATION(deque::HdrFCDeque);
diff --git a/tests/test-hdr/deque/hdr_intrusive_deque.h b/tests/test-hdr/deque/hdr_intrusive_deque.h
new file mode 100644 (file)
index 0000000..8f887d9
--- /dev/null
@@ -0,0 +1,334 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include "cppunit/test_beans.h"
+
+namespace deque {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+
+    class IntrusiveDequeHeaderTest: public CppUnitMini::TestCase
+    {
+    public:
+        template <typename NodeType>
+        struct base_hook_item: public NodeType
+        {
+            int nVal;
+            int nDisposeCount;
+
+            base_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        template <typename NodeType>
+        struct member_hook_item
+        {
+            int nVal;
+            int nDisposeCount;
+            NodeType hMember;
+
+            member_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        struct faked_disposer
+        {
+            template <typename T>
+            void operator ()( T * p )
+            {
+                ++p->nDisposeCount;
+            }
+        };
+
+        template <class Deque>
+        void test()
+        {
+            test_beans::check_item_counter<typename Deque::item_counter> check_ic;
+
+            typedef typename Deque::value_type value_type;
+            value_type v1, v2, v3;
+
+            Deque q;
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+
+            v1.nVal = 1;
+            v2.nVal = 2;
+            v3.nVal = 3;
+
+            // push_left / pop_right
+            CPPUNIT_ASSERT( q.push_front(v1));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+            CPPUNIT_ASSERT( q.push_front(v2));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+            CPPUNIT_ASSERT( q.push_front(v3));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 3 ));
+
+            CPPUNIT_ASSERT( v1.nDisposeCount == 0 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 0 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 0 );
+
+            value_type * pv;
+            pv = q.pop_back();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 1 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 0 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 0 );
+
+            pv = q.pop_back();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 2 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 0 );
+
+            pv = q.pop_back();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 3 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
+
+            pv = q.pop_back();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv == NULL );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
+
+
+            // push_right / pop_left
+            CPPUNIT_ASSERT( q.push_back(v1));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+            CPPUNIT_ASSERT( q.push_back(v2));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+            CPPUNIT_ASSERT( q.push_back(v3));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 3 ));
+
+            CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
+
+            pv = q.pop_front();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 1 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
+
+            pv = q.pop_front();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 2 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
+
+            pv = q.pop_front();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 3 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 2 );
+
+            pv = q.pop_front();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv == NULL );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 2 );
+
+
+            // push_right / pop_right
+            CPPUNIT_ASSERT( q.push_back(v1));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+            CPPUNIT_ASSERT( q.push_back(v2));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+            CPPUNIT_ASSERT( q.push_back(v3));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 3 ));
+
+            CPPUNIT_ASSERT( v1.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 2 );
+
+            pv = q.pop_back();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 3 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 3 );
+
+            pv = q.pop_back();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 2 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 3 );
+
+            pv = q.pop_back();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 1 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 3 );
+
+            pv = q.pop_back();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv == NULL );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 3 );
+
+
+            // push_left / pop_left
+            CPPUNIT_ASSERT( q.push_front(v1));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+            CPPUNIT_ASSERT( q.push_front(v2));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+            CPPUNIT_ASSERT( q.push_front(v3));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 3 ));
+
+            CPPUNIT_ASSERT( v1.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 3 );
+
+            pv = q.pop_front();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 3 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 2 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 4 );
+
+            pv = q.pop_front();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 2 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 1 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 4 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 4 );
+
+            pv = q.pop_front();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 1 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 4 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 4 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 4 );
+
+            pv = q.pop_front();
+            Deque::gc::scan();
+            CPPUNIT_ASSERT( pv == NULL );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_ASSERT( check_ic( q.size(), 0 ));
+            CPPUNIT_ASSERT( v1.nDisposeCount == 4 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 4 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 4 );
+        }
+
+        void test_MichaelDeque_HP_default();
+        void test_MichaelDeque_HP_default_ic();
+        void test_MichaelDeque_HP_default_stat();
+        void test_MichaelDeque_HP_base();
+        void test_MichaelDeque_HP_member();
+        void test_MichaelDeque_HP_base_ic();
+        void test_MichaelDeque_HP_member_ic();
+        void test_MichaelDeque_HP_base_stat();
+        void test_MichaelDeque_HP_member_stat();
+        void test_MichaelDeque_HP_base_align();
+        void test_MichaelDeque_HP_member_align();
+        void test_MichaelDeque_HP_base_noalign();
+        void test_MichaelDeque_HP_member_noalign();
+        void test_MichaelDeque_PTB_base();
+        void test_MichaelDeque_PTB_member();
+        void test_MichaelDeque_PTB_base_ic();
+        void test_MichaelDeque_PTB_member_ic();
+        void test_MichaelDeque_PTB_base_stat();
+        void test_MichaelDeque_PTB_member_stat();
+        void test_MichaelDeque_PTB_base_align();
+        void test_MichaelDeque_PTB_member_align();
+        void test_MichaelDeque_PTB_base_noalign();
+        void test_MichaelDeque_PTB_member_noalign();
+
+        CPPUNIT_TEST_SUITE(IntrusiveDequeHeaderTest)
+            CPPUNIT_TEST( test_MichaelDeque_HP_default);
+            CPPUNIT_TEST( test_MichaelDeque_HP_default_ic);
+            CPPUNIT_TEST( test_MichaelDeque_HP_default_stat);
+            CPPUNIT_TEST( test_MichaelDeque_HP_base);
+            CPPUNIT_TEST( test_MichaelDeque_HP_member);
+            CPPUNIT_TEST( test_MichaelDeque_HP_base_ic);
+            CPPUNIT_TEST( test_MichaelDeque_HP_member_ic);
+            CPPUNIT_TEST( test_MichaelDeque_HP_base_stat);
+            CPPUNIT_TEST( test_MichaelDeque_HP_member_stat);
+            CPPUNIT_TEST( test_MichaelDeque_HP_base_align);
+            CPPUNIT_TEST( test_MichaelDeque_HP_member_align);
+            CPPUNIT_TEST( test_MichaelDeque_HP_base_noalign);
+            CPPUNIT_TEST( test_MichaelDeque_HP_member_noalign);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_base);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_member);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_base_ic);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_member_ic);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_base_stat);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_member_stat);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_base_align);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_member_align);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_base_noalign);
+            CPPUNIT_TEST( test_MichaelDeque_PTB_member_noalign);
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+}   // namespace deque
diff --git a/tests/test-hdr/deque/hdr_intrusive_michael_deque_hp.cpp b/tests/test-hdr/deque/hdr_intrusive_michael_deque_hp.cpp
new file mode 100644 (file)
index 0000000..2524bb8
--- /dev/null
@@ -0,0 +1,166 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_deque.h"
+#include <cds/gc/hp.h>
+#include <cds/intrusive/michael_deque.h>
+
+namespace deque {
+#define TEST(X) void IntrusiveDequeHeaderTest::test_##X() { test<X>(); }
+
+    namespace {
+        typedef cds::gc::HP HP;
+        typedef ci::michael_deque::node<HP> node_hp;
+
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::base_hook_item< node_hp >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+        > MichaelDeque_HP_default;
+
+        /// HP + item counter
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::base_hook_item< node_hp >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::sequential_consistent >
+        > MichaelDeque_HP_default_ic;
+
+        /// HP + stat
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::base_hook_item< node_hp >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,co::stat< ci::michael_deque::stat<> >
+        > MichaelDeque_HP_default_stat;
+
+        // HP base hook
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::base_hook_item< node_hp >
+            ,ci::opt::hook<
+                ci::michael_deque::base_hook< ci::opt::gc<HP> >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+        > MichaelDeque_HP_base;
+
+        // HP member hook
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::member_hook_item< node_hp >
+            ,ci::opt::hook<
+                ci::michael_deque::member_hook<
+                    offsetof(IntrusiveDequeHeaderTest::member_hook_item< node_hp >, hMember),
+                    ci::opt::gc<HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+        > MichaelDeque_HP_member;
+
+        /// HP base hook + item counter
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::base_hook_item< node_hp >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::michael_deque::base_hook< ci::opt::gc<HP> >
+            >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::relaxed_ordering >
+        > MichaelDeque_HP_base_ic;
+
+        // HP member hook + item counter
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::member_hook_item< node_hp >
+            ,ci::opt::hook<
+                ci::michael_deque::member_hook<
+                    offsetof(IntrusiveDequeHeaderTest::member_hook_item< node_hp >, hMember),
+                    ci::opt::gc<HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > MichaelDeque_HP_member_ic;
+
+        // HP base hook + stat
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::base_hook_item< node_hp >
+            ,ci::opt::hook<
+                ci::michael_deque::base_hook< ci::opt::gc<HP> >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,co::stat< ci::michael_deque::stat<> >
+        > MichaelDeque_HP_base_stat;
+
+        // HP member hook + stat
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::member_hook_item< node_hp >
+            ,ci::opt::hook<
+                ci::michael_deque::member_hook<
+                    offsetof(IntrusiveDequeHeaderTest::member_hook_item< node_hp >, hMember),
+                    ci::opt::gc<HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,co::stat< ci::michael_deque::stat<> >
+        > MichaelDeque_HP_member_stat;
+
+        // HP base hook + alignment
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::base_hook_item< node_hp >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::michael_deque::base_hook< ci::opt::gc<HP> >
+            >
+            ,co::alignment< 32 >
+        > MichaelDeque_HP_base_align;
+
+        // HP member hook + alignment
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::member_hook_item< node_hp >
+            ,ci::opt::hook<
+                ci::michael_deque::member_hook<
+                    offsetof(IntrusiveDequeHeaderTest::member_hook_item< node_hp >, hMember),
+                    ci::opt::gc<HP>
+                >
+            >
+            ,co::alignment< 32 >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+        > MichaelDeque_HP_member_align;
+
+        // HP base hook + no alignment
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::base_hook_item< node_hp >
+            ,ci::opt::hook<
+                ci::michael_deque::base_hook< ci::opt::gc<HP> >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,co::alignment< co::no_special_alignment >
+        > MichaelDeque_HP_base_noalign;
+
+        // HP member hook + no alignment
+        typedef ci::MichaelDeque< HP,
+            IntrusiveDequeHeaderTest::member_hook_item< node_hp >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::michael_deque::member_hook<
+                    offsetof(IntrusiveDequeHeaderTest::member_hook_item< node_hp >, hMember),
+                    ci::opt::gc<HP>
+                >
+            >
+            ,co::alignment< co::no_special_alignment >
+        > MichaelDeque_HP_member_noalign;
+
+    }   // namespace
+
+    TEST( MichaelDeque_HP_default)
+    TEST( MichaelDeque_HP_default_ic)
+    TEST( MichaelDeque_HP_default_stat)
+    TEST( MichaelDeque_HP_base)
+    TEST( MichaelDeque_HP_member)
+    TEST( MichaelDeque_HP_base_ic)
+    TEST( MichaelDeque_HP_member_ic)
+    TEST( MichaelDeque_HP_base_stat)
+    TEST( MichaelDeque_HP_member_stat)
+    TEST( MichaelDeque_HP_base_align)
+    TEST( MichaelDeque_HP_member_align)
+    TEST( MichaelDeque_HP_base_noalign)
+    TEST( MichaelDeque_HP_member_noalign)
+
+} // namespace deque
+
+CPPUNIT_TEST_SUITE_REGISTRATION(deque::IntrusiveDequeHeaderTest);
diff --git a/tests/test-hdr/deque/hdr_intrusive_michael_deque_ptb.cpp b/tests/test-hdr/deque/hdr_intrusive_michael_deque_ptb.cpp
new file mode 100644 (file)
index 0000000..a4fc089
--- /dev/null
@@ -0,0 +1,142 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_deque.h"
+#include <cds/gc/ptb.h>
+#include <cds/intrusive/michael_deque.h>
+
+namespace deque {
+#define TEST(X) void IntrusiveDequeHeaderTest::test_##X() { test<X>(); }
+
+    namespace {
+        typedef cds::gc::PTB PTB;
+        typedef ci::michael_deque::node<PTB> node_ptb;
+
+        // PTB base hook
+        typedef ci::MichaelDeque< PTB,
+            IntrusiveDequeHeaderTest::base_hook_item< node_ptb >
+            ,ci::opt::hook<
+            ci::michael_deque::base_hook< ci::opt::gc<PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+        > MichaelDeque_PTB_base;
+
+        // PTB member hook
+        typedef ci::MichaelDeque< PTB,
+            IntrusiveDequeHeaderTest::member_hook_item< node_ptb >
+            ,ci::opt::hook<
+                ci::michael_deque::member_hook<
+                    offsetof(IntrusiveDequeHeaderTest::member_hook_item< node_ptb >, hMember),
+                    ci::opt::gc<PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+        > MichaelDeque_PTB_member;
+
+        /// PTB base hook + item counter
+        typedef ci::MichaelDeque< PTB,
+            IntrusiveDequeHeaderTest::base_hook_item< node_ptb >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::michael_deque::base_hook< ci::opt::gc<PTB> >
+            >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::relaxed_ordering >
+        > MichaelDeque_PTB_base_ic;
+
+        // PTB member hook + item counter
+        typedef ci::MichaelDeque< PTB,
+            IntrusiveDequeHeaderTest::member_hook_item< node_ptb >
+            ,ci::opt::hook<
+                ci::michael_deque::member_hook<
+                    offsetof(IntrusiveDequeHeaderTest::member_hook_item< node_ptb >, hMember),
+                    ci::opt::gc<PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > MichaelDeque_PTB_member_ic;
+
+        // PTB base hook + stat
+        typedef ci::MichaelDeque< PTB,
+            IntrusiveDequeHeaderTest::base_hook_item< node_ptb >
+            ,ci::opt::hook<
+                ci::michael_deque::base_hook< ci::opt::gc<PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,co::stat< ci::michael_deque::stat<> >
+        > MichaelDeque_PTB_base_stat;
+
+        // PTB member hook + stat
+        typedef ci::MichaelDeque< PTB,
+            IntrusiveDequeHeaderTest::member_hook_item< node_ptb >
+            ,ci::opt::hook<
+                ci::michael_deque::member_hook<
+                    offsetof(IntrusiveDequeHeaderTest::member_hook_item< node_ptb >, hMember),
+                    ci::opt::gc<PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,co::stat< ci::michael_deque::stat<> >
+        > MichaelDeque_PTB_member_stat;
+
+        // PTB base hook + alignment
+        typedef ci::MichaelDeque< PTB,
+            IntrusiveDequeHeaderTest::base_hook_item< node_ptb >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::michael_deque::base_hook< ci::opt::gc<PTB> >
+            >
+            ,co::alignment< 32 >
+        > MichaelDeque_PTB_base_align;
+
+        // PTB member hook + alignment
+        typedef ci::MichaelDeque< PTB,
+            IntrusiveDequeHeaderTest::member_hook_item< node_ptb >
+            ,ci::opt::hook<
+                ci::michael_deque::member_hook<
+                    offsetof(IntrusiveDequeHeaderTest::member_hook_item< node_ptb >, hMember),
+                    ci::opt::gc<PTB>
+                >
+            >
+            ,co::alignment< 32 >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+        > MichaelDeque_PTB_member_align;
+
+        // PTB base hook + no alignment
+        typedef ci::MichaelDeque< PTB,
+            IntrusiveDequeHeaderTest::base_hook_item< node_ptb >
+            ,ci::opt::hook<
+                ci::michael_deque::base_hook< ci::opt::gc<PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,co::alignment< co::no_special_alignment >
+        > MichaelDeque_PTB_base_noalign;
+
+        // PTB member hook + no alignment
+        typedef ci::MichaelDeque< PTB,
+            IntrusiveDequeHeaderTest::member_hook_item< node_ptb >
+            ,ci::opt::disposer< IntrusiveDequeHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::michael_deque::member_hook<
+                    offsetof(IntrusiveDequeHeaderTest::member_hook_item< node_ptb >, hMember),
+                    ci::opt::gc<PTB>
+                >
+            >
+            ,co::alignment< co::no_special_alignment >
+        > MichaelDeque_PTB_member_noalign;
+    }   // namespace
+
+    TEST( MichaelDeque_PTB_base)
+    TEST( MichaelDeque_PTB_member)
+    TEST( MichaelDeque_PTB_base_ic)
+    TEST( MichaelDeque_PTB_member_ic)
+    TEST( MichaelDeque_PTB_base_stat)
+    TEST( MichaelDeque_PTB_member_stat)
+    TEST( MichaelDeque_PTB_base_align)
+    TEST( MichaelDeque_PTB_member_align)
+    TEST( MichaelDeque_PTB_base_noalign)
+    TEST( MichaelDeque_PTB_member_noalign)
+
+
+} // namespace deque
+
diff --git a/tests/test-hdr/deque/hdr_michael_deque_hp.cpp b/tests/test-hdr/deque/hdr_michael_deque_hp.cpp
new file mode 100644 (file)
index 0000000..6bd39f5
--- /dev/null
@@ -0,0 +1,45 @@
+//$$CDS-header$$
+
+#include "hdr_deque.h"
+#include <cds/gc/hp.h>
+#include <cds/container/michael_deque.h>
+
+namespace deque {
+#define TEST(X) void DequeHeaderTest::test_##X() { test<X>(); }
+
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+    namespace {
+        typedef cds::gc::HP HP;
+        typedef deque::DequeHeaderTest::value_type value_type;
+
+        typedef cc::MichaelDeque< HP, value_type > MichaelDeque_HP;
+
+        /// HP + item counter
+        typedef cc::MichaelDeque< HP, value_type
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::sequential_consistent >
+        > MichaelDeque_HP_ic;
+
+        /// HP + stat
+        typedef cc::MichaelDeque< HP, value_type
+            ,co::stat< cds::intrusive::michael_deque::stat<> >
+        > MichaelDeque_HP_stat;
+
+        /// HP + noalign
+        typedef cc::MichaelDeque< HP, value_type
+            ,co::alignment< co::no_special_alignment >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > MichaelDeque_HP_noalign;
+
+    }   // namespace
+
+    TEST( MichaelDeque_HP)
+    TEST( MichaelDeque_HP_ic)
+    TEST( MichaelDeque_HP_stat)
+    TEST( MichaelDeque_HP_noalign)
+
+} // namespace deque
+
+CPPUNIT_TEST_SUITE_REGISTRATION(deque::DequeHeaderTest);
diff --git a/tests/test-hdr/deque/hdr_michael_deque_ptb.cpp b/tests/test-hdr/deque/hdr_michael_deque_ptb.cpp
new file mode 100644 (file)
index 0000000..a7ea257
--- /dev/null
@@ -0,0 +1,43 @@
+//$$CDS-header$$
+
+#include "hdr_deque.h"
+#include <cds/gc/ptb.h>
+#include <cds/container/michael_deque.h>
+
+namespace deque {
+#define TEST(X) void DequeHeaderTest::test_##X() { test<X>(); }
+
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+    namespace {
+        typedef cds::gc::PTB PTB;
+        typedef deque::DequeHeaderTest::value_type value_type;
+
+        typedef cc::MichaelDeque< PTB, value_type > MichaelDeque_PTB;
+
+        /// PTB + item counter
+        typedef cc::MichaelDeque< PTB, value_type
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::sequential_consistent >
+        > MichaelDeque_PTB_ic;
+
+        /// PTB + stat
+        typedef cc::MichaelDeque< PTB, value_type
+            ,co::stat< cds::intrusive::michael_deque::stat<> >
+        > MichaelDeque_PTB_stat;
+
+        /// PTB + noalign
+        typedef cc::MichaelDeque< PTB, value_type
+            ,co::alignment< co::no_special_alignment >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > MichaelDeque_PTB_noalign;
+
+    }   // namespace
+
+    TEST( MichaelDeque_PTB)
+    TEST( MichaelDeque_PTB_ic)
+    TEST( MichaelDeque_PTB_stat)
+    TEST( MichaelDeque_PTB_noalign)
+
+} // namespace deque
diff --git a/tests/test-hdr/map/hdr_cuckoo_map.cpp b/tests/test-hdr/map/hdr_cuckoo_map.cpp
new file mode 100644 (file)
index 0000000..cf88bfc
--- /dev/null
@@ -0,0 +1,655 @@
+//$$CDS-header$$
+
+#include "map/hdr_cuckoo_map.h"
+#include <cds/container/cuckoo_map.h>
+
+namespace map {
+
+    namespace {
+        typedef CuckooMapHdrTest::hash_int    hash1;
+        struct hash2: private hash1
+        {
+            typedef hash1 base_class;
+
+            size_t operator()( int i ) const
+            {
+                size_t h = ~( base_class::operator()(i));
+                return ~h + 0x9e3779b9 + (h << 6) + (h >> 2);
+            }
+        };
+    }
+
+    void CuckooMapHdrTest::Cuckoo_striped_list()
+    {
+        CPPUNIT_MESSAGE( "equal");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::equal_to< std::equal_to<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "equal, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::striping<> >
+                    ,co::equal_to< std::equal_to< int > >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "cmp");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "cmp, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::striping<> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::striping<> >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::striping<> >
+                    ,co::less< std::less<int> >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::striping<> >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::striping<> >
+                    ,co::less< std::less<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp+equal");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::equal_to< std::equal_to<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::striping<> >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp+equal, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::striping<> >
+                    ,co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::equal_to< std::equal_to< int > >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+    }
+
+
+    void CuckooMapHdrTest::Cuckoo_striped_vector()
+    {
+        CPPUNIT_MESSAGE( "equal");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::equal_to< std::equal_to<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "equal, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::striping<> >
+                    ,co::equal_to< std::equal_to< int > >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "cmp");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "cmp, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::striping<> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::striping<> >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::striping<> >
+                    ,co::less< std::less<int> >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::striping<> >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::striping<> >
+                    ,co::less< std::less<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp+equal");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::equal_to< std::equal_to<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::striping<> >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp+equal, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::striping<> >
+                    ,co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::equal_to< std::equal_to< int > >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+    }
+
+
+    void CuckooMapHdrTest::Cuckoo_refinable_list()
+    {
+        CPPUNIT_MESSAGE( "equal");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::equal_to< std::equal_to<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::refinable<> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "equal, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,co::equal_to< std::equal_to< int > >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "cmp");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::refinable<> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "cmp, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,co::less< std::less<int> >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,co::less< std::less<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp+equal");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::equal_to< std::equal_to<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp+equal, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::equal_to< std::equal_to< int > >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+    }
+
+
+    void CuckooMapHdrTest::Cuckoo_refinable_vector()
+    {
+        CPPUNIT_MESSAGE( "equal");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::equal_to< std::equal_to<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                    ,co::mutex_policy< cc::cuckoo::refinable<> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "equal, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,co::equal_to< std::equal_to< int > >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "cmp");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< false >
+                    ,co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "cmp, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,cc::cuckoo::store_hash< false >
+                    ,co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,co::less< std::less<int> >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,co::less< std::less<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp+equal");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::equal_to< std::equal_to<int> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                    ,co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,cc::cuckoo::store_hash< false >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+
+        CPPUNIT_MESSAGE( "less+cmp+equal, store hash");
+        {
+            typedef cc::CuckooMap< CuckooMapHdrTest::key_type, CuckooMapHdrTest::value_type,
+                cc::cuckoo::make_traits<
+                    co::mutex_policy< cc::cuckoo::refinable<> >
+                    ,co::less< std::less<int> >
+                    ,co::compare< CuckooMapHdrTest::cmp >
+                    ,co::equal_to< std::equal_to< int > >
+                    ,cc::cuckoo::store_hash< true >
+                    ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                    ,co::hash< std::tuple< hash1, hash2 > >
+                >::type
+            > map_t;
+
+            test_cuckoo<map_t>();
+        }
+    }
+
+}   // namespace map
+
+CPPUNIT_TEST_SUITE_REGISTRATION(map::CuckooMapHdrTest);
diff --git a/tests/test-hdr/map/hdr_cuckoo_map.h b/tests/test-hdr/map/hdr_cuckoo_map.h
new file mode 100644 (file)
index 0000000..71c0967
--- /dev/null
@@ -0,0 +1,395 @@
+//$$CDS-header$$
+
+#ifndef __CDSTEST_HDR_CUCKOO_MAP_H
+#define __CDSTEST_HDR_CUCKOO_MAP_H
+#include "size_check.h"
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/os/timer.h>
+#include <cds/opt/hash.h>
+#include <cds/ref.h>
+#include <algorithm>    // random_shuffle
+
+namespace cds { namespace container {}}
+
+namespace map {
+    using misc::check_size;
+
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+    class CuckooMapHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        typedef int key_type;
+
+        struct value_type {
+            int m_val;
+
+            value_type()
+                : m_val(0)
+            {}
+
+            value_type( int n )
+                : m_val( n )
+            {}
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            value_type( value_type&& v )
+                : m_val( v.m_val )
+            {}
+
+            value_type( value_type const& v )
+                : m_val( v.m_val )
+            {}
+
+            value_type& operator=( value_type const& v )
+            {
+                m_val = v.m_val;
+                return *this;
+            }
+#endif
+        };
+
+        typedef std::pair<key_type const, value_type> pair_type;
+
+        struct less
+        {
+            bool operator ()(int v1, int v2 ) const
+            {
+                return v1 < v2;
+            }
+        };
+
+        struct cmp {
+            int operator ()(int v1, int v2 ) const
+            {
+                if ( v1 < v2 )
+                    return -1;
+                return v1 > v2 ? 1 : 0;
+            }
+        };
+
+        struct equal {
+            bool operator ()(int v1, int v2 ) const
+            {
+                return v1 == v2;
+            }
+        };
+
+        struct hash_int {
+            size_t operator()( int i ) const
+            {
+                return co::v::hash<int>()( i );
+            }
+        };
+
+        struct simple_item_counter {
+            size_t  m_nCount;
+
+            simple_item_counter()
+                : m_nCount(0)
+            {}
+
+            size_t operator ++()
+            {
+                return ++m_nCount;
+            }
+
+            size_t operator --()
+            {
+                return --m_nCount;
+            }
+
+            void reset()
+            {
+                m_nCount = 0;
+            }
+
+            operator size_t() const
+            {
+                return m_nCount;
+            }
+        };
+
+        template <typename Map>
+        struct insert_functor
+        {
+            typedef typename Map::value_type pair_type;
+
+            // insert ftor
+            void operator()( pair_type& item )
+            {
+                item.second.m_val = item.first * 3;
+            }
+
+            // ensure ftor
+            void operator()( bool bNew, pair_type& item )
+            {
+                if ( bNew )
+                    item.second.m_val = item.first * 2;
+                else
+                    item.second.m_val = item.first * 5;
+            }
+        };
+
+        struct check_value {
+            int     m_nExpected;
+
+            check_value( int nExpected )
+                : m_nExpected( nExpected )
+            {}
+
+            template <typename T>
+            void operator ()( T& pair )
+            {
+                CPPUNIT_ASSERT_CURRENT( pair.second.m_val == m_nExpected );
+            }
+            template <typename T, typename Q>
+            void operator ()( T& pair, Q )
+            {
+                CPPUNIT_ASSERT_CURRENT( pair.second.m_val == m_nExpected );
+            }
+        };
+
+        struct extract_functor
+        {
+            int *   m_pVal;
+            void operator()( pair_type const& val )
+            {
+                *m_pVal = val.second.m_val;
+            }
+        };
+
+        /*
+        template <class Map>
+        void test_iter( Map& s)
+        {
+            typedef typename Map::iterator          iterator;
+            typedef typename Map::const_iterator    const_iterator;
+
+            const int nMaxCount = 500;
+            for ( int i = 0; i < nMaxCount; ++i ) {
+                CPPUNIT_ASSERT( s.insert( i, i * 2 ));
+            }
+
+            int nCount = 0;
+            for ( iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( it->first * 2 == it->second.m_val );
+                CPPUNIT_ASSERT( (*it).first * 2 == (*it).second.m_val );
+                it->second.m_val = it->first;
+                ++nCount;
+            }
+            CPPUNIT_ASSERT( nCount == nMaxCount );
+
+            Map const& refSet = s;
+            nCount = 0;
+            for ( const_iterator it = refSet.begin(), itEnd = refSet.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( it->first == it->second.m_val );
+                CPPUNIT_ASSERT( (*it).first == (*it).second.m_val );
+                ++nCount;
+            }
+            CPPUNIT_ASSERT( nCount == nMaxCount );
+        }
+        */
+
+
+        template <class Map>
+        void test_cuckoo()
+        {
+            Map m( 32, 4, 3 );
+            CPPUNIT_ASSERT( m.bucket_count() == 32 );
+            CPPUNIT_ASSERT( m.lock_count() == 32 );
+
+            test_cuckoo_with( m );
+
+            // Iterators is not yet supported for CuckooMap
+            //m.clear();
+            //CPPUNIT_ASSERT( m.empty() );
+            //CPPUNIT_ASSERT( check_size( m, 0 ));
+            //test_iter(m);
+        }
+
+        //*******************************************
+        // If erase_with && find_with are supported
+        template <class Map>
+        void test_int_with( Map& m )
+        {
+            std::pair<bool, bool> ensureResult;
+            typedef typename std::conditional< Map::c_isSorted, less, equal >::type predicate;
+
+            // insert
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+            CPPUNIT_ASSERT( !m.find(25) );
+            CPPUNIT_ASSERT( m.insert( 25 ) )    ;   // value = 0
+            CPPUNIT_ASSERT( m.find(25) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 1 ));
+            CPPUNIT_ASSERT( m.find(25) );
+
+            CPPUNIT_ASSERT( !m.insert( 25 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 1 ));
+
+            CPPUNIT_ASSERT( !m.find_with(10, predicate()) );
+            CPPUNIT_ASSERT( m.insert( 10, 10 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+            CPPUNIT_ASSERT( m.find_with(10, predicate()) );
+
+            CPPUNIT_ASSERT( !m.insert( 10, 20 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+
+            CPPUNIT_ASSERT( !m.find(30) );
+            CPPUNIT_ASSERT( m.insert_key( 30, insert_functor<Map>() ) )    ; // value = 90
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( m.find(30) );
+
+            CPPUNIT_ASSERT( !m.insert_key( 10, insert_functor<Map>() ) );
+            CPPUNIT_ASSERT( !m.insert_key( 25, insert_functor<Map>() ) );
+            CPPUNIT_ASSERT( !m.insert_key( 30, insert_functor<Map>() ) );
+
+            // ensure (new key)
+            CPPUNIT_ASSERT( !m.find(27) );
+            ensureResult = m.ensure( 27, insert_functor<Map>() ) ;   // value = 54
+            CPPUNIT_ASSERT( ensureResult.first );
+            CPPUNIT_ASSERT( ensureResult.second );
+            CPPUNIT_ASSERT( m.find(27) );
+
+            // find test
+            check_value chk(10);
+            CPPUNIT_ASSERT( m.find( 10, cds::ref(chk) ));
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find_with( 25, predicate(), boost::ref(chk) ));
+            chk.m_nExpected = 90;
+            CPPUNIT_ASSERT( m.find( 30, boost::ref(chk) ));
+            chk.m_nExpected = 54;
+            CPPUNIT_ASSERT( m.find( 27, boost::ref(chk) ));
+
+            ensureResult = m.ensure( 10, insert_functor<Map>() ) ;   // value = 50
+            CPPUNIT_ASSERT( ensureResult.first );
+            CPPUNIT_ASSERT( !ensureResult.second );
+            chk.m_nExpected = 50;
+            CPPUNIT_ASSERT( m.find( 10, boost::ref(chk) ));
+
+            // erase test
+            CPPUNIT_ASSERT( !m.find(100) );
+            CPPUNIT_ASSERT( !m.erase( 100 )) ;  // not found
+
+            CPPUNIT_ASSERT( m.find(25) );
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.erase( 25 ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( !m.find(25) );
+            CPPUNIT_ASSERT( !m.erase( 25 ));
+
+            CPPUNIT_ASSERT( !m.find(258) );
+            CPPUNIT_ASSERT( m.insert(258))
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.find_with(258, predicate()) );
+            CPPUNIT_ASSERT( m.erase_with( 258, predicate() ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( !m.find(258) );
+            CPPUNIT_ASSERT( !m.erase_with( 258, predicate() ));
+
+            int nVal;
+            extract_functor ext;
+            ext.m_pVal = &nVal;
+
+            CPPUNIT_ASSERT( !m.find(29) );
+            CPPUNIT_ASSERT( m.insert(29, 290))
+            CPPUNIT_ASSERT( m.erase_with( 29, predicate(), boost::ref(ext)));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( nVal == 290 );
+            nVal = -1;
+            CPPUNIT_ASSERT( !m.erase_with( 29, predicate(), boost::ref(ext)));
+            CPPUNIT_ASSERT( nVal == -1 );
+
+            CPPUNIT_ASSERT( m.erase( 30, boost::ref(ext)));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+            CPPUNIT_ASSERT( nVal == 90 );
+            nVal = -1;
+            CPPUNIT_ASSERT( !m.erase( 30, boost::ref(ext)));
+            CPPUNIT_ASSERT( nVal == -1 );
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            CPPUNIT_ASSERT( m.emplace(126) ) ; // key = 126, val = 0
+            CPPUNIT_ASSERT( m.emplace(137, 731))    ;   // key = 137, val = 731
+            CPPUNIT_ASSERT( m.emplace( 149, value_type(941) ))   ;   // key = 149, val = 941
+
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find( 126, cds::ref(chk) ));
+            chk.m_nExpected = 731;
+            CPPUNIT_ASSERT( m.find_with( 137, predicate(), cds::ref(chk) ));
+            chk.m_nExpected = 941;
+            CPPUNIT_ASSERT( m.find( 149, cds::ref(chk) ));
+
+            CPPUNIT_ASSERT( !m.emplace(126, 621)) ; // already in map
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find( 126, cds::ref(chk) ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+#       endif
+        }
+
+        template <class Map>
+        void test_cuckoo_with(Map& m)
+        {
+            cds::OS::Timer    timer;
+
+            test_int_with( m );
+
+            // Iterators is not yet supported
+            //m.clear();
+            //CPPUNIT_ASSERT( m.empty() );
+            //CPPUNIT_ASSERT( check_size( m, 0 ));
+            //test_iter(m);
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+            // Resizing test
+            for ( int i = 0; i < 40000; i++ ) {
+                m.insert( i );
+            }
+
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+        }
+
+        void Cuckoo_striped_list();
+        void Cuckoo_striped_vector();
+        void Cuckoo_refinable_list();
+        void Cuckoo_refinable_vector();
+
+        CPPUNIT_TEST_SUITE(CuckooMapHdrTest)
+            CPPUNIT_TEST(Cuckoo_striped_list)
+            CPPUNIT_TEST(Cuckoo_striped_vector)
+            CPPUNIT_TEST(Cuckoo_refinable_list)
+            CPPUNIT_TEST(Cuckoo_refinable_vector)
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+}   // namespace map
+
+#endif // #ifndef __CDSTEST_HDR_CUCKOO_MAP_H
diff --git a/tests/test-hdr/map/hdr_map.h b/tests/test-hdr/map/hdr_map.h
new file mode 100644 (file)
index 0000000..95cb980
--- /dev/null
@@ -0,0 +1,931 @@
+//$$CDS-header$$
+
+#ifndef __CDSTEST_HDR_MAP_H
+#define __CDSTEST_HDR_MAP_H
+#include "size_check.h"
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/os/timer.h>
+#include <cds/opt/hash.h>
+#include <cds/ref.h>
+#include <algorithm>    // random_shuffle
+
+namespace cds { namespace container {}}
+
+namespace map {
+    using misc::check_size;
+
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+    // MichaelHashSet based on MichaelList
+    class HashMapHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        typedef int key_type;
+
+        struct value_type {
+            int m_val;
+
+            value_type()
+                : m_val(0)
+            {}
+
+            value_type( int n )
+                : m_val( n )
+            {}
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            value_type( value_type&& v )
+                : m_val( v.m_val )
+            {}
+
+            value_type( value_type const& v )
+                : m_val( v.m_val )
+            {}
+
+            value_type& operator=( value_type const& v )
+            {
+                m_val = v.m_val;
+                return *this;
+            }
+#endif
+        };
+
+        typedef std::pair<key_type const, value_type> pair_type;
+
+        struct less
+        {
+            bool operator ()(int v1, int v2 ) const
+            {
+                return v1 < v2;
+            }
+        };
+
+        struct cmp {
+            int operator ()(int v1, int v2 ) const
+            {
+                if ( v1 < v2 )
+                    return -1;
+                return v1 > v2 ? 1 : 0;
+            }
+        };
+
+        struct equal {
+            bool operator ()(int v1, int v2 ) const
+            {
+                return v1 == v2;
+            }
+        };
+
+        struct hash_int {
+            size_t operator()( int i ) const
+            {
+                return co::v::hash<int>()( i );
+            }
+
+            template <typename T>
+            size_t operator()( T const& i ) const
+            {
+                return co::v::hash<int>()( i.nKey );
+            }
+        };
+
+        struct simple_item_counter {
+            size_t  m_nCount;
+
+            simple_item_counter()
+                : m_nCount(0)
+            {}
+
+            size_t operator ++()
+            {
+                return ++m_nCount;
+            }
+
+            size_t operator --()
+            {
+                return --m_nCount;
+            }
+
+            void reset()
+            {
+                m_nCount = 0;
+            }
+
+            operator size_t() const
+            {
+                return m_nCount;
+            }
+        };
+
+        template <typename Map>
+        struct insert_functor
+        {
+            typedef typename Map::value_type pair_type;
+
+            // insert ftor
+            void operator()( pair_type& item )
+            {
+                item.second.m_val = item.first * 3;
+            }
+
+            // ensure ftor
+            void operator()( bool bNew, pair_type& item )
+            {
+                if ( bNew )
+                    item.second.m_val = item.first * 2;
+                else
+                    item.second.m_val = item.first * 5;
+            }
+        };
+
+        struct check_value {
+            int     m_nExpected;
+
+            check_value( int nExpected )
+                : m_nExpected( nExpected )
+            {}
+
+            template <typename T>
+            void operator ()( T& pair )
+            {
+                CPPUNIT_ASSERT_CURRENT( pair.second.m_val == m_nExpected );
+            }
+            template <typename T, typename Q>
+            void operator ()( T& pair, Q )
+            {
+                CPPUNIT_ASSERT_CURRENT( pair.second.m_val == m_nExpected );
+            }
+        };
+
+        struct extract_functor
+        {
+            int *   m_pVal;
+            void operator()( pair_type const& val )
+            {
+                *m_pVal = val.second.m_val;
+            }
+        };
+
+        struct other_item {
+            int nKey;
+
+            other_item( int key )
+                : nKey(key)
+            {}
+        };
+
+        struct other_less
+        {
+            bool operator ()(int v1, other_item const& v2 ) const
+            {
+                return v1 < v2.nKey;
+            }
+            bool operator ()(other_item const& v1, int v2 ) const
+            {
+                return v1.nKey < v2;
+            }
+        };
+
+
+        template <class Map>
+        void test_int()
+        {
+            Map m( 100, 4 );
+
+            test_int_with(m);
+
+            // extract/get test
+            CPPUNIT_ASSERT( m.empty() );
+            {
+                const int nLimit = 100;
+                typename Map::guarded_ptr gp;
+                int arrRandom[nLimit];
+                for ( int i = 0; i < nLimit; ++i )
+                    arrRandom[i] = i;
+                std::random_shuffle( arrRandom, arrRandom + nLimit );
+
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( m.insert( arrRandom[i], arrRandom[i] ));
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrRandom[i];
+                    CPPUNIT_ASSERT( m.get(gp, nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey );
+
+                    CPPUNIT_ASSERT( m.extract(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey );
+                    CPPUNIT_CHECK( !m.get(gp, nKey));
+                    gp.release();
+
+                    CPPUNIT_CHECK( !m.extract(gp, nKey));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( m.empty() );
+
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( m.insert( arrRandom[i], arrRandom[i] ));
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrRandom[i];
+                    CPPUNIT_ASSERT( m.get_with(gp, other_item(nKey), other_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey );
+
+                    CPPUNIT_ASSERT( m.extract_with(gp, other_item(nKey), other_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey );
+                    CPPUNIT_CHECK( !m.get_with(gp, other_item(nKey), other_less() ));
+                    gp.release();
+
+                    CPPUNIT_CHECK( !m.extract_with(gp, other_item(nKey), other_less() ));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( m.empty() );
+            }
+
+            // iterator test
+            test_iter<Map>();
+        }
+
+        template <class Map>
+        void test_rcu()
+        {
+            Map m( 52, 4 );
+
+            test_int_with(m);
+
+            // extract/get test
+            {
+                typedef typename Map::gc    rcu;
+                typedef typename Map::rcu_lock rcu_lock;
+                typedef typename Map::value_type value_type;
+                typename Map::exempt_ptr ep;
+
+                static size_t const nLimit = 100;
+                int arr[nLimit];
+                for ( size_t i = 0; i < nLimit; ++i )
+                    arr[i] = (int) i;
+                std::random_shuffle( arr, arr + nLimit );
+
+                for ( size_t i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( m.insert( arr[i], arr[i] ));
+
+                for ( size_t i = 0; i < nLimit; i += 2 ) {
+                    value_type * pVal;
+                    int nKey = arr[i];
+                    {
+                        rcu_lock l;
+                        pVal = m.get( nKey );
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->first == nKey );
+                        CPPUNIT_CHECK( pVal->second.m_val == nKey );
+
+                        CPPUNIT_ASSERT( m.extract( ep, nKey ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( pVal->first == ep->first );
+                        CPPUNIT_CHECK( pVal->second.m_val == ep->second.m_val );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock l;
+                        CPPUNIT_CHECK( m.get( nKey ) == NULL );
+                        CPPUNIT_CHECK( !m.extract( ep, nKey ));
+                        CPPUNIT_CHECK( ep.empty() );
+
+                        nKey = arr[i+1];
+                        pVal = m.get_with( other_item(nKey), other_less() );
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->first == nKey );
+                        CPPUNIT_CHECK( pVal->second.m_val == nKey );
+
+                        CPPUNIT_ASSERT( m.extract_with( ep, other_item(nKey), other_less() ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( pVal->first == ep->first );
+                        CPPUNIT_CHECK( pVal->second.m_val == (*ep).second.m_val );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock l;
+                        CPPUNIT_CHECK( m.get_with( other_item(nKey), other_less() ) == NULL );
+                        CPPUNIT_CHECK( !m.extract_with( ep, other_item(nKey), other_less() ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_CHECK( m.empty() );
+                CPPUNIT_CHECK( check_size( m, 0 ));
+                {
+                    rcu_lock l;
+                    CPPUNIT_CHECK( m.get( int(nLimit / 2) ) == NULL );
+                    CPPUNIT_CHECK( !m.extract( ep, int(nLimit / 2) ));
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+            }
+
+            // iterator test
+            test_iter<Map>();
+        }
+
+        template <class Map>
+        void test_int_with( Map& m )
+        {
+            std::pair<bool, bool> ensureResult;
+
+            // insert
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+            CPPUNIT_ASSERT( !m.find(25) );
+            CPPUNIT_ASSERT( m.insert( 25 ) )    ;   // value = 0
+            CPPUNIT_ASSERT( m.find(25) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 1 ));
+            CPPUNIT_ASSERT( m.find(25) );
+
+            CPPUNIT_ASSERT( !m.insert( 25 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 1 ));
+
+            CPPUNIT_ASSERT( !m.find_with(10, less()) );
+            CPPUNIT_ASSERT( m.insert( 10, 10 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+            CPPUNIT_ASSERT( m.find_with(10, less()) );
+
+            CPPUNIT_ASSERT( !m.insert( 10, 20 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+
+            CPPUNIT_ASSERT( !m.find(30) );
+            CPPUNIT_ASSERT( m.insert_key( 30, insert_functor<Map>() ) )    ; // value = 90
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( m.find(30) );
+
+            CPPUNIT_ASSERT( !m.insert_key( 10, insert_functor<Map>() ) );
+            CPPUNIT_ASSERT( !m.insert_key( 25, insert_functor<Map>() ) );
+            CPPUNIT_ASSERT( !m.insert_key( 30, insert_functor<Map>() ) );
+
+            // ensure (new key)
+            CPPUNIT_ASSERT( !m.find(27) );
+            ensureResult = m.ensure( 27, insert_functor<Map>() ) ;   // value = 54
+            CPPUNIT_ASSERT( ensureResult.first );
+            CPPUNIT_ASSERT( ensureResult.second );
+            CPPUNIT_ASSERT( m.find(27) );
+
+            // find test
+            check_value chk(10);
+            CPPUNIT_ASSERT( m.find( 10, cds::ref(chk) ));
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find_with( 25, less(), boost::ref(chk) ));
+            chk.m_nExpected = 90;
+            CPPUNIT_ASSERT( m.find( 30, boost::ref(chk) ));
+            chk.m_nExpected = 54;
+            CPPUNIT_ASSERT( m.find( 27, boost::ref(chk) ));
+
+            ensureResult = m.ensure( 10, insert_functor<Map>() ) ;   // value = 50
+            CPPUNIT_ASSERT( ensureResult.first );
+            CPPUNIT_ASSERT( !ensureResult.second );
+            chk.m_nExpected = 50;
+            CPPUNIT_ASSERT( m.find( 10, boost::ref(chk) ));
+
+            // erase test
+            CPPUNIT_ASSERT( !m.find(100) );
+            CPPUNIT_ASSERT( !m.erase( 100 )) ;  // not found
+
+            CPPUNIT_ASSERT( m.find(25) );
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.erase( 25 ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( !m.find(25) );
+            CPPUNIT_ASSERT( !m.erase( 25 ));
+
+            CPPUNIT_ASSERT( !m.find(258) );
+            CPPUNIT_ASSERT( m.insert(258))
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.find_with(258, less()) );
+            CPPUNIT_ASSERT( m.erase_with( 258, less() ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( !m.find(258) );
+            CPPUNIT_ASSERT( !m.erase_with( 258, less() ));
+
+            int nVal;
+            extract_functor ext;
+            ext.m_pVal = &nVal;
+
+            CPPUNIT_ASSERT( !m.find(29) );
+            CPPUNIT_ASSERT( m.insert(29, 290));
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.erase_with( 29, less(), boost::ref(ext)));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( nVal == 290 );
+            nVal = -1;
+            CPPUNIT_ASSERT( !m.erase_with( 29, less(), boost::ref(ext)));
+            CPPUNIT_ASSERT( nVal == -1 );
+
+            CPPUNIT_ASSERT( m.erase( 30, boost::ref(ext)));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+            CPPUNIT_ASSERT( nVal == 90 );
+            nVal = -1;
+            CPPUNIT_ASSERT( !m.erase( 30, boost::ref(ext)));
+            CPPUNIT_ASSERT( nVal == -1 );
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            CPPUNIT_ASSERT( m.emplace(126) ) ; // key = 126, val = 0
+            CPPUNIT_ASSERT( m.emplace(137, 731))    ;   // key = 137, val = 731
+            CPPUNIT_ASSERT( m.emplace( 149, value_type(941) ))   ;   // key = 149, val = 941
+
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find( 126, cds::ref(chk) ));
+            chk.m_nExpected = 731;
+            CPPUNIT_ASSERT( m.find_with( 137, less(), cds::ref(chk) ));
+            chk.m_nExpected = 941;
+            CPPUNIT_ASSERT( m.find( 149, cds::ref(chk) ));
+
+            CPPUNIT_ASSERT( !m.emplace(126, 621)) ; // already in map
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find( 126, cds::ref(chk) ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+#       endif
+        }
+
+
+        template <class Map>
+        void test_int_nogc()
+        {
+            typedef typename Map::iterator          iterator;
+            typedef typename Map::const_iterator    const_iterator;
+
+            {
+                Map m( 52, 4 );
+
+                CPPUNIT_ASSERT( m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 0 ));
+
+                CPPUNIT_ASSERT( m.find(10) == m.end() );
+                iterator it = m.insert( 10 );
+                CPPUNIT_ASSERT( it != m.end() );
+                CPPUNIT_ASSERT( !m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 1 ));
+                CPPUNIT_ASSERT( m.find(10) == it );
+                CPPUNIT_ASSERT( it->first == 10 );
+                CPPUNIT_ASSERT( it->second.m_val == 0 );
+
+                CPPUNIT_ASSERT( m.find(100) == m.end() );
+                it = m.insert( 100, 200 );
+                CPPUNIT_ASSERT( it != m.end() );
+                CPPUNIT_ASSERT( !m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 2 ));
+                CPPUNIT_ASSERT( m.find_with(100, less()) == it );
+                CPPUNIT_ASSERT( it->first == 100 );
+                CPPUNIT_ASSERT( it->second.m_val == 200 );
+
+                CPPUNIT_ASSERT( m.find(55) == m.end() );
+                it = m.insert_key( 55, insert_functor<Map>() );
+                CPPUNIT_ASSERT( it != m.end() );
+                CPPUNIT_ASSERT( !m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 3 ));
+                CPPUNIT_ASSERT( m.find(55) == it );
+                CPPUNIT_ASSERT( it->first == 55 );
+                CPPUNIT_ASSERT( it->second.m_val == 55 * 3 );
+
+                CPPUNIT_ASSERT( m.insert( 55 ) == m.end() );
+                CPPUNIT_ASSERT( m.insert( 55, 10 ) == m.end() );
+                CPPUNIT_ASSERT( m.insert_key( 55, insert_functor<Map>()) == m.end() );
+
+                CPPUNIT_ASSERT( m.find(10) != m.end() );
+                std::pair<iterator, bool> ensureResult = m.ensure( 10 );
+                CPPUNIT_ASSERT( ensureResult.first != m.end() );
+                CPPUNIT_ASSERT( !ensureResult.second  );
+                CPPUNIT_ASSERT( !m.empty() );
+                ensureResult.first->second.m_val = ensureResult.first->first * 5;
+                CPPUNIT_ASSERT( check_size( m, 3 ));
+                CPPUNIT_ASSERT( m.find(10) == ensureResult.first );
+                it = m.find(10);
+                CPPUNIT_ASSERT( it != m.end() );
+                CPPUNIT_ASSERT( it->second.m_val == 50 );
+
+                CPPUNIT_ASSERT( m.find(120) == m.end() );
+                ensureResult = m.ensure( 120 );
+                CPPUNIT_ASSERT( ensureResult.first != m.end() );
+                CPPUNIT_ASSERT( ensureResult.second  );
+                CPPUNIT_ASSERT( !m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 4 ));
+                ensureResult.first->second.m_val = ensureResult.first->first * 5;
+                CPPUNIT_ASSERT( m.find_with(120, less()) == ensureResult.first );
+                it = m.find_with(120, less());
+                CPPUNIT_ASSERT( it != m.end() );
+                CPPUNIT_ASSERT( it->second.m_val == 120 * 5 );
+                CPPUNIT_ASSERT( m.find_with(120, less()) == m.find(120) );
+
+#           ifdef CDS_EMPLACE_SUPPORT
+                // emplace test
+                it = m.emplace( 151 ) ;  // key = 151,  val = 0
+                CPPUNIT_ASSERT( it != m.end() );
+                CPPUNIT_ASSERT( it->first == 151 );
+                CPPUNIT_ASSERT( it->second.m_val == 0 );
+
+                it = m.emplace( 174, 471 ) ; // key == 174, val = 471
+                CPPUNIT_ASSERT( it != m.end() );
+                CPPUNIT_ASSERT( it->first == 174 );
+                CPPUNIT_ASSERT( it->second.m_val == 471 );
+
+                it = m.emplace( 190, value_type(91)) ; // key == 190, val = 19
+                CPPUNIT_ASSERT( it != m.end() );
+                CPPUNIT_ASSERT( it->first == 190 );
+                CPPUNIT_ASSERT( it->second.m_val == 91 );
+
+                it = m.emplace( 151, 1051 );
+                CPPUNIT_ASSERT( it == m.end());
+
+                it = m.find( 174 );
+                CPPUNIT_ASSERT( it != m.end() );
+                CPPUNIT_ASSERT( it->first == 174 );
+                CPPUNIT_ASSERT( it->second.m_val == 471 );
+
+                it = m.find( 190 );
+                CPPUNIT_ASSERT( it != m.end() );
+                CPPUNIT_ASSERT( it->first == 190 );
+                CPPUNIT_ASSERT( it->second.m_val == 91 );
+
+                it = m.find( 151 );
+                CPPUNIT_ASSERT( it != m.end() );
+                CPPUNIT_ASSERT( it->first == 151 );
+                CPPUNIT_ASSERT( it->second.m_val == 0 );
+#           endif
+            }
+
+            // iterator test
+
+            {
+                Map m( 52, 4 );
+
+                for ( int i = 0; i < 500; ++i ) {
+                    CPPUNIT_ASSERT( m.insert( i, i * 2 ) != m.end() );
+                }
+                CPPUNIT_ASSERT( check_size( m, 500 ));
+
+                for ( iterator it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( it->first * 2 == (*it).second.m_val );
+                    it->second = it->first;
+                }
+
+                Map const& refMap = m;
+                for ( const_iterator it = refMap.begin(), itEnd = refMap.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( it->first == it->second.m_val );
+                    CPPUNIT_ASSERT( (*it).first == (*it).second.m_val );
+                }
+            }
+        }
+
+        template <class Map>
+        void test_iter()
+        {
+            typedef typename Map::iterator          iterator;
+            typedef typename Map::const_iterator    const_iterator;
+
+            Map s( 100, 4 );
+
+            const int nMaxCount = 500;
+            for ( int i = 0; i < nMaxCount; ++i ) {
+                CPPUNIT_ASSERT( s.insert( i, i * 2 ));
+            }
+
+            int nCount = 0;
+            for ( iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( it->first * 2 == it->second.m_val );
+                CPPUNIT_ASSERT( (*it).first * 2 == (*it).second.m_val );
+                it->second.m_val = it->first;
+                ++nCount;
+            }
+            CPPUNIT_ASSERT( nCount == nMaxCount );
+
+            Map const& refSet = s;
+            nCount = 0;
+            for ( const_iterator it = refSet.begin(), itEnd = refSet.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( it->first == it->second.m_val );
+                CPPUNIT_ASSERT( (*it).first == (*it).second.m_val );
+                ++nCount;
+            }
+            CPPUNIT_ASSERT( nCount == nMaxCount );
+        }
+
+
+        void Michael_HP_cmp();
+        void Michael_HP_less();
+        void Michael_HP_cmpmix();
+
+        void Michael_PTB_cmp();
+        void Michael_PTB_less();
+        void Michael_PTB_cmpmix();
+
+        void Michael_HRC_cmp();
+        void Michael_HRC_less();
+        void Michael_HRC_cmpmix();
+
+        void Michael_RCU_GPI_cmp();
+        void Michael_RCU_GPI_less();
+        void Michael_RCU_GPI_cmpmix();
+
+        void Michael_RCU_GPB_cmp();
+        void Michael_RCU_GPB_less();
+        void Michael_RCU_GPB_cmpmix();
+
+        void Michael_RCU_GPT_cmp();
+        void Michael_RCU_GPT_less();
+        void Michael_RCU_GPT_cmpmix();
+
+        void Michael_RCU_SHB_cmp();
+        void Michael_RCU_SHB_less();
+        void Michael_RCU_SHB_cmpmix();
+
+        void Michael_RCU_SHT_cmp();
+        void Michael_RCU_SHT_less();
+        void Michael_RCU_SHT_cmpmix();
+
+        void Michael_nogc_cmp();
+        void Michael_nogc_less();
+        void Michael_nogc_cmpmix();
+
+        void Lazy_HP_cmp();
+        void Lazy_HP_less();
+        void Lazy_HP_cmpmix();
+
+        void Lazy_PTB_cmp();
+        void Lazy_PTB_less();
+        void Lazy_PTB_cmpmix();
+
+        void Lazy_HRC_cmp();
+        void Lazy_HRC_less();
+        void Lazy_HRC_cmpmix();
+
+        void Lazy_RCU_GPI_cmp();
+        void Lazy_RCU_GPI_less();
+        void Lazy_RCU_GPI_cmpmix();
+
+        void Lazy_RCU_GPB_cmp();
+        void Lazy_RCU_GPB_less();
+        void Lazy_RCU_GPB_cmpmix();
+
+        void Lazy_RCU_GPT_cmp();
+        void Lazy_RCU_GPT_less();
+        void Lazy_RCU_GPT_cmpmix();
+
+        void Lazy_RCU_SHB_cmp();
+        void Lazy_RCU_SHB_less();
+        void Lazy_RCU_SHB_cmpmix();
+
+        void Lazy_RCU_SHT_cmp();
+        void Lazy_RCU_SHT_less();
+        void Lazy_RCU_SHT_cmpmix();
+
+        void Lazy_nogc_cmp();
+        void Lazy_nogc_less();
+        void Lazy_nogc_cmpmix();
+
+        void Split_HP_cmp();
+        void Split_HP_less();
+        void Split_HP_cmpmix();
+
+        void Split_PTB_cmp();
+        void Split_PTB_less();
+        void Split_PTB_cmpmix();
+
+        void Split_HRC_cmp();
+        void Split_HRC_less();
+        void Split_HRC_cmpmix();
+
+        void Split_RCU_GPI_cmp();
+        void Split_RCU_GPI_less();
+        void Split_RCU_GPI_cmpmix();
+
+        void Split_RCU_GPB_cmp();
+        void Split_RCU_GPB_less();
+        void Split_RCU_GPB_cmpmix();
+
+        void Split_RCU_GPT_cmp();
+        void Split_RCU_GPT_less();
+        void Split_RCU_GPT_cmpmix();
+
+        void Split_RCU_SHB_cmp();
+        void Split_RCU_SHB_less();
+        void Split_RCU_SHB_cmpmix();
+
+        void Split_RCU_SHT_cmp();
+        void Split_RCU_SHT_less();
+        void Split_RCU_SHT_cmpmix();
+
+        void Split_nogc_cmp();
+        void Split_nogc_less();
+        void Split_nogc_cmpmix();
+
+        void Split_Lazy_HP_cmp();
+        void Split_Lazy_HP_less();
+        void Split_Lazy_HP_cmpmix();
+
+        void Split_Lazy_PTB_cmp();
+        void Split_Lazy_PTB_less();
+        void Split_Lazy_PTB_cmpmix();
+
+        void Split_Lazy_HRC_cmp();
+        void Split_Lazy_HRC_less();
+        void Split_Lazy_HRC_cmpmix();
+
+        void Split_Lazy_RCU_GPI_cmp();
+        void Split_Lazy_RCU_GPI_less();
+        void Split_Lazy_RCU_GPI_cmpmix();
+
+        void Split_Lazy_RCU_GPB_cmp();
+        void Split_Lazy_RCU_GPB_less();
+        void Split_Lazy_RCU_GPB_cmpmix();
+
+        void Split_Lazy_RCU_GPT_cmp();
+        void Split_Lazy_RCU_GPT_less();
+        void Split_Lazy_RCU_GPT_cmpmix();
+
+        void Split_Lazy_RCU_SHB_cmp();
+        void Split_Lazy_RCU_SHB_less();
+        void Split_Lazy_RCU_SHB_cmpmix();
+
+        void Split_Lazy_RCU_SHT_cmp();
+        void Split_Lazy_RCU_SHT_less();
+        void Split_Lazy_RCU_SHT_cmpmix();
+
+        void Split_Lazy_nogc_cmp();
+        void Split_Lazy_nogc_less();
+        void Split_Lazy_nogc_cmpmix();
+
+        CPPUNIT_TEST_SUITE(HashMapHdrTest)
+            CPPUNIT_TEST(Michael_HP_cmp)
+            CPPUNIT_TEST(Michael_HP_less)
+            CPPUNIT_TEST(Michael_HP_cmpmix)
+
+            CPPUNIT_TEST(Michael_PTB_cmp)
+            CPPUNIT_TEST(Michael_PTB_less)
+            CPPUNIT_TEST(Michael_PTB_cmpmix)
+
+            CPPUNIT_TEST(Michael_HRC_cmp)
+            CPPUNIT_TEST(Michael_HRC_less)
+            CPPUNIT_TEST(Michael_HRC_cmpmix)
+
+            CPPUNIT_TEST(Michael_RCU_GPI_cmp)
+            CPPUNIT_TEST(Michael_RCU_GPI_less)
+            CPPUNIT_TEST(Michael_RCU_GPI_cmpmix)
+
+            CPPUNIT_TEST(Michael_RCU_GPB_cmp)
+            CPPUNIT_TEST(Michael_RCU_GPB_less)
+            CPPUNIT_TEST(Michael_RCU_GPB_cmpmix)
+
+            CPPUNIT_TEST(Michael_RCU_SHT_cmp)
+            CPPUNIT_TEST(Michael_RCU_SHT_less)
+            CPPUNIT_TEST(Michael_RCU_SHT_cmpmix)
+
+            CPPUNIT_TEST(Michael_RCU_SHB_cmp)
+            CPPUNIT_TEST(Michael_RCU_SHB_less)
+            CPPUNIT_TEST(Michael_RCU_SHB_cmpmix)
+
+            CPPUNIT_TEST(Michael_RCU_GPT_cmp)
+            CPPUNIT_TEST(Michael_RCU_GPT_less)
+            CPPUNIT_TEST(Michael_RCU_GPT_cmpmix)
+
+            CPPUNIT_TEST(Michael_nogc_cmp)
+            CPPUNIT_TEST(Michael_nogc_less)
+            CPPUNIT_TEST(Michael_nogc_cmpmix)
+
+            CPPUNIT_TEST(Lazy_HP_cmp)
+            CPPUNIT_TEST(Lazy_HP_less)
+            CPPUNIT_TEST(Lazy_HP_cmpmix)
+
+            CPPUNIT_TEST(Lazy_PTB_cmp)
+            CPPUNIT_TEST(Lazy_PTB_less)
+            CPPUNIT_TEST(Lazy_PTB_cmpmix)
+
+            CPPUNIT_TEST(Lazy_HRC_cmp)
+            CPPUNIT_TEST(Lazy_HRC_less)
+            CPPUNIT_TEST(Lazy_HRC_cmpmix)
+
+            CPPUNIT_TEST(Lazy_RCU_GPI_cmp)
+            CPPUNIT_TEST(Lazy_RCU_GPI_less)
+            CPPUNIT_TEST(Lazy_RCU_GPI_cmpmix)
+
+            CPPUNIT_TEST(Lazy_RCU_GPB_cmp)
+            CPPUNIT_TEST(Lazy_RCU_GPB_less)
+            CPPUNIT_TEST(Lazy_RCU_GPB_cmpmix)
+
+            CPPUNIT_TEST(Lazy_RCU_GPT_cmp)
+            CPPUNIT_TEST(Lazy_RCU_GPT_less)
+            CPPUNIT_TEST(Lazy_RCU_GPT_cmpmix)
+
+            CPPUNIT_TEST(Lazy_RCU_SHB_cmp)
+            CPPUNIT_TEST(Lazy_RCU_SHB_less)
+            CPPUNIT_TEST(Lazy_RCU_SHB_cmpmix)
+
+            CPPUNIT_TEST(Lazy_RCU_SHT_cmp)
+            CPPUNIT_TEST(Lazy_RCU_SHT_less)
+            CPPUNIT_TEST(Lazy_RCU_SHT_cmpmix)
+
+            CPPUNIT_TEST(Lazy_nogc_cmp)
+            CPPUNIT_TEST(Lazy_nogc_less)
+            CPPUNIT_TEST(Lazy_nogc_cmpmix)
+
+            CPPUNIT_TEST(Split_HP_cmp)
+            CPPUNIT_TEST(Split_HP_less)
+            CPPUNIT_TEST(Split_HP_cmpmix)
+
+            CPPUNIT_TEST(Split_PTB_cmp)
+            CPPUNIT_TEST(Split_PTB_less)
+            CPPUNIT_TEST(Split_PTB_cmpmix)
+
+            CPPUNIT_TEST(Split_HRC_cmp)
+            CPPUNIT_TEST(Split_HRC_less)
+            CPPUNIT_TEST(Split_HRC_cmpmix)
+
+            CPPUNIT_TEST(Split_RCU_GPI_cmp)
+            CPPUNIT_TEST(Split_RCU_GPI_less)
+            CPPUNIT_TEST(Split_RCU_GPI_cmpmix)
+
+            CPPUNIT_TEST(Split_RCU_GPB_cmp)
+            CPPUNIT_TEST(Split_RCU_GPB_less)
+            CPPUNIT_TEST(Split_RCU_GPB_cmpmix)
+
+            CPPUNIT_TEST(Split_RCU_GPT_cmp)
+            CPPUNIT_TEST(Split_RCU_GPT_less)
+            CPPUNIT_TEST(Split_RCU_GPT_cmpmix)
+
+            CPPUNIT_TEST(Split_RCU_SHB_cmp)
+            CPPUNIT_TEST(Split_RCU_SHB_less)
+            CPPUNIT_TEST(Split_RCU_SHB_cmpmix)
+
+            CPPUNIT_TEST(Split_RCU_SHT_cmp)
+            CPPUNIT_TEST(Split_RCU_SHT_less)
+            CPPUNIT_TEST(Split_RCU_SHT_cmpmix)
+
+            CPPUNIT_TEST(Split_nogc_cmp)
+            CPPUNIT_TEST(Split_nogc_less)
+            CPPUNIT_TEST(Split_nogc_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_HP_cmp)
+            CPPUNIT_TEST(Split_Lazy_HP_less)
+            CPPUNIT_TEST(Split_Lazy_HP_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_PTB_cmp)
+            CPPUNIT_TEST(Split_Lazy_PTB_less)
+            CPPUNIT_TEST(Split_Lazy_PTB_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_HRC_cmp)
+            CPPUNIT_TEST(Split_Lazy_HRC_less)
+            CPPUNIT_TEST(Split_Lazy_HRC_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_RCU_GPI_cmp)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPI_less)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPI_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_RCU_GPB_cmp)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPB_less)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPB_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_RCU_GPT_cmp)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPT_less)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPT_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_RCU_SHB_cmp)
+            CPPUNIT_TEST(Split_Lazy_RCU_SHB_less)
+            CPPUNIT_TEST(Split_Lazy_RCU_SHB_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_RCU_SHT_cmp)
+            CPPUNIT_TEST(Split_Lazy_RCU_SHT_less)
+            CPPUNIT_TEST(Split_Lazy_RCU_SHT_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_nogc_cmp)
+            CPPUNIT_TEST(Split_Lazy_nogc_less)
+            CPPUNIT_TEST(Split_Lazy_nogc_cmpmix)
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+}   // namespace map
+
+#endif // #ifndef __CDSTEST_HDR_MAP_H
diff --git a/tests/test-hdr/map/hdr_michael_map_hp.cpp b/tests/test-hdr/map/hdr_michael_map_hp.cpp
new file mode 100644 (file)
index 0000000..e848493
--- /dev/null
@@ -0,0 +1,90 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/michael_kvlist_hp.h>
+#include <cds/container/michael_map.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+
+        struct HP_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct HP_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct HP_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Michael_HP_cmp()
+    {
+        typedef cc::MichaelKVList< cds::gc::HP, int, HashMapHdrTest::value_type, HP_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_HP_less()
+    {
+        typedef cc::MichaelKVList< cds::gc::HP, int, HashMapHdrTest::value_type, HP_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_HP_cmpmix()
+    {
+        typedef cc::MichaelKVList< cds::gc::HP, int, HashMapHdrTest::value_type, HP_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
+CPPUNIT_TEST_SUITE_REGISTRATION(map::HashMapHdrTest);
+
diff --git a/tests/test-hdr/map/hdr_michael_map_hrc.cpp b/tests/test-hdr/map/hdr_michael_map_hrc.cpp
new file mode 100644 (file)
index 0000000..f81bc96
--- /dev/null
@@ -0,0 +1,87 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/michael_kvlist_hrc.h>
+#include <cds/container/michael_map.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        struct HRC_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct HRC_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct HRC_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Michael_HRC_cmp()
+    {
+        typedef cc::MichaelKVList< cds::gc::HRC, int, HashMapHdrTest::value_type, HRC_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_HRC_less()
+    {
+        typedef cc::MichaelKVList< cds::gc::HRC, int, HashMapHdrTest::value_type, HRC_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_HRC_cmpmix()
+    {
+        typedef cc::MichaelKVList< cds::gc::HRC, int, HashMapHdrTest::value_type, HRC_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_michael_map_lazy_hp.cpp b/tests/test-hdr/map/hdr_michael_map_lazy_hp.cpp
new file mode 100644 (file)
index 0000000..82b2340
--- /dev/null
@@ -0,0 +1,87 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/lazy_kvlist_hp.h>
+#include <cds/container/michael_map.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        struct HP_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct HP_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct HP_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Lazy_HP_cmp()
+    {
+        typedef cc::LazyKVList< cds::gc::HP, int, HashMapHdrTest::value_type, HP_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_HP_less()
+    {
+        typedef cc::LazyKVList< cds::gc::HP, int, HashMapHdrTest::value_type, HP_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_HP_cmpmix()
+    {
+        typedef cc::LazyKVList< cds::gc::HP, int, HashMapHdrTest::value_type, HP_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HP, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_michael_map_lazy_hrc.cpp b/tests/test-hdr/map/hdr_michael_map_lazy_hrc.cpp
new file mode 100644 (file)
index 0000000..122db9d
--- /dev/null
@@ -0,0 +1,87 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/lazy_kvlist_hrc.h>
+#include <cds/container/michael_map.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        struct HRC_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct HRC_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct HRC_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Lazy_HRC_cmp()
+    {
+        typedef cc::LazyKVList< cds::gc::HRC, int, HashMapHdrTest::value_type, HRC_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_HRC_less()
+    {
+        typedef cc::LazyKVList< cds::gc::HRC, int, HashMapHdrTest::value_type, HRC_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_HRC_cmpmix()
+    {
+        typedef cc::LazyKVList< cds::gc::HRC, int, HashMapHdrTest::value_type, HRC_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::HRC, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_michael_map_lazy_nogc.cpp b/tests/test-hdr/map/hdr_michael_map_lazy_nogc.cpp
new file mode 100644 (file)
index 0000000..c5fd148
--- /dev/null
@@ -0,0 +1,85 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/lazy_kvlist_nogc.h>
+#include <cds/container/michael_map_nogc.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        struct nogc_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct nogc_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct nogc_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Lazy_nogc_cmp()
+    {
+        typedef cc::LazyKVList< cds::gc::nogc, int, HashMapHdrTest::value_type, nogc_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list, map_traits > map;
+        test_int_nogc< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_nogc_less()
+    {
+        typedef cc::LazyKVList< cds::gc::nogc, int, HashMapHdrTest::value_type, nogc_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list, map_traits > map;
+        test_int_nogc< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_nogc_cmpmix()
+    {
+        typedef cc::LazyKVList< cds::gc::nogc, int, HashMapHdrTest::value_type, nogc_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list, map_traits > map;
+        test_int_nogc< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+}   // namespace map
diff --git a/tests/test-hdr/map/hdr_michael_map_lazy_ptb.cpp b/tests/test-hdr/map/hdr_michael_map_lazy_ptb.cpp
new file mode 100644 (file)
index 0000000..f083e0a
--- /dev/null
@@ -0,0 +1,87 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/lazy_kvlist_ptb.h>
+#include <cds/container/michael_map.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        struct PTB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct PTB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct PTB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Lazy_PTB_cmp()
+    {
+        typedef cc::LazyKVList< cds::gc::PTB, int, HashMapHdrTest::value_type, PTB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_PTB_less()
+    {
+        typedef cc::LazyKVList< cds::gc::PTB, int, HashMapHdrTest::value_type, PTB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_PTB_cmpmix()
+    {
+        typedef cc::LazyKVList< cds::gc::PTB, int, HashMapHdrTest::value_type, PTB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpb.cpp b/tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..b08e6a1
--- /dev/null
@@ -0,0 +1,90 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/lazy_kvlist_rcu.h>
+#include <cds/container/michael_map_rcu.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        struct RCU_GPB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct RCU_GPB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct RCU_GPB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Lazy_RCU_GPB_cmp()
+    {
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_RCU_GPB_less()
+    {
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_RCU_GPB_cmpmix()
+    {
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpi.cpp b/tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..ec55153
--- /dev/null
@@ -0,0 +1,90 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/lazy_kvlist_rcu.h>
+#include <cds/container/michael_map_rcu.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        struct RCU_GPI_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct RCU_GPI_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct RCU_GPI_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Lazy_RCU_GPI_cmp()
+    {
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPI_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_RCU_GPI_less()
+    {
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPI_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_RCU_GPI_cmpmix()
+    {
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPI_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpt.cpp b/tests/test-hdr/map/hdr_michael_map_lazy_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..2ee9102
--- /dev/null
@@ -0,0 +1,90 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/lazy_kvlist_rcu.h>
+#include <cds/container/michael_map_rcu.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+
+        struct RCU_GPT_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct RCU_GPT_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct RCU_GPT_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Lazy_RCU_GPT_cmp()
+    {
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPT_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_RCU_GPT_less()
+    {
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPT_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Lazy_RCU_GPT_cmpmix()
+    {
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPT_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_michael_map_lazy_rcu_shb.cpp b/tests/test-hdr/map/hdr_michael_map_lazy_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..4bdbc41
--- /dev/null
@@ -0,0 +1,96 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/lazy_kvlist_rcu.h>
+#include <cds/container/michael_map_rcu.h>
+
+namespace map {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+
+        struct RCU_SHB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct RCU_SHB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct RCU_SHB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+#endif
+
+    void HashMapHdrTest::Lazy_RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Lazy_RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Lazy_RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_michael_map_lazy_rcu_sht.cpp b/tests/test-hdr/map/hdr_michael_map_lazy_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..5f5897e
--- /dev/null
@@ -0,0 +1,96 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/lazy_kvlist_rcu.h>
+#include <cds/container/michael_map_rcu.h>
+
+namespace map {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+
+        struct RCU_SHT_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct RCU_SHT_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct RCU_SHT_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+#endif
+
+    void HashMapHdrTest::Lazy_RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHT_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Lazy_RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHT_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Lazy_RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHT_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_michael_map_nogc.cpp b/tests/test-hdr/map/hdr_michael_map_nogc.cpp
new file mode 100644 (file)
index 0000000..3975103
--- /dev/null
@@ -0,0 +1,85 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/michael_kvlist_nogc.h>
+#include <cds/container/michael_map_nogc.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        struct nogc_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct nogc_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct nogc_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Michael_nogc_cmp()
+    {
+        typedef cc::MichaelKVList< cds::gc::nogc, int, HashMapHdrTest::value_type, nogc_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list, map_traits > map;
+        test_int_nogc< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_nogc_less()
+    {
+        typedef cc::MichaelKVList< cds::gc::nogc, int, HashMapHdrTest::value_type, nogc_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list, map_traits > map;
+        test_int_nogc< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_nogc_cmpmix()
+    {
+        typedef cc::MichaelKVList< cds::gc::nogc, int, HashMapHdrTest::value_type, nogc_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list, map_traits > map;
+        test_int_nogc< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::nogc, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+}   // namespace map
diff --git a/tests/test-hdr/map/hdr_michael_map_ptb.cpp b/tests/test-hdr/map/hdr_michael_map_ptb.cpp
new file mode 100644 (file)
index 0000000..49cab8d
--- /dev/null
@@ -0,0 +1,87 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/michael_kvlist_ptb.h>
+#include <cds/container/michael_map.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        struct PTB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct PTB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct PTB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Michael_PTB_cmp()
+    {
+        typedef cc::MichaelKVList< cds::gc::PTB, int, HashMapHdrTest::value_type, PTB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_PTB_less()
+    {
+        typedef cc::MichaelKVList< cds::gc::PTB, int, HashMapHdrTest::value_type, PTB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_PTB_cmpmix()
+    {
+        typedef cc::MichaelKVList< cds::gc::PTB, int, HashMapHdrTest::value_type, PTB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list, map_traits > map;
+        test_int< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< cds::gc::PTB, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_michael_map_rcu_gpb.cpp b/tests/test-hdr/map/hdr_michael_map_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..0bcfb32
--- /dev/null
@@ -0,0 +1,90 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/michael_kvlist_rcu.h>
+#include <cds/container/michael_map_rcu.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        struct RCU_GPB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct RCU_GPB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct RCU_GPB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Michael_RCU_GPB_cmp()
+    {
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_RCU_GPB_less()
+    {
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_RCU_GPB_cmpmix()
+    {
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_michael_map_rcu_gpi.cpp b/tests/test-hdr/map/hdr_michael_map_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..6e93fd9
--- /dev/null
@@ -0,0 +1,90 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/michael_kvlist_rcu.h>
+#include <cds/container/michael_map_rcu.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        struct RCU_GPI_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct RCU_GPI_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct RCU_GPI_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Michael_RCU_GPI_cmp()
+    {
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPI_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_RCU_GPI_less()
+    {
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPI_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_RCU_GPI_cmpmix()
+    {
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPI_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_michael_map_rcu_gpt.cpp b/tests/test-hdr/map/hdr_michael_map_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..4d08ea8
--- /dev/null
@@ -0,0 +1,90 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/michael_kvlist_rcu.h>
+#include <cds/container/michael_map_rcu.h>
+
+namespace map {
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+
+        struct RCU_GPT_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct RCU_GPT_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct RCU_GPT_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+
+    void HashMapHdrTest::Michael_RCU_GPT_cmp()
+    {
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPT_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_RCU_GPT_less()
+    {
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPT_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Michael_RCU_GPT_cmpmix()
+    {
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_GPT_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_michael_map_rcu_shb.cpp b/tests/test-hdr/map/hdr_michael_map_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..3ab347d
--- /dev/null
@@ -0,0 +1,96 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/michael_kvlist_rcu.h>
+#include <cds/container/michael_map_rcu.h>
+
+namespace map {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+
+        struct RCU_SHB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct RCU_SHB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct RCU_SHB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+#endif
+
+    void HashMapHdrTest::Michael_RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Michael_RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Michael_RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_michael_map_rcu_sht.cpp b/tests/test-hdr/map/hdr_michael_map_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..4e88edb
--- /dev/null
@@ -0,0 +1,96 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/michael_kvlist_rcu.h>
+#include <cds/container/michael_map_rcu.h>
+
+namespace map {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct map_traits: public cc::michael_map::type_traits
+        {
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+        };
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+
+        struct RCU_SHT_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+        };
+
+        struct RCU_SHT_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::less  less;
+        };
+
+        struct RCU_SHT_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashMapHdrTest::cmp   compare;
+            typedef HashMapHdrTest::less  less;
+        };
+    }
+#endif
+
+    void HashMapHdrTest::Michael_RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHT_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Michael_RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHT_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Michael_RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelKVList< rcu_type, int, HashMapHdrTest::value_type, RCU_SHT_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashMap< rcu_type, list, map_traits > map;
+        test_rcu< map >();
+
+        // option-based version
+        typedef cc::MichaelHashMap< rcu_type, list,
+            cc::michael_map::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_refinable_hashmap_boost_flat_map.cpp b/tests/test-hdr/map/hdr_refinable_hashmap_boost_flat_map.cpp
new file mode 100644 (file)
index 0000000..146fde5
--- /dev/null
@@ -0,0 +1,178 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace map {
+    void StripedMapHdrTest::Refinable_boost_flat_map()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::flat_map you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_map/boost_flat_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef boost::container::flat_map<StripedMapHdrTest::key_type, StripedMapHdrTest::value_type, StripedMapHdrTest::less > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& m, iterator /*itInsert*/, iterator itWhat )
+            {
+                m.insert( *itWhat );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Refinable_boost_flat_map()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::Spin> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+
+    }
+}   // namespace map
+
+/*
+#else
+    namespace map {
+        void StripedMapHdrTest::Refinable_boost_flat_map()
+        {
+            CPPUNIT_MESSAGE( "Skipped; for boost::container::flat_map is not compatible with MS VC++ 11" );
+        }
+    }
+#endif
+*/
+
+#else // BOOST_VERSION < 104800
+
+namespace map {
+    void StripedMapHdrTest::Refinable_boost_flat_map()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::flat_map you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/map/hdr_refinable_hashmap_boost_list.cpp b/tests/test-hdr/map/hdr_refinable_hashmap_boost_list.cpp
new file mode 100644 (file)
index 0000000..4668c6b
--- /dev/null
@@ -0,0 +1,163 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace map {
+    void StripedMapHdrTest::Refinable_boost_list()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::list you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_map/boost_list.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef boost::container::list< StripedMapHdrTest::pair_type > sequence_t;
+
+        struct my_copy_policy {
+            typedef sequence_t::iterator iterator;
+
+            void operator()( sequence_t& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::make_pair(itWhat->first, itWhat->second ));
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Refinable_boost_list()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+        >   map_cmp;
+        test_striped2< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped2< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped2< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::Spin> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_spin;
+        test_striped2< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedMap< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   pair_type_less_resizing_lf;
+            pair_type_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(8) );
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   map_less_resizing_lf16;
+        test_striped2< map_less_resizing_lf16 >();
+
+        {
+            CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+            typedef cc::StripedMap< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   map_less_resizing_sbt16;
+        test_striped2< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace map
+
+#else // BOOST_VERSION < 104800
+
+namespace map {
+    void StripedMapHdrTest::Refinable_boost_list()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::list you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/map/hdr_refinable_hashmap_boost_map.cpp b/tests/test-hdr/map/hdr_refinable_hashmap_boost_map.cpp
new file mode 100644 (file)
index 0000000..350ec62
--- /dev/null
@@ -0,0 +1,167 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace map {
+    void StripedMapHdrTest::Refinable_boost_map()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::map you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_map/boost_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef boost::container::map<StripedMapHdrTest::key_type, StripedMapHdrTest::value_type, StripedMapHdrTest::less > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& m, iterator /*itInsert*/, iterator itWhat )
+            {
+                m.insert( *itWhat );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Refinable_boost_map()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::Spin> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+
+    }
+}   // namespace map
+
+#else // BOOST_VERSION < 104800
+
+namespace map {
+    void StripedMapHdrTest::Refinable_boost_map()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::map you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/map/hdr_refinable_hashmap_boost_unordered_map.cpp b/tests/test-hdr/map/hdr_refinable_hashmap_boost_unordered_map.cpp
new file mode 100644 (file)
index 0000000..a275f35
--- /dev/null
@@ -0,0 +1,146 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+#include <cds/container/striped_map/boost_unordered_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef boost::unordered_map< StripedMapHdrTest::key_type, StripedMapHdrTest::value_type > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& m, iterator itInsert, iterator itWhat )
+            {
+                m.insert( std::make_pair(itWhat->first, itWhat->second ) );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Refinable_boost_unordered_map()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::Spin> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+
+    }
+
+}   // namespace map
+
diff --git a/tests/test-hdr/map/hdr_refinable_hashmap_hashmap_std.cpp b/tests/test-hdr/map/hdr_refinable_hashmap_hashmap_std.cpp
new file mode 100644 (file)
index 0000000..4572cb1
--- /dev/null
@@ -0,0 +1,148 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+#include <cds/container/striped_map/std_hash_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+#if !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600)
+
+namespace map {
+
+    namespace {
+        typedef std::unordered_map< StripedMapHdrTest::key_type, StripedMapHdrTest::value_type > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& m, iterator itInsert, iterator itWhat )
+            {
+                m.insert( std::make_pair(itWhat->first, itWhat->second ) );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Refinable_hashmap()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::Spin> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace map
+
+#endif // #if !(CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION < 1600)
diff --git a/tests/test-hdr/map/hdr_refinable_hashmap_hashmap_vc.cpp b/tests/test-hdr/map/hdr_refinable_hashmap_hashmap_vc.cpp
new file mode 100644 (file)
index 0000000..ff1a774
--- /dev/null
@@ -0,0 +1,147 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+#include <cds/container/striped_map/std_hash_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600
+
+namespace map {
+
+    namespace {
+        typedef stdext::hash_map< StripedMapHdrTest::key_type, StripedMapHdrTest::value_type > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& m, iterator itInsert, iterator itWhat )
+            {
+                m.insert( std::make_pair(itWhat->first, itWhat->second ) );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Refinable_hashmap()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::Spin> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+}   // namespace map
+
+#endif // #if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION < 1600
diff --git a/tests/test-hdr/map/hdr_refinable_hashmap_list.cpp b/tests/test-hdr/map/hdr_refinable_hashmap_list.cpp
new file mode 100644 (file)
index 0000000..a8ff667
--- /dev/null
@@ -0,0 +1,139 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+#include <cds/container/striped_map/std_list.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef std::list<StripedMapHdrTest::pair_type> sequence_t;
+
+        struct my_copy_policy {
+            typedef sequence_t::iterator iterator;
+
+            void operator()( sequence_t& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::make_pair(itWhat->first, itWhat->second ));
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Refinable_list()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+        >   map_cmp;
+        test_striped2< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped2< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped2< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::Spin> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_spin;
+        test_striped2< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedMap< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   pair_type_less_resizing_lf;
+            pair_type_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(8) );
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   map_less_resizing_lf16;
+        test_striped2< map_less_resizing_lf16 >();
+
+        {
+            CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+            typedef cc::StripedMap< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   map_less_resizing_sbt16;
+        test_striped2< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+}   // namespace map
diff --git a/tests/test-hdr/map/hdr_refinable_hashmap_map.cpp b/tests/test-hdr/map/hdr_refinable_hashmap_map.cpp
new file mode 100644 (file)
index 0000000..93adb93
--- /dev/null
@@ -0,0 +1,145 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+#include <cds/container/striped_map/std_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef std::map<StripedMapHdrTest::key_type, StripedMapHdrTest::value_type, StripedMapHdrTest::less > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& m, iterator /*itInsert*/, iterator itWhat )
+            {
+                m.insert( *itWhat );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Refinable_map()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::Spin> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+
+    }
+
+}   // namespace map
diff --git a/tests/test-hdr/map/hdr_refinable_hashmap_slist.cpp b/tests/test-hdr/map/hdr_refinable_hashmap_slist.cpp
new file mode 100644 (file)
index 0000000..48d5f71
--- /dev/null
@@ -0,0 +1,163 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace map {
+    void StripedMapHdrTest::Refinable_slist()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::slist you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_map/boost_slist.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+
+namespace map {
+
+    namespace {
+        typedef boost::container::slist<StripedMapHdrTest::pair_type> sequence_t;
+
+        struct my_copy_policy {
+            typedef sequence_t::iterator iterator;
+
+            void operator()( sequence_t& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert_after( itInsert, StripedMapHdrTest::pair_type( std::make_pair(itWhat->first, itWhat->second )));
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Refinable_slist()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+        >   map_cmp;
+        test_striped2< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped2< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped2< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::Spin> >
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_spin;
+        test_striped2< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedMap< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   pair_type_less_resizing_lf;
+            pair_type_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(8) );
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   map_less_resizing_lf16;
+        test_striped2< map_less_resizing_lf16 >();
+
+        {
+            CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+            typedef cc::StripedMap< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   map_less_resizing_sbt16;
+        test_striped2< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedMap< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+}   // namespace map
+#else
+
+namespace map {
+    void StripedMapHdrTest::Refinable_slist()
+    {
+        CPPUNIT_MESSAGE("Skipped; for boost::container::slist you should use boost version 1.48 or above");
+    }
+} // namespace map
+
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/map/hdr_skiplist_map.h b/tests/test-hdr/map/hdr_skiplist_map.h
new file mode 100644 (file)
index 0000000..7314395
--- /dev/null
@@ -0,0 +1,581 @@
+//$$CDS-header$$
+
+#ifndef __CDSTEST_HDR_SKIPLIST_MAP_H
+#define __CDSTEST_HDR_SKIPLIST_MAP_H
+
+#include "map/hdr_map.h"
+
+namespace map {
+
+    class SkipListMapHdrTest: public HashMapHdrTest
+    {
+        typedef HashMapHdrTest base_class;
+        typedef base_class::other_item  wrapped_item;
+        typedef base_class::other_less  wrapped_less;
+
+        template <class Map, typename PrintStat >
+        void test()
+        {
+            Map m;
+            test_int_with( m );
+
+            static int const nLimit = 10000;
+            typedef typename Map::iterator          set_iterator;
+            typedef typename Map::const_iterator    const_set_iterator;
+
+            int nCount = 0;
+            int nPrevKey = 0;
+
+            // Test iterator - ascending order
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+
+            for ( int i = 0; i < nLimit; ++i ) {
+                CPPUNIT_ASSERT( m.insert(i, i) );
+            }
+            CPPUNIT_MSG( PrintStat()(m, "Iterator test, ascending insert order") );
+
+            nCount = 0;
+            nPrevKey = 0;
+            for ( set_iterator it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).first == it->second.m_val );
+                CPPUNIT_ASSERT( m.find( it->first ));
+                it->second.m_val = (*it).first * 2;
+                ++nCount;
+                if ( it != m.begin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                }
+                nPrevKey = it->first;
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            for ( const_set_iterator it = m.cbegin(), itEnd = m.cend(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).first * 2 == it->second.m_val );
+                ++nCount;
+                if ( it != m.cbegin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                }
+                nPrevKey = it->first;
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            // Test iterator - descending order
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+
+            for ( int i = nLimit; i > 0; --i ) {
+                CPPUNIT_ASSERT( m.insert( i - 1, (i-1) * 2) );
+            }
+            CPPUNIT_MSG( PrintStat()(m, "Iterator test, descending insert order") );
+
+            nCount = 0;
+            nPrevKey = 0;
+            for ( set_iterator it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).first * 2 == it->second.m_val );
+                CPPUNIT_ASSERT( m.find( it->first ));
+                it->second.m_val = (*it).first;
+                ++nCount;
+                if ( it != m.begin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                }
+                nPrevKey = it->first;
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            for ( const_set_iterator it = m.cbegin(), itEnd = m.cend(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).first == it->second.m_val );
+                ++nCount;
+                if ( it != m.cbegin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                }
+                nPrevKey = it->first;
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            // Test iterator - random order
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            {
+                int nRand[nLimit];
+                for ( int i = 0; i < nLimit; ++i ) {
+                    nRand[i] = i;
+                }
+                std::random_shuffle( nRand, nRand + nLimit );
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( m.insert( nRand[i], nRand[i]) );
+                }
+                CPPUNIT_MSG( PrintStat()(m, "Iterator test, random insert order") );
+            }
+
+            nCount = 0;
+            nPrevKey = 0;
+            for ( set_iterator it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).first == it->second.m_val );
+                CPPUNIT_ASSERT( m.find( it->first ));
+                it->second.m_val = (*it).first * 2;
+                ++nCount;
+                if ( it != m.begin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                }
+                nPrevKey = it->first;
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            for ( const_set_iterator it = m.cbegin(), itEnd = m.cend(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).first * 2 == it->second.m_val );
+                ++nCount;
+                if ( it != m.cbegin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                }
+                nPrevKey = it->first;
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            {
+                typename Map::guarded_ptr gp;
+                int arrItem[nLimit];
+                for ( int i = 0; i < nLimit; ++i )
+                    arrItem[i] = i;
+                std::random_shuffle( arrItem, arrItem + nLimit );
+
+                typedef base_class::less less;
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrItem[i];
+                    CPPUNIT_ASSERT( m.get( gp, nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey * 2 );
+                    gp.release();
+                    CPPUNIT_ASSERT( m.extract(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey * 2 );
+                    gp.release();
+                    CPPUNIT_CHECK( !m.get( gp, nKey ));
+                    CPPUNIT_CHECK( !m.extract(gp, nKey));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( m.empty());
+
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( m.insert(arrItem[i], arrItem[i]*2) );
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrItem[i];
+                    CPPUNIT_ASSERT( m.get_with( gp, wrapped_item(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey * 2 );
+                    gp.release();
+                    CPPUNIT_ASSERT( m.extract_with(gp, wrapped_item(nKey), wrapped_less()));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey * 2 );
+                    gp.release();
+                    CPPUNIT_CHECK( !m.get_with( gp, wrapped_item(nKey), wrapped_less()));
+                    CPPUNIT_CHECK( !m.extract_with( gp, wrapped_item(nKey), wrapped_less()));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( m.empty());
+
+                //extract_min
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( m.insert(arrItem[i], arrItem[i]*2) );
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( m.extract_min(gp));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == i );
+                    CPPUNIT_CHECK( gp->second.m_val == i * 2 );
+                    gp.release();
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_CHECK( !m.extract_min(gp));
+                CPPUNIT_CHECK( gp.empty());
+                CPPUNIT_ASSERT( m.empty());
+
+                // extract_max
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( m.insert(arrItem[i], arrItem[i]*2) );
+
+                for ( int i = nLimit - 1; i >= 0; --i ) {
+                    CPPUNIT_ASSERT( m.extract_max(gp));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == i );
+                    CPPUNIT_CHECK( gp->second.m_val == i * 2 );
+                    gp.release();
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_CHECK( !m.extract_max(gp));
+                CPPUNIT_CHECK( gp.empty());
+                CPPUNIT_ASSERT( m.empty());
+            }
+
+            CPPUNIT_MSG( PrintStat()(m, NULL) );
+        }
+
+        template <class Map, typename PrintStat >
+        void test_nogc()
+        {
+            typedef typename Map::iterator          iterator;
+            typedef typename Map::const_iterator    const_iterator;
+
+            Map m;
+
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+            CPPUNIT_ASSERT( m.find(10) == m.end() );
+            iterator it = m.insert( 10 );
+            CPPUNIT_ASSERT( it != m.end() );
+            CPPUNIT_ASSERT( it->first == 10 );
+            CPPUNIT_ASSERT( it->second.m_val == 0 );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 1 ));
+            CPPUNIT_ASSERT( m.find(10) == it );
+            CPPUNIT_ASSERT( it->first == 10 );
+            CPPUNIT_ASSERT( it->second.m_val == 0 );
+
+            CPPUNIT_ASSERT( m.find(100) == m.end() );
+            it = m.insert( 100, 200 );
+            CPPUNIT_ASSERT( it != m.end() );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+            CPPUNIT_ASSERT( m.find(100) == it );
+            CPPUNIT_ASSERT( it->first == 100 );
+            CPPUNIT_ASSERT( it->second.m_val == 200 );
+
+            CPPUNIT_ASSERT( m.find(55) == m.end() );
+            it = m.insert_key( 55, insert_functor<Map>() );
+            CPPUNIT_ASSERT( it != m.end() );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( m.find(55) == it );
+            CPPUNIT_ASSERT( it->first == 55 );
+            CPPUNIT_ASSERT( it->second.m_val == 55 * 3 );
+
+            CPPUNIT_ASSERT( m.insert( 55 ) == m.end() );
+            CPPUNIT_ASSERT( m.insert( 55, 10 ) == m.end() );
+            CPPUNIT_ASSERT( m.insert_key( 55, insert_functor<Map>()) == m.end() );
+
+            CPPUNIT_ASSERT( m.find(10) != m.end() );
+            std::pair<iterator, bool> ensureResult = m.ensure( 10 );
+            CPPUNIT_ASSERT( ensureResult.first != m.end() );
+            CPPUNIT_ASSERT( !ensureResult.second  );
+            CPPUNIT_ASSERT( !m.empty() );
+            ensureResult.first->second.m_val = ensureResult.first->first * 5;
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( m.find(10) == ensureResult.first );
+            it = m.find_with( 10, typename base_class::less() );
+            CPPUNIT_ASSERT( it != m.end() );
+            CPPUNIT_ASSERT( it->second.m_val == 50 );
+
+            CPPUNIT_ASSERT( m.find_with(120, base_class::less()) == m.end() );
+            ensureResult = m.ensure( 120 );
+            CPPUNIT_ASSERT( ensureResult.first != m.end() );
+            CPPUNIT_ASSERT( ensureResult.second  );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            ensureResult.first->second.m_val = ensureResult.first->first * 5;
+            CPPUNIT_ASSERT( m.find_with(120, base_class::less()) == ensureResult.first );
+            it = m.find_with(120, base_class::less());
+            CPPUNIT_ASSERT( it != m.end() );
+            CPPUNIT_ASSERT( it->second.m_val == 120 * 5 );
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            it = m.emplace( 151 ) ;  // key = 151,  val = 0
+            CPPUNIT_ASSERT( it != m.end() );
+            CPPUNIT_ASSERT( it->first == 151 );
+            CPPUNIT_ASSERT( it->second.m_val == 0 );
+
+            it = m.emplace( 174, 471 ) ; // key == 174, val = 471
+            CPPUNIT_ASSERT( it != m.end() );
+            CPPUNIT_ASSERT( it->first == 174 );
+            CPPUNIT_ASSERT( it->second.m_val == 471 );
+
+            it = m.emplace( 190, value_type(91)) ; // key == 190, val = 19
+            CPPUNIT_ASSERT( it != m.end() );
+            CPPUNIT_ASSERT( it->first == 190 );
+            CPPUNIT_ASSERT( it->second.m_val == 91 );
+
+            it = m.emplace( 151, 1051 );
+            CPPUNIT_ASSERT( it == m.end());
+
+            it = m.find( 174 );
+            CPPUNIT_ASSERT( it != m.end() );
+            CPPUNIT_ASSERT( it->first == 174 );
+            CPPUNIT_ASSERT( it->second.m_val == 471 );
+
+            it = m.find( 190 );
+            CPPUNIT_ASSERT( it != m.end() );
+            CPPUNIT_ASSERT( it->first == 190 );
+            CPPUNIT_ASSERT( it->second.m_val == 91 );
+
+            it = m.find( 151 );
+            CPPUNIT_ASSERT( it != m.end() );
+            CPPUNIT_ASSERT( it->first == 151 );
+            CPPUNIT_ASSERT( it->second.m_val == 0 );
+#       endif
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+            // get_min test
+            for ( int i = 500; i > 0; --i ) {
+                CPPUNIT_ASSERT( m.insert( i, i * 2 ) != m.end() );
+
+                typename Map::value_type * pVal = m.get_min();
+                CPPUNIT_ASSERT( pVal != NULL );
+                CPPUNIT_CHECK( pVal->first == i );
+                CPPUNIT_CHECK( pVal->second.m_val == i * 2 );
+            }
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+            CPPUNIT_CHECK( m.get_min() == NULL );
+            CPPUNIT_CHECK( m.get_max() == NULL );
+
+            // iterator test
+
+            for ( int i = 0; i < 500; ++i ) {
+                CPPUNIT_ASSERT( m.insert( i, i * 2 ) != m.end() );
+
+                typename Map::value_type * pVal = m.get_max();
+                CPPUNIT_ASSERT( pVal != NULL );
+                CPPUNIT_CHECK( pVal->first == i );
+                CPPUNIT_CHECK( pVal->second.m_val == i * 2 );
+            }
+            CPPUNIT_ASSERT( check_size( m, 500 ));
+
+            for ( iterator it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( it->first * 2 == (*it).second.m_val );
+                it->second = it->first;
+            }
+
+            Map const& refMap = m;
+            for ( const_iterator it = refMap.begin(), itEnd = refMap.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( it->first == it->second.m_val );
+                CPPUNIT_ASSERT( (*it).first == (*it).second.m_val );
+            }
+
+            CPPUNIT_MSG( PrintStat()(m, "SkipListMap statistics") );
+        }
+
+    public:
+        void SkipList_HP_less();
+        void SkipList_HP_cmp();
+        void SkipList_HP_cmpless();
+        void SkipList_HP_less_stat();
+        void SkipList_HP_cmp_stat();
+        void SkipList_HP_cmpless_stat();
+        void SkipList_HP_xorshift_less();
+        void SkipList_HP_xorshift_cmp();
+        void SkipList_HP_xorshift_cmpless();
+        void SkipList_HP_xorshift_less_stat();
+        void SkipList_HP_xorshift_cmp_stat();
+        void SkipList_HP_xorshift_cmpless_stat();
+        void SkipList_HP_turbopas_less();
+        void SkipList_HP_turbopas_cmp();
+        void SkipList_HP_turbopas_cmpless();
+        void SkipList_HP_turbopas_less_stat();
+        void SkipList_HP_turbopas_cmp_stat();
+        void SkipList_HP_turbopas_cmpless_stat();
+        void SkipList_HP_michaelalloc_less();
+        void SkipList_HP_michaelalloc_cmp();
+        void SkipList_HP_michaelalloc_cmpless();
+        void SkipList_HP_michaelalloc_less_stat();
+        void SkipList_HP_michaelalloc_cmp_stat();
+        void SkipList_HP_michaelalloc_cmpless_stat();
+
+        void SkipList_HRC_less();
+        void SkipList_HRC_cmp();
+        void SkipList_HRC_cmpless();
+        void SkipList_HRC_less_stat();
+        void SkipList_HRC_cmp_stat();
+        void SkipList_HRC_cmpless_stat();
+        void SkipList_HRC_xorshift_less();
+        void SkipList_HRC_xorshift_cmp();
+        void SkipList_HRC_xorshift_cmpless();
+        void SkipList_HRC_xorshift_less_stat();
+        void SkipList_HRC_xorshift_cmp_stat();
+        void SkipList_HRC_xorshift_cmpless_stat();
+        void SkipList_HRC_turbopas_less();
+        void SkipList_HRC_turbopas_cmp();
+        void SkipList_HRC_turbopas_cmpless();
+        void SkipList_HRC_turbopas_less_stat();
+        void SkipList_HRC_turbopas_cmp_stat();
+        void SkipList_HRC_turbopas_cmpless_stat();
+        void SkipList_HRC_michaelalloc_less();
+        void SkipList_HRC_michaelalloc_cmp();
+        void SkipList_HRC_michaelalloc_cmpless();
+        void SkipList_HRC_michaelalloc_less_stat();
+        void SkipList_HRC_michaelalloc_cmp_stat();
+        void SkipList_HRC_michaelalloc_cmpless_stat();
+
+        void SkipList_PTB_less();
+        void SkipList_PTB_cmp();
+        void SkipList_PTB_cmpless();
+        void SkipList_PTB_less_stat();
+        void SkipList_PTB_cmp_stat();
+        void SkipList_PTB_cmpless_stat();
+        void SkipList_PTB_xorshift_less();
+        void SkipList_PTB_xorshift_cmp();
+        void SkipList_PTB_xorshift_cmpless();
+        void SkipList_PTB_xorshift_less_stat();
+        void SkipList_PTB_xorshift_cmp_stat();
+        void SkipList_PTB_xorshift_cmpless_stat();
+        void SkipList_PTB_turbopas_less();
+        void SkipList_PTB_turbopas_cmp();
+        void SkipList_PTB_turbopas_cmpless();
+        void SkipList_PTB_turbopas_less_stat();
+        void SkipList_PTB_turbopas_cmp_stat();
+        void SkipList_PTB_turbopas_cmpless_stat();
+        void SkipList_PTB_michaelalloc_less();
+        void SkipList_PTB_michaelalloc_cmp();
+        void SkipList_PTB_michaelalloc_cmpless();
+        void SkipList_PTB_michaelalloc_less_stat();
+        void SkipList_PTB_michaelalloc_cmp_stat();
+        void SkipList_PTB_michaelalloc_cmpless_stat();
+
+        void SkipList_NOGC_less();
+        void SkipList_NOGC_cmp();
+        void SkipList_NOGC_cmpless();
+        void SkipList_NOGC_less_stat();
+        void SkipList_NOGC_cmp_stat();
+        void SkipList_NOGC_cmpless_stat();
+        void SkipList_NOGC_xorshift_less();
+        void SkipList_NOGC_xorshift_cmp();
+        void SkipList_NOGC_xorshift_cmpless();
+        void SkipList_NOGC_xorshift_less_stat();
+        void SkipList_NOGC_xorshift_cmp_stat();
+        void SkipList_NOGC_xorshift_cmpless_stat();
+        void SkipList_NOGC_turbopas_less();
+        void SkipList_NOGC_turbopas_cmp();
+        void SkipList_NOGC_turbopas_cmpless();
+        void SkipList_NOGC_turbopas_less_stat();
+        void SkipList_NOGC_turbopas_cmp_stat();
+        void SkipList_NOGC_turbopas_cmpless_stat();
+        void SkipList_NOGC_michaelalloc_less();
+        void SkipList_NOGC_michaelalloc_cmp();
+        void SkipList_NOGC_michaelalloc_cmpless();
+        void SkipList_NOGC_michaelalloc_less_stat();
+        void SkipList_NOGC_michaelalloc_cmp_stat();
+        void SkipList_NOGC_michaelalloc_cmpless_stat();
+
+        CPPUNIT_TEST_SUITE(SkipListMapHdrTest)
+            CPPUNIT_TEST(SkipList_HP_less)
+            CPPUNIT_TEST(SkipList_HP_cmp)
+            CPPUNIT_TEST(SkipList_HP_cmpless)
+            CPPUNIT_TEST(SkipList_HP_less_stat)
+            CPPUNIT_TEST(SkipList_HP_cmp_stat)
+            CPPUNIT_TEST(SkipList_HP_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HP_xorshift_less)
+            CPPUNIT_TEST(SkipList_HP_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_HP_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_HP_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_HP_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_HP_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HP_turbopas_less)
+            CPPUNIT_TEST(SkipList_HP_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_HP_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_HP_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_HP_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_HP_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_HRC_less)
+            CPPUNIT_TEST(SkipList_HRC_cmp)
+            CPPUNIT_TEST(SkipList_HRC_cmpless)
+            CPPUNIT_TEST(SkipList_HRC_less_stat)
+            CPPUNIT_TEST(SkipList_HRC_cmp_stat)
+            CPPUNIT_TEST(SkipList_HRC_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_less)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_less)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_PTB_less)
+            CPPUNIT_TEST(SkipList_PTB_cmp)
+            CPPUNIT_TEST(SkipList_PTB_cmpless)
+            CPPUNIT_TEST(SkipList_PTB_less_stat)
+            CPPUNIT_TEST(SkipList_PTB_cmp_stat)
+            CPPUNIT_TEST(SkipList_PTB_cmpless_stat)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_less)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_less)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_NOGC_less)
+            CPPUNIT_TEST(SkipList_NOGC_cmp)
+            CPPUNIT_TEST(SkipList_NOGC_cmpless)
+            CPPUNIT_TEST(SkipList_NOGC_less_stat)
+            CPPUNIT_TEST(SkipList_NOGC_cmp_stat)
+            CPPUNIT_TEST(SkipList_NOGC_cmpless_stat)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_less)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_less)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmpless_stat)
+
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+
+} // namespace map
+
+#endif // #ifndef __CDSTEST_HDR_SKIPLIST_MAP_H
diff --git a/tests/test-hdr/map/hdr_skiplist_map_hp.cpp b/tests/test-hdr/map/hdr_skiplist_map_hp.cpp
new file mode 100644 (file)
index 0000000..bf27665
--- /dev/null
@@ -0,0 +1,313 @@
+//$$CDS-header$$
+
+#include "map/hdr_skiplist_map.h"
+#include <cds/container/skip_list_map_hp.h>
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace map {
+
+    void SkipListMapHdrTest::SkipList_HP_less()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat > >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_xorshift_less()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_xorshift_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_xorshift_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_xorshift_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_turbopas_less()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_turbopas_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_turbopas_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_turbopas_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_michaelalloc_less()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_michaelalloc_cmp()
+    {
+            typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+                cc::skip_list::make_traits<
+                    co::compare< cmp >
+                    ,co::item_counter< simple_item_counter >
+                    ,co::allocator< memory::MichaelAllocator<int> >
+                >::type
+            > set;
+            test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HP_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HP, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace map
+
+CPPUNIT_TEST_SUITE_REGISTRATION(map::SkipListMapHdrTest);
diff --git a/tests/test-hdr/map/hdr_skiplist_map_hrc.cpp b/tests/test-hdr/map/hdr_skiplist_map_hrc.cpp
new file mode 100644 (file)
index 0000000..9ad246c
--- /dev/null
@@ -0,0 +1,311 @@
+//$$CDS-header$$
+
+#include "map/hdr_skiplist_map.h"
+#include <cds/container/skip_list_map_hrc.h>
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace map {
+
+    void SkipListMapHdrTest::SkipList_HRC_less()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_xorshift_less()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_xorshift_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_xorshift_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_xorshift_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_turbopas_less()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_turbopas_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_turbopas_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_turbopas_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_michaelalloc_less()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_michaelalloc_cmp()
+    {
+            typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+                cc::skip_list::make_traits<
+                    co::compare< cmp >
+                    ,co::item_counter< simple_item_counter >
+                    ,co::allocator< memory::MichaelAllocator<int> >
+                >::type
+            > set;
+            test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_HRC_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::HRC, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_skiplist_map_nogc.cpp b/tests/test-hdr/map/hdr_skiplist_map_nogc.cpp
new file mode 100644 (file)
index 0000000..3d0b909
--- /dev/null
@@ -0,0 +1,311 @@
+//$$CDS-header$$
+
+#include "map/hdr_skiplist_map.h"
+#include <cds/container/skip_list_map_nogc.h>
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace map {
+
+    void SkipListMapHdrTest::SkipList_NOGC_less()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_xorshift_less()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_xorshift_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_xorshift_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_xorshift_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_turbopas_less()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_turbopas_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_turbopas_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_turbopas_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_michaelalloc_less()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_michaelalloc_cmp()
+    {
+            typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+                cc::skip_list::make_traits<
+                    co::compare< cmp >
+                    ,co::item_counter< simple_item_counter >
+                    ,co::allocator< memory::MichaelAllocator<int> >
+                >::type
+            > set;
+            test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_NOGC_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::nogc, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_skiplist_map_ptb.cpp b/tests/test-hdr/map/hdr_skiplist_map_ptb.cpp
new file mode 100644 (file)
index 0000000..994e4fb
--- /dev/null
@@ -0,0 +1,311 @@
+//$$CDS-header$$
+
+#include "map/hdr_skiplist_map.h"
+#include <cds/container/skip_list_map_ptb.h>
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace map {
+
+    void SkipListMapHdrTest::SkipList_PTB_less()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_xorshift_less()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_xorshift_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_xorshift_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_xorshift_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_turbopas_less()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_turbopas_cmp()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_turbopas_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_turbopas_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_michaelalloc_less()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_michaelalloc_cmp()
+    {
+            typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+                cc::skip_list::make_traits<
+                    co::compare< cmp >
+                    ,co::item_counter< simple_item_counter >
+                    ,co::allocator< memory::MichaelAllocator<int> >
+                >::type
+            > set;
+            test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapHdrTest::SkipList_PTB_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListMap< cds::gc::PTB, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_skiplist_map_rcu.h b/tests/test-hdr/map/hdr_skiplist_map_rcu.h
new file mode 100644 (file)
index 0000000..f55c6ef
--- /dev/null
@@ -0,0 +1,507 @@
+//$$CDS-header$$
+
+#ifndef __CDSTEST_HDR_SKIPLIST_MAP_RCU_H
+#define __CDSTEST_HDR_SKIPLIST_MAP_RCU_H
+
+#include "map/hdr_map.h"
+
+namespace map {
+
+    class SkipListMapRCUHdrTest: public HashMapHdrTest
+    {
+        typedef HashMapHdrTest base_class;
+        typedef base_class::other_item  wrapped_item;
+        typedef base_class::other_less  wrapped_less;
+
+        template <class Map, typename PrintStat >
+        void test()
+        {
+            Map m;
+            test_int_with( m );
+
+            static int const nLimit = 10000;
+            typedef typename Map::iterator          set_iterator;
+            typedef typename Map::const_iterator    const_set_iterator;
+            typedef typename Map::gc::scoped_lock   rcu_lock;
+
+            int nCount = 0;
+            int nPrevKey = 0;
+
+            // Test iterator - ascending order
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+
+            for ( int i = 0; i < nLimit; ++i ) {
+                CPPUNIT_ASSERT( m.insert(i, i) );
+            }
+            CPPUNIT_MSG( PrintStat()(m, "Iterator test, ascending insert order") );
+
+            nCount = 0;
+            nPrevKey = 0;
+            {
+                rcu_lock sl;
+                for ( set_iterator it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).first == it->second.m_val );
+                    CPPUNIT_ASSERT( m.find( it->first ));
+                    it->second.m_val = (*it).first * 2;
+                    ++nCount;
+                    if ( it != m.begin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                    }
+                    nPrevKey = it->first;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            {
+                rcu_lock sl;
+                for ( const_set_iterator it = m.cbegin(), itEnd = m.cend(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).first * 2 == it->second.m_val );
+                    ++nCount;
+                    if ( it != m.cbegin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                    }
+                    nPrevKey = it->first;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            // Test iterator - descending order
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+
+            for ( int i = nLimit; i > 0; --i ) {
+                CPPUNIT_ASSERT( m.insert( i - 1, (i-1) * 2) );
+            }
+            CPPUNIT_MSG( PrintStat()(m, "Iterator test, descending insert order") );
+
+            nCount = 0;
+            nPrevKey = 0;
+            {
+                rcu_lock sl;
+                for ( set_iterator it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).first * 2 == it->second.m_val );
+                    CPPUNIT_ASSERT( m.find( it->first ));
+                    it->second.m_val = (*it).first;
+                    ++nCount;
+                    if ( it != m.begin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                    }
+                    nPrevKey = it->first;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            {
+                rcu_lock sl;
+                for ( const_set_iterator it = m.cbegin(), itEnd = m.cend(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).first == it->second.m_val );
+                    ++nCount;
+                    if ( it != m.cbegin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                    }
+                    nPrevKey = it->first;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            // Test iterator - random order
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            {
+                int nRand[nLimit];
+                for ( int i = 0; i < nLimit; ++i ) {
+                    nRand[i] = i;
+                }
+                std::random_shuffle( nRand, nRand + nLimit );
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( m.insert(i, i) );
+                }
+                CPPUNIT_MSG( PrintStat()(m, "Iterator test, random insert order") );
+            }
+
+            nCount = 0;
+            nPrevKey = 0;
+            {
+                rcu_lock sl;
+                for ( set_iterator it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).first == it->second.m_val );
+                    CPPUNIT_ASSERT( m.find( it->first ));
+                    it->second.m_val = (*it).first * 2;
+                    ++nCount;
+                    if ( it != m.begin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                    }
+                    nPrevKey = it->first;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            {
+                rcu_lock sl;
+                for ( const_set_iterator it = m.cbegin(), itEnd = m.cend(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).first * 2 == it->second.m_val );
+                    ++nCount;
+                    if ( it != m.cbegin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
+                    }
+                    nPrevKey = it->first;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            {
+                int arrItem[nLimit];
+                for ( int i = 0; i < nLimit; ++i )
+                    arrItem[i] = i;
+                std::random_shuffle( arrItem, arrItem + nLimit );
+
+                typedef typename Map::value_type value_type;
+                typename Map::exempt_ptr ep;
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrItem[i];
+                    {
+                        rcu_lock l;
+                        value_type * pVal = m.get( nKey );
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->first == nKey );
+                        CPPUNIT_CHECK( pVal->second.m_val == nKey * 2 );
+                    }
+
+                    CPPUNIT_ASSERT( m.extract( ep, nKey ));
+                    CPPUNIT_ASSERT( !ep.empty() );
+                    CPPUNIT_CHECK( ep->first == nKey );
+                    CPPUNIT_CHECK( ep->second.m_val == nKey * 2 );
+                    ep.release();
+
+                    {
+                        rcu_lock l;
+                        CPPUNIT_CHECK( m.get( nKey ) ==  NULL );
+                    }
+                    CPPUNIT_CHECK( !m.extract(ep, nKey) );
+                }
+                CPPUNIT_ASSERT( m.empty() );
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( m.insert(arrItem[i], arrItem[i]*2) );
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrItem[i];
+                    {
+                        rcu_lock l;
+                        value_type * pVal = m.get_with( wrapped_item(nKey), wrapped_less() );
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->first == nKey );
+                        CPPUNIT_CHECK( pVal->second.m_val == nKey * 2 );
+                    }
+
+                    CPPUNIT_ASSERT( m.extract_with( ep, wrapped_item(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !ep.empty() );
+                    CPPUNIT_CHECK( ep->first == nKey );
+                    CPPUNIT_CHECK( ep->second.m_val == nKey * 2 );
+                    ep.release();
+
+                    {
+                        rcu_lock l;
+                        CPPUNIT_CHECK( m.get_with( wrapped_item(nKey), wrapped_less() ) ==  NULL );
+                    }
+                    CPPUNIT_CHECK( !m.extract_with(ep, wrapped_item(nKey), wrapped_less()) );
+                }
+                CPPUNIT_ASSERT( m.empty() );
+
+                // extract_min
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( m.insert(arrItem[i], arrItem[i]*2) );
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( m.extract_min(ep));
+                    CPPUNIT_ASSERT( !ep.empty() );
+                    CPPUNIT_CHECK( ep->first == i );
+                    CPPUNIT_CHECK( ep->second.m_val == i * 2 );
+                    ep.release();
+                }
+                CPPUNIT_ASSERT( m.empty() );
+                CPPUNIT_CHECK( !m.extract_min(ep) );
+
+                // extract_max
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( m.insert(arrItem[i], arrItem[i]*2) );
+                for ( int i = nLimit-1; i >= 0; --i ) {
+                    CPPUNIT_ASSERT( m.extract_max(ep));
+                    CPPUNIT_ASSERT( !ep.empty() );
+                    CPPUNIT_CHECK( ep->first == i );
+                    CPPUNIT_CHECK( ep->second.m_val == i * 2 );
+                    ep.release();
+                }
+                CPPUNIT_ASSERT( m.empty() );
+                CPPUNIT_CHECK( !m.extract_max(ep) );
+            }
+
+            CPPUNIT_MSG( PrintStat()(m, NULL) );
+        }
+
+    public:
+        void SkipList_RCU_GPI_less();
+        void SkipList_RCU_GPI_cmp();
+        void SkipList_RCU_GPI_cmpless();
+        void SkipList_RCU_GPI_less_stat();
+        void SkipList_RCU_GPI_cmp_stat();
+        void SkipList_RCU_GPI_cmpless_stat();
+        void SkipList_RCU_GPI_xorshift_less();
+        void SkipList_RCU_GPI_xorshift_cmp();
+        void SkipList_RCU_GPI_xorshift_cmpless();
+        void SkipList_RCU_GPI_xorshift_less_stat();
+        void SkipList_RCU_GPI_xorshift_cmp_stat();
+        void SkipList_RCU_GPI_xorshift_cmpless_stat();
+        void SkipList_RCU_GPI_turbopas_less();
+        void SkipList_RCU_GPI_turbopas_cmp();
+        void SkipList_RCU_GPI_turbopas_cmpless();
+        void SkipList_RCU_GPI_turbopas_less_stat();
+        void SkipList_RCU_GPI_turbopas_cmp_stat();
+        void SkipList_RCU_GPI_turbopas_cmpless_stat();
+        void SkipList_RCU_GPI_michaelalloc_less();
+        void SkipList_RCU_GPI_michaelalloc_cmp();
+        void SkipList_RCU_GPI_michaelalloc_cmpless();
+        void SkipList_RCU_GPI_michaelalloc_less_stat();
+        void SkipList_RCU_GPI_michaelalloc_cmp_stat();
+        void SkipList_RCU_GPI_michaelalloc_cmpless_stat();
+
+        void SkipList_RCU_GPB_less();
+        void SkipList_RCU_GPB_cmp();
+        void SkipList_RCU_GPB_cmpless();
+        void SkipList_RCU_GPB_less_stat();
+        void SkipList_RCU_GPB_cmp_stat();
+        void SkipList_RCU_GPB_cmpless_stat();
+        void SkipList_RCU_GPB_xorshift_less();
+        void SkipList_RCU_GPB_xorshift_cmp();
+        void SkipList_RCU_GPB_xorshift_cmpless();
+        void SkipList_RCU_GPB_xorshift_less_stat();
+        void SkipList_RCU_GPB_xorshift_cmp_stat();
+        void SkipList_RCU_GPB_xorshift_cmpless_stat();
+        void SkipList_RCU_GPB_turbopas_less();
+        void SkipList_RCU_GPB_turbopas_cmp();
+        void SkipList_RCU_GPB_turbopas_cmpless();
+        void SkipList_RCU_GPB_turbopas_less_stat();
+        void SkipList_RCU_GPB_turbopas_cmp_stat();
+        void SkipList_RCU_GPB_turbopas_cmpless_stat();
+        void SkipList_RCU_GPB_michaelalloc_less();
+        void SkipList_RCU_GPB_michaelalloc_cmp();
+        void SkipList_RCU_GPB_michaelalloc_cmpless();
+        void SkipList_RCU_GPB_michaelalloc_less_stat();
+        void SkipList_RCU_GPB_michaelalloc_cmp_stat();
+        void SkipList_RCU_GPB_michaelalloc_cmpless_stat();
+
+        void SkipList_RCU_GPT_less();
+        void SkipList_RCU_GPT_cmp();
+        void SkipList_RCU_GPT_cmpless();
+        void SkipList_RCU_GPT_less_stat();
+        void SkipList_RCU_GPT_cmp_stat();
+        void SkipList_RCU_GPT_cmpless_stat();
+        void SkipList_RCU_GPT_xorshift_less();
+        void SkipList_RCU_GPT_xorshift_cmp();
+        void SkipList_RCU_GPT_xorshift_cmpless();
+        void SkipList_RCU_GPT_xorshift_less_stat();
+        void SkipList_RCU_GPT_xorshift_cmp_stat();
+        void SkipList_RCU_GPT_xorshift_cmpless_stat();
+        void SkipList_RCU_GPT_turbopas_less();
+        void SkipList_RCU_GPT_turbopas_cmp();
+        void SkipList_RCU_GPT_turbopas_cmpless();
+        void SkipList_RCU_GPT_turbopas_less_stat();
+        void SkipList_RCU_GPT_turbopas_cmp_stat();
+        void SkipList_RCU_GPT_turbopas_cmpless_stat();
+        void SkipList_RCU_GPT_michaelalloc_less();
+        void SkipList_RCU_GPT_michaelalloc_cmp();
+        void SkipList_RCU_GPT_michaelalloc_cmpless();
+        void SkipList_RCU_GPT_michaelalloc_less_stat();
+        void SkipList_RCU_GPT_michaelalloc_cmp_stat();
+        void SkipList_RCU_GPT_michaelalloc_cmpless_stat();
+
+        void SkipList_RCU_SHB_less();
+        void SkipList_RCU_SHB_cmp();
+        void SkipList_RCU_SHB_cmpless();
+        void SkipList_RCU_SHB_less_stat();
+        void SkipList_RCU_SHB_cmp_stat();
+        void SkipList_RCU_SHB_cmpless_stat();
+        void SkipList_RCU_SHB_xorshift_less();
+        void SkipList_RCU_SHB_xorshift_cmp();
+        void SkipList_RCU_SHB_xorshift_cmpless();
+        void SkipList_RCU_SHB_xorshift_less_stat();
+        void SkipList_RCU_SHB_xorshift_cmp_stat();
+        void SkipList_RCU_SHB_xorshift_cmpless_stat();
+        void SkipList_RCU_SHB_turbopas_less();
+        void SkipList_RCU_SHB_turbopas_cmp();
+        void SkipList_RCU_SHB_turbopas_cmpless();
+        void SkipList_RCU_SHB_turbopas_less_stat();
+        void SkipList_RCU_SHB_turbopas_cmp_stat();
+        void SkipList_RCU_SHB_turbopas_cmpless_stat();
+        void SkipList_RCU_SHB_michaelalloc_less();
+        void SkipList_RCU_SHB_michaelalloc_cmp();
+        void SkipList_RCU_SHB_michaelalloc_cmpless();
+        void SkipList_RCU_SHB_michaelalloc_less_stat();
+        void SkipList_RCU_SHB_michaelalloc_cmp_stat();
+        void SkipList_RCU_SHB_michaelalloc_cmpless_stat();
+
+        void SkipList_RCU_SHT_less();
+        void SkipList_RCU_SHT_cmp();
+        void SkipList_RCU_SHT_cmpless();
+        void SkipList_RCU_SHT_less_stat();
+        void SkipList_RCU_SHT_cmp_stat();
+        void SkipList_RCU_SHT_cmpless_stat();
+        void SkipList_RCU_SHT_xorshift_less();
+        void SkipList_RCU_SHT_xorshift_cmp();
+        void SkipList_RCU_SHT_xorshift_cmpless();
+        void SkipList_RCU_SHT_xorshift_less_stat();
+        void SkipList_RCU_SHT_xorshift_cmp_stat();
+        void SkipList_RCU_SHT_xorshift_cmpless_stat();
+        void SkipList_RCU_SHT_turbopas_less();
+        void SkipList_RCU_SHT_turbopas_cmp();
+        void SkipList_RCU_SHT_turbopas_cmpless();
+        void SkipList_RCU_SHT_turbopas_less_stat();
+        void SkipList_RCU_SHT_turbopas_cmp_stat();
+        void SkipList_RCU_SHT_turbopas_cmpless_stat();
+        void SkipList_RCU_SHT_michaelalloc_less();
+        void SkipList_RCU_SHT_michaelalloc_cmp();
+        void SkipList_RCU_SHT_michaelalloc_cmpless();
+        void SkipList_RCU_SHT_michaelalloc_less_stat();
+        void SkipList_RCU_SHT_michaelalloc_cmp_stat();
+        void SkipList_RCU_SHT_michaelalloc_cmpless_stat();
+
+        CPPUNIT_TEST_SUITE(SkipListMapRCUHdrTest)
+            CPPUNIT_TEST(SkipList_RCU_GPI_less)
+            CPPUNIT_TEST(SkipList_RCU_GPI_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPI_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPI_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_less)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_less)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_RCU_GPB_less)
+            CPPUNIT_TEST(SkipList_RCU_GPB_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPB_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPB_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_less)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_less)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_RCU_GPT_less)
+            CPPUNIT_TEST(SkipList_RCU_GPT_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPT_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPT_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_less)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_less)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_RCU_SHB_less)
+            CPPUNIT_TEST(SkipList_RCU_SHB_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHB_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHB_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_less)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_less)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_RCU_SHT_less)
+            CPPUNIT_TEST(SkipList_RCU_SHT_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHT_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHT_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_less)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_less)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmpless_stat)
+
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+
+} // namespace map
+
+#endif // #ifndef __CDSTEST_HDR_SKIPLIST_MAP_RCU_H
diff --git a/tests/test-hdr/map/hdr_skiplist_map_rcu_gpb.cpp b/tests/test-hdr/map/hdr_skiplist_map_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..a2e4749
--- /dev/null
@@ -0,0 +1,317 @@
+//$$CDS-header$$
+
+#include "map/hdr_skiplist_map_rcu.h"
+
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/skip_list_map_rcu.h>
+
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace map {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_cmp()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_xorshift_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_xorshift_cmp()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_xorshift_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_xorshift_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_turbopas_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_turbopas_cmp()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_turbopas_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_turbopas_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_michaelalloc_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_michaelalloc_cmp()
+    {
+            typedef cc::SkipListMap< rcu_type, key_type, value_type,
+                cc::skip_list::make_traits<
+                    co::compare< cmp >
+                    ,co::item_counter< simple_item_counter >
+                    ,co::allocator< memory::MichaelAllocator<int> >
+                >::type
+            > set;
+            test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPB_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_skiplist_map_rcu_gpi.cpp b/tests/test-hdr/map/hdr_skiplist_map_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..11b963e
--- /dev/null
@@ -0,0 +1,319 @@
+//$$CDS-header$$
+
+#include "map/hdr_skiplist_map_rcu.h"
+
+#include <cds/urcu/general_instant.h>
+#include <cds/container/skip_list_map_rcu.h>
+
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace map {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_cmp()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_xorshift_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_xorshift_cmp()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_xorshift_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_xorshift_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_turbopas_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_turbopas_cmp()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_turbopas_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_turbopas_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_michaelalloc_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_michaelalloc_cmp()
+    {
+            typedef cc::SkipListMap< rcu_type, key_type, value_type,
+                cc::skip_list::make_traits<
+                    co::compare< cmp >
+                    ,co::item_counter< simple_item_counter >
+                    ,co::allocator< memory::MichaelAllocator<int> >
+                >::type
+            > set;
+            test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPI_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace map
+
+CPPUNIT_TEST_SUITE_REGISTRATION(map::SkipListMapRCUHdrTest);
diff --git a/tests/test-hdr/map/hdr_skiplist_map_rcu_gpt.cpp b/tests/test-hdr/map/hdr_skiplist_map_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..524a3ee
--- /dev/null
@@ -0,0 +1,317 @@
+//$$CDS-header$$
+
+#include "map/hdr_skiplist_map_rcu.h"
+
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/skip_list_map_rcu.h>
+
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace map {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_cmp()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_xorshift_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_xorshift_cmp()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_xorshift_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_xorshift_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_turbopas_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_turbopas_cmp()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_turbopas_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_turbopas_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_michaelalloc_less()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_michaelalloc_cmp()
+    {
+            typedef cc::SkipListMap< rcu_type, key_type, value_type,
+                cc::skip_list::make_traits<
+                    co::compare< cmp >
+                    ,co::item_counter< simple_item_counter >
+                    ,co::allocator< memory::MichaelAllocator<int> >
+                >::type
+            > set;
+            test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_GPT_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_skiplist_map_rcu_shb.cpp b/tests/test-hdr/map/hdr_skiplist_map_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..f857f45
--- /dev/null
@@ -0,0 +1,368 @@
+//$$CDS-header$$
+
+#include "map/hdr_skiplist_map_rcu.h"
+
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/skip_list_map_rcu.h>
+
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace map {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+    }
+#endif
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_xorshift_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_xorshift_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_xorshift_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_xorshift_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_xorshift_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_xorshift_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_turbopas_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_turbopas_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_turbopas_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_turbopas_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_turbopas_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_turbopas_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_michaelalloc_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_michaelalloc_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_michaelalloc_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_michaelalloc_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_michaelalloc_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHB_michaelalloc_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_skiplist_map_rcu_sht.cpp b/tests/test-hdr/map/hdr_skiplist_map_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..784dea0
--- /dev/null
@@ -0,0 +1,368 @@
+//$$CDS-header$$
+
+#include "map/hdr_skiplist_map_rcu.h"
+
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/skip_list_map_rcu.h>
+
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace map {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+    }
+#endif
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_xorshift_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_xorshift_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_xorshift_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_xorshift_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_xorshift_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_xorshift_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_turbopas_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_turbopas_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_turbopas_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_turbopas_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_turbopas_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_turbopas_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_michaelalloc_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_michaelalloc_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_michaelalloc_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_michaelalloc_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_michaelalloc_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListMapRCUHdrTest::SkipList_RCU_SHT_michaelalloc_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListMap< rcu_type, key_type, value_type,
+            cc::skip_list::make_traits<
+                co::less< less >
+                ,co::compare< cmp >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_splitlist_map_hp.cpp b/tests/test-hdr/map/hdr_splitlist_map_hp.cpp
new file mode 100644 (file)
index 0000000..6e69f55
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/michael_list_hp.h>
+#include <cds/container/split_list_map.h>
+
+namespace map {
+
+    namespace {
+        struct HP_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct HP_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct HP_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_HP_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HP, key_type, value_type, HP_cmp_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HP,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_HP_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HP, key_type, value_type, HP_less_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HP,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_HP_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HP, key_type, value_type, HP_cmpmix_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HP,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_hrc.cpp b/tests/test-hdr/map/hdr_splitlist_map_hrc.cpp
new file mode 100644 (file)
index 0000000..066dde7
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/michael_list_hrc.h>
+#include <cds/container/split_list_map.h>
+
+namespace map {
+
+    namespace {
+        struct HRC_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct HRC_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct HRC_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_HRC_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HRC, key_type, value_type, HRC_cmp_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HRC,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_HRC_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HRC, key_type, value_type, HRC_less_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HRC,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_HRC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HRC, key_type, value_type, HRC_cmpmix_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HRC,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_lazy_hp.cpp b/tests/test-hdr/map/hdr_splitlist_map_lazy_hp.cpp
new file mode 100644 (file)
index 0000000..7803fa7
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/lazy_list_hp.h>
+#include <cds/container/split_list_map.h>
+
+namespace map {
+
+    namespace {
+        struct HP_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct HP_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct HP_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_Lazy_HP_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HP, key_type, value_type, HP_cmp_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HP,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_HP_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HP, key_type, value_type, HP_less_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HP,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_HP_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HP, key_type, value_type, HP_cmpmix_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HP,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_lazy_hrc.cpp b/tests/test-hdr/map/hdr_splitlist_map_lazy_hrc.cpp
new file mode 100644 (file)
index 0000000..7da2ec4
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/lazy_list_hrc.h>
+#include <cds/container/split_list_map.h>
+
+namespace map {
+
+    namespace {
+        struct HRC_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct HRC_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct HRC_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_Lazy_HRC_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HRC, key_type, value_type, HRC_cmp_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HRC,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_HRC_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HRC, key_type, value_type, HRC_less_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HRC,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_HRC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::HRC, key_type, value_type, HRC_cmpmix_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::HRC,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_lazy_nogc.cpp b/tests/test-hdr/map/hdr_splitlist_map_lazy_nogc.cpp
new file mode 100644 (file)
index 0000000..2da207a
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/lazy_list_nogc.h>
+#include <cds/container/split_list_map_nogc.h>
+
+namespace map {
+
+    namespace {
+        struct nogc_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct nogc_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent   memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct nogc_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_Lazy_nogc_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::nogc, key_type, value_type, nogc_cmp_traits > map_type;
+        test_int_nogc< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::nogc,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_nogc_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::nogc, key_type, value_type, nogc_less_traits > map_type;
+        test_int_nogc< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::nogc,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_nogc_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::nogc, key_type, value_type, nogc_cmpmix_traits > map_type;
+        test_int_nogc< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::nogc,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_lazy_ptb.cpp b/tests/test-hdr/map/hdr_splitlist_map_lazy_ptb.cpp
new file mode 100644 (file)
index 0000000..7ad4b28
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/lazy_list_ptb.h>
+#include <cds/container/split_list_map.h>
+
+namespace map {
+
+    namespace {
+        struct PTB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct PTB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct PTB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_Lazy_PTB_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::PTB, key_type, value_type, PTB_cmp_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::PTB,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_PTB_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::PTB, key_type, value_type, PTB_less_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::PTB,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_PTB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::PTB, key_type, value_type, PTB_cmpmix_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::PTB,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpb.cpp b/tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..3d0575e
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/split_list_map_rcu.h>
+
+namespace map {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >  rcu_type;
+
+        struct RCU_GPB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct RCU_GPB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct RCU_GPB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_GPB_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPB_cmp_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_GPB_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPB_less_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_GPB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPB_cmpmix_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpi.cpp b/tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..6c7b5cc
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/split_list_map_rcu.h>
+
+namespace map {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> >  rcu_type;
+
+        struct RCU_GPI_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct RCU_GPI_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct RCU_GPI_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_GPI_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPI_cmp_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_GPI_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPI_less_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_GPI_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPI_cmpmix_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpt.cpp b/tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..c3ed26e
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/split_list_map_rcu.h>
+
+namespace map {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> >  rcu_type;
+
+        struct RCU_GPT_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct RCU_GPT_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct RCU_GPT_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_GPT_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPT_cmp_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_GPT_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPT_less_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_GPT_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPT_cmpmix_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_shb.cpp b/tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..f6199d5
--- /dev/null
@@ -0,0 +1,140 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/split_list_map_rcu.h>
+
+namespace map {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> >  rcu_type;
+
+        struct RCU_SHB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct RCU_SHB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct RCU_SHB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+#endif
+
+    void HashMapHdrTest::Split_Lazy_RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHB_cmp_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHB_less_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHB_cmpmix_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_sht.cpp b/tests/test-hdr/map/hdr_splitlist_map_lazy_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..8cf3320
--- /dev/null
@@ -0,0 +1,140 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/split_list_map_rcu.h>
+
+namespace map {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> >  rcu_type;
+
+        struct RCU_SHT_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct RCU_SHT_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct RCU_SHT_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+#endif
+
+    void HashMapHdrTest::Split_Lazy_RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHT_cmp_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHT_less_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Split_Lazy_RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHT_cmpmix_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_splitlist_map_nogc.cpp b/tests/test-hdr/map/hdr_splitlist_map_nogc.cpp
new file mode 100644 (file)
index 0000000..537893f
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/michael_list_nogc.h>
+#include <cds/container/split_list_map_nogc.h>
+
+namespace map {
+
+    namespace {
+        struct nogc_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct nogc_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct nogc_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_nogc_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::nogc, key_type, value_type, nogc_cmp_traits > map_type;
+        test_int_nogc< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::nogc,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_nogc_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::nogc, key_type, value_type, nogc_less_traits > map_type;
+        test_int_nogc< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::nogc,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_nogc_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::nogc, key_type, value_type, nogc_cmpmix_traits > map_type;
+        test_int_nogc< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::nogc,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int_nogc< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_ptb.cpp b/tests/test-hdr/map/hdr_splitlist_map_ptb.cpp
new file mode 100644 (file)
index 0000000..a09ae3c
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/container/michael_list_ptb.h>
+#include <cds/container/split_list_map.h>
+
+namespace map {
+
+    namespace {
+        struct PTB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct PTB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct PTB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_PTB_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::PTB, key_type, value_type, PTB_cmp_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::PTB,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_PTB_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::PTB, key_type, value_type, PTB_less_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::PTB,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_PTB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< cds::gc::PTB, key_type, value_type, PTB_cmpmix_traits > map_type;
+        test_int< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< cds::gc::PTB,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_int< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_rcu_gpb.cpp b/tests/test-hdr/map/hdr_splitlist_map_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..e90aa0a
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/split_list_map_rcu.h>
+
+namespace map {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >  rcu_type;
+
+        struct RCU_GPB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct RCU_GPB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct RCU_GPB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_RCU_GPB_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPB_cmp_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_RCU_GPB_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPB_less_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_RCU_GPB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPB_cmpmix_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_rcu_gpi.cpp b/tests/test-hdr/map/hdr_splitlist_map_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..239073a
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/split_list_map_rcu.h>
+
+namespace map {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> >  rcu_type;
+
+        struct RCU_GPI_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct RCU_GPI_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct RCU_GPI_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_RCU_GPI_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPI_cmp_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_RCU_GPI_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPI_less_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_RCU_GPI_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPI_cmpmix_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_rcu_gpt.cpp b/tests/test-hdr/map/hdr_splitlist_map_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..0272e02
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/split_list_map_rcu.h>
+
+namespace map {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> >  rcu_type;
+
+        struct RCU_GPT_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct RCU_GPT_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct RCU_GPT_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+
+    void HashMapHdrTest::Split_RCU_GPT_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPT_cmp_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_RCU_GPT_less()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPT_less_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+    void HashMapHdrTest::Split_RCU_GPT_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_GPT_cmpmix_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+    }
+
+
+} // namespace map
+
diff --git a/tests/test-hdr/map/hdr_splitlist_map_rcu_shb.cpp b/tests/test-hdr/map/hdr_splitlist_map_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..51dbe24
--- /dev/null
@@ -0,0 +1,140 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/split_list_map_rcu.h>
+
+namespace map {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> >  rcu_type;
+
+        struct RCU_SHB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct RCU_SHB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct RCU_SHB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+#endif
+
+    void HashMapHdrTest::Split_RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHB_cmp_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Split_RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHB_less_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Split_RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHB_cmpmix_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_splitlist_map_rcu_sht.cpp b/tests/test-hdr/map/hdr_splitlist_map_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..6765662
--- /dev/null
@@ -0,0 +1,140 @@
+//$$CDS-header$$
+
+#include "map/hdr_map.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/split_list_map_rcu.h>
+
+namespace map {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> >  rcu_type;
+
+        struct RCU_SHT_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+            };
+        };
+
+        struct RCU_SHT_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = true };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::less   less;
+            };
+        };
+
+        struct RCU_SHT_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashMapHdrTest::hash_int            hash;
+            typedef HashMapHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashMapHdrTest::cmp   compare;
+                typedef std::less<HashMapHdrTest::key_type>     less;
+            };
+        };
+    }
+#endif
+
+    void HashMapHdrTest::Split_RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHT_cmp_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Split_RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHT_less_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+    void HashMapHdrTest::Split_RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListMap< rcu_type, key_type, value_type, RCU_SHT_cmpmix_traits > map_type;
+        test_rcu< map_type >();
+
+        // option-based version
+        typedef cc::SplitListMap< rcu_type,
+            key_type,
+            value_type,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                    cc::opt::less< std::less<key_type> >
+                        ,cc::opt::compare< cmp >
+                    >::type
+                >
+            >::type
+        > opt_map;
+        test_rcu< opt_map >();
+#endif
+    }
+
+} // namespace map
diff --git a/tests/test-hdr/map/hdr_striped_hashmap_boost_flat_map.cpp b/tests/test-hdr/map/hdr_striped_hashmap_boost_flat_map.cpp
new file mode 100644 (file)
index 0000000..842c500
--- /dev/null
@@ -0,0 +1,169 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace map {
+    void StripedMapHdrTest::Striped_boost_flat_map()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::flat_map you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_map/boost_flat_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef boost::container::flat_map<StripedMapHdrTest::key_type, StripedMapHdrTest::value_type, StripedMapHdrTest::less > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& m, iterator /*itInsert*/, iterator itWhat )
+            {
+                m.insert( *itWhat );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Striped_boost_flat_map()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            ,co::mutex_policy< cc::striped_set::striping<cds::lock::Spin> >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+
+    }
+
+}   // namespace map
+
+/*
+#else
+    namespace map {
+        void StripedMapHdrTest::Striped_boost_flat_map()
+        {
+            CPPUNIT_MESSAGE( "Skipped; to use boost::container::flat_map is not compatible with MS VC++ 11" );
+        }
+    }
+#endif
+*/
+
+#else // BOOST_VERSION < 104800
+
+namespace map {
+    void StripedMapHdrTest::Striped_boost_flat_map()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::flat_map you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/map/hdr_striped_hashmap_boost_list.cpp b/tests/test-hdr/map/hdr_striped_hashmap_boost_list.cpp
new file mode 100644 (file)
index 0000000..a33e1fb
--- /dev/null
@@ -0,0 +1,154 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace map {
+    void StripedMapHdrTest::Striped_boost_list()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::list you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_map/boost_list.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef boost::container::list< StripedMapHdrTest::pair_type > sequence_t;
+
+        struct my_copy_policy {
+            typedef sequence_t::iterator iterator;
+
+            void operator()( sequence_t& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::make_pair(itWhat->first, itWhat->second ));
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Striped_boost_list()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   map_cmp;
+        test_striped2< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped2< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped2< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            ,co::mutex_policy< cc::striped_set::striping<cds::lock::Spin> >
+        >   map_spin;
+        test_striped2< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedMap< sequence_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   pair_type_less_resizing_lf;
+            pair_type_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(8) );
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   map_less_resizing_lf16;
+        test_striped2< map_less_resizing_lf16 >();
+
+        {
+            CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+            typedef cc::StripedMap< sequence_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   map_less_resizing_sbt16;
+        test_striped2< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+
+    }
+
+}   // namespace map
+
+#else // BOOST_VERSION < 104800
+
+namespace map {
+    void StripedMapHdrTest::Striped_boost_list()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::list you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/map/hdr_striped_hashmap_boost_map.cpp b/tests/test-hdr/map/hdr_striped_hashmap_boost_map.cpp
new file mode 100644 (file)
index 0000000..a808999
--- /dev/null
@@ -0,0 +1,157 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace map {
+    void StripedMapHdrTest::Striped_boost_map()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::map you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_map/boost_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef boost::container::map<StripedMapHdrTest::key_type, StripedMapHdrTest::value_type, StripedMapHdrTest::less > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& map, iterator itWhat )
+            {
+                map.insert( *itWhat );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Striped_boost_map()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            ,co::mutex_policy< cc::striped_set::striping<cds::lock::Spin> >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace map
+
+#else // BOOST_VERSION < 104800
+
+namespace map {
+    void StripedMapHdrTest::Striped_boost_map()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::map you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/map/hdr_striped_hashmap_boost_unordered_map.cpp b/tests/test-hdr/map/hdr_striped_hashmap_boost_unordered_map.cpp
new file mode 100644 (file)
index 0000000..92bfba9
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+#include <cds/container/striped_map/boost_unordered_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef boost::unordered_map< StripedMapHdrTest::key_type, StripedMapHdrTest::value_type > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& m, iterator itInsert, iterator itWhat )
+            {
+                m.insert( std::make_pair(itWhat->first, itWhat->second ) );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Striped_boost_unordered_map()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            ,co::mutex_policy< cc::striped_set::striping<cds::lock::Spin> >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace map
diff --git a/tests/test-hdr/map/hdr_striped_hashmap_hashmap_std.cpp b/tests/test-hdr/map/hdr_striped_hashmap_hashmap_std.cpp
new file mode 100644 (file)
index 0000000..aa1e582
--- /dev/null
@@ -0,0 +1,138 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+#include <cds/container/striped_map/std_hash_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+#if !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600)
+
+namespace map {
+
+    namespace {
+        typedef std::unordered_map< StripedMapHdrTest::key_type, StripedMapHdrTest::value_type > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& m, iterator itInsert, iterator itWhat )
+            {
+                m.insert( std::make_pair(itWhat->first, itWhat->second ) );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Striped_hashmap()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            ,co::mutex_policy< cc::striped_set::striping<cds::lock::Spin> >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace map
+
+#endif // #if !(CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION < 1600)
diff --git a/tests/test-hdr/map/hdr_striped_hashmap_hashmap_vc.cpp b/tests/test-hdr/map/hdr_striped_hashmap_hashmap_vc.cpp
new file mode 100644 (file)
index 0000000..d198454
--- /dev/null
@@ -0,0 +1,138 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+#include <cds/container/striped_map/std_hash_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600
+
+namespace map {
+
+    namespace {
+        typedef stdext::hash_map< StripedMapHdrTest::key_type, StripedMapHdrTest::value_type > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& m, iterator itInsert, iterator itWhat )
+            {
+                m.insert( std::make_pair(itWhat->first, itWhat->second ) );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Striped_hashmap()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            ,co::mutex_policy< cc::striped_set::striping<cds::lock::Spin> >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace map
+
+#endif // #if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION < 1600
diff --git a/tests/test-hdr/map/hdr_striped_hashmap_list.cpp b/tests/test-hdr/map/hdr_striped_hashmap_list.cpp
new file mode 100644 (file)
index 0000000..b71ede2
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+#include <cds/container/striped_map/std_list.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef std::list<StripedMapHdrTest::pair_type> sequence_t;
+
+        struct my_copy_policy {
+            typedef sequence_t::iterator iterator;
+
+            void operator()( sequence_t& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::make_pair(itWhat->first, itWhat->second ));
+            }
+
+        };
+    }
+
+    void StripedMapHdrTest::Striped_list()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   map_cmp;
+        test_striped2< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped2< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped2< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            ,co::mutex_policy< cc::striped_set::striping<cds::lock::Spin> >
+        >   map_spin;
+        test_striped2< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedMap< sequence_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   pair_type_less_resizing_lf;
+            pair_type_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(8) );
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   map_less_resizing_lf16;
+        test_striped2< map_less_resizing_lf16 >();
+
+        {
+            CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+            typedef cc::StripedMap< sequence_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   map_less_resizing_sbt16;
+        test_striped2< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace map
diff --git a/tests/test-hdr/map/hdr_striped_hashmap_map.cpp b/tests/test-hdr/map/hdr_striped_hashmap_map.cpp
new file mode 100644 (file)
index 0000000..1a3e479
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+#include <cds/container/striped_map/std_map.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef std::map<StripedMapHdrTest::key_type, StripedMapHdrTest::value_type, StripedMapHdrTest::less > map_t;
+
+        struct my_copy_policy {
+            typedef map_t::iterator iterator;
+
+            void operator()( map_t& m, iterator /*itInsert*/, iterator itWhat )
+            {
+                m.insert( *itWhat );
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Striped_map()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   map_cmp;
+        test_striped< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            ,co::mutex_policy< cc::striped_set::striping<cds::lock::Spin> >
+        >   map_spin;
+        test_striped< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   map_less_resizing_lf;
+            map_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   map_less_resizing_lf16;
+        test_striped< map_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedMap< map_t
+                , co::hash< hash_int >
+                , co::compare< cmp >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   map_less_resizing_sbt16;
+        test_striped< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedMap< map_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace map
diff --git a/tests/test-hdr/map/hdr_striped_hashmap_slist.cpp b/tests/test-hdr/map/hdr_striped_hashmap_slist.cpp
new file mode 100644 (file)
index 0000000..170faaa
--- /dev/null
@@ -0,0 +1,153 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace map {
+    void StripedMapHdrTest::Striped_slist()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::slist you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_map/boost_slist.h>
+#include <cds/container/striped_map.h>
+#include <cds/lock/spinlock.h>
+
+namespace map {
+
+    namespace {
+        typedef boost::container::slist<StripedMapHdrTest::pair_type> sequence_t;
+
+        struct my_copy_policy {
+            typedef sequence_t::iterator iterator;
+
+            void operator()( sequence_t& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert_after( itInsert, StripedMapHdrTest::pair_type( std::make_pair(itWhat->first, itWhat->second )));
+            }
+        };
+    }
+
+    void StripedMapHdrTest::Striped_slist()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   map_cmp;
+        test_striped2< map_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+        >   map_less;
+        test_striped2< map_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::less< less >
+        >   map_cmpmix;
+        test_striped2< map_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            ,co::mutex_policy< cc::striped_set::striping<cds::lock::Spin> >
+        >   map_spin;
+        test_striped2< map_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedMap< sequence_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   pair_type_less_resizing_lf;
+            pair_type_less_resizing_lf m(30, cc::striped_set::load_factor_resizing<0>(8) );
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   map_less_resizing_lf16;
+        test_striped2< map_less_resizing_lf16 >();
+
+        {
+            CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+            typedef cc::StripedMap< sequence_t
+                , co::hash< hash_int >
+                , co::less< less >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   map_less_resizing_sbt;
+            map_less_resizing_sbt m(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(m);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   map_less_resizing_sbt16;
+        test_striped2< map_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::less< less >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy_item");
+        typedef cc::StripedMap< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace map
+
+#else // BOOST_VERSION < 104800
+
+namespace map {
+    void StripedMapHdrTest::Striped_slist()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::slist you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/map/hdr_striped_map.h b/tests/test-hdr/map/hdr_striped_map.h
new file mode 100644 (file)
index 0000000..30098f8
--- /dev/null
@@ -0,0 +1,595 @@
+//$$CDS-header$$
+
+#ifndef __CDSTEST_HDR_STRIPED_MAP_H
+#define __CDSTEST_HDR_STRIPED_MAP_H
+#include "size_check.h"
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/os/timer.h>
+#include <cds/opt/hash.h>
+#include <cds/ref.h>
+#include <algorithm>    // random_shuffle
+
+namespace cds { namespace container {}}
+
+namespace map {
+    using misc::check_size;
+
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+    class StripedMapHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        typedef int key_type;
+
+        struct value_type {
+            int m_val;
+
+            value_type()
+                : m_val(0)
+            {}
+
+            value_type( int n )
+                : m_val( n )
+            {}
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            value_type( value_type&& v )
+                : m_val( v.m_val )
+            {}
+
+            value_type( value_type const& v )
+                : m_val( v.m_val )
+            {}
+
+            value_type& operator=( value_type const& v )
+            {
+                m_val = v.m_val;
+                return *this;
+            }
+#endif
+        };
+
+        typedef std::pair<key_type const, value_type> pair_type;
+
+        struct less
+        {
+            bool operator ()(int v1, int v2 ) const
+            {
+                return v1 < v2;
+            }
+        };
+
+        struct cmp {
+            int operator ()(int v1, int v2 ) const
+            {
+                if ( v1 < v2 )
+                    return -1;
+                return v1 > v2 ? 1 : 0;
+            }
+        };
+
+        struct equal {
+            bool operator ()(int v1, int v2 ) const
+            {
+                return v1 == v2;
+            }
+        };
+
+        struct hash_int {
+            size_t operator()( int i ) const
+            {
+                return co::v::hash<int>()( i );
+            }
+        };
+
+        struct simple_item_counter {
+            size_t  m_nCount;
+
+            simple_item_counter()
+                : m_nCount(0)
+            {}
+
+            size_t operator ++()
+            {
+                return ++m_nCount;
+            }
+
+            size_t operator --()
+            {
+                return --m_nCount;
+            }
+
+            void reset()
+            {
+                m_nCount = 0;
+            }
+
+            operator size_t() const
+            {
+                return m_nCount;
+            }
+        };
+
+        template <typename Map>
+        struct insert_functor
+        {
+            typedef typename Map::value_type pair_type;
+
+            // insert ftor
+            void operator()( pair_type& item )
+            {
+                item.second.m_val = item.first * 3;
+            }
+
+            // ensure ftor
+            void operator()( bool bNew, pair_type& item )
+            {
+                if ( bNew )
+                    item.second.m_val = item.first * 2;
+                else
+                    item.second.m_val = item.first * 5;
+            }
+        };
+
+        struct check_value {
+            int     m_nExpected;
+
+            check_value( int nExpected )
+                : m_nExpected( nExpected )
+            {}
+
+            template <typename T>
+            void operator ()( T& pair )
+            {
+                CPPUNIT_ASSERT_CURRENT( pair.second.m_val == m_nExpected );
+            }
+            template <typename T, typename Q>
+            void operator ()( T& pair, Q )
+            {
+                CPPUNIT_ASSERT_CURRENT( pair.second.m_val == m_nExpected );
+            }
+        };
+
+        struct extract_functor
+        {
+            int *   m_pVal;
+            void operator()( pair_type const& val )
+            {
+                *m_pVal = val.second.m_val;
+            }
+        };
+
+        template <class Map>
+        void test_int_with( Map& m )
+        {
+            std::pair<bool, bool> ensureResult;
+
+            // insert
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+            CPPUNIT_ASSERT( !m.find(25) );
+            CPPUNIT_ASSERT( m.insert( 25 ) )    ;   // value = 0
+            CPPUNIT_ASSERT( m.find(25) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 1 ));
+            CPPUNIT_ASSERT( m.find(25) );
+
+            CPPUNIT_ASSERT( !m.insert( 25 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 1 ));
+
+            CPPUNIT_ASSERT( !m.find(10) );
+            CPPUNIT_ASSERT( m.insert( 10, 10 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+            CPPUNIT_ASSERT( m.find(10) );
+
+            CPPUNIT_ASSERT( !m.insert( 10, 20 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+
+            CPPUNIT_ASSERT( !m.find(30) );
+            CPPUNIT_ASSERT( m.insert_key( 30, insert_functor<Map>() ) )    ; // value = 90
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( m.find(30) );
+
+            CPPUNIT_ASSERT( !m.insert_key( 10, insert_functor<Map>() ) );
+            CPPUNIT_ASSERT( !m.insert_key( 25, insert_functor<Map>() ) );
+            CPPUNIT_ASSERT( !m.insert_key( 30, insert_functor<Map>() ) );
+
+            // ensure (new key)
+            CPPUNIT_ASSERT( !m.find(27) );
+            ensureResult = m.ensure( 27, insert_functor<Map>() ) ;   // value = 54
+            CPPUNIT_ASSERT( ensureResult.first );
+            CPPUNIT_ASSERT( ensureResult.second );
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.find(27) );
+
+            // find test
+            check_value chk(10);
+            CPPUNIT_ASSERT( m.find( 10, cds::ref(chk) ));
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find( 25, boost::ref(chk) ));
+            chk.m_nExpected = 90;
+            CPPUNIT_ASSERT( m.find( 30, boost::ref(chk) ));
+            chk.m_nExpected = 54;
+            CPPUNIT_ASSERT( m.find( 27, boost::ref(chk) ));
+
+            ensureResult = m.ensure( 10, insert_functor<Map>() ) ;   // value = 50
+            CPPUNIT_ASSERT( ensureResult.first );
+            CPPUNIT_ASSERT( !ensureResult.second );
+            chk.m_nExpected = 50;
+            CPPUNIT_ASSERT( m.find( 10, boost::ref(chk) ));
+
+            // erase test
+            CPPUNIT_ASSERT( !m.find(100) );
+            CPPUNIT_ASSERT( !m.erase( 100 )) ;  // not found
+
+            CPPUNIT_ASSERT( m.find(25) );
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.erase( 25 ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( !m.find(25) );
+            CPPUNIT_ASSERT( !m.erase( 25 ));
+
+            CPPUNIT_ASSERT( !m.find(258) );
+            CPPUNIT_ASSERT( m.insert(258))
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.find(258) );
+            CPPUNIT_ASSERT( m.erase( 258 ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( !m.find(258) );
+            CPPUNIT_ASSERT( !m.erase( 258 ));
+
+            int nVal;
+            extract_functor ext;
+            ext.m_pVal = &nVal;
+
+            CPPUNIT_ASSERT( !m.find(29) );
+            CPPUNIT_ASSERT( m.insert(29, 290));
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.erase( 29, boost::ref(ext)));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( nVal == 290 );
+            nVal = -1;
+            CPPUNIT_ASSERT( !m.erase( 29, boost::ref(ext)));
+            CPPUNIT_ASSERT( nVal == -1 );
+
+            CPPUNIT_ASSERT( m.erase( 30, boost::ref(ext)));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+            CPPUNIT_ASSERT( nVal == 90 );
+            nVal = -1;
+            CPPUNIT_ASSERT( !m.erase( 30, boost::ref(ext)));
+            CPPUNIT_ASSERT( nVal == -1 );
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            CPPUNIT_ASSERT( m.emplace(126) ) ; // key = 126, val = 0
+            CPPUNIT_ASSERT( m.emplace(137, 731))    ;   // key = 137, val = 731
+            CPPUNIT_ASSERT( m.emplace( 149, value_type(941) ))   ;   // key = 149, val = 941
+
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find( 126, cds::ref(chk) ));
+            chk.m_nExpected = 731;
+            CPPUNIT_ASSERT( m.find( 137, cds::ref(chk) ));
+            chk.m_nExpected = 941;
+            CPPUNIT_ASSERT( m.find( 149, cds::ref(chk) ));
+
+            CPPUNIT_ASSERT( !m.emplace(126, 621)) ; // already in map
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find( 126, cds::ref(chk) ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+#       endif
+        }
+
+        template <class Map>
+        void test_iter( Map& s)
+        {
+            typedef typename Map::iterator          iterator;
+            typedef typename Map::const_iterator    const_iterator;
+
+            const int nMaxCount = 500;
+            for ( int i = 0; i < nMaxCount; ++i ) {
+                CPPUNIT_ASSERT( s.insert( i, i * 2 ));
+            }
+
+            int nCount = 0;
+            for ( iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( it->first * 2 == it->second.m_val );
+                CPPUNIT_ASSERT( (*it).first * 2 == (*it).second.m_val );
+                it->second.m_val = it->first;
+                ++nCount;
+            }
+            CPPUNIT_ASSERT( nCount == nMaxCount );
+
+            Map const& refSet = s;
+            nCount = 0;
+            for ( const_iterator it = refSet.begin(), itEnd = refSet.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( it->first == it->second.m_val );
+                CPPUNIT_ASSERT( (*it).first == (*it).second.m_val );
+                ++nCount;
+            }
+            CPPUNIT_ASSERT( nCount == nMaxCount );
+        }
+
+        template <class Map>
+        void test_striped()
+        {
+            Map m( 30 );
+            CPPUNIT_ASSERT( m.bucket_count() == 32 );
+            CPPUNIT_ASSERT( m.lock_count() == 32 );
+
+            test_striped_with(m);
+        }
+
+        template <class Map>
+        void test_striped_with(Map& m)
+        {
+            cds::OS::Timer    timer;
+
+            test_int_with( m );
+
+            // Iterators is not yet supported
+            //m.clear();
+            //CPPUNIT_ASSERT( m.empty() );
+            //CPPUNIT_ASSERT( check_size( m, 0 ));
+            //test_iter(m);
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+            // Resizing test
+            for ( int i = 0; i < 40000; i++ ) {
+                m.insert( i );
+            }
+
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+        }
+
+        //*******************************************
+        // If erase_with && find_with are supported
+        template <class Map>
+        void test_int_with2( Map& m )
+        {
+            std::pair<bool, bool> ensureResult;
+
+            // insert
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+            CPPUNIT_ASSERT( !m.find(25) );
+            CPPUNIT_ASSERT( m.insert( 25 ) )    ;   // value = 0
+            CPPUNIT_ASSERT( m.find(25) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 1 ));
+            CPPUNIT_ASSERT( m.find(25) );
+
+            CPPUNIT_ASSERT( !m.insert( 25 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 1 ));
+
+            CPPUNIT_ASSERT( !m.find_with(10, less()) );
+            CPPUNIT_ASSERT( m.insert( 10, 10 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+            CPPUNIT_ASSERT( m.find_with(10, less()) );
+
+            CPPUNIT_ASSERT( !m.insert( 10, 20 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+
+            CPPUNIT_ASSERT( !m.find(30) );
+            CPPUNIT_ASSERT( m.insert_key( 30, insert_functor<Map>() ) )    ; // value = 90
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( m.find(30) );
+
+            CPPUNIT_ASSERT( !m.insert_key( 10, insert_functor<Map>() ) );
+            CPPUNIT_ASSERT( !m.insert_key( 25, insert_functor<Map>() ) );
+            CPPUNIT_ASSERT( !m.insert_key( 30, insert_functor<Map>() ) );
+
+            // ensure (new key)
+            CPPUNIT_ASSERT( !m.find(27) );
+            ensureResult = m.ensure( 27, insert_functor<Map>() ) ;   // value = 54
+            CPPUNIT_ASSERT( ensureResult.first );
+            CPPUNIT_ASSERT( ensureResult.second );
+            CPPUNIT_ASSERT( m.find(27) );
+
+            // find test
+            check_value chk(10);
+            CPPUNIT_ASSERT( m.find( 10, cds::ref(chk) ));
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find_with( 25, less(), boost::ref(chk) ));
+            chk.m_nExpected = 90;
+            CPPUNIT_ASSERT( m.find( 30, boost::ref(chk) ));
+            chk.m_nExpected = 54;
+            CPPUNIT_ASSERT( m.find( 27, boost::ref(chk) ));
+
+            ensureResult = m.ensure( 10, insert_functor<Map>() ) ;   // value = 50
+            CPPUNIT_ASSERT( ensureResult.first );
+            CPPUNIT_ASSERT( !ensureResult.second );
+            chk.m_nExpected = 50;
+            CPPUNIT_ASSERT( m.find( 10, boost::ref(chk) ));
+
+            // erase test
+            CPPUNIT_ASSERT( !m.find(100) );
+            CPPUNIT_ASSERT( !m.erase( 100 )) ;  // not found
+
+            CPPUNIT_ASSERT( m.find(25) );
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.erase( 25 ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( !m.find(25) );
+            CPPUNIT_ASSERT( !m.erase( 25 ));
+
+            CPPUNIT_ASSERT( !m.find(258) );
+            CPPUNIT_ASSERT( m.insert(258))
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.find_with(258, less()) );
+            CPPUNIT_ASSERT( m.erase_with( 258, less() ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( !m.find(258) );
+            CPPUNIT_ASSERT( !m.erase_with( 258, less() ));
+
+            int nVal;
+            extract_functor ext;
+            ext.m_pVal = &nVal;
+
+            CPPUNIT_ASSERT( !m.find(29) );
+            CPPUNIT_ASSERT( m.insert(29, 290))
+            CPPUNIT_ASSERT( m.erase_with( 29, less(), boost::ref(ext)));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( nVal == 290 );
+            nVal = -1;
+            CPPUNIT_ASSERT( !m.erase_with( 29, less(), boost::ref(ext)));
+            CPPUNIT_ASSERT( nVal == -1 );
+
+            CPPUNIT_ASSERT( m.erase( 30, boost::ref(ext)));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+            CPPUNIT_ASSERT( nVal == 90 );
+            nVal = -1;
+            CPPUNIT_ASSERT( !m.erase( 30, boost::ref(ext)));
+            CPPUNIT_ASSERT( nVal == -1 );
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            CPPUNIT_ASSERT( m.emplace(126) ) ; // key = 126, val = 0
+            CPPUNIT_ASSERT( m.emplace(137, 731))    ;   // key = 137, val = 731
+            CPPUNIT_ASSERT( m.emplace( 149, value_type(941) ))   ;   // key = 149, val = 941
+
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find( 126, cds::ref(chk) ));
+            chk.m_nExpected = 731;
+            CPPUNIT_ASSERT( m.find_with( 137, less(), cds::ref(chk) ));
+            chk.m_nExpected = 941;
+            CPPUNIT_ASSERT( m.find( 149, cds::ref(chk) ));
+
+            CPPUNIT_ASSERT( !m.emplace(126, 621)) ; // already in map
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find( 126, cds::ref(chk) ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+#       endif
+        }
+
+        template <class Map>
+        void test_striped_with2(Map& m)
+        {
+            cds::OS::Timer    timer;
+
+            test_int_with2( m );
+
+            // Iterators is not yet supported
+            //m.clear();
+            //CPPUNIT_ASSERT( m.empty() );
+            //CPPUNIT_ASSERT( check_size( m, 0 ));
+            //test_iter(m);
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+            // Resizing test
+            for ( int i = 0; i < 40000; i++ ) {
+                m.insert( i );
+            }
+
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+        }
+
+#ifndef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+        template <class Map>
+        void test_striped2()
+        {
+            test_striped<Map>();
+        }
+#else
+        template <class Map>
+        void test_striped2()
+        {
+            Map m( 30 );
+            CPPUNIT_ASSERT( m.bucket_count() == 32 );
+            CPPUNIT_ASSERT( m.lock_count() == 32 );
+
+            test_striped_with2(m);
+        }
+#endif
+
+        void Striped_hashmap();
+        void Striped_list();
+        void Striped_map();
+        void Striped_slist();
+        void Striped_boost_list();
+        void Striped_boost_flat_map();
+        void Striped_boost_map();
+        void Striped_boost_unordered_map();
+
+        void Refinable_hashmap();
+        void Refinable_list();
+        void Refinable_map();
+        void Refinable_slist();
+        void Refinable_boost_list();
+        void Refinable_boost_flat_map();
+        void Refinable_boost_map();
+        void Refinable_boost_unordered_map();
+
+        CPPUNIT_TEST_SUITE(StripedMapHdrTest)
+            CPPUNIT_TEST(Striped_hashmap)
+            CPPUNIT_TEST(Striped_list)
+            CPPUNIT_TEST(Striped_map)
+            CPPUNIT_TEST(Striped_slist)
+            CPPUNIT_TEST(Striped_boost_list)
+            CPPUNIT_TEST(Striped_boost_flat_map)
+            CPPUNIT_TEST(Striped_boost_map)
+            CPPUNIT_TEST(Striped_boost_unordered_map)
+
+            CPPUNIT_TEST(Refinable_hashmap)
+            CPPUNIT_TEST(Refinable_list)
+            CPPUNIT_TEST(Refinable_map)
+            CPPUNIT_TEST(Refinable_slist)
+            CPPUNIT_TEST(Refinable_boost_list)
+            CPPUNIT_TEST(Refinable_boost_flat_map)
+            CPPUNIT_TEST(Refinable_boost_map)
+            CPPUNIT_TEST(Refinable_boost_unordered_map)
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+}   // namespace map
+
+#endif // #ifndef __CDSTEST_HDR_STRIPED_MAP_H
diff --git a/tests/test-hdr/map/hdr_striped_map_reg.cpp b/tests/test-hdr/map/hdr_striped_map_reg.cpp
new file mode 100644 (file)
index 0000000..1a72b5f
--- /dev/null
@@ -0,0 +1,5 @@
+//$$CDS-header$$
+
+#include "map/hdr_striped_map.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION(map::StripedMapHdrTest);
diff --git a/tests/test-hdr/map/print_skiplist_stat.h b/tests/test-hdr/map/print_skiplist_stat.h
new file mode 100644 (file)
index 0000000..1f70455
--- /dev/null
@@ -0,0 +1,44 @@
+//$$CDS-header$$
+
+#ifndef __CDS_TESTHDR_MAP_PRINT_SKIPLIST_STAT_H
+#define __CDS_TESTHDR_MAP_PRINT_SKIPLIST_STAT_H
+
+#include "unit/print_skip_list_stat.h"
+
+namespace misc {
+
+    template <typename Stat>
+    struct print_skiplist_stat;
+
+    template <>
+    struct print_skiplist_stat< cds::intrusive::skip_list::stat<> >
+    {
+        template <class Set>
+        std::string operator()( Set const& s, const char * pszHdr )
+        {
+            std::stringstream st;
+            if ( pszHdr ) {
+                st << "\t\t" << pszHdr << "\n"
+                    << s.statistics()
+;
+            }
+            else {
+                st << s.statistics();
+            }
+            return st.str();
+        }
+    };
+
+    template<>
+    struct print_skiplist_stat< cds::intrusive::skip_list::empty_stat >
+    {
+        template <class Set>
+        std::string operator()( Set const& /*s*/, const char * /*pszHdr*/ )
+        {
+            return std::string();
+        }
+    };
+
+}   // namespace misc
+
+#endif // #ifndef __CDS_TESTHDR_MAP_PRINT_SKIPLIST_STAT_H
diff --git a/tests/test-hdr/misc/allocator_test.cpp b/tests/test-hdr/misc/allocator_test.cpp
new file mode 100644 (file)
index 0000000..463ba44
--- /dev/null
@@ -0,0 +1,168 @@
+//$$CDS-header$$
+
+#include "misc/michael_allocator.h"
+#include <cds/os/timer.h>
+#include <cds/details/allocator.h>
+
+#include "cppunit/cppunit_proxy.h"
+
+namespace misc {
+
+    static size_t s_nPassCount = 10;
+    static unsigned long long s_nAllocPerPass = 1024 * 1024 * 1024;
+
+    static size_t s_nConstructCount = 0;
+    static size_t s_nDestructCount = 0;
+
+    class Allocator_test : public CppUnitMini::TestCase
+    {
+        static const size_t s_nArrSizeSize = 64 * 1024;
+        unsigned int    m_arrSize[s_nArrSizeSize];
+
+        template <typename ALLOC>
+        void alloc_free()
+        {
+            ALLOC a;
+
+            for ( size_t nPass = 0; nPass < s_nPassCount; ++nPass ) {
+                unsigned long long nTotalAllocated = 0;
+                size_t nCurIdx = 0;
+                while ( nTotalAllocated < s_nAllocPerPass ) {
+                    size_t nSize = m_arrSize[nCurIdx] + 4;
+                    char * p = a.allocate( nSize, NULL );
+                    CPPUNIT_ASSERT( p != NULL );
+                    memset( p, 0x96, nSize );
+                    nTotalAllocated += nSize;
+                    a.deallocate( p, 1 );
+                    if ( ++nCurIdx > s_nArrSizeSize )
+                        nCurIdx = 0;
+                }
+            }
+        }
+
+        void alloc_free_michael()
+        {
+            std::cout << "\n\tMichael allocator" << std::flush;
+            cds::OS::Timer    timer;
+            alloc_free<MichaelHeap_NoStat<char> >();
+            double fDur = timer.duration();
+            std::cout << "\tduration=" << fDur << std::endl;
+
+            //cds::memory::michael_allocator::statistics st;
+            //s_MichaelAlloc.get_statistics( st );
+        }
+        void alloc_free_std()
+        {
+            std::cout << "\n\tstd::allocator" << std::flush;
+            cds::OS::Timer    timer;
+            alloc_free<std::allocator<char> >();
+            double fDur = timer.duration();
+            std::cout << "\tduration=" << fDur << std::endl;
+        }
+
+        template <typename ALLOC>
+        void alloc_all_free_all()
+        {
+            ALLOC a;
+
+            for ( size_t nPass = 0; nPass < s_nPassCount; ++nPass ) {
+                unsigned long long nTotalAllocated = 0;
+                char * pHead = a.allocate( sizeof(void *), NULL );
+                CPPUNIT_ASSERT( pHead != NULL );
+                char * pCur = pHead;
+                size_t nCurIdx = 0;
+                while ( nTotalAllocated < s_nAllocPerPass ) {
+                    size_t nSize = m_arrSize[nCurIdx] + sizeof(void *);
+                    char * p = a.allocate( nSize, NULL );
+                    CPPUNIT_ASSERT( p != NULL );
+                    memset( p, 0x96, nSize );
+                    *((char **) pCur) = p;
+                    pCur = p;
+                    nTotalAllocated += nSize;
+                    if ( ++nCurIdx > s_nArrSizeSize )
+                        nCurIdx = 0;
+                }
+                *((char **) pCur) = NULL;
+
+                pCur = pHead;
+                while ( pCur != NULL ) {
+                    char * pNext = *((char **) pCur);
+                    a.deallocate( pCur, 0 );
+                    pCur = pNext;
+                }
+            }
+        }
+
+        void alloc_all_free_all_michael()
+        {
+            std::cout << "\n\tMichael allocator" << std::flush;
+            cds::OS::Timer    timer;
+            alloc_all_free_all<MichaelHeap_NoStat<char> >();
+            double fDur = timer.duration();
+            std::cout << "\tduration=" << fDur << std::endl;
+
+            //cds::memory::michael_allocator::statistics st;
+            //s_MichaelAlloc.get_statistics( st );
+        }
+        void alloc_all_free_all_std()
+        {
+            std::cout << "\n\tstd::allocator" << std::flush;
+            cds::OS::Timer    timer;
+            alloc_all_free_all<std::allocator<char> >();
+            double fDur = timer.duration();
+            std::cout << "\tduration=" << fDur << std::endl;
+        }
+
+        struct SimpleStruct
+        {
+            int     n;
+
+            SimpleStruct()
+            {
+                ++s_nConstructCount;
+            }
+
+            ~SimpleStruct()
+            {
+                ++s_nDestructCount;
+            }
+        };
+
+        void test_array()
+        {
+            size_t const nArraySize = 10;
+
+            SimpleStruct * pArr;
+            cds::details::Allocator<SimpleStruct>  a;
+            pArr = a.NewArray( nArraySize );
+            a.Delete( pArr, nArraySize );
+
+            CPPUNIT_ASSERT( s_nConstructCount == nArraySize );
+            CPPUNIT_ASSERT( s_nConstructCount == s_nDestructCount );
+        }
+
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg )
+        {
+            s_nPassCount = cfg.getULong( "PassCount", 10 );
+            s_nAllocPerPass = cfg.getULong( "AllocPerPass", 1024 ) * 1024 * 1024;
+        }
+
+    public:
+        Allocator_test()
+        {
+            CPPUNIT_ASSERT( s_nArrSizeSize == sizeof(m_arrSize) / sizeof(m_arrSize[0]) );
+            for ( size_t i = 0; i < s_nArrSizeSize; ++i )
+                m_arrSize[i] = rand();
+        }
+
+        CPPUNIT_TEST_SUITE(Allocator_test);
+            CPPUNIT_TEST(test_array)
+            CPPUNIT_TEST(alloc_free_michael)
+            CPPUNIT_TEST(alloc_free_std)
+            CPPUNIT_TEST(alloc_all_free_all_michael)
+            CPPUNIT_TEST(alloc_all_free_all_std)
+        CPPUNIT_TEST_SUITE_END();
+    };
+}   // namespace memory
+CPPUNIT_TEST_SUITE_REGISTRATION( misc::Allocator_test );
diff --git a/tests/test-hdr/misc/bitop_st.cpp b/tests/test-hdr/misc/bitop_st.cpp
new file mode 100644 (file)
index 0000000..01d4de7
--- /dev/null
@@ -0,0 +1,85 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+
+#include <cds/int_algo.h>
+#include <cds/os/timer.h>
+
+class bitop_ST : public CppUnitMini::TestCase
+{
+protected:
+    void bitop32()
+    {
+        cds::atomic32u_t    n;
+        n = 0;
+        CPPUNIT_ASSERT_EX( cds::bitop::MSB(n) == 0, "n=" << n );
+        CPPUNIT_ASSERT_EX( cds::bitop::LSB(n) == 0, "n=" << n );
+        CPPUNIT_ASSERT_EX( cds::bitop::SBC(n) == 0, "n=" << n );
+        CPPUNIT_ASSERT_EX( cds::bitop::ZBC(n) == sizeof(n) * 8, "n=" << n );
+
+        int nBit = 1;
+        for ( n = 1; n != 0; n *= 2 ) {
+            CPPUNIT_ASSERT_EX( cds::bitop::MSB(n) == nBit, "n=" << n );
+            CPPUNIT_ASSERT_EX( cds::bitop::LSB(n) == nBit, "n=" << n );
+            CPPUNIT_ASSERT_EX( cds::bitop::MSBnz(n) == nBit - 1, "n=" << n );
+            CPPUNIT_ASSERT_EX( cds::bitop::LSBnz(n) == nBit - 1, "n=" << n );
+            CPPUNIT_ASSERT_EX( cds::bitop::SBC(n) == 1, "n=" << n );
+            CPPUNIT_ASSERT_EX( cds::bitop::ZBC(n) == sizeof(n) * 8 - 1, "n=" << n );
+
+            ++nBit;
+        }
+    }
+
+    void bitop64()
+    {
+        cds::atomic64u_t    n;
+        n = 0;
+        CPPUNIT_ASSERT_EX( cds::bitop::MSB(n) == 0, "n=" << n );
+        CPPUNIT_ASSERT_EX( cds::bitop::LSB(n) == 0, "n=" << n );
+        CPPUNIT_ASSERT_EX( cds::bitop::SBC(n) == 0, "n=" << n );
+        CPPUNIT_ASSERT_EX( cds::bitop::ZBC(n) == sizeof(n) * 8, "n=" << n );
+
+        int nBit = 1;
+        for ( n = 1; n != 0; n *= 2 ) {
+            CPPUNIT_ASSERT_EX( cds::bitop::MSB(n) == nBit, "n=" << n );
+            CPPUNIT_ASSERT_EX( cds::bitop::LSB(n) == nBit, "n=" << n );
+            CPPUNIT_ASSERT_EX( cds::bitop::MSBnz(n) == nBit - 1, "n=" << n );
+            CPPUNIT_ASSERT_EX( cds::bitop::LSBnz(n) == nBit - 1, "n=" << n );
+            CPPUNIT_ASSERT_EX( cds::bitop::SBC(n) == 1, "n=" << n );
+            CPPUNIT_ASSERT_EX( cds::bitop::ZBC(n) == sizeof(n) * 8 - 1, "n=" << n );
+
+            ++nBit;
+        }
+    }
+
+    void floor_ceil_pow2()
+    {
+        CPPUNIT_CHECK_EX( cds::beans::floor2(0) == 1, "floor2(0) = " << cds::beans::floor2(0) << ", expected 1" );
+        CPPUNIT_CHECK_EX( cds::beans::floor2(1) == 1, "floor2(1) = " << cds::beans::floor2(1) << ", expected 1" );
+        CPPUNIT_CHECK_EX( cds::beans::floor2(2) == 2, "floor2(2) = " << cds::beans::floor2(2) << ", expected 2" );
+        CPPUNIT_CHECK_EX( cds::beans::floor2(3) == 2, "floor2(3) = " << cds::beans::floor2(3) << ", expected 2" );
+        CPPUNIT_CHECK_EX( cds::beans::floor2(4) == 4, "floor2(4) = " << cds::beans::floor2(4) << ", expected 4" );
+        CPPUNIT_CHECK_EX( cds::beans::floor2(5) == 4, "floor2(5) = " << cds::beans::floor2(5) << ", expected 4" );
+        CPPUNIT_CHECK_EX( cds::beans::floor2(7) == 4, "floor2(7) = " << cds::beans::floor2(7) << ", expected 4" );
+        CPPUNIT_CHECK_EX( cds::beans::floor2(8) == 8, "floor2(8) = " << cds::beans::floor2(8) << ", expected 8" );
+        CPPUNIT_CHECK_EX( cds::beans::floor2(9) == 8, "floor2(9) = " << cds::beans::floor2(9) << ", expected 8" );
+
+        CPPUNIT_CHECK_EX( cds::beans::ceil2(0) == 1, "ceil2(0) = " << cds::beans::ceil2(0) << ", expected 1" );
+        CPPUNIT_CHECK_EX( cds::beans::ceil2(1) == 1, "ceil2(1) = " << cds::beans::ceil2(1) << ", expected 1" );
+        CPPUNIT_CHECK_EX( cds::beans::ceil2(2) == 2, "ceil2(2) = " << cds::beans::ceil2(2) << ", expected 2" );
+        CPPUNIT_CHECK_EX( cds::beans::ceil2(3) == 4, "ceil2(3) = " << cds::beans::ceil2(3) << ", expected 4" );
+        CPPUNIT_CHECK_EX( cds::beans::ceil2(4) == 4, "ceil2(4) = " << cds::beans::ceil2(4) << ", expected 4" );
+        CPPUNIT_CHECK_EX( cds::beans::ceil2(5) == 8, "ceil2(5) = " << cds::beans::ceil2(5) << ", expected 8" );
+        CPPUNIT_CHECK_EX( cds::beans::ceil2(7) == 8, "ceil2(7) = " << cds::beans::ceil2(7) << ", expected 8" );
+        CPPUNIT_CHECK_EX( cds::beans::ceil2(8) == 8, "ceil2(8) = " << cds::beans::ceil2(8) << ", expected 8" );
+        CPPUNIT_CHECK_EX( cds::beans::ceil2(9) == 16, "ceil2(9) = " << cds::beans::ceil2(16) << ", expected 16" );
+    }
+
+    CPPUNIT_TEST_SUITE(bitop_ST);
+        CPPUNIT_TEST(bitop32)
+        CPPUNIT_TEST(bitop64)
+        CPPUNIT_TEST(floor_ceil_pow2)
+    CPPUNIT_TEST_SUITE_END();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(bitop_ST);
diff --git a/tests/test-hdr/misc/cxx11_atomic_class.cpp b/tests/test-hdr/misc/cxx11_atomic_class.cpp
new file mode 100644 (file)
index 0000000..681fe8f
--- /dev/null
@@ -0,0 +1,778 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+
+//#define CDS_USE_BOOST_ATOMIC
+#include <cds/cxx11_atomic.h>
+
+#include "misc/cxx11_convert_memory_order.h"
+
+namespace misc {
+    class cxx11_atomic_class: public CppUnitMini::TestCase
+    {
+        template <typename AtomicFlag>
+        void do_test_atomic_flag_mo( AtomicFlag& f, CDS_ATOMIC::memory_order order )
+        {
+            CDS_ATOMIC::memory_order mo_clear = convert_to_store_order(order);
+            for ( int i = 0; i < 5; ++i ) {
+                CPPUNIT_ASSERT( !f.test_and_set( order ));
+                CPPUNIT_ASSERT( f.test_and_set( order ) );
+                f.clear( mo_clear );
+            }
+        }
+
+        template <typename AtomicFlag>
+        void do_test_atomic_flag( AtomicFlag& f)
+        {
+            f.clear();
+
+            for ( int i = 0; i < 5; ++i ) {
+                CPPUNIT_ASSERT( !f.test_and_set());
+                CPPUNIT_ASSERT( f.test_and_set() );
+                f.clear();
+            }
+
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_relaxed );
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_consume );
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_acquire );
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_release );
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_acq_rel );
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_seq_cst );
+        }
+
+        template <class Atomic, typename Integral>
+        void do_test_atomic_type(Atomic& a)
+        {
+            typedef Integral    integral_type;
+
+            CPPUNIT_ASSERT( a.is_lock_free() );
+            a.store( (integral_type) 0 );
+            CPPUNIT_ASSERT( a == 0 );
+            CPPUNIT_ASSERT( a.load() == 0 );
+
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                CPPUNIT_ASSERT( a.exchange( n ) == 0 );
+                CPPUNIT_ASSERT( a == n );
+                CPPUNIT_ASSERT( a.exchange( (integral_type) 0 ) == n );
+                CPPUNIT_ASSERT( a.load() == 0 );
+            }
+
+            integral_type prev = a.load();
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                integral_type expected = prev;
+
+                CPPUNIT_ASSERT( a.compare_exchange_weak( expected, n));
+                CPPUNIT_ASSERT( expected  == prev );
+                CPPUNIT_ASSERT( !a.compare_exchange_weak( expected, n));
+                CPPUNIT_ASSERT( expected  == n );
+
+                prev = n;
+                CPPUNIT_ASSERT( a == n );
+            }
+
+            a = (integral_type) 0;
+
+            prev = a;
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                integral_type expected = prev;
+
+                CPPUNIT_ASSERT( a.compare_exchange_strong( expected, n));
+                CPPUNIT_ASSERT( expected  == prev );
+                CPPUNIT_ASSERT( !a.compare_exchange_strong( expected, n));
+                CPPUNIT_ASSERT( expected  == n );
+
+                prev = n;
+                CPPUNIT_ASSERT( a.load() == n );
+            }
+
+            CPPUNIT_ASSERT( a.exchange( (integral_type) 0 ) == prev );
+        }
+
+        template <class Atomic, typename Integral>
+        void do_test_atomic_integral(Atomic& a)
+        {
+            do_test_atomic_type< Atomic, Integral >(a);
+
+            typedef Integral    integral_type;
+
+            // fetch_xxx testing
+            a.store( (integral_type) 0 );
+
+            // fetch_add
+            for ( size_t nByte = 0; nByte < sizeof(integral_type); ++nByte )
+            {
+                integral_type prev = a.load();
+                integral_type n = integral_type(42) << (nByte * 8);
+
+                CPPUNIT_ASSERT( a.fetch_add(n) == prev);
+            }
+
+            // fetch_sub
+            for ( size_t nByte = sizeof(integral_type); nByte > 0; --nByte )
+            {
+                integral_type prev = a.load();
+                integral_type n = integral_type(42) << ((nByte - 1) * 8);
+
+                CPPUNIT_ASSERT( a.fetch_sub(n) == prev);
+            }
+            CPPUNIT_ASSERT( a.load() == 0 );
+
+            // fetch_or / fetc_xor / fetch_and
+            for ( size_t nBit = 0; nBit < sizeof(integral_type) * 8; ++nBit )
+            {
+                integral_type prev = a.load()  ;;
+                integral_type mask = 1 << nBit;
+
+                CPPUNIT_ASSERT( a.fetch_or( mask ) == prev );
+                prev = a.load();
+                CPPUNIT_ASSERT( ( prev & mask)  == mask);
+
+                CPPUNIT_ASSERT( a.fetch_and( (integral_type) ~mask ) == prev );
+                prev = a.load();
+                CPPUNIT_ASSERT( integral_type(prev & mask) == integral_type(0));
+
+                CPPUNIT_ASSERT( a.fetch_xor( mask ) == prev );
+                prev = a.load();
+                CPPUNIT_ASSERT( integral_type( prev & mask)  == mask);
+            }
+            CPPUNIT_ASSERT( a.load() == (integral_type) -1 );
+
+
+            // op= testing
+            a = (integral_type) 0;
+
+            // +=
+            for ( size_t nByte = 0; nByte < sizeof(integral_type); ++nByte )
+            {
+                integral_type prev = a;
+                integral_type n = integral_type(42) << (nByte * 8);
+
+                CPPUNIT_ASSERT( (a += n) == (prev + n));
+            }
+
+            // -=
+            for ( size_t nByte = sizeof(integral_type); nByte > 0; --nByte )
+            {
+                integral_type prev = a;
+                integral_type n = integral_type(42) << ((nByte - 1) * 8);
+
+                CPPUNIT_ASSERT( (a -= n) == prev - n );
+            }
+            CPPUNIT_ASSERT( a.load() == 0 );
+
+            // |= / ^= / &=
+            for ( size_t nBit = 0; nBit < sizeof(integral_type) * 8; ++nBit )
+            {
+                integral_type prev = a;
+                integral_type mask = integral_type(1) << nBit;
+
+                CPPUNIT_ASSERT( (a |= mask ) == (prev | mask ));
+                prev = a;
+                CPPUNIT_ASSERT( ( prev & mask)  == mask);
+
+                CPPUNIT_ASSERT( (a &= (integral_type) ~mask ) == ( prev & (integral_type) ~mask ));
+                prev = a;
+                CPPUNIT_ASSERT( ( prev & mask)  == 0);
+
+                CPPUNIT_ASSERT( (a ^= mask ) == (prev ^ mask ));
+                prev = a;
+                CPPUNIT_ASSERT( ( prev & mask)  == mask);
+            }
+            CPPUNIT_ASSERT( a == (integral_type) -1 );
+        }
+
+        template <class Atomic, typename Integral>
+        void do_test_atomic_type( Atomic& a, CDS_ATOMIC::memory_order order )
+        {
+            typedef Integral    integral_type;
+
+            const CDS_ATOMIC::memory_order oLoad = convert_to_load_order( order );
+            const CDS_ATOMIC::memory_order oStore = convert_to_store_order( order );
+
+            CPPUNIT_ASSERT( a.is_lock_free() );
+            a.store((integral_type) 0, oStore );
+            CPPUNIT_ASSERT( a == 0 );
+            CPPUNIT_ASSERT( a.load( oLoad ) == 0 );
+
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                CPPUNIT_ASSERT( a.exchange( n, order ) == 0 );
+                CPPUNIT_ASSERT( a.load( oLoad ) == n );
+                CPPUNIT_ASSERT( a.exchange( (integral_type) 0, order ) == n );
+                CPPUNIT_ASSERT( a.load( oLoad ) == 0 );
+            }
+
+            integral_type prev = a.load( oLoad );
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                integral_type expected = prev;
+
+                CPPUNIT_ASSERT( a.compare_exchange_weak( expected, n, order, CDS_ATOMIC::memory_order_relaxed));
+                CPPUNIT_ASSERT( expected  == prev );
+                CPPUNIT_ASSERT( !a.compare_exchange_weak( expected, n, order, CDS_ATOMIC::memory_order_relaxed));
+                CPPUNIT_ASSERT( expected  == n );
+
+                prev = n;
+                CPPUNIT_ASSERT( a.load( oLoad ) == n );
+            }
+
+            a.store( (integral_type) 0, oStore );
+
+            prev = a.load( oLoad );
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                integral_type expected = prev;
+
+                CPPUNIT_ASSERT( a.compare_exchange_strong( expected, n, order, CDS_ATOMIC::memory_order_relaxed));
+                CPPUNIT_ASSERT( expected  == prev );
+                CPPUNIT_ASSERT( !a.compare_exchange_strong( expected, n, order, CDS_ATOMIC::memory_order_relaxed));
+                CPPUNIT_ASSERT( expected  == n );
+
+                prev = n;
+                CPPUNIT_ASSERT( a.load( oLoad ) == n );
+            }
+
+            CPPUNIT_ASSERT( a.exchange( (integral_type) 0, order ) == prev );
+        }
+
+        template <class Atomic, typename Integral>
+        void do_test_atomic_integral( Atomic& a, CDS_ATOMIC::memory_order order )
+        {
+            do_test_atomic_type< Atomic, Integral >( a, order );
+
+            typedef Integral    integral_type;
+
+            const CDS_ATOMIC::memory_order oLoad = convert_to_load_order( order );
+            const CDS_ATOMIC::memory_order oStore = convert_to_store_order( order );
+
+            // fetch_xxx testing
+            a.store( (integral_type) 0, oStore );
+
+            // fetch_add
+            for ( size_t nByte = 0; nByte < sizeof(integral_type); ++nByte )
+            {
+                integral_type prev = a.load( oLoad );
+                integral_type n = integral_type(42) << (nByte * 8);
+
+                CPPUNIT_ASSERT( a.fetch_add( n, order) == prev);
+            }
+
+            // fetch_sub
+            for ( size_t nByte = sizeof(integral_type); nByte > 0; --nByte )
+            {
+                integral_type prev = a.load( oLoad );
+                integral_type n = integral_type(42) << ((nByte - 1) * 8);
+
+                CPPUNIT_ASSERT( a.fetch_sub( n, order ) == prev);
+            }
+            CPPUNIT_ASSERT( a.load( oLoad ) == 0 );
+
+            // fetch_or / fetc_xor / fetch_and
+            for ( size_t nBit = 0; nBit < sizeof(integral_type) * 8; ++nBit )
+            {
+                integral_type prev = a.load( oLoad )  ;;
+                integral_type mask = 1 << nBit;
+
+                CPPUNIT_ASSERT( a.fetch_or( mask, order ) == prev );
+                prev = a.load( oLoad );
+                CPPUNIT_ASSERT( ( prev & mask)  == mask);
+
+                CPPUNIT_ASSERT( a.fetch_and( (integral_type) ~mask, order ) == prev );
+                prev = a.load( oLoad );
+                CPPUNIT_ASSERT( ( prev & mask)  == 0);
+
+                CPPUNIT_ASSERT( a.fetch_xor( mask, order ) == prev );
+                prev = a.load( oLoad );
+                CPPUNIT_ASSERT( ( prev & mask)  == mask);
+            }
+            CPPUNIT_ASSERT( a.load( oLoad ) == (integral_type) -1 );
+        }
+
+
+
+        template <typename Atomic, typename Integral>
+        void test_atomic_integral_(Atomic& a)
+        {
+            do_test_atomic_integral<Atomic, Integral >(a);
+
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_relaxed );
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_consume );
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_acquire );
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_release );
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_acq_rel );
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_seq_cst );
+        }
+
+        template <typename Integral>
+        void test_atomic_integral()
+        {
+            typedef CDS_ATOMIC::atomic<Integral> atomic_type;
+
+            atomic_type a[8];
+            for ( size_t i = 0; i < sizeof(a)/sizeof(a[0]); ++i ) {
+                test_atomic_integral_<atomic_type, Integral>( a[i] );
+            }
+        }
+        template <typename Integral>
+        void test_atomic_integral_volatile()
+        {
+            typedef CDS_ATOMIC::atomic<Integral> volatile atomic_type;
+
+            atomic_type a[8];
+            for ( size_t i = 0; i < sizeof(a)/sizeof(a[0]); ++i ) {
+                test_atomic_integral_<atomic_type, Integral>( a[i] );
+            }
+        }
+
+        template <class AtomicBool>
+        void do_test_atomic_bool( AtomicBool& a )
+        {
+            CPPUNIT_ASSERT( a.is_lock_free() );
+            a.store( false );
+            CPPUNIT_ASSERT( a == false );
+            CPPUNIT_ASSERT( a.load() == false );
+
+            CPPUNIT_ASSERT( a.exchange( true ) == false );
+            CPPUNIT_ASSERT( a.load() == true );
+            CPPUNIT_ASSERT( a.exchange( false ) == true );
+            CPPUNIT_ASSERT( a.load() == false );
+
+            bool expected = false;
+            CPPUNIT_ASSERT( a.compare_exchange_weak( expected, true));
+            CPPUNIT_ASSERT( expected  == false );
+            CPPUNIT_ASSERT( !a.compare_exchange_weak( expected, false));
+            CPPUNIT_ASSERT( expected  == true );
+            CPPUNIT_ASSERT( a.load() == true );
+
+            a.store( false );
+
+            expected = false;
+            CPPUNIT_ASSERT( a.compare_exchange_strong( expected, true));
+            CPPUNIT_ASSERT( expected  == false );
+            CPPUNIT_ASSERT( !a.compare_exchange_strong( expected, false));
+            CPPUNIT_ASSERT( expected  == true );
+
+            CPPUNIT_ASSERT( a.load() == true );
+
+            CPPUNIT_ASSERT( a.exchange( false ) == true );
+        }
+
+        template <class AtomicBool>
+        void do_test_atomic_bool( AtomicBool& a, CDS_ATOMIC::memory_order order )
+        {
+            const CDS_ATOMIC::memory_order oLoad = convert_to_load_order( order );
+            const CDS_ATOMIC::memory_order oStore = convert_to_store_order( order );
+
+            CPPUNIT_ASSERT( a.is_lock_free() );
+            a.store( false, oStore );
+            CPPUNIT_ASSERT( a == false );
+            CPPUNIT_ASSERT( a.load( oLoad ) == false );
+
+            CPPUNIT_ASSERT( a.exchange( true, order ) == false );
+            CPPUNIT_ASSERT( a.load( oLoad ) == true );
+            CPPUNIT_ASSERT( a.exchange( false, order ) == true );
+            CPPUNIT_ASSERT( a.load( oLoad ) == false );
+
+            bool expected = false;
+            CPPUNIT_ASSERT( a.compare_exchange_weak( expected, true, order, CDS_ATOMIC::memory_order_relaxed));
+            CPPUNIT_ASSERT( expected  == false );
+            CPPUNIT_ASSERT( !a.compare_exchange_weak( expected, false, order, CDS_ATOMIC::memory_order_relaxed));
+            CPPUNIT_ASSERT( expected  == true );
+            CPPUNIT_ASSERT( a.load( oLoad ) == true );
+
+            //a = bool(false);
+            a.store( false, oStore );
+
+            expected = false;
+            CPPUNIT_ASSERT( a.compare_exchange_strong( expected, true, order, CDS_ATOMIC::memory_order_relaxed));
+            CPPUNIT_ASSERT( expected  == false );
+            CPPUNIT_ASSERT( !a.compare_exchange_strong( expected, false, order, CDS_ATOMIC::memory_order_relaxed));
+            CPPUNIT_ASSERT( expected  == true );
+
+            CPPUNIT_ASSERT( a.load( oLoad ) == true );
+
+            CPPUNIT_ASSERT( a.exchange( false, order ) == true );
+        }
+
+
+        template <typename Atomic>
+        void do_test_atomic_pointer_void_( Atomic& a, char * arr, char aSize, CDS_ATOMIC::memory_order order )
+        {
+            CDS_ATOMIC::memory_order oLoad = convert_to_load_order(order);
+            CDS_ATOMIC::memory_order oStore = convert_to_store_order(order);
+            void *  p;
+
+            a.store( (void *) arr, oStore );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>(a.load( oLoad )) == 1 );
+
+            p = arr;
+            CPPUNIT_ASSERT( a.compare_exchange_weak( p, (void *)(arr + 5), order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 0 );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>(p) == 1 );
+            CPPUNIT_ASSERT( !a.compare_exchange_weak( p, (void *)(arr + 3), order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>(p) == 6 );
+
+            CPPUNIT_ASSERT( a.compare_exchange_strong( p, (void *)(arr + 3), order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>(p) == 6 );
+            CPPUNIT_ASSERT( !a.compare_exchange_strong( p, (void *)(arr + 5), order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 3 );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>(p) == 4 );
+
+            CPPUNIT_ASSERT( reinterpret_cast<char *>(a.exchange( (void *) arr, order )) == arr + 3 );
+            CPPUNIT_ASSERT( reinterpret_cast<char *>(a.load( oLoad )) == arr );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>(a.load( oLoad )) == 1 );
+
+            for ( char i = 1; i < aSize; ++i ) {
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(a.load( oLoad )) == i );
+                CPPUNIT_ASSERT( a.fetch_add( 1, order ));
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(a.load( oLoad )) == i + 1 );
+            }
+
+            for ( char i = aSize; i > 1; --i ) {
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(a.load( oLoad )) == i  );
+                CPPUNIT_ASSERT( a.fetch_sub( 1, order ));
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(a.load( oLoad )) == i - 1 );
+            }
+        }
+
+        template <bool Volatile>
+        void do_test_atomic_pointer_void()
+        {
+            typedef typename add_volatile<CDS_ATOMIC::atomic< void *>, Volatile>::type    atomic_pointer;
+
+            char   arr[8];
+            const char aSize = sizeof(arr)/sizeof(arr[0]);
+            for ( char i = 0; i < aSize; ++i ) {
+                arr[unsigned(i)] = i + 1;
+            }
+
+            atomic_pointer  a;
+            void *  p;
+
+#if CDS_BUILD_BITS == 32 && !( CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION == 40700 )
+            /* GCC 4.7.0 has an linktime error in 32bit x86 mode:
+
+            ../tests/test-hdr/misc/cxx11_atomic_class.o: In function `std::__atomic_base<void*>::is_lock_free() const':
+            /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/atomic_base.h:719: undefined reference to `__atomic_is_lock_free'
+
+            ../tests/test-hdr/misc/cxx11_atomic_class.o: In function `std::__atomic_base<void*>::is_lock_free() const volatile':
+            /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/atomic_base.h:723: undefined reference to `__atomic_is_lock_free'
+
+            */
+            CPPUNIT_ASSERT( a.is_lock_free() );
+#endif
+
+            a.store( (void *) arr );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>(a.load()) == 1 );
+
+            p = arr;
+            CPPUNIT_ASSERT( a.compare_exchange_weak( p, (void *)(arr + 5) ));
+            CPPUNIT_ASSERT( p == arr + 0 );
+            CPPUNIT_ASSERT( !a.compare_exchange_weak( p, (void *)(arr + 3) ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+
+            CPPUNIT_ASSERT( a.compare_exchange_strong( p, (void *)(arr + 3) ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( !a.compare_exchange_strong( p, (void *)(arr + 5) ));
+            CPPUNIT_ASSERT( p == arr + 3 );
+
+            CPPUNIT_ASSERT( reinterpret_cast<char *>( a.exchange( (void *) arr )) == arr + 3 );
+            CPPUNIT_ASSERT( reinterpret_cast<char *>( a.load()) == arr );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>( a.load()) == 1 );
+
+            for ( char i = 1; i < aSize; ++i ) {
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(a.load()) == i );
+                CPPUNIT_ASSERT( a.fetch_add( 1 ));
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(a.load()) == i + 1 );
+            }
+
+            for ( char i = aSize; i > 1; --i ) {
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(a.load()) == i  );
+                CPPUNIT_ASSERT( a.fetch_sub( 1 ));
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(a.load()) == i - 1 );
+            }
+
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_relaxed );
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_consume );
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_acquire );
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_release );
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_acq_rel );
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_seq_cst );
+        }
+
+        template <typename Atomic, typename Integral>
+        void test_atomic_pointer_for_( Atomic& a, Integral * arr, Integral aSize, CDS_ATOMIC::memory_order order )
+        {
+            typedef Integral integral_type;
+            CDS_ATOMIC::memory_order oLoad = convert_to_load_order(order);
+            CDS_ATOMIC::memory_order oStore = convert_to_store_order(order);
+            integral_type *  p;
+
+            a.store( arr, oStore );
+            CPPUNIT_ASSERT( *a.load( oLoad ) == 1 );
+
+            p = arr;
+            CPPUNIT_ASSERT( a.compare_exchange_weak( p, arr + 5, order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 0 );
+            CPPUNIT_ASSERT( *p == 1 );
+            CPPUNIT_ASSERT( !a.compare_exchange_weak( p, arr + 3, order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( *p == 6 );
+
+            CPPUNIT_ASSERT( a.compare_exchange_strong( p, arr + 3, order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( *p == 6 );
+            CPPUNIT_ASSERT( !a.compare_exchange_strong( p, arr + 5, order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 3 );
+            CPPUNIT_ASSERT( *p == 4 );
+
+            CPPUNIT_ASSERT( a.exchange( arr, order ) == arr + 3 );
+            CPPUNIT_ASSERT( a.load( oLoad ) == arr );
+            CPPUNIT_ASSERT( *a.load( oLoad ) == 1 );
+
+            for ( integral_type i = 1; i < aSize; ++i ) {
+                integral_type * p = a.load();
+                CPPUNIT_ASSERT( *p == i );
+                CPPUNIT_ASSERT( a.fetch_add( 1, order ) == p  );
+                CPPUNIT_ASSERT( *a.load( oLoad ) == i + 1 );
+            }
+
+            for ( integral_type i = aSize; i > 1; --i ) {
+                integral_type * p = a.load();
+                CPPUNIT_ASSERT( *p == i  );
+                CPPUNIT_ASSERT( a.fetch_sub( 1, order ) == p );
+                CPPUNIT_ASSERT( *a.load( oLoad ) == i - 1 );
+            }
+        }
+
+        template <typename Integral, bool Volatile>
+        void test_atomic_pointer_for()
+        {
+            typedef Integral integral_type;
+            typedef typename add_volatile<CDS_ATOMIC::atomic< integral_type *>, Volatile>::type    atomic_pointer;
+
+            integral_type   arr[8];
+            const integral_type aSize = sizeof(arr)/sizeof(arr[0]);
+            for ( integral_type i = 0; i < aSize; ++i ) {
+                arr[size_t(i)] = i + 1;
+            }
+
+            atomic_pointer  a;
+            integral_type *  p;
+
+            a.store( arr );
+            CPPUNIT_ASSERT( *a.load() == 1 );
+
+            p = arr;
+            CPPUNIT_ASSERT( a.compare_exchange_weak( p, arr + 5 ));
+            CPPUNIT_ASSERT( p == arr + 0 );
+            CPPUNIT_ASSERT( *p == 1 );
+            CPPUNIT_ASSERT( !a.compare_exchange_weak( p, arr + 3 ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( *p == 6 );
+
+            CPPUNIT_ASSERT( a.compare_exchange_strong( p, arr + 3 ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( *p == 6 );
+            CPPUNIT_ASSERT( !a.compare_exchange_strong( p, arr + 5 ));
+            CPPUNIT_ASSERT( p == arr + 3 );
+            CPPUNIT_ASSERT( *p == 4 );
+
+            CPPUNIT_ASSERT( a.exchange( arr ) == arr + 3 );
+            CPPUNIT_ASSERT( a.load() == arr );
+            CPPUNIT_ASSERT( *a.load() == 1 );
+
+            for ( integral_type i = 1; i < aSize; ++i ) {
+                integral_type * p = a.load();
+                CPPUNIT_ASSERT( *p == i );
+                integral_type * pa = a.fetch_add( 1 );
+                CPPUNIT_ASSERT_EX( pa == p, "pa=" << ((uintptr_t) pa) << " p=" << ((uintptr_t) p) );
+                CPPUNIT_ASSERT( *a.load() == i + 1 );
+            }
+
+            for ( integral_type i = aSize; i > 1; --i ) {
+                integral_type * p = a.load();
+                CPPUNIT_ASSERT( *p == i  );
+                CPPUNIT_ASSERT( a.fetch_sub( 1 ) == p );
+                CPPUNIT_ASSERT( *a.load() == i - 1 );
+            }
+
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_relaxed );
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_consume );
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_acquire );
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_release );
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_acq_rel );
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_seq_cst );
+        }
+
+    public:
+        void test_atomic_flag()
+        {
+            // Array to test different alignment
+
+            CDS_ATOMIC::atomic_flag flags[8];
+            for ( size_t i = 0; i < sizeof(flags)/sizeof(flags[0]); ++i )
+                do_test_atomic_flag( flags[i] );
+        }
+
+        void test_atomic_flag_volatile()
+        {
+            // Array to test different alignment
+
+            CDS_ATOMIC::atomic_flag volatile flags[8];
+            for ( size_t i = 0; i < sizeof(flags)/sizeof(flags[0]); ++i )
+                do_test_atomic_flag( flags[i] );
+        }
+
+        template <typename AtomicBool>
+        void test_atomic_bool_()
+        {
+            // Array to test different alignment
+            AtomicBool  a[8];
+
+            for ( size_t i = 0; i < sizeof(a)/sizeof(a[0]); ++i ) {
+                do_test_atomic_bool( a[i] );
+
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_relaxed );
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_consume );
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_acquire );
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_release );
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_acq_rel );
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_seq_cst );
+            }
+        }
+
+        void test_atomic_bool()
+        {
+            test_atomic_bool_< CDS_ATOMIC::atomic<bool> >();
+        }
+        void test_atomic_bool_volatile()
+        {
+            test_atomic_bool_< CDS_ATOMIC::atomic<bool> volatile >();
+        }
+
+        void test_atomic_char()                 { test_atomic_integral<char>(); }
+        void test_atomic_signed_char()          { test_atomic_integral<signed char>(); }
+        void test_atomic_unsigned_char()        { test_atomic_integral<unsigned char>(); }
+        void test_atomic_short_int()            { test_atomic_integral<short int>(); }
+        void test_atomic_unsigned_short_int()   { test_atomic_integral<unsigned short int>(); }
+        void test_atomic_int()                  { test_atomic_integral<int>(); }
+        void test_atomic_unsigned_int()         { test_atomic_integral<unsigned int>(); }
+        void test_atomic_long()                 { test_atomic_integral<long>(); }
+        void test_atomic_unsigned_long()        { test_atomic_integral<unsigned long>(); }
+        void test_atomic_long_long()            { test_atomic_integral<long long>(); }
+        void test_atomic_unsigned_long_long()   { test_atomic_integral<unsigned long long>(); }
+//#if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40400
+//        void test_atomic_char16_t()             { test_atomic_integral<char16_t>(); }
+//        void test_atomic_char32_t()             { test_atomic_integral<char32_t>(); }
+//#endif
+//        void test_atomic_wchar_t()
+//        {
+//#if CDS_OS_TYPE != CDS_OS_HPUX
+//            test_atomic_integral<wchar_t>();
+//#endif
+//        }
+
+        void test_atomic_char_volatile()                 { test_atomic_integral_volatile<char>(); }
+        void test_atomic_signed_char_volatile()          { test_atomic_integral_volatile<signed char>(); }
+        void test_atomic_unsigned_char_volatile()        { test_atomic_integral_volatile<unsigned char>(); }
+        void test_atomic_short_int_volatile()            { test_atomic_integral_volatile<short int>(); }
+        void test_atomic_unsigned_short_int_volatile()   { test_atomic_integral_volatile<unsigned short int>(); }
+        void test_atomic_int_volatile()                  { test_atomic_integral_volatile<int>(); }
+        void test_atomic_unsigned_int_volatile()         { test_atomic_integral_volatile<unsigned int>(); }
+        void test_atomic_long_volatile()                 { test_atomic_integral_volatile<long>(); }
+        void test_atomic_unsigned_long_volatile()        { test_atomic_integral_volatile<unsigned long>(); }
+        void test_atomic_long_long_volatile()            { test_atomic_integral_volatile<long long>(); }
+        void test_atomic_unsigned_long_long_volatile()   { test_atomic_integral_volatile<unsigned long long>(); }
+//#if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40400
+//        void test_atomic_char16_t_volatile()             { test_atomic_integral_volatile<char16_t>(); }
+//        void test_atomic_char32_t_volatile()             { test_atomic_integral_volatile<char32_t>(); }
+//#endif
+//        void test_atomic_wchar_t_volatile()
+//        {
+//#if CDS_OS_TYPE != CDS_OS_HPUX
+//            test_atomic_integral_volatile<wchar_t>();
+//#endif
+//        }
+
+        void test_atomic_pointer_void()         { do_test_atomic_pointer_void<false>() ;}
+        void test_atomic_pointer_void_volatile(){ do_test_atomic_pointer_void<true>() ;}
+
+        void test_atomic_pointer_char()         { test_atomic_pointer_for<char, false>() ;}
+        void test_atomic_pointer_short()        { test_atomic_pointer_for<short int, false>() ;}
+        void test_atomic_pointer_int()          { test_atomic_pointer_for<int, false>() ;}
+        void test_atomic_pointer_long()         { test_atomic_pointer_for<long, false>() ;}
+        void test_atomic_pointer_long_long()    { test_atomic_pointer_for<long long, false>() ;}
+
+        void test_atomic_pointer_char_volatile()        { test_atomic_pointer_for<char, true>() ;}
+        void test_atomic_pointer_short_volatile()       { test_atomic_pointer_for<unsigned short int, true>() ;}
+        void test_atomic_pointer_int_volatile()          { test_atomic_pointer_for<int, true>() ;}
+        void test_atomic_pointer_long_volatile()         { test_atomic_pointer_for<long, true>() ;}
+        void test_atomic_pointer_long_long_volatile()    { test_atomic_pointer_for<long long, true>() ;}
+
+    public:
+        CPPUNIT_TEST_SUITE(cxx11_atomic_class)
+            CPPUNIT_TEST( test_atomic_flag )
+            CPPUNIT_TEST( test_atomic_flag_volatile )
+
+            CPPUNIT_TEST( test_atomic_bool )
+            CPPUNIT_TEST( test_atomic_char )
+            CPPUNIT_TEST( test_atomic_signed_char)
+            CPPUNIT_TEST( test_atomic_unsigned_char)
+            CPPUNIT_TEST( test_atomic_short_int)
+            CPPUNIT_TEST( test_atomic_unsigned_short_int)
+            CPPUNIT_TEST( test_atomic_int)
+            CPPUNIT_TEST( test_atomic_unsigned_int)
+            CPPUNIT_TEST( test_atomic_long)
+            CPPUNIT_TEST( test_atomic_unsigned_long)
+            CPPUNIT_TEST( test_atomic_long_long)
+            CPPUNIT_TEST( test_atomic_unsigned_long_long)
+//#if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40400
+//            CPPUNIT_TEST( test_atomic_char16_t )
+//            CPPUNIT_TEST( test_atomic_char32_t )
+//#endif
+//            CPPUNIT_TEST( test_atomic_wchar_t)
+
+            CPPUNIT_TEST( test_atomic_bool_volatile )
+            CPPUNIT_TEST( test_atomic_char_volatile )
+            CPPUNIT_TEST( test_atomic_signed_char_volatile)
+            CPPUNIT_TEST( test_atomic_unsigned_char_volatile)
+            CPPUNIT_TEST( test_atomic_short_int_volatile)
+            CPPUNIT_TEST( test_atomic_unsigned_short_int_volatile)
+            CPPUNIT_TEST( test_atomic_int_volatile)
+            CPPUNIT_TEST( test_atomic_unsigned_int_volatile)
+            CPPUNIT_TEST( test_atomic_long_volatile)
+            CPPUNIT_TEST( test_atomic_unsigned_long_volatile)
+            CPPUNIT_TEST( test_atomic_long_long_volatile)
+            CPPUNIT_TEST( test_atomic_unsigned_long_long_volatile)
+//#if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40400
+//            CPPUNIT_TEST( test_atomic_char16_t_volatile )
+//            CPPUNIT_TEST( test_atomic_char32_t_volatile )
+//#endif
+//            CPPUNIT_TEST( test_atomic_wchar_t_volatile)
+
+            CPPUNIT_TEST( test_atomic_pointer_void)
+            CPPUNIT_TEST( test_atomic_pointer_void_volatile)
+
+            CPPUNIT_TEST( test_atomic_pointer_char)
+            CPPUNIT_TEST( test_atomic_pointer_short)
+            CPPUNIT_TEST( test_atomic_pointer_int)
+            CPPUNIT_TEST( test_atomic_pointer_long)
+            CPPUNIT_TEST( test_atomic_pointer_long_long)
+
+            CPPUNIT_TEST( test_atomic_pointer_char_volatile)
+            CPPUNIT_TEST( test_atomic_pointer_short_volatile)
+            CPPUNIT_TEST( test_atomic_pointer_int_volatile)
+            CPPUNIT_TEST( test_atomic_pointer_long_volatile)
+            CPPUNIT_TEST( test_atomic_pointer_long_long_volatile)
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+}   // namespace misc
+
+CPPUNIT_TEST_SUITE_REGISTRATION(misc::cxx11_atomic_class);
diff --git a/tests/test-hdr/misc/cxx11_atomic_func.cpp b/tests/test-hdr/misc/cxx11_atomic_func.cpp
new file mode 100644 (file)
index 0000000..84298b0
--- /dev/null
@@ -0,0 +1,738 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+
+#include <cds/cxx11_atomic.h>
+
+#ifndef CDS_USE_BOOST_ATOMIC
+// Skip this test for boost.atomic
+// Boost.atomic has no free atomic functions implementation.
+
+#include "misc/cxx11_convert_memory_order.h"
+
+namespace misc {
+
+    class cxx11_atomic_func: public CppUnitMini::TestCase
+    {
+        template <typename AtomicFlag>
+        void do_test_atomic_flag_mo( AtomicFlag& f, CDS_ATOMIC::memory_order order )
+        {
+            CDS_ATOMIC::memory_order mo_clear = convert_to_store_order(order);
+
+            f.clear( convert_to_store_order(order) );
+
+            for ( int i = 0; i < 5; ++i ) {
+                CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_flag_test_and_set_explicit( &f, order ));
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_flag_test_and_set_explicit( &f, order ) );
+                CDS_ATOMIC::atomic_flag_clear_explicit( &f, mo_clear );
+                CDS_ATOMIC::atomic_flag_clear_explicit( &f, mo_clear );
+            }
+            //CPPUNIT_ASSERT( f.m_Flag == 0 );
+        }
+
+        template <typename AtomicFlag>
+        void do_test_atomic_flag( AtomicFlag& f )
+        {
+            f.clear();
+
+            for ( int i = 0; i < 5; ++i ) {
+                //CPPUNIT_ASSERT( f.m_Flag == 0 );
+                CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_flag_test_and_set( &f ));
+                //CPPUNIT_ASSERT( f.m_Flag != 0 );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_flag_test_and_set( &f ) );
+                //CPPUNIT_ASSERT( f.m_Flag != 0 );
+                CDS_ATOMIC::atomic_flag_clear(&f);
+                //CPPUNIT_ASSERT( f.m_Flag == 0 );
+                CDS_ATOMIC::atomic_flag_clear(&f);
+            }
+            //CPPUNIT_ASSERT( f.m_Flag == 0 );
+
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_relaxed );
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_consume );
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_acquire );
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_release );
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_acq_rel );
+            do_test_atomic_flag_mo( f, CDS_ATOMIC::memory_order_seq_cst );
+        }
+
+        template <class Atomic, typename Integral>
+        void do_test_atomic_type(Atomic& a )
+        {
+            typedef Integral    integral_type;
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_is_lock_free( &a ) );
+            CDS_ATOMIC::atomic_store( &a, (integral_type) 0 );
+            CPPUNIT_ASSERT( a == 0 );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == 0 );
+
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange( &a, n ) == 0 );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == n );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange( &a, (integral_type) 0 ) == n );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == 0 );
+            }
+
+            integral_type prev = CDS_ATOMIC::atomic_load( &a );
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                integral_type expected = prev;
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_weak( &a, &expected, n));
+                CPPUNIT_ASSERT( expected  == prev );
+                CPPUNIT_ASSERT( expected  != n );
+                CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_weak( &a, &expected, n) );
+                CPPUNIT_ASSERT( expected  == n );
+
+                prev = n;
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == n );
+            }
+
+            CDS_ATOMIC::atomic_store( &a, (integral_type) 0 );
+
+            prev = CDS_ATOMIC::atomic_load( &a );
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                integral_type expected = prev;
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_strong( &a, &expected, n));
+                CPPUNIT_ASSERT( expected  == prev );
+                CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_strong( &a, &expected, n));
+                CPPUNIT_ASSERT( expected  == n );
+
+                prev = n;
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == n );
+            }
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange( &a, (integral_type) 0 ) == prev );
+        }
+
+        template <class Atomic, typename Integral>
+        void do_test_atomic_integral( Atomic& a )
+        {
+            do_test_atomic_type< Atomic, Integral >( a );
+
+            typedef Integral    integral_type;
+
+            // fetch_xxx testing
+            CDS_ATOMIC::atomic_store( &a, (integral_type) 0 );
+
+            // fetch_add
+            for ( size_t nByte = 0; nByte < sizeof(integral_type); ++nByte )
+            {
+                integral_type prev = CDS_ATOMIC::atomic_load( &a );
+                integral_type n = integral_type(42) << (nByte * 8);
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_add( &a, n) == prev);
+            }
+
+            // fetch_sub
+            for ( size_t nByte = sizeof(integral_type); nByte > 0; --nByte )
+            {
+                integral_type prev = CDS_ATOMIC::atomic_load( &a );
+                integral_type n = integral_type(42) << ((nByte - 1) * 8);
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_sub( &a, n) == prev);
+            }
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == 0 );
+
+            // fetch_or / fetc_xor / fetch_and
+            for ( size_t nBit = 0; nBit < sizeof(integral_type) * 8; ++nBit )
+            {
+                integral_type prev = CDS_ATOMIC::atomic_load( &a );
+                integral_type mask = 1 << nBit;
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_or( &a, mask ) == prev );
+                prev = CDS_ATOMIC::atomic_load( &a );
+                CPPUNIT_ASSERT( ( prev & mask)  == mask);
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_and( &a, (integral_type) ~mask ) == prev );
+                prev = CDS_ATOMIC::atomic_load( &a );
+                CPPUNIT_ASSERT_EX( integral_type(prev & mask) == integral_type(0), "prev=" << std::hex << prev << ", mask=" << std::hex << mask);
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_xor( &a, mask ) == prev );
+                prev = CDS_ATOMIC::atomic_load( &a );
+                CPPUNIT_ASSERT( ( prev & mask)  == mask);
+            }
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == (integral_type) -1 );
+        }
+
+        template <class Atomic, typename Integral>
+        void do_test_atomic_type( Atomic& a, CDS_ATOMIC::memory_order order )
+        {
+            typedef Integral    integral_type;
+
+            const CDS_ATOMIC::memory_order oLoad = convert_to_load_order( order );
+            const CDS_ATOMIC::memory_order oStore = convert_to_store_order( order );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_is_lock_free( &a ) );
+            CDS_ATOMIC::atomic_store_explicit( &a, (integral_type) 0, oStore );
+            CPPUNIT_ASSERT( a == 0 );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == 0 );
+
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange_explicit( &a, n, order ) == 0 );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == n );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange_explicit( &a, (integral_type) 0, order ) == n );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == 0 );
+            }
+
+            integral_type prev = CDS_ATOMIC::atomic_load_explicit( &a, oLoad );
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                integral_type expected = prev;
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_weak_explicit( &a, &expected, n, order, CDS_ATOMIC::memory_order_relaxed));
+                CPPUNIT_ASSERT( expected  == prev );
+                CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_weak_explicit( &a, &expected, n, order, CDS_ATOMIC::memory_order_relaxed));
+                CPPUNIT_ASSERT( expected  == n );
+
+                prev = n;
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == n );
+            }
+
+            CDS_ATOMIC::atomic_store_explicit( &a, (integral_type) 0, oStore );
+
+            prev = CDS_ATOMIC::atomic_load_explicit( &a, oLoad );
+            for ( size_t nByte = 0; nByte < sizeof(Integral); ++nByte ) {
+                integral_type n = integral_type(42) << (nByte * 8);
+                integral_type expected = prev;
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_strong_explicit( &a, &expected, n, order, CDS_ATOMIC::memory_order_relaxed));
+                CPPUNIT_ASSERT( expected  == prev );
+                CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_strong_explicit( &a, &expected, n, order, CDS_ATOMIC::memory_order_relaxed));
+                CPPUNIT_ASSERT( expected  == n );
+
+                prev = n;
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == n );
+            }
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange_explicit( &a, (integral_type) 0, order ) == prev );
+        }
+
+        template <class Atomic, typename Integral>
+        void do_test_atomic_integral( Atomic& a, CDS_ATOMIC::memory_order order )
+        {
+            do_test_atomic_type< Atomic, Integral >( a, order );
+            typedef Integral    integral_type;
+
+            const CDS_ATOMIC::memory_order oLoad = convert_to_load_order( order );
+            const CDS_ATOMIC::memory_order oStore = convert_to_store_order( order );
+
+            // fetch_xxx testing
+            CDS_ATOMIC::atomic_store_explicit( &a, (integral_type) 0, oStore );
+
+            // fetch_add
+            for ( size_t nByte = 0; nByte < sizeof(integral_type); ++nByte )
+            {
+                integral_type prev = CDS_ATOMIC::atomic_load_explicit( &a, oLoad );
+                integral_type n = integral_type(42) << (nByte * 8);
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_add_explicit( &a, n, order) == prev);
+            }
+
+            // fetch_sub
+            for ( size_t nByte = sizeof(integral_type); nByte > 0; --nByte )
+            {
+                integral_type prev = CDS_ATOMIC::atomic_load_explicit( &a, oLoad );
+                integral_type n = integral_type(42) << ((nByte - 1) * 8);
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_sub_explicit( &a, n, order ) == prev);
+            }
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == 0 );
+
+            // fetch_or / fetc_xor / fetch_and
+            for ( size_t nBit = 0; nBit < sizeof(integral_type) * 8; ++nBit )
+            {
+                integral_type prev = CDS_ATOMIC::atomic_load_explicit( &a, oLoad )  ;;
+                integral_type mask = 1 << nBit;
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_or_explicit( &a, mask, order ) == prev );
+                prev = CDS_ATOMIC::atomic_load_explicit( &a, oLoad );
+                CPPUNIT_ASSERT( ( prev & mask)  == mask);
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_and_explicit( &a, (integral_type) ~mask, order ) == prev );
+                prev = CDS_ATOMIC::atomic_load_explicit( &a, oLoad );
+                CPPUNIT_ASSERT( ( prev & mask)  == 0);
+
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_xor_explicit( &a, mask, order ) == prev );
+                prev = CDS_ATOMIC::atomic_load_explicit( &a, oLoad );
+                CPPUNIT_ASSERT( ( prev & mask)  == mask);
+            }
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == (integral_type) -1 );
+        }
+
+        template <typename Atomic, typename Integral>
+        void test_atomic_integral_(Atomic& a)
+        {
+            do_test_atomic_integral<Atomic, Integral >(a);
+
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_relaxed );
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_consume );
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_acquire );
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_release );
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_acq_rel );
+            do_test_atomic_integral<Atomic, Integral >( a, CDS_ATOMIC::memory_order_seq_cst );
+        }
+
+        template <typename Integral>
+        void test_atomic_integral()
+        {
+            typedef CDS_ATOMIC::atomic<Integral>    atomic_type;
+            atomic_type a[8];
+            for ( size_t i = 0; i < sizeof(a)/sizeof(a[0]); ++i ) {
+                test_atomic_integral_<atomic_type, Integral>( a[i] );
+            }
+        }
+        template <typename Integral>
+        void test_atomic_integral_volatile()
+        {
+            typedef CDS_ATOMIC::atomic<Integral> volatile atomic_type;
+            atomic_type a[8];
+            for ( size_t i = 0; i < sizeof(a)/sizeof(a[0]); ++i ) {
+                test_atomic_integral_<atomic_type, Integral>( a[i] );
+            }
+        }
+
+        template <class AtomicBool>
+        void do_test_atomic_bool(AtomicBool& a)
+        {
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_is_lock_free( &a ) );
+            CDS_ATOMIC::atomic_store( &a, false );
+            CPPUNIT_ASSERT( a == false );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == false );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange( &a, true ) == false );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == true );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange( &a, false ) == true );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == false );
+
+            bool expected = false;
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_weak( &a, &expected, true));
+            CPPUNIT_ASSERT( expected  == false );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_weak( &a, &expected, false));
+            CPPUNIT_ASSERT( expected  == true );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == true );
+
+            CDS_ATOMIC::atomic_store( &a, false );
+
+            expected = false;
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_strong( &a, &expected, true));
+            CPPUNIT_ASSERT( expected  == false );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_strong( &a, &expected, false));
+            CPPUNIT_ASSERT( expected  == true );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == true );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange( &a, false ) == true );
+        }
+
+        template <class AtomicBool>
+        void do_test_atomic_bool( AtomicBool& a, CDS_ATOMIC::memory_order order )
+        {
+            const CDS_ATOMIC::memory_order oLoad = convert_to_load_order( order );
+            const CDS_ATOMIC::memory_order oStore = convert_to_store_order( order );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_is_lock_free( &a ) );
+            CDS_ATOMIC::atomic_store_explicit( &a, false, oStore );
+            CPPUNIT_ASSERT( a == false );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == false );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange_explicit( &a, true, order ) == false );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == true );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange_explicit( &a, false, order ) == true );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == false );
+
+            bool expected = false;
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_weak_explicit( &a, &expected, true, order, CDS_ATOMIC::memory_order_relaxed));
+            CPPUNIT_ASSERT( expected  == false );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_weak_explicit( &a, &expected, false, order, CDS_ATOMIC::memory_order_relaxed));
+            CPPUNIT_ASSERT( expected  == true );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == true );
+
+            CDS_ATOMIC::atomic_store( &a, false );
+
+            expected = false;
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_strong_explicit( &a, &expected, true, order, CDS_ATOMIC::memory_order_relaxed));
+            CPPUNIT_ASSERT( expected  == false );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_strong_explicit( &a, &expected, false, order, CDS_ATOMIC::memory_order_relaxed));
+            CPPUNIT_ASSERT( expected  == true );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == true );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange_explicit( &a, false, order ) == true );
+        }
+
+        template <typename Atomic, typename Integral>
+        void test_atomic_pointer_for_( Atomic& a, Integral * arr, Integral aSize, CDS_ATOMIC::memory_order order )
+        {
+            typedef Integral integral_type;
+            CDS_ATOMIC::memory_order oLoad = convert_to_load_order(order);
+            CDS_ATOMIC::memory_order oStore = convert_to_store_order(order);
+            integral_type *  p;
+
+            CDS_ATOMIC::atomic_store_explicit( &a, arr, oStore );
+            CPPUNIT_ASSERT( *CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == 1 );
+
+            p = arr;
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_weak_explicit( &a, &p, arr + 5, order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 0 );
+            CPPUNIT_ASSERT( *p == 1 );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_weak_explicit( &a, &p, arr + 3, order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( *p == 6 );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_strong_explicit( &a, &p, arr + 3, order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( *p == 6 );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_strong_explicit( &a, &p, arr + 5, order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 3 );
+            CPPUNIT_ASSERT( *p == 4 );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange_explicit( &a, arr, order ) == arr + 3 );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == arr );
+            CPPUNIT_ASSERT( *CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == 1 );
+
+            for ( integral_type i = 1; i < aSize; ++i ) {
+                integral_type * p = CDS_ATOMIC::atomic_load_explicit( &a, oLoad );
+                CPPUNIT_ASSERT( *p == i );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_add_explicit( &a, 1, order ) == p );
+                CPPUNIT_ASSERT( *CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == i + 1 );
+            }
+
+            for ( integral_type i = aSize; i > 1; --i ) {
+                integral_type * p = CDS_ATOMIC::atomic_load_explicit( &a, oLoad );
+                CPPUNIT_ASSERT( *p == i  );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_sub_explicit( &a, 1, order ) == p );
+                CPPUNIT_ASSERT( *CDS_ATOMIC::atomic_load_explicit( &a, oLoad ) == i - 1 );
+            }
+        }
+
+        template <typename Integral, bool Volatile>
+        void test_atomic_pointer_for()
+        {
+            typedef Integral integral_type;
+            typedef typename add_volatile<CDS_ATOMIC::atomic< integral_type *>, Volatile>::type    atomic_pointer;
+
+            integral_type   arr[8];
+            const integral_type aSize = sizeof(arr)/sizeof(arr[0]);
+            for ( integral_type i = 0; i < aSize; ++i ) {
+                arr[size_t(i)] = i + 1;
+            }
+
+            atomic_pointer  a;
+            integral_type *  p;
+
+            CDS_ATOMIC::atomic_store( &a, arr );
+            CPPUNIT_ASSERT( *CDS_ATOMIC::atomic_load( &a ) == 1 );
+
+            p = arr;
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_weak( &a, &p, arr + 5 ));
+            CPPUNIT_ASSERT( p == arr + 0 );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_weak( &a, &p, arr + 3 ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_strong( &a, &p, arr + 3 ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_strong( &a, &p, arr + 5 ));
+            CPPUNIT_ASSERT( p == arr + 3 );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_exchange( &a, arr ) == arr + 3 );
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_load( &a ) == arr );
+            CPPUNIT_ASSERT( *CDS_ATOMIC::atomic_load( &a ) == 1 );
+
+            for ( integral_type i = 1; i < aSize; ++i ) {
+                integral_type * p = CDS_ATOMIC::atomic_load( &a );
+                CPPUNIT_ASSERT( *p == i );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_add( &a, 1 ) == p );
+                CPPUNIT_ASSERT( *CDS_ATOMIC::atomic_load( &a ) == i + 1 );
+            }
+
+            for ( integral_type i = aSize; i > 1; --i ) {
+                integral_type * p = CDS_ATOMIC::atomic_load( &a );
+                CPPUNIT_ASSERT( *p == i  );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_sub( &a, 1 ) == p );
+                CPPUNIT_ASSERT( *CDS_ATOMIC::atomic_load( &a ) == i - 1 );
+            }
+
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_relaxed );
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_consume );
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_acquire );
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_release );
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_acq_rel );
+            test_atomic_pointer_for_( a, arr, aSize, CDS_ATOMIC::memory_order_seq_cst );
+
+        }
+
+        template <typename Atomic>
+        void do_test_atomic_pointer_void_( Atomic& a, char * arr, char aSize, CDS_ATOMIC::memory_order order )
+        {
+            CDS_ATOMIC::memory_order oLoad = convert_to_load_order(order);
+            CDS_ATOMIC::memory_order oStore = convert_to_store_order(order);
+            char *  p;
+
+            CDS_ATOMIC::atomic_store_explicit( &a, (void *) arr, oStore );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load_explicit( &a, oLoad )) == 1 );
+
+            p = arr;
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_weak_explicit( &a, (void **) &p, (void *)(arr + 5), order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 0 );
+            CPPUNIT_ASSERT( *p == 1 );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_weak_explicit( &a, (void **) &p, (void *)(arr + 3), order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( *p == 6 );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_strong_explicit( &a, (void **) &p, (void *)(arr + 3), order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( *p == 6 );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_strong_explicit( &a, (void **) &p, (void *)(arr + 5), order, CDS_ATOMIC::memory_order_relaxed ));
+            CPPUNIT_ASSERT( p == arr + 3 );
+            CPPUNIT_ASSERT( *p == 4 );
+
+            CPPUNIT_ASSERT( reinterpret_cast<char *>(CDS_ATOMIC::atomic_exchange_explicit( &a, (void *) arr, order )) == arr + 3 );
+            CPPUNIT_ASSERT( reinterpret_cast<char *>(CDS_ATOMIC::atomic_load_explicit( &a, oLoad )) == arr );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load_explicit( &a, oLoad )) == 1 );
+
+            for ( char i = 1; i < aSize; ++i ) {
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load_explicit( &a, oLoad )) == i );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_add_explicit( &a, 1, order ));
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load_explicit( &a, oLoad )) == i + 1 );
+            }
+
+            for ( char i = aSize; i > 1; --i ) {
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load_explicit( &a, oLoad )) == i  );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_sub_explicit( &a, 1, order ));
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load_explicit( &a, oLoad )) == i - 1 );
+            }
+        }
+
+        template <bool Volatile>
+        void do_test_atomic_pointer_void()
+        {
+            typedef typename add_volatile<CDS_ATOMIC::atomic< void *>, Volatile>::type    atomic_pointer;
+
+            char   arr[8];
+            const char aSize = sizeof(arr)/sizeof(arr[0]);
+            for ( char i = 0; i < aSize; ++i ) {
+                arr[unsigned(i)] = i + 1;
+            }
+
+            atomic_pointer  a;
+            char *  p;
+
+            CDS_ATOMIC::atomic_store( &a, (void *) arr );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load( &a )) == 1 );
+
+            p = arr;
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_weak( &a, (void **) &p, (void *)(arr + 5) ));
+            CPPUNIT_ASSERT( p == arr + 0 );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_weak( &a, (void **) &p, (void *)(arr + 3) ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+
+            CPPUNIT_ASSERT( CDS_ATOMIC::atomic_compare_exchange_strong( &a, (void **) &p, (void *)(arr + 3) ));
+            CPPUNIT_ASSERT( p == arr + 5 );
+            CPPUNIT_ASSERT( !CDS_ATOMIC::atomic_compare_exchange_strong( &a, (void **) &p, (void *)(arr + 5) ));
+            CPPUNIT_ASSERT( p == arr + 3 );
+
+            CPPUNIT_ASSERT( reinterpret_cast<char *>( CDS_ATOMIC::atomic_exchange( &a, (void *) arr )) == arr + 3 );
+            CPPUNIT_ASSERT( reinterpret_cast<char *>( CDS_ATOMIC::atomic_load( &a )) == arr );
+            CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load( &a )) == 1 );
+
+            for ( char i = 1; i < aSize; ++i ) {
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load( &a )) == i );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_add( &a, 1 ));
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load( &a )) == i + 1 );
+            }
+
+            for ( char i = aSize; i > 1; --i ) {
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load( &a )) == i  );
+                CPPUNIT_ASSERT( CDS_ATOMIC::atomic_fetch_sub( &a, 1 ));
+                CPPUNIT_ASSERT( *reinterpret_cast<char *>(CDS_ATOMIC::atomic_load( &a )) == i - 1 );
+            }
+
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_relaxed );
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_consume );
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_acquire );
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_release );
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_acq_rel );
+            do_test_atomic_pointer_void_( a, arr, aSize, CDS_ATOMIC::memory_order_seq_cst );
+        }
+
+    public:
+        void test_atomic_flag()
+        {
+            CDS_ATOMIC::atomic_flag flags[8];
+            for ( size_t i = 0; i < sizeof(flags)/sizeof(flags[0]); ++i )
+                do_test_atomic_flag( flags[i] );
+        }
+        void test_atomic_flag_volatile()
+        {
+            CDS_ATOMIC::atomic_flag volatile flags[8];
+            for ( size_t i = 0; i < sizeof(flags)/sizeof(flags[0]); ++i )
+                do_test_atomic_flag( flags[i] );
+        }
+
+        template <typename AtomicBool>
+        void test_atomic_bool_()
+        {
+            AtomicBool a[8];
+            for ( size_t i = 0; i < sizeof(a)/sizeof(a[0]); ++i ) {
+                do_test_atomic_bool( a[i] );
+
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_relaxed );
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_consume );
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_acquire );
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_release );
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_acq_rel );
+                do_test_atomic_bool( a[i], CDS_ATOMIC::memory_order_seq_cst );
+            }
+        }
+
+        void test_atomic_bool()
+        {
+            test_atomic_bool_<CDS_ATOMIC::atomic<bool> >();
+        }
+        void test_atomic_bool_volatile()
+        {
+            test_atomic_bool_<CDS_ATOMIC::atomic<bool> volatile >();
+        }
+
+        void test_atomic_char()                 { test_atomic_integral<char>(); }
+        void test_atomic_char_volatile()        { test_atomic_integral_volatile<char>(); }
+        void test_atomic_signed_char()          { test_atomic_integral<signed char>(); }
+        void test_atomic_signed_char_volatile() { test_atomic_integral_volatile<signed char>(); }
+        void test_atomic_unsigned_char()        { test_atomic_integral<unsigned char>(); }
+        void test_atomic_unsigned_char_volatile(){ test_atomic_integral_volatile<unsigned char>(); }
+        void test_atomic_short_int()            { test_atomic_integral<short int>(); }
+        void test_atomic_short_int_volatile()   { test_atomic_integral_volatile<short int>(); }
+        void test_atomic_unsigned_short_int()   { test_atomic_integral<unsigned short int>(); }
+        void test_atomic_unsigned_short_int_volatile() { test_atomic_integral_volatile<unsigned short int>(); }
+        void test_atomic_int()                  { test_atomic_integral<int>(); }
+        void test_atomic_int_volatile()         { test_atomic_integral_volatile<int>(); }
+        void test_atomic_unsigned_int()         { test_atomic_integral<unsigned int>(); }
+        void test_atomic_unsigned_int_volatile(){ test_atomic_integral_volatile<unsigned int>(); }
+        void test_atomic_long()                 { test_atomic_integral<long>(); }
+        void test_atomic_long_volatile()        { test_atomic_integral_volatile<long>(); }
+        void test_atomic_unsigned_long()        { test_atomic_integral<unsigned long>(); }
+        void test_atomic_unsigned_long_volatile() { test_atomic_integral_volatile<unsigned long>(); }
+        void test_atomic_long_long()            { test_atomic_integral<long long>(); }
+        void test_atomic_long_long_volatile()   { test_atomic_integral_volatile<long long>(); }
+        void test_atomic_unsigned_long_long()   { test_atomic_integral<unsigned long long>(); }
+        void test_atomic_unsigned_long_long_volatile() { test_atomic_integral_volatile<unsigned long long>(); }
+//#if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40400
+//        void test_atomic_char16_t()             { test_atomic_integral<char16_t>(); }
+//        void test_atomic_char16_t_volatile()    { test_atomic_integral_volatile<char16_t>(); }
+//        void test_atomic_char32_t()             { test_atomic_integral<char32_t>(); }
+//        void test_atomic_char32_t_volatile()    { test_atomic_integral_volatile<char32_t>(); }
+//#endif
+//        void test_atomic_wchar_t()
+//        {
+//#if CDS_OS_TYPE != CDS_OS_HPUX
+//            test_atomic_integral<wchar_t>();
+//#endif
+//        }
+//        void test_atomic_wchar_t_volatile()
+//        {
+//#if CDS_OS_TYPE != CDS_OS_HPUX
+//            test_atomic_integral_volatile<wchar_t>();
+//#endif
+//        }
+
+        void test_atomic_pointer_void()         { do_test_atomic_pointer_void<false>() ;}
+        void test_atomic_pointer_void_volatile(){ do_test_atomic_pointer_void<true>() ;}
+
+        void test_atomic_pointer_char()         { test_atomic_pointer_for<char, false>() ;}
+        void test_atomic_pointer_short()        { test_atomic_pointer_for<short int, false>() ;}
+        void test_atomic_pointer_int()          { test_atomic_pointer_for<int, false>() ;}
+        void test_atomic_pointer_long()         { test_atomic_pointer_for<long, false>() ;}
+        void test_atomic_pointer_long_long()    { test_atomic_pointer_for<long long, false>() ;}
+
+        void test_atomic_pointer_char_volatile()        { test_atomic_pointer_for<char, true>() ;}
+        void test_atomic_pointer_short_volatile()       { test_atomic_pointer_for<unsigned short int, true>() ;}
+        void test_atomic_pointer_int_volatile()          { test_atomic_pointer_for<int, true>() ;}
+        void test_atomic_pointer_long_volatile()         { test_atomic_pointer_for<long, true>() ;}
+        void test_atomic_pointer_long_long_volatile()    { test_atomic_pointer_for<long long, true>() ;}
+
+        void test_atomic_fence()
+        {
+            CDS_ATOMIC::atomic_thread_fence(CDS_ATOMIC::memory_order_relaxed );
+            CDS_ATOMIC::atomic_thread_fence(CDS_ATOMIC::memory_order_consume );
+            CDS_ATOMIC::atomic_thread_fence(CDS_ATOMIC::memory_order_acquire );
+            CDS_ATOMIC::atomic_thread_fence(CDS_ATOMIC::memory_order_release );
+            CDS_ATOMIC::atomic_thread_fence(CDS_ATOMIC::memory_order_acq_rel );
+            CDS_ATOMIC::atomic_thread_fence(CDS_ATOMIC::memory_order_seq_cst );
+
+            CDS_ATOMIC::atomic_signal_fence(CDS_ATOMIC::memory_order_relaxed );
+            CDS_ATOMIC::atomic_signal_fence(CDS_ATOMIC::memory_order_consume );
+            CDS_ATOMIC::atomic_signal_fence(CDS_ATOMIC::memory_order_acquire );
+            CDS_ATOMIC::atomic_signal_fence(CDS_ATOMIC::memory_order_release );
+            CDS_ATOMIC::atomic_signal_fence(CDS_ATOMIC::memory_order_acq_rel );
+            CDS_ATOMIC::atomic_signal_fence(CDS_ATOMIC::memory_order_seq_cst );
+        }
+
+    public:
+        CPPUNIT_TEST_SUITE(cxx11_atomic_func)
+            CPPUNIT_TEST( test_atomic_flag )
+            CPPUNIT_TEST( test_atomic_flag_volatile )
+
+            CPPUNIT_TEST( test_atomic_bool )
+            CPPUNIT_TEST( test_atomic_char )
+            CPPUNIT_TEST( test_atomic_signed_char)
+            CPPUNIT_TEST( test_atomic_unsigned_char)
+            CPPUNIT_TEST( test_atomic_short_int)
+            CPPUNIT_TEST( test_atomic_unsigned_short_int)
+            CPPUNIT_TEST( test_atomic_int)
+            CPPUNIT_TEST( test_atomic_unsigned_int)
+            CPPUNIT_TEST( test_atomic_long)
+            CPPUNIT_TEST( test_atomic_unsigned_long)
+            CPPUNIT_TEST( test_atomic_long_long)
+            CPPUNIT_TEST( test_atomic_unsigned_long_long)
+//#if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40400
+//            CPPUNIT_TEST( test_atomic_char16_t )
+//            CPPUNIT_TEST( test_atomic_char32_t )
+//#endif
+//            CPPUNIT_TEST( test_atomic_wchar_t)
+
+            CPPUNIT_TEST( test_atomic_bool_volatile )
+            CPPUNIT_TEST( test_atomic_char_volatile )
+            CPPUNIT_TEST( test_atomic_signed_char_volatile)
+            CPPUNIT_TEST( test_atomic_unsigned_char_volatile)
+            CPPUNIT_TEST( test_atomic_short_int_volatile)
+            CPPUNIT_TEST( test_atomic_unsigned_short_int_volatile)
+            CPPUNIT_TEST( test_atomic_int_volatile)
+            CPPUNIT_TEST( test_atomic_unsigned_int_volatile)
+            CPPUNIT_TEST( test_atomic_long_volatile)
+            CPPUNIT_TEST( test_atomic_unsigned_long_volatile)
+            CPPUNIT_TEST( test_atomic_long_long_volatile)
+            CPPUNIT_TEST( test_atomic_unsigned_long_long_volatile)
+//#if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION >= 40400
+//            CPPUNIT_TEST( test_atomic_char16_t_volatile )
+//            CPPUNIT_TEST( test_atomic_char32_t_volatile )
+//#endif
+//            CPPUNIT_TEST( test_atomic_wchar_t_volatile)
+
+            CPPUNIT_TEST( test_atomic_pointer_void)
+            CPPUNIT_TEST( test_atomic_pointer_void_volatile)
+
+            CPPUNIT_TEST( test_atomic_pointer_char)
+            CPPUNIT_TEST( test_atomic_pointer_short)
+            CPPUNIT_TEST( test_atomic_pointer_int)
+            CPPUNIT_TEST( test_atomic_pointer_long)
+            CPPUNIT_TEST( test_atomic_pointer_long_long)
+
+            CPPUNIT_TEST( test_atomic_pointer_char_volatile)
+            CPPUNIT_TEST( test_atomic_pointer_short_volatile)
+            CPPUNIT_TEST( test_atomic_pointer_int_volatile)
+            CPPUNIT_TEST( test_atomic_pointer_long_volatile)
+            CPPUNIT_TEST( test_atomic_pointer_long_long_volatile)
+
+            CPPUNIT_TEST( test_atomic_fence)
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+}   // namespace misc
+
+CPPUNIT_TEST_SUITE_REGISTRATION(misc::cxx11_atomic_func);
+
+#endif // #ifndef CDS_USE_BOOST_ATOMIC
diff --git a/tests/test-hdr/misc/cxx11_convert_memory_order.h b/tests/test-hdr/misc/cxx11_convert_memory_order.h
new file mode 100644 (file)
index 0000000..8c0083d
--- /dev/null
@@ -0,0 +1,47 @@
+//$$CDS-header$$
+
+// This header should be included AFTER <cds/cxx11_atomic.h> if needed
+
+namespace misc {
+
+    static inline CDS_ATOMIC::memory_order convert_to_store_order( CDS_ATOMIC::memory_order order )
+    {
+        switch ( order ) {
+            case CDS_ATOMIC::memory_order_acquire:
+            case CDS_ATOMIC::memory_order_consume:
+                return CDS_ATOMIC::memory_order_relaxed;
+            case CDS_ATOMIC::memory_order_acq_rel:
+                return CDS_ATOMIC::memory_order_release;
+            default:
+                return order;
+        }
+    }
+
+    static inline CDS_ATOMIC::memory_order convert_to_load_order( CDS_ATOMIC::memory_order order )
+    {
+        switch ( order ) {
+            case CDS_ATOMIC::memory_order_release:
+                return CDS_ATOMIC::memory_order_relaxed;
+            case CDS_ATOMIC::memory_order_acq_rel:
+                return CDS_ATOMIC::memory_order_acquire;
+            default:
+                return order;
+        }
+    }
+
+    template <typename T, bool Volatile>
+    struct add_volatile;
+
+    template <typename T>
+    struct add_volatile<T, false>
+    {
+        typedef T   type;
+    };
+
+    template <typename T>
+    struct add_volatile<T, true>
+    {
+        typedef T volatile   type;
+    };
+
+} // namespace misc
diff --git a/tests/test-hdr/misc/find_option.cpp b/tests/test-hdr/misc/find_option.cpp
new file mode 100644 (file)
index 0000000..263476d
--- /dev/null
@@ -0,0 +1,196 @@
+//$$CDS-header$$
+
+#include <cds/opt/options.h>
+#include <cds/details/std/type_traits.h>
+
+// Value options
+namespace {
+
+    template <int Val>
+    struct int_opt {
+        static const int value = Val;
+    };
+
+    template <bool Val>
+    struct bool_opt {
+        static const bool value = Val;
+    };
+
+    enum user_enum {
+        val_zero, val_one, val_two, val_three, val_four, val_five
+    };
+
+    template <user_enum Val>
+    struct enum_opt {
+        static const user_enum value = Val;
+    };
+}
+
+// Declare necessary cds::opt::find_option specialization for user-provided enum type
+CDS_DECLARE_FIND_OPTION_INTEGRAL_SPECIALIZATION( user_enum )
+
+#if CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION < 40500
+// GCC 4.4 does not support local struct declarations
+namespace {
+    struct tag_default;
+    struct tag_a;
+    struct tag_b;
+}
+#endif
+
+void find_option_compiler_test()
+{
+
+    // *************************************************
+    // Type options
+    //
+#if !(CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION < 40500)
+    // GCC 4.4 does not support local struct declarations
+    struct tag_default;
+    struct tag_a;
+    struct tag_b;
+#endif
+
+    // Option not found
+    static_assert( (std::is_same<
+        cds::opt::find_option< cds::opt::tag<tag_default>, cds::opt::stat<tag_a>, bool_opt<false> >::type,
+        cds::opt::tag<tag_default>
+    >::value), "Result != tag_default" );
+
+    // Option found once
+    static_assert( (std::is_same<
+        cds::opt::find_option< cds::opt::tag<tag_default>, cds::opt::tag<tag_a> >::type,
+        cds::opt::tag<tag_a>
+    >::value), "Result != tag_a" );
+
+    static_assert( (std::is_same<
+        cds::opt::find_option< cds::opt::tag<tag_default>, cds::opt::stat<tag_a>, cds::opt::tag<tag_a> >::type,
+        cds::opt::tag<tag_a>
+    >::value), "Result != tag_a" );
+
+    // First option
+    static_assert( (std::is_same<
+        cds::opt::find_option< cds::opt::tag<tag_default>
+        ,cds::opt::tag<tag_a>   // desired
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        >::type,
+        cds::opt::tag<tag_a>
+    >::value), "Result != tag_a" );
+
+    // Last option
+    static_assert( (std::is_same<
+        cds::opt::find_option< cds::opt::tag<tag_default>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::tag<tag_a>   // desired
+        >::type,
+        cds::opt::tag<tag_a>
+    >::value), "Result != tag_a" );
+
+    // Middle option
+    static_assert( (std::is_same<
+        cds::opt::find_option< cds::opt::tag<tag_default>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::tag<tag_a>   // desired
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        >::type,
+        cds::opt::tag<tag_a>
+    >::value), "Result != tag_a" );
+
+    // Option not found
+    static_assert( (std::is_same<
+        cds::opt::find_option< cds::opt::tag<tag_default>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_default>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        >::type,
+        cds::opt::tag<tag_default>
+    >::value), "Result != tag_default" );
+
+    // Multiple options
+    static_assert( (std::is_same<
+        cds::opt::find_option< cds::opt::tag<tag_default>, cds::opt::tag<tag_a>, cds::opt::tag<tag_b> >::type,
+        cds::opt::tag<tag_a>
+    >::value), "Result != tag_a" );
+
+    static_assert( (std::is_same<
+        cds::opt::find_option< cds::opt::tag<tag_default>
+        ,cds::opt::tag<tag_a>   // desired - first accepted
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_b>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::stat<tag_a>
+        ,cds::opt::tag<tag_b>    // desired
+        >::type,
+        cds::opt::tag<tag_a>
+    >::value), "Result != tag_a" );
+
+
+
+    // *****************************************************
+    // Value options
+
+    // Not found
+    static_assert( (std::is_same<
+        cds::opt::find_option< int_opt<15>, bool_opt<false>, cds::opt::stat<tag_a> >::type,
+        int_opt<15>
+    >::value), "Result != int_opt<15>" );
+
+    static_assert( (std::is_same<
+        cds::opt::find_option< int_opt<15>, int_opt<100>, cds::opt::stat<tag_a> >::type,
+        int_opt<100>
+    >::value), "Result != int_opt<100>" );
+
+    static_assert( (std::is_same<
+        cds::opt::find_option< int_opt<15>, int_opt<100>, cds::opt::stat<tag_a>, bool_opt<true>, int_opt<200> >::type,
+        int_opt<100>
+    >::value), "Result != int_opt<100>" );
+
+    // User-provided enum type
+    static_assert( (std::is_same<
+        cds::opt::find_option< enum_opt<val_zero>, int_opt<100>, cds::opt::stat<tag_a>, int_opt<200> >::type,
+        enum_opt<val_zero>
+    >::value), "Result != enum_opt<val_zero>" );
+
+    static_assert( (std::is_same<
+        cds::opt::find_option< enum_opt<val_zero>, int_opt<100>, cds::opt::stat<tag_a>, enum_opt<val_three>, int_opt<200> >::type,
+        enum_opt<val_three>
+    >::value), "Result != enum_opt<val_three>" );
+
+}
+
+void test_extracting_option_value()
+{
+#if !(CDS_COMPILER == CDS_COMPILER_GCC && CDS_COMPILER_VERSION < 40500)
+    // GCC 4.4 does not support local struct declarations
+    struct tag_a;
+#endif
+    // Define option
+    typedef cds::opt::tag< tag_a >  tag_option;
+
+    // What is the value of the tag_option?
+    // How we can extract tag_a from tag_option?
+    // Here is a solution:
+    typedef cds::opt::value< tag_option >::tag  tag_option_value;
+
+    // tag_option_value is the same as tag_a
+    static_assert( (std::is_same< tag_option_value, tag_a >::value), "Error getting the value of option: tag_option_value != tag_a" );
+
+    // Value-option
+    typedef cds::opt::alignment< 16 >   align_option;
+    static_assert( cds::opt::value< align_option >::alignment == 16, "Error getting the value of option: option value != 16" );
+}
diff --git a/tests/test-hdr/misc/hash_tuple.cpp b/tests/test-hdr/misc/hash_tuple.cpp
new file mode 100644 (file)
index 0000000..e9353a7
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include <cds/opt/hash.h>
+
+#include "cppunit/cppunit_proxy.h"
+
+namespace misc {
+    namespace {
+        typedef cds::opt::v::hash_selector< cds::opt::none >::type hashing;
+
+#define HASHING(_n) \
+        struct hash##_n: public hashing { \
+            template <typename T> size_t operator()( T const& v ) const { return hashing::operator()(v) + _n ; } \
+        };
+
+        HASHING(2)
+        HASHING(3)
+        HASHING(4)
+        HASHING(5)
+        HASHING(6)
+        HASHING(7)
+        HASHING(8)
+        HASHING(9)
+        HASHING(10)
+#undef HASHING
+    }
+
+    class HashTuple: public CppUnitMini::TestCase
+    {
+        void test()
+        {
+            int nVal = 5;
+            size_t nHash = hashing()(nVal);
+
+            size_t val[16];
+
+            cds::opt::hash< std::tuple< hashing, hash2 > >::pack<cds::opt::none>::hash  h2;
+            h2( val, nVal );
+            CPPUNIT_ASSERT( val[0] == nHash );
+            CPPUNIT_ASSERT( val[1] == nHash + 2 );
+
+            cds::opt::hash< std::tuple< hashing, hash2, hash3 > >::pack<cds::opt::none>::hash  h3;
+            h3( val, nVal );
+            CPPUNIT_ASSERT( val[0] == nHash );
+            CPPUNIT_ASSERT( val[1] == nHash + 2 );
+            CPPUNIT_ASSERT( val[2] == nHash + 3 );
+
+            cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4 > >::pack<cds::opt::none>::hash  h4;
+            h4( val, nVal );
+            CPPUNIT_ASSERT( val[0] == nHash );
+            CPPUNIT_ASSERT( val[1] == nHash + 2 );
+            CPPUNIT_ASSERT( val[2] == nHash + 3 );
+            CPPUNIT_ASSERT( val[3] == nHash + 4 );
+
+            cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5 > >::pack<cds::opt::none>::hash  h5;
+            h5( val, nVal );
+            CPPUNIT_ASSERT( val[0] == nHash );
+            CPPUNIT_ASSERT( val[1] == nHash + 2 );
+            CPPUNIT_ASSERT( val[2] == nHash + 3 );
+            CPPUNIT_ASSERT( val[3] == nHash + 4 );
+            CPPUNIT_ASSERT( val[4] == nHash + 5 );
+
+#if !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1700)
+            // MS VC 11: std::tuple suports up to 5 template params only
+
+            cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6 > >::pack<cds::opt::none>::hash  h6;
+            h6( val, nVal );
+            CPPUNIT_ASSERT( val[0] == nHash );
+            CPPUNIT_ASSERT( val[1] == nHash + 2 );
+            CPPUNIT_ASSERT( val[2] == nHash + 3 );
+            CPPUNIT_ASSERT( val[3] == nHash + 4 );
+            CPPUNIT_ASSERT( val[4] == nHash + 5 );
+            CPPUNIT_ASSERT( val[5] == nHash + 6 );
+
+            cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7 > >::pack<cds::opt::none>::hash  h7;
+            h7( val, nVal );
+            CPPUNIT_ASSERT( val[0] == nHash );
+            CPPUNIT_ASSERT( val[1] == nHash + 2 );
+            CPPUNIT_ASSERT( val[2] == nHash + 3 );
+            CPPUNIT_ASSERT( val[3] == nHash + 4 );
+            CPPUNIT_ASSERT( val[4] == nHash + 5 );
+            CPPUNIT_ASSERT( val[5] == nHash + 6 );
+            CPPUNIT_ASSERT( val[6] == nHash + 7 );
+
+            cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8 > >::pack<cds::opt::none>::hash  h8;
+            h8( val, nVal );
+            CPPUNIT_ASSERT( val[0] == nHash );
+            CPPUNIT_ASSERT( val[1] == nHash + 2 );
+            CPPUNIT_ASSERT( val[2] == nHash + 3 );
+            CPPUNIT_ASSERT( val[3] == nHash + 4 );
+            CPPUNIT_ASSERT( val[4] == nHash + 5 );
+            CPPUNIT_ASSERT( val[5] == nHash + 6 );
+            CPPUNIT_ASSERT( val[6] == nHash + 7 );
+            CPPUNIT_ASSERT( val[7] == nHash + 8 );
+
+            cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8, hash9 > >::pack<cds::opt::none>::hash  h9;
+            h9( val, nVal );
+            CPPUNIT_ASSERT( val[0] == nHash );
+            CPPUNIT_ASSERT( val[1] == nHash + 2 );
+            CPPUNIT_ASSERT( val[2] == nHash + 3 );
+            CPPUNIT_ASSERT( val[3] == nHash + 4 );
+            CPPUNIT_ASSERT( val[4] == nHash + 5 );
+            CPPUNIT_ASSERT( val[5] == nHash + 6 );
+            CPPUNIT_ASSERT( val[6] == nHash + 7 );
+            CPPUNIT_ASSERT( val[7] == nHash + 8 );
+            CPPUNIT_ASSERT( val[8] == nHash + 9 );
+
+            cds::opt::hash< std::tuple< hashing, hash2, hash3, hash4, hash5, hash6, hash7, hash8, hash9, hash10 > >::pack<cds::opt::none>::hash  h10;
+            h10( val, nVal );
+            CPPUNIT_ASSERT( val[0] == nHash );
+            CPPUNIT_ASSERT( val[1] == nHash + 2 );
+            CPPUNIT_ASSERT( val[2] == nHash + 3 );
+            CPPUNIT_ASSERT( val[3] == nHash + 4 );
+            CPPUNIT_ASSERT( val[4] == nHash + 5 );
+            CPPUNIT_ASSERT( val[5] == nHash + 6 );
+            CPPUNIT_ASSERT( val[6] == nHash + 7 );
+            CPPUNIT_ASSERT( val[7] == nHash + 8 );
+            CPPUNIT_ASSERT( val[8] == nHash + 9 );
+            CPPUNIT_ASSERT( val[9] == nHash + 10 );
+#endif
+        }
+
+    public:
+        CPPUNIT_TEST_SUITE(HashTuple)
+            CPPUNIT_TEST( test )
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+} // namespace misc
+
+CPPUNIT_TEST_SUITE_REGISTRATION(misc::HashTuple);
diff --git a/tests/test-hdr/misc/michael_allocator.cpp b/tests/test-hdr/misc/michael_allocator.cpp
new file mode 100644 (file)
index 0000000..89b8de7
--- /dev/null
@@ -0,0 +1,8 @@
+//$$CDS-header$$
+
+#include "misc/michael_allocator.h"
+
+namespace misc {
+    t_MichaelHeap_NoStat  s_MichaelHeap_NoStat;
+    t_MichaelHeap_Stat    s_MichaelHeap_Stat;
+}
diff --git a/tests/test-hdr/misc/michael_allocator.h b/tests/test-hdr/misc/michael_allocator.h
new file mode 100644 (file)
index 0000000..013c2a5
--- /dev/null
@@ -0,0 +1,197 @@
+//$$CDS-header$$
+
+#include <cds/memory/michael/allocator.h>
+#include <iostream>
+
+namespace misc {
+    namespace ma = cds::memory::michael;
+
+    typedef ma::Heap<
+        ma::opt::procheap_stat<ma::procheap_empty_stat>,
+        ma::opt::os_allocated_stat<ma::os_allocated_empty>,
+        ma::opt::check_bounds<ma::debug_bound_checking>
+    >      t_MichaelHeap_NoStat;
+
+    typedef ma::Heap<
+        ma::opt::procheap_stat<ma::procheap_atomic_stat >,
+        ma::opt::os_allocated_stat<ma::os_allocated_atomic >,
+        ma::opt::check_bounds<ma::debug_bound_checking>
+    >  t_MichaelHeap_Stat;
+
+    typedef ma::summary_stat            summary_stat;
+
+    extern t_MichaelHeap_NoStat  s_MichaelHeap_NoStat;
+    extern t_MichaelHeap_Stat    s_MichaelHeap_Stat;
+
+    template <typename T>
+    class MichaelHeap_NoStat
+    {
+    public:
+        typedef T value_type;
+        typedef T * pointer;
+
+        enum {
+            alignment = 1
+        };
+
+
+        pointer allocate( size_t nSize, const void * pHint )
+        {
+            return reinterpret_cast<pointer>( s_MichaelHeap_NoStat.alloc( sizeof(T) * nSize ) );
+        }
+
+        void deallocate( pointer p, size_t nCount )
+        {
+            s_MichaelHeap_NoStat.free( p );
+        }
+
+        static void stat(summary_stat& s)
+        {
+            s_MichaelHeap_NoStat.summaryStat(s);
+        }
+    };
+
+    template <typename T>
+    class std_allocator: public std::allocator<T>
+    {
+    public:
+        enum {
+            alignment = 1
+        };
+
+        static void stat(summary_stat& s)
+        {}
+    };
+
+    template <typename T>
+    class MichaelHeap_Stat
+    {
+    public:
+        typedef T value_type;
+        typedef T * pointer;
+
+        enum {
+            alignment = 1
+        };
+
+        pointer allocate( size_t nSize, const void * pHint )
+        {
+            return reinterpret_cast<pointer>( s_MichaelHeap_Stat.alloc( sizeof(T) * nSize ) );
+        }
+
+        void deallocate( pointer p, size_t nCount )
+        {
+            s_MichaelHeap_Stat.free( p );
+        }
+
+        static void stat(summary_stat& s)
+        {
+            s_MichaelHeap_Stat.summaryStat(s);
+        }
+    };
+
+    template <typename T, size_t ALIGN>
+    class MichaelAlignHeap_NoStat
+    {
+    public:
+        typedef T value_type;
+        typedef T * pointer;
+
+        enum {
+            alignment = ALIGN
+        };
+
+        pointer allocate( size_t nSize, const void * pHint )
+        {
+            return reinterpret_cast<pointer>( s_MichaelHeap_NoStat.alloc_aligned( sizeof(T) * nSize, ALIGN ) );
+        }
+
+        void deallocate( pointer p, size_t nCount )
+        {
+            s_MichaelHeap_NoStat.free_aligned( p );
+        }
+
+        static void stat(summary_stat& s)
+        {
+            s_MichaelHeap_NoStat.summaryStat(s);
+        }
+    };
+
+    template <typename T, size_t ALIGN>
+    class MichaelAlignHeap_Stat {
+    public:
+        typedef T value_type;
+        typedef T * pointer;
+
+        enum {
+            alignment = ALIGN
+        };
+
+        pointer allocate( size_t nSize, const void * pHint )
+        {
+            return reinterpret_cast<pointer>( s_MichaelHeap_Stat.alloc_aligned( sizeof(T) * nSize, ALIGN ) );
+        }
+
+        void deallocate( pointer p, size_t nCount )
+        {
+            s_MichaelHeap_Stat.free_aligned( p );
+        }
+
+        static void stat(summary_stat& s)
+        {
+            s_MichaelHeap_Stat.summaryStat(s);
+        }
+    };
+
+    template <typename T, size_t ALIGN>
+    class system_aligned_allocator
+    {
+    public:
+        typedef T value_type;
+        typedef T * pointer;
+
+        enum {
+            alignment = ALIGN
+        };
+
+        pointer allocate( size_t nSize, const void * pHint )
+        {
+            return reinterpret_cast<pointer>( cds::OS::aligned_malloc( sizeof(T) * nSize, ALIGN ) );
+        }
+
+        void deallocate( pointer p, size_t nCount )
+        {
+            cds::OS::aligned_free( p );
+        }
+
+        static void stat(summary_stat& s)
+        {}
+    };
+
+    static inline std::ostream& operator <<(std::ostream& os, const summary_stat& s)
+    {
+        os  << "\t         alloc from active: " << s.nAllocFromActive << "\n"
+            << "\t        alloc from partial: " << s.nAllocFromPartial << "\n"
+            << "\t            alloc from new: " << s.nAllocFromNew << "\n"
+            << "\t           free call count: " << s.nFreeCount << "\n"
+            << "\t      superblock allocated: " << s.nPageAllocCount << "\n"
+            << "\t    superblock deallocated: " << s.nPageDeallocCount << "\n"
+            << "\t superblock desc allocated: " << s.nDescAllocCount << "\n"
+            << "\t      superblock full desc: " << s.nDescFull << "\n"
+            << "\t     total allocated bytes: " << s.nBytesAllocated << "\n"
+            << "\t   total deallocated bytes: " << s.nBytesDeallocated << "\n"
+            << "\tOS-allocated large blocks\n"
+            << "\t          alloc call count: " << s.nSysAllocCount << "\n"
+            << "\t           free call count: " << s.nSysFreeCount << "\n"
+            << "\t     total allocated bytes: " << s.nSysBytesAllocated << "\n"
+            << "\t   total deallocated bytes: " << s.nSysBytesDeallocated << "\n"
+            << "\tCAS contention indicators\n"
+            << "\t updating active field of active block: " << s.nActiveDescCASFailureCount << "\n"
+            << "\t updating anchor field of active block: " << s.nActiveAnchorCASFailureCount << "\n"
+            << "\tupdating active field of partial block: " << s.nPartialDescCASFailureCount << "\n"
+            << "\tupdating anchor field of partial block: " << s.nPartialAnchorCASFailureCount
+            << std::endl;
+
+        return os;
+    }
+}
diff --git a/tests/test-hdr/misc/permutation_generator.cpp b/tests/test-hdr/misc/permutation_generator.cpp
new file mode 100644 (file)
index 0000000..ae25f56
--- /dev/null
@@ -0,0 +1,77 @@
+//$$CDS-header$$
+
+#include <cds/opt/permutation.h>
+#include "cppunit/cppunit_proxy.h"
+
+namespace misc {
+
+    class Permutations: public CppUnitMini::TestCase
+    {
+        static const size_t c_nMax = 1024;
+
+        template <typename Gen>
+        void test_with( Gen& gen, size_t nLen )
+        {
+            unsigned int arr[c_nMax];
+            for ( size_t nPass = 0; nPass < 10; ++nPass ) {
+                for ( size_t i = 0; i < c_nMax; ++i )
+                    arr[i] = 0;
+
+                do {
+                    typename Gen::integer_type i = gen;
+                    ++arr[ i ];
+                } while ( gen.next() );
+
+                for ( size_t i = 0; i < nLen; ++i )
+                    CPPUNIT_CHECK_EX( arr[i] == 1, "arr[" << i << "]=" << arr[i] );
+                for ( size_t i = nLen; i < c_nMax; ++i )
+                    CPPUNIT_CHECK_EX( arr[i] == 0, "arr[" << i << "]=" << arr[i] );
+
+                gen.reset();
+            }
+        }
+
+        template <typename Gen>
+        void test()
+        {
+            for ( size_t nLen = 2; nLen <= c_nMax; ++nLen ) {
+                Gen gen( nLen );
+                test_with( gen, nLen );
+            }
+        }
+
+        template <typename Gen>
+        void test2()
+        {
+            for ( size_t nLen = 2; nLen <= c_nMax; nLen *= 2 ) {
+                Gen gen( nLen );
+                test_with( gen, nLen );
+            }
+        }
+
+        void test_random_permutation()
+        {
+            test< cds::opt::v::random_permutation<> >();
+        }
+
+        void test_random2_permutation()
+        {
+            test2< cds::opt::v::random2_permutation<> >();
+        }
+
+        void test_random_shuffle_permutation()
+        {
+            test< cds::opt::v::random_shuffle_permutation<> >();
+        }
+
+    public:
+        CPPUNIT_TEST_SUITE(Permutations)
+            CPPUNIT_TEST( test_random_permutation )
+            CPPUNIT_TEST( test_random2_permutation )
+            CPPUNIT_TEST( test_random_shuffle_permutation )
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+} // namespace misc
+
+CPPUNIT_TEST_SUITE_REGISTRATION(misc::Permutations);
diff --git a/tests/test-hdr/misc/thread_init_fini.cpp b/tests/test-hdr/misc/thread_init_fini.cpp
new file mode 100644 (file)
index 0000000..c1e1861
--- /dev/null
@@ -0,0 +1,77 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include <cds/threading/model.h>
+
+namespace {
+    static size_t s_nThreadCount = 8;
+    static size_t s_nPassCount = 1000000;
+}
+
+class thread_init_fini: public CppUnitMini::TestCase
+{
+    class Thread: public CppUnitMini::TestThread
+    {
+        virtual TestThread *    clone()
+        {
+            return new Thread( *this );
+        }
+
+    public:
+        Thread( CppUnitMini::ThreadPool& pool )
+            : CppUnitMini::TestThread( pool )
+        {}
+        Thread( Thread& src )
+            : CppUnitMini::TestThread( src )
+        {}
+
+        thread_init_fini&  getTest()
+        {
+            return reinterpret_cast<thread_init_fini&>( m_Pool.m_Test );
+        }
+
+        virtual void init()
+        {}
+        virtual void fini()
+        {}
+
+        virtual void test()
+        {
+            for ( size_t i = 0; i < s_nPassCount; ++i ) {
+                CPPUNIT_ASSERT(!cds::threading::Manager::isThreadAttached());
+                if ( !cds::threading::Manager::isThreadAttached() )
+                    cds::threading::Manager::attachThread();
+                CPPUNIT_ASSERT( cds::threading::Manager::isThreadAttached() );
+                cds::threading::Manager::detachThread();
+            }
+        }
+    };
+
+protected:
+    void init_fini()
+    {
+        CPPUNIT_MSG( "Thread init/fini test,\n    thread count=" << s_nThreadCount << " pass count=" << s_nPassCount << "..." );
+
+        CppUnitMini::ThreadPool pool( *this );
+
+        pool.add( new Thread( pool ), s_nThreadCount );
+
+        cds::OS::Timer    timer;
+        timer.reset();
+
+        pool.run();
+
+        CPPUNIT_MSG( "   Duration=" << timer.duration() );
+    }
+
+    void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+        s_nThreadCount = cfg.getULong("ThreadCount", 8 );
+        s_nPassCount = cfg.getULong("PassCount", 1000000 );
+    }
+
+    CPPUNIT_TEST_SUITE(thread_init_fini)
+        CPPUNIT_TEST(init_fini);
+    CPPUNIT_TEST_SUITE_END();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(thread_init_fini);
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_lazy.h b/tests/test-hdr/ordered_list/hdr_intrusive_lazy.h
new file mode 100644 (file)
index 0000000..a016f64
--- /dev/null
@@ -0,0 +1,887 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/intrusive/lazy_list_base.h>
+
+namespace ordlist {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+
+    class IntrusiveLazyListHeaderTest: public CppUnitMini::TestCase
+    {
+    public:
+
+        struct stat {
+            int nDisposeCount;
+            int nEnsureExistsCall;
+            int nEnsureNewCall;
+            int nFindCall;
+            int nEraseCall;
+
+            stat()
+                : nDisposeCount(0)
+                , nEnsureExistsCall(0)
+                , nEnsureNewCall(0)
+                , nFindCall(0)
+                , nEraseCall(0)
+            {}
+
+            stat( const stat& s )
+            {
+                *this = s;
+            }
+
+            stat& operator =(const stat& s)
+            {
+                memcpy( this, &s, sizeof(s));
+                return *this;
+            }
+        };
+
+        template <typename GC>
+        struct base_int_item: public ci::lazy_list::node< GC >
+        {
+            int nKey;
+            int nVal;
+
+            mutable stat    s;
+
+            base_int_item()
+            {}
+
+            base_int_item(int key, int val)
+                : nKey( key )
+                , nVal(val)
+                , s()
+            {}
+
+            base_int_item(const base_int_item& v )
+                : nKey( v.nKey )
+                , nVal( v.nVal )
+                , s()
+            {}
+
+            const int& key() const
+            {
+                return nKey;
+            }
+        };
+
+        template <typename GC>
+        struct member_int_item
+        {
+            int nKey;
+            int nVal;
+
+            ci::lazy_list::node< GC > hMember;
+
+            mutable stat s;
+
+            member_int_item()
+            {}
+
+            member_int_item(int key, int val)
+                : nKey( key )
+                , nVal(val)
+                , s()
+            {}
+
+            member_int_item(const member_int_item& v )
+                : nKey( v.nKey )
+                , nVal( v.nVal )
+                , s()
+            {}
+
+            const int& key() const
+            {
+                return nKey;
+            }
+        };
+
+        template <typename T>
+        struct less
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() < v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() < v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 < v2.key();
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1.key() < v2.key() )
+                    return -1;
+                return v1.key() > v2.key() ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const T& v1, const Q& v2 ) const
+            {
+                if ( v1.key() < v2 )
+                    return -1;
+                return v1.key() > v2 ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const Q& v1, const T& v2 ) const
+            {
+                if ( v1 < v2.key() )
+                    return -1;
+                return v1 > v2.key() ? 1 : 0;
+            }
+        };
+
+        struct other_item {
+            int nKey;
+
+            other_item( int n )
+                : nKey(n)
+            {}
+        };
+
+        struct other_less {
+            template <typename T, typename Q>
+            bool operator()( T const& i1, Q const& i2) const
+            {
+                return i1.nKey < i2.nKey;
+            }
+        };
+
+        struct faked_disposer
+        {
+            template <typename T>
+            void operator ()( T * p )
+            {
+                ++p->s.nDisposeCount;
+            }
+        };
+
+        struct ensure_functor
+        {
+            template <typename T>
+            void operator ()(bool bNew, T& item, T& val )
+            {
+                if ( bNew )
+                    ++item.s.nEnsureNewCall;
+                else
+                    ++item.s.nEnsureExistsCall;
+            }
+        };
+
+        struct find_functor
+        {
+            template <typename T, typename Q>
+            void operator ()( T& item, Q& val )
+            {
+                ++item.s.nFindCall;
+            }
+        };
+
+        struct erase_functor
+        {
+            template <typename T>
+            void operator()( T const& item )
+            {
+                item.s.nEraseCall++;
+            }
+        };
+
+        template <class OrdList>
+        void test_int_common()
+        {
+            typedef typename OrdList::value_type    value_type;
+
+            value_type v1( 10, 50 );
+            value_type v2( 5, 25  );
+            value_type v3( 20, 100 );
+            {
+                OrdList l;
+                CPPUNIT_ASSERT( l.empty() );
+
+                CPPUNIT_ASSERT( l.insert( v1 ))     ;   // true
+                CPPUNIT_ASSERT( l.find( v1.key() ));
+
+                CPPUNIT_ASSERT( v1.s.nFindCall == 0 );
+                CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
+                CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
+
+                CPPUNIT_ASSERT( !l.find_with( v2.key(), less<value_type>() ));
+                CPPUNIT_ASSERT( !l.find( v3.key(), find_functor() ));
+                CPPUNIT_ASSERT( !l.empty() );
+
+                //CPPUNIT_ASSERT( !l.insert( v1 ))    ;   // assertion "is_empty" is raised
+
+                {
+                    value_type v( v1 );
+                    CPPUNIT_ASSERT( !l.insert( v )) ;   // false
+                }
+
+                std::pair<bool, bool> ret = l.ensure( v2, ensure_functor() );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
+                CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 0 );
+
+                //CPPUNIT_ASSERT( !l.insert( v2 ))    ;   // assertion "is_empty"
+
+                CPPUNIT_ASSERT( l.find( v1.key() )) ;   // true
+
+                CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
+                CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
+                CPPUNIT_ASSERT( v1.s.nFindCall == 2 );
+
+                CPPUNIT_ASSERT( l.find( v2.key() ));
+
+                CPPUNIT_ASSERT( v2.s.nFindCall == 0 );
+                CPPUNIT_ASSERT( l.find_with( v2.key(), less<value_type>(), find_functor() ));
+                CPPUNIT_ASSERT( v2.s.nFindCall == 1 );
+
+                CPPUNIT_ASSERT( !l.find( v3.key() ));
+
+                {
+                    CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 0 );
+                    CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
+
+                    value_type v( v2 );
+                    ret = l.ensure( v, ensure_functor() );
+
+                    CPPUNIT_ASSERT( ret.first );
+                    CPPUNIT_ASSERT( !ret.second );
+                    CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 1 );
+                    CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
+                    CPPUNIT_ASSERT( v.s.nEnsureExistsCall == 0 );
+                    CPPUNIT_ASSERT( v.s.nEnsureNewCall == 0 );
+                }
+
+                CPPUNIT_ASSERT( !l.empty() );
+
+                CPPUNIT_ASSERT( l.insert( v3 ))     ;   // true
+                CPPUNIT_ASSERT( l.find( v3.key() ));
+
+                CPPUNIT_ASSERT( v3.s.nFindCall == 0 );
+                CPPUNIT_ASSERT( l.find( v3.key(), find_functor() ));
+                CPPUNIT_ASSERT( v3.s.nFindCall == 1 );
+
+                CPPUNIT_ASSERT( l.unlink( v2 ) );
+                CPPUNIT_ASSERT( l.find( v1.key() )) ;   // true
+                CPPUNIT_ASSERT( !l.find( v2.key() )) ;   // true
+                CPPUNIT_ASSERT( l.find( v3.key() )) ;   // true
+                CPPUNIT_ASSERT( !l.empty() );
+                CPPUNIT_ASSERT( !l.unlink( v2 ) );
+
+                {
+                    // v1 key is in the list but v NODE is not in the list
+                    value_type v( v1 );
+                    CPPUNIT_ASSERT( !l.unlink( v ) );
+                }
+
+                CPPUNIT_ASSERT( l.unlink( v1 ) );
+                CPPUNIT_ASSERT( !l.unlink( v1 ) );
+                CPPUNIT_ASSERT( !l.find( v1.key() ));
+                CPPUNIT_ASSERT( !l.find( v2.key() ));
+                CPPUNIT_ASSERT( l.find( v3.key() ));
+                CPPUNIT_ASSERT( !l.empty() );
+                CPPUNIT_ASSERT( !l.unlink( v1 ) );
+                CPPUNIT_ASSERT( !l.unlink( v2 ) );
+
+                CPPUNIT_ASSERT( l.unlink( v3 ) );
+                CPPUNIT_ASSERT( !l.find( v1.key() ));
+                CPPUNIT_ASSERT( !l.find_with( v2.key(), less<value_type>() ));
+                CPPUNIT_ASSERT( !l.find( v3.key() ));
+                CPPUNIT_ASSERT( l.empty() );
+                CPPUNIT_ASSERT( !l.unlink( v1 ) );
+                CPPUNIT_ASSERT( !l.unlink( v2 ) );
+                CPPUNIT_ASSERT( !l.unlink( v3 ) );
+
+                // Apply retired pointer to clean links
+                OrdList::gc::force_dispose();
+
+                stat s( v3.s );
+                ret = l.ensure( v3, ensure_functor() );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v3.s.nEnsureNewCall == s.nEnsureNewCall + 1);
+                CPPUNIT_ASSERT( v3.s.nEnsureExistsCall == s.nEnsureExistsCall );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                s = v2.s;
+                ret = l.ensure( v2, ensure_functor() );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v2.s.nEnsureNewCall == s.nEnsureNewCall + 1);
+                CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == s.nEnsureExistsCall );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                s = v1.s;
+                ret = l.ensure( v1, ensure_functor() );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v1.s.nEnsureNewCall == s.nEnsureNewCall + 1);
+                CPPUNIT_ASSERT( v1.s.nEnsureExistsCall == s.nEnsureExistsCall );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                // Erase test
+                CPPUNIT_ASSERT( l.erase( v1.key()) );
+                //CPPUNIT_ASSERT( v1.s.nDisposeCount == 0 );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                CPPUNIT_ASSERT( v2.s.nEraseCall == 0 );
+                CPPUNIT_ASSERT( l.erase_with( v2.key(), less<value_type>(), erase_functor()) );
+                CPPUNIT_ASSERT( v2.s.nEraseCall == 1 );
+                CPPUNIT_ASSERT( !l.erase_with( v2.key(), less<value_type>()));
+                CPPUNIT_ASSERT( v2.s.nEraseCall == 1 );
+                //CPPUNIT_ASSERT( v2.s.nDisposeCount == 0 );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                CPPUNIT_ASSERT( !l.erase( v2 ));
+                CPPUNIT_ASSERT( !l.erase( v1 ));
+                //CPPUNIT_ASSERT( v2.s.nDisposeCount == 0 );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                CPPUNIT_ASSERT( v3.s.nEraseCall == 0 );
+                CPPUNIT_ASSERT( l.erase( v3, erase_functor() ));
+                CPPUNIT_ASSERT( v3.s.nEraseCall == 1 );
+                //CPPUNIT_ASSERT( v3.s.nDisposeCount == 0 );
+                CPPUNIT_ASSERT( l.empty() );
+
+                // Apply retired pointer to clean links
+                OrdList::gc::force_dispose();
+
+                // Unlink test
+                CPPUNIT_ASSERT( l.insert( v1 ));
+                CPPUNIT_ASSERT( l.insert( v3 ));
+                CPPUNIT_ASSERT( !l.empty() );
+                CPPUNIT_ASSERT( !l.unlink( v2 ));
+                CPPUNIT_ASSERT( l.unlink( v1 ));
+                CPPUNIT_ASSERT( !l.unlink( v1 ));
+                CPPUNIT_ASSERT( l.unlink( v3 ));
+                CPPUNIT_ASSERT( !l.unlink( v3 ));
+                CPPUNIT_ASSERT( l.empty() );
+
+                // Apply retired pointer
+                OrdList::gc::force_dispose();
+                CPPUNIT_ASSERT( v1.s.nDisposeCount == 3 );
+                CPPUNIT_ASSERT( v2.s.nDisposeCount == 2 );
+                CPPUNIT_ASSERT( v3.s.nDisposeCount == 3 );
+
+                // Destructor test (call disposer)
+                CPPUNIT_ASSERT( l.insert( v1 ));
+                CPPUNIT_ASSERT( l.insert( v3 ));
+                CPPUNIT_ASSERT( l.insert( v2 ));
+
+                // Iterator test
+                {
+                    typename OrdList::iterator it = l.begin();
+                    CPPUNIT_ASSERT( it != l.end() );
+                    CPPUNIT_ASSERT( it->nKey == v2.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v2.nVal );
+                    CPPUNIT_ASSERT( ++it != l.end() );
+                    CPPUNIT_ASSERT( it->nKey == v1.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v1.nVal );
+                    CPPUNIT_ASSERT( ++it != l.end() );
+                    CPPUNIT_ASSERT( it->nKey == v3.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v3.nVal );
+                    CPPUNIT_ASSERT( ++it == l.end() );
+                }
+
+                {
+                    OrdList const & lref = l;
+                    typename OrdList::const_iterator it = lref.begin();
+                    CPPUNIT_ASSERT( it != l.end() );
+                    CPPUNIT_ASSERT( it->nKey == v2.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v2.nVal );
+                    CPPUNIT_ASSERT( ++it != lref.end() );
+                    CPPUNIT_ASSERT( it->nKey == v1.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v1.nVal );
+                    CPPUNIT_ASSERT( ++it != l.end() );
+                    CPPUNIT_ASSERT( it->nKey == v3.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v3.nVal );
+                    CPPUNIT_ASSERT( ++it == l.end() );
+                }
+            }
+
+            // Apply retired pointer
+            OrdList::gc::force_dispose();
+
+            CPPUNIT_ASSERT( v1.s.nDisposeCount == 4 );
+            CPPUNIT_ASSERT( v2.s.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v3.s.nDisposeCount == 4 );
+        }
+
+        template <class OrdList>
+        void test_int()
+        {
+            test_int_common<OrdList>();
+
+            OrdList l;
+            typename OrdList::guarded_ptr gp;
+
+            static int const nLimit = 20;
+            typename OrdList::value_type arrItem[nLimit];
+
+
+            {
+                int a[nLimit];
+                for (int i = 0; i < nLimit; ++i)
+                    a[i]=i;
+                std::random_shuffle( a, a + nLimit );
+
+                for (int i = 0; i < nLimit; ++i) {
+                    arrItem[i].nKey = a[i];
+                    arrItem[i].nVal = a[i] * 2;
+                }
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
+
+                for ( int i=0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( l.get( gp, arrItem[i].nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
+                    CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract( gp, arrItem[i].nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
+                    CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( !l.get( gp, arrItem[i].nKey ));
+                    CPPUNIT_ASSERT( gp.empty());
+                    CPPUNIT_ASSERT( !l.extract( gp, arrItem[i].nKey ));
+                    CPPUNIT_ASSERT( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty() );
+                CPPUNIT_ASSERT( !l.get( gp, nLimit/2 ));
+                CPPUNIT_ASSERT( gp.empty());
+                CPPUNIT_ASSERT( !l.extract( gp, nLimit/2 ));
+                CPPUNIT_ASSERT( gp.empty());
+
+                // Apply retired pointer
+                OrdList::gc::force_dispose();
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
+
+                for ( int i=0; i < nLimit; ++i ) {
+                    other_item itm( arrItem[i].nKey );
+                    CPPUNIT_ASSERT( l.get_with( gp, itm, other_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
+                    CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract_with( gp, itm, other_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
+                    CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( !l.get_with( gp, itm, other_less() ));
+                    CPPUNIT_ASSERT( gp.empty());
+                    CPPUNIT_ASSERT( !l.extract_with( gp, itm, other_less() ));
+                    CPPUNIT_ASSERT( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty() );
+                CPPUNIT_ASSERT( !l.get_with( gp, other_item(nLimit/2), other_less() ));
+                CPPUNIT_ASSERT( gp.empty());
+                CPPUNIT_ASSERT( !l.extract_with( gp, other_item(nLimit/2), other_less() ));
+                CPPUNIT_ASSERT( gp.empty());
+
+                // Apply retired pointer
+                OrdList::gc::force_dispose();
+
+                for ( int i=0; i < nLimit; i++ ) {
+                    CPPUNIT_ASSERT( arrItem[i].s.nDisposeCount == 2 );
+                }
+            }
+        }
+
+        template <class OrdList>
+        void test_rcu_int()
+        {
+            test_int_common<OrdList>();
+
+            OrdList l;
+            static int const nLimit = 20;
+            typename OrdList::value_type arrItem[nLimit];
+
+            typedef typename OrdList::rcu_lock rcu_lock;
+            typedef typename OrdList::value_type value_type;
+            typedef typename OrdList::gc rcu_type;
+
+            {
+                int a[nLimit];
+                for (int i = 0; i < nLimit; ++i)
+                    a[i]=i;
+                std::random_shuffle( a, a + nLimit );
+
+                for (int i = 0; i < nLimit; ++i) {
+                    arrItem[i].nKey = a[i];
+                    arrItem[i].nVal = a[i] * 2;
+                }
+
+                typename OrdList::exempt_ptr ep;
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get( a[i] );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->nKey == a[i] );
+                        CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract( ep, a[i] ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->nKey == a[i] );
+                        CPPUNIT_CHECK( (*ep).nVal == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get( a[i]) == NULL );
+                        CPPUNIT_CHECK( !l.extract( ep, a[i] ) );
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get( a[0] ) == NULL );
+                    CPPUNIT_CHECK( !l.extract( ep, a[0] ));
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+                // Apply retired pointer
+                OrdList::gc::force_dispose();
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
+                }
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    other_item itm( a[i] );
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get_with( itm, other_less() );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->nKey == a[i] );
+                        CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() ) );
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->nKey == a[i] );
+                        CPPUNIT_CHECK( ep->nVal == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get_with( itm, other_less()) == NULL );
+                        CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get_with( other_item(0), other_less() ) == NULL );
+                    CPPUNIT_CHECK( !l.extract_with( ep, other_item(0), other_less() ));
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+                // Apply retired pointer
+                OrdList::gc::force_dispose();
+            }
+        }
+
+        template <class OrdList>
+        void test_nogc_int()
+        {
+            typedef typename OrdList::value_type    value_type;
+            {
+                value_type v1( 10, 50 );
+                value_type v2( 5, 25  );
+                value_type v3( 20, 100 );
+                {
+                    OrdList l;
+                    CPPUNIT_ASSERT( l.empty() );
+
+                    CPPUNIT_ASSERT( l.insert( v1 ))     ;   // true
+                    CPPUNIT_ASSERT( l.find( v1.key() ) == &v1 );
+
+                    CPPUNIT_ASSERT( v1.s.nFindCall == 0 );
+                    CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
+                    CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
+
+                    CPPUNIT_ASSERT( l.find_with( v2.key(), less<value_type>() ) == NULL );
+                    CPPUNIT_ASSERT( l.find( v3.key() ) == NULL );
+                    CPPUNIT_ASSERT( !l.empty() );
+
+                    //CPPUNIT_ASSERT( !l.insert( v1 ))    ;   // assertion "is_empty" is raised
+
+                    {
+                        value_type v( v1 );
+                        CPPUNIT_ASSERT( !l.insert( v )) ;   // false
+                    }
+
+                    std::pair<bool, bool> ret = l.ensure( v2, ensure_functor() );
+                    CPPUNIT_ASSERT( ret.first );
+                    CPPUNIT_ASSERT( ret.second );
+                    CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
+                    CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 0 );
+
+                    //CPPUNIT_ASSERT( !l.insert( v2 ))    ;   // assertion "is_empty"
+
+                    CPPUNIT_ASSERT( l.find( v1.key() ) == &v1 ) ;   // true
+
+                    CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
+                    CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
+                    CPPUNIT_ASSERT( v1.s.nFindCall == 2 );
+
+                    CPPUNIT_ASSERT( l.find_with( v2.key(), less<value_type>() ) == &v2 );
+
+                    CPPUNIT_ASSERT( v2.s.nFindCall == 0 );
+                    CPPUNIT_ASSERT( l.find_with( v2.key(), less<value_type>(), find_functor() ));
+                    CPPUNIT_ASSERT( v2.s.nFindCall == 1 );
+
+                    CPPUNIT_ASSERT( !l.find( v3.key() ));
+
+                    {
+                        value_type v( v2 );
+                        ret = l.ensure( v, ensure_functor() );
+
+                        CPPUNIT_ASSERT( ret.first );
+                        CPPUNIT_ASSERT( !ret.second );
+                        CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 1 );
+                        CPPUNIT_ASSERT( v.s.nEnsureExistsCall == 0 && v.s.nEnsureNewCall == 0 );
+                    }
+
+                    CPPUNIT_ASSERT( !l.empty() );
+
+                    CPPUNIT_ASSERT( l.insert( v3 ))     ;   // true
+                    CPPUNIT_ASSERT( l.find( v3.key() ) == &v3 );
+
+                    CPPUNIT_ASSERT( v3.s.nFindCall == 0 );
+                    CPPUNIT_ASSERT( l.find( v3.key(), find_functor() ));
+                    CPPUNIT_ASSERT( v3.s.nFindCall == 1 );
+
+                    {
+                        typename OrdList::iterator it = l.begin();
+                        CPPUNIT_ASSERT( it != l.end() );
+                        CPPUNIT_ASSERT( it->nKey == v2.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v2.nVal );
+                        CPPUNIT_ASSERT( ++it != l.end() );
+                        CPPUNIT_ASSERT( it->nKey == v1.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v1.nVal );
+                        CPPUNIT_ASSERT( it++ != l.end() );
+                        CPPUNIT_ASSERT( it->nKey == v3.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v3.nVal );
+                        CPPUNIT_ASSERT( it++ != l.end() );
+                        CPPUNIT_ASSERT( it == l.end() );
+                    }
+
+                    {
+                        OrdList const & lref = l;
+                        typename OrdList::const_iterator it = lref.begin();
+                        CPPUNIT_ASSERT( it != l.end() );
+                        CPPUNIT_ASSERT( it->nKey == v2.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v2.nVal );
+                        CPPUNIT_ASSERT( ++it != lref.end() );
+                        CPPUNIT_ASSERT( it->nKey == v1.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v1.nVal );
+                        CPPUNIT_ASSERT( it++ != l.end() );
+                        CPPUNIT_ASSERT( it->nKey == v3.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v3.nVal );
+                        CPPUNIT_ASSERT( it++ != lref.end() );
+                        CPPUNIT_ASSERT( it == l.end() );
+                    }
+                }
+
+                // Disposer called on list destruction
+                CPPUNIT_ASSERT( v1.s.nDisposeCount == 1 );
+                CPPUNIT_ASSERT( v2.s.nDisposeCount == 1 );
+                CPPUNIT_ASSERT( v3.s.nDisposeCount == 1 );
+            }
+        }
+
+        void HP_base_cmp();
+        void HP_base_less();
+        void HP_base_cmpmix();
+        void HP_base_ic();
+        void HP_member_cmp();
+        void HP_member_less();
+        void HP_member_cmpmix();
+        void HP_member_ic();
+
+        void PTB_base_cmp();
+        void PTB_base_less();
+        void PTB_base_cmpmix();
+        void PTB_base_ic();
+        void PTB_member_cmp();
+        void PTB_member_less();
+        void PTB_member_cmpmix();
+        void PTB_member_ic();
+
+        void HRC_base_cmp();
+        void HRC_base_less();
+        void HRC_base_cmpmix();
+        void HRC_base_ic();
+
+        void RCU_GPI_base_cmp();
+        void RCU_GPI_base_less();
+        void RCU_GPI_base_cmpmix();
+        void RCU_GPI_base_ic();
+        void RCU_GPI_member_cmp();
+        void RCU_GPI_member_less();
+        void RCU_GPI_member_cmpmix();
+        void RCU_GPI_member_ic();
+
+        void RCU_GPB_base_cmp();
+        void RCU_GPB_base_less();
+        void RCU_GPB_base_cmpmix();
+        void RCU_GPB_base_ic();
+        void RCU_GPB_member_cmp();
+        void RCU_GPB_member_less();
+        void RCU_GPB_member_cmpmix();
+        void RCU_GPB_member_ic();
+
+        void RCU_GPT_base_cmp();
+        void RCU_GPT_base_less();
+        void RCU_GPT_base_cmpmix();
+        void RCU_GPT_base_ic();
+        void RCU_GPT_member_cmp();
+        void RCU_GPT_member_less();
+        void RCU_GPT_member_cmpmix();
+        void RCU_GPT_member_ic();
+
+        void RCU_SHB_base_cmp();
+        void RCU_SHB_base_less();
+        void RCU_SHB_base_cmpmix();
+        void RCU_SHB_base_ic();
+        void RCU_SHB_member_cmp();
+        void RCU_SHB_member_less();
+        void RCU_SHB_member_cmpmix();
+        void RCU_SHB_member_ic();
+
+        void RCU_SHT_base_cmp();
+        void RCU_SHT_base_less();
+        void RCU_SHT_base_cmpmix();
+        void RCU_SHT_base_ic();
+        void RCU_SHT_member_cmp();
+        void RCU_SHT_member_less();
+        void RCU_SHT_member_cmpmix();
+        void RCU_SHT_member_ic();
+
+        void nogc_base_cmp();
+        void nogc_base_less();
+        void nogc_base_cmpmix();
+        void nogc_base_ic();
+        void nogc_member_cmp();
+        void nogc_member_less();
+        void nogc_member_cmpmix();
+        void nogc_member_ic();
+
+
+        CPPUNIT_TEST_SUITE(IntrusiveLazyListHeaderTest)
+            CPPUNIT_TEST(HP_base_cmp)
+            CPPUNIT_TEST(HP_base_less)
+            CPPUNIT_TEST(HP_base_cmpmix)
+            CPPUNIT_TEST(HP_base_ic)
+            CPPUNIT_TEST(HP_member_cmp)
+            CPPUNIT_TEST(HP_member_less)
+            CPPUNIT_TEST(HP_member_cmpmix)
+            CPPUNIT_TEST(HP_member_ic)
+
+            CPPUNIT_TEST(PTB_base_cmp)
+            CPPUNIT_TEST(PTB_base_less)
+            CPPUNIT_TEST(PTB_base_cmpmix)
+            CPPUNIT_TEST(PTB_base_ic)
+            CPPUNIT_TEST(PTB_member_cmp)
+            CPPUNIT_TEST(PTB_member_less)
+            CPPUNIT_TEST(PTB_member_cmpmix)
+            CPPUNIT_TEST(PTB_member_ic)
+
+            CPPUNIT_TEST(HRC_base_cmp)
+            CPPUNIT_TEST(HRC_base_less)
+            CPPUNIT_TEST(HRC_base_cmpmix)
+            CPPUNIT_TEST(HRC_base_ic)
+
+            CPPUNIT_TEST(RCU_GPI_base_cmp)
+            CPPUNIT_TEST(RCU_GPI_base_less)
+            CPPUNIT_TEST(RCU_GPI_base_cmpmix)
+            CPPUNIT_TEST(RCU_GPI_base_ic)
+            CPPUNIT_TEST(RCU_GPI_member_cmp)
+            CPPUNIT_TEST(RCU_GPI_member_less)
+            CPPUNIT_TEST(RCU_GPI_member_cmpmix)
+            CPPUNIT_TEST(RCU_GPI_member_ic)
+
+            CPPUNIT_TEST(RCU_GPB_base_cmp)
+            CPPUNIT_TEST(RCU_GPB_base_less)
+            CPPUNIT_TEST(RCU_GPB_base_cmpmix)
+            CPPUNIT_TEST(RCU_GPB_base_ic)
+            CPPUNIT_TEST(RCU_GPB_member_cmp)
+            CPPUNIT_TEST(RCU_GPB_member_less)
+            CPPUNIT_TEST(RCU_GPB_member_cmpmix)
+            CPPUNIT_TEST(RCU_GPB_member_ic)
+
+            CPPUNIT_TEST(RCU_GPT_base_cmp)
+            CPPUNIT_TEST(RCU_GPT_base_less)
+            CPPUNIT_TEST(RCU_GPT_base_cmpmix)
+            CPPUNIT_TEST(RCU_GPT_base_ic)
+            CPPUNIT_TEST(RCU_GPT_member_cmp)
+            CPPUNIT_TEST(RCU_GPT_member_less)
+            CPPUNIT_TEST(RCU_GPT_member_cmpmix)
+            CPPUNIT_TEST(RCU_GPT_member_ic)
+
+            CPPUNIT_TEST(RCU_SHB_base_cmp)
+            CPPUNIT_TEST(RCU_SHB_base_less)
+            CPPUNIT_TEST(RCU_SHB_base_cmpmix)
+            CPPUNIT_TEST(RCU_SHB_base_ic)
+            CPPUNIT_TEST(RCU_SHB_member_cmp)
+            CPPUNIT_TEST(RCU_SHB_member_less)
+            CPPUNIT_TEST(RCU_SHB_member_cmpmix)
+            CPPUNIT_TEST(RCU_SHB_member_ic)
+
+            CPPUNIT_TEST(RCU_SHT_base_cmp)
+            CPPUNIT_TEST(RCU_SHT_base_less)
+            CPPUNIT_TEST(RCU_SHT_base_cmpmix)
+            CPPUNIT_TEST(RCU_SHT_base_ic)
+            CPPUNIT_TEST(RCU_SHT_member_cmp)
+            CPPUNIT_TEST(RCU_SHT_member_less)
+            CPPUNIT_TEST(RCU_SHT_member_cmpmix)
+            CPPUNIT_TEST(RCU_SHT_member_ic)
+
+            CPPUNIT_TEST(nogc_base_cmp)
+            CPPUNIT_TEST(nogc_base_less)
+            CPPUNIT_TEST(nogc_base_cmpmix)
+            CPPUNIT_TEST(nogc_base_ic)
+            CPPUNIT_TEST(nogc_member_cmp)
+            CPPUNIT_TEST(nogc_member_less)
+            CPPUNIT_TEST(nogc_member_cmpmix)
+            CPPUNIT_TEST(nogc_member_ic)
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_lazy_hp.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_lazy_hp.cpp
new file mode 100644 (file)
index 0000000..dca6065
--- /dev/null
@@ -0,0 +1,130 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_lazy.h"
+#include <cds/intrusive/lazy_list_hp.h>
+
+namespace ordlist {
+    void IntrusiveLazyListHeaderTest::HP_base_cmp()
+    {
+        typedef base_int_item< cds::gc::HP > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::HP_base_less()
+    {
+        typedef base_int_item< cds::gc::HP > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::HP_base_cmpmix()
+    {
+        typedef base_int_item< cds::gc::HP > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::HP_base_ic()
+    {
+        typedef base_int_item< cds::gc::HP > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::HP_member_cmp()
+    {
+        typedef member_int_item< cds::gc::HP > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::HP_member_less()
+    {
+        typedef member_int_item< cds::gc::HP > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::HP_member_cmpmix()
+    {
+        typedef member_int_item< cds::gc::HP > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::HP_member_ic()
+    {
+        typedef member_int_item< cds::gc::HP > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+}   // namespace ordlist
+
+CPPUNIT_TEST_SUITE_REGISTRATION(ordlist::IntrusiveLazyListHeaderTest);
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_lazy_hrc.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_lazy_hrc.cpp
new file mode 100644 (file)
index 0000000..865a720
--- /dev/null
@@ -0,0 +1,64 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_lazy.h"
+#include <cds/intrusive/lazy_list_hrc.h>
+
+namespace ordlist {
+
+    void IntrusiveLazyListHeaderTest::HRC_base_cmp()
+    {
+        typedef base_int_item< cds::gc::HRC > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::HRC_base_less()
+    {
+        typedef base_int_item< cds::gc::HRC > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::HRC_base_cmpmix()
+    {
+        typedef base_int_item< cds::gc::HRC > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::HRC_base_ic()
+    {
+        typedef base_int_item< cds::gc::HRC > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+
+}
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_lazy_nogc.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_lazy_nogc.cpp
new file mode 100644 (file)
index 0000000..894cbe5
--- /dev/null
@@ -0,0 +1,129 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_lazy.h"
+#include <cds/intrusive/lazy_list_nogc.h>
+
+namespace ordlist {
+    void IntrusiveLazyListHeaderTest::nogc_base_cmp()
+    {
+        typedef base_int_item< cds::gc::nogc > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::nogc_base_less()
+    {
+        typedef base_int_item< cds::gc::nogc > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::nogc_base_cmpmix()
+    {
+        typedef base_int_item< cds::gc::nogc > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::nogc_base_ic()
+    {
+        typedef base_int_item< cds::gc::nogc > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::nogc_member_cmp()
+    {
+        typedef member_int_item< cds::gc::nogc > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::nogc_member_less()
+    {
+        typedef member_int_item< cds::gc::nogc > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::nogc_member_cmpmix()
+    {
+        typedef member_int_item< cds::gc::nogc > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::nogc_member_ic()
+    {
+        typedef member_int_item< cds::gc::nogc > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+
+} // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_lazy_ptb.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_lazy_ptb.cpp
new file mode 100644 (file)
index 0000000..057db78
--- /dev/null
@@ -0,0 +1,129 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_lazy.h"
+#include <cds/intrusive/lazy_list_ptb.h>
+
+namespace ordlist {
+    void IntrusiveLazyListHeaderTest::PTB_base_cmp()
+    {
+        typedef base_int_item< cds::gc::PTB > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::PTB_base_less()
+    {
+        typedef base_int_item< cds::gc::PTB > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::PTB_base_cmpmix()
+    {
+        typedef base_int_item< cds::gc::PTB > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::PTB_base_ic()
+    {
+        typedef base_int_item< cds::gc::PTB > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::PTB_member_cmp()
+    {
+        typedef member_int_item< cds::gc::PTB > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::PTB_member_less()
+    {
+        typedef member_int_item< cds::gc::PTB > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::PTB_member_cmpmix()
+    {
+        typedef member_int_item< cds::gc::PTB > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::PTB_member_ic()
+    {
+        typedef member_int_item< cds::gc::PTB > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+
+} // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpb.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..9091db8
--- /dev/null
@@ -0,0 +1,132 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_lazy.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >    RCU;
+    }
+
+    void IntrusiveLazyListHeaderTest::RCU_GPB_base_cmp()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::lazy_list::make_traits<
+            ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+            ,co::compare< cmp<item> >
+            ,ci::opt::disposer< faked_disposer >
+        >::type list_traits;
+        typedef ci::LazyList< RCU, item, list_traits > list;
+
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPB_base_less()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPB_base_cmpmix()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPB_base_ic()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPB_member_cmp()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPB_member_less()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPB_member_cmpmix()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPB_member_ic()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpi.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..6e656bc
--- /dev/null
@@ -0,0 +1,133 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_lazy.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> >    RCU;
+    }
+
+    void IntrusiveLazyListHeaderTest::RCU_GPI_base_cmp()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPI_base_less()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPI_base_cmpmix()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPI_base_ic()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPI_member_cmp()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPI_member_less()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPI_member_cmpmix()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPI_member_ic()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpt.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..71d3eae
--- /dev/null
@@ -0,0 +1,133 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_lazy.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> >    RCU;
+    }
+
+    void IntrusiveLazyListHeaderTest::RCU_GPT_base_cmp()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPT_base_less()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPT_base_cmpmix()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPT_base_ic()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPT_member_cmp()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPT_member_less()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPT_member_cmpmix()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveLazyListHeaderTest::RCU_GPT_member_ic()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_shb.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..9a002a8
--- /dev/null
@@ -0,0 +1,158 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_lazy.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> >    RCU;
+    }
+#endif
+
+    void IntrusiveLazyListHeaderTest::RCU_SHB_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::lazy_list::make_traits<
+            ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+            ,co::compare< cmp<item> >
+            ,ci::opt::disposer< faked_disposer >
+        >::type list_traits;
+        typedef ci::LazyList< RCU, item, list_traits > list;
+
+        test_rcu_int<list>();
+#endif
+    }
+
+    void IntrusiveLazyListHeaderTest::RCU_SHB_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+
+    void IntrusiveLazyListHeaderTest::RCU_SHB_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+
+    void IntrusiveLazyListHeaderTest::RCU_SHB_base_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+
+    void IntrusiveLazyListHeaderTest::RCU_SHB_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+
+    void IntrusiveLazyListHeaderTest::RCU_SHB_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+
+    void IntrusiveLazyListHeaderTest::RCU_SHB_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+
+    void IntrusiveLazyListHeaderTest::RCU_SHB_member_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_sht.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_lazy_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..b5a53ae
--- /dev/null
@@ -0,0 +1,151 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_lazy.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> >    RCU;
+    }
+#endif
+
+    void IntrusiveLazyListHeaderTest::RCU_SHT_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveLazyListHeaderTest::RCU_SHT_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveLazyListHeaderTest::RCU_SHT_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveLazyListHeaderTest::RCU_SHT_base_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveLazyListHeaderTest::RCU_SHT_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveLazyListHeaderTest::RCU_SHT_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveLazyListHeaderTest::RCU_SHT_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveLazyListHeaderTest::RCU_SHT_member_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_michael.h b/tests/test-hdr/ordered_list/hdr_intrusive_michael.h
new file mode 100644 (file)
index 0000000..ed76a10
--- /dev/null
@@ -0,0 +1,887 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/intrusive/michael_list_base.h>
+
+namespace ordlist {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+
+    class IntrusiveMichaelListHeaderTest: public CppUnitMini::TestCase
+    {
+    public:
+
+        struct stat {
+            int nDisposeCount;
+            int nEnsureExistsCall;
+            int nEnsureNewCall;
+            int nFindCall;
+            int nEraseCall;
+
+            stat()
+                : nDisposeCount(0)
+                , nEnsureExistsCall(0)
+                , nEnsureNewCall(0)
+                , nFindCall(0)
+                , nEraseCall(0)
+            {}
+
+            stat( const stat& s )
+            {
+                *this = s;
+            }
+
+            stat& operator =(const stat& s)
+            {
+                memcpy( this, &s, sizeof(s));
+                return *this;
+            }
+        };
+
+        template <typename GC>
+        struct base_int_item: public ci::michael_list::node< GC >
+        {
+            int nKey;
+            int nVal;
+
+            mutable stat    s;
+
+            base_int_item()
+            {}
+
+            base_int_item(int key, int val)
+                : nKey( key )
+                , nVal(val)
+                , s()
+            {}
+
+            base_int_item(const base_int_item& v )
+                : nKey( v.nKey )
+                , nVal( v.nVal )
+                , s()
+            {}
+
+            const int& key() const
+            {
+                return nKey;
+            }
+        };
+
+        template <typename GC>
+        struct member_int_item
+        {
+            int nKey;
+            int nVal;
+
+            ci::michael_list::node< GC > hMember;
+
+            mutable stat s;
+
+            member_int_item()
+            {}
+
+            member_int_item(int key, int val)
+                : nKey( key )
+                , nVal(val)
+                , s()
+            {}
+
+            member_int_item(const member_int_item& v )
+                : nKey( v.nKey )
+                , nVal( v.nVal )
+                , s()
+            {}
+
+            const int& key() const
+            {
+                return nKey;
+            }
+        };
+
+        template <typename T>
+        struct less
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() < v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() < v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 < v2.key();
+            }
+        };
+
+        struct other_item {
+            int nKey;
+
+            other_item( int n )
+                : nKey(n)
+            {}
+        };
+
+        struct other_less {
+            template <typename T, typename Q>
+            bool operator()( T const& i1, Q const& i2) const
+            {
+                return i1.nKey < i2.nKey;
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1.key() < v2.key() )
+                    return -1;
+                return v1.key() > v2.key() ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const T& v1, const Q& v2 ) const
+            {
+                if ( v1.key() < v2 )
+                    return -1;
+                return v1.key() > v2 ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const Q& v1, const T& v2 ) const
+            {
+                if ( v1 < v2.key() )
+                    return -1;
+                return v1 > v2.key() ? 1 : 0;
+            }
+        };
+
+        struct faked_disposer
+        {
+            template <typename T>
+            void operator ()( T * p )
+            {
+                ++p->s.nDisposeCount;
+            }
+        };
+
+        struct ensure_functor
+        {
+            template <typename T>
+            void operator ()(bool bNew, T& item, T& val )
+            {
+                if ( bNew )
+                    ++item.s.nEnsureNewCall;
+                else
+                    ++item.s.nEnsureExistsCall;
+            }
+        };
+
+        struct find_functor
+        {
+            template <typename T, typename Q>
+            void operator ()( T& item, Q& val )
+            {
+                ++item.s.nFindCall;
+            }
+        };
+
+        struct erase_functor
+        {
+            template <typename T>
+            void operator()( T const& item )
+            {
+                item.s.nEraseCall++;
+            }
+        };
+
+        template <class OrdList>
+        void test_int_common()
+        {
+            typedef typename OrdList::value_type    value_type;
+
+            value_type v1( 10, 50 );
+            value_type v2( 5, 25  );
+            value_type v3( 20, 100 );
+            {
+                OrdList l;
+                CPPUNIT_ASSERT( l.empty() );
+
+                CPPUNIT_ASSERT( l.insert( v1 ))     ;   // true
+                CPPUNIT_ASSERT( l.find( v1.key() ));
+
+                CPPUNIT_ASSERT( v1.s.nFindCall == 0 );
+                CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
+                CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
+
+                CPPUNIT_ASSERT( !l.find( v2.key() ));
+                CPPUNIT_ASSERT( !l.find_with( v3.key(), less<value_type>() ));
+                CPPUNIT_ASSERT( !l.empty() );
+
+                CPPUNIT_ASSERT( !l.insert( v1 ))    ;   // assertion "is_empty" is not raised since pNext is NULL
+
+                {
+                    value_type v( v1 );
+                    CPPUNIT_ASSERT( !l.insert( v )) ;   // false
+                }
+
+                std::pair<bool, bool> ret = l.ensure( v2, ensure_functor() );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
+                CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 0 );
+
+                //CPPUNIT_ASSERT( !l.insert( v2 ))    ;   // assertion "is_empty"
+
+                CPPUNIT_ASSERT( l.find_with( v1.key(), less<value_type>() )) ;   // true
+
+                CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
+                CPPUNIT_ASSERT( l.find_with( v1.key(), less<value_type>(), find_functor() ));
+                CPPUNIT_ASSERT( v1.s.nFindCall == 2 );
+
+                CPPUNIT_ASSERT( l.find( v2.key() ));
+
+                CPPUNIT_ASSERT( v2.s.nFindCall == 0 );
+                CPPUNIT_ASSERT( l.find( v2.key(), find_functor() ));
+                CPPUNIT_ASSERT( v2.s.nFindCall == 1 );
+
+                CPPUNIT_ASSERT( !l.find( v3.key() ));
+
+                {
+                    CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 0 );
+                    CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
+
+                    value_type v( v2 );
+                    ret = l.ensure( v, ensure_functor() );
+
+                    CPPUNIT_ASSERT( ret.first );
+                    CPPUNIT_ASSERT( !ret.second );
+                    CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 1 );
+                    CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
+                    CPPUNIT_ASSERT( v.s.nEnsureExistsCall == 0 );
+                    CPPUNIT_ASSERT( v.s.nEnsureNewCall == 0 );
+                }
+
+                CPPUNIT_ASSERT( !l.empty() );
+
+                CPPUNIT_ASSERT( l.insert( v3 ))     ;   // true
+                CPPUNIT_ASSERT( l.find( v3.key() ));
+
+                CPPUNIT_ASSERT( v3.s.nFindCall == 0 );
+                CPPUNIT_ASSERT( l.find( v3.key(), find_functor() ));
+                CPPUNIT_ASSERT( v3.s.nFindCall == 1 );
+
+                CPPUNIT_ASSERT( l.unlink( v2 ) );
+                CPPUNIT_ASSERT( l.find( v1.key() )) ;   // true
+                CPPUNIT_ASSERT( !l.find( v2.key() )) ;   // true
+                CPPUNIT_ASSERT( l.find( v3.key() )) ;   // true
+                CPPUNIT_ASSERT( !l.empty() );
+                CPPUNIT_ASSERT( !l.unlink( v2 ) );
+
+                {
+                    // v1 key is in the list but v NODE is not in the list
+                    value_type v( v1 );
+                    CPPUNIT_ASSERT( !l.unlink( v ) );
+                }
+
+                CPPUNIT_ASSERT( l.unlink( v1 ) );
+                CPPUNIT_ASSERT( !l.unlink( v1 ) );
+                CPPUNIT_ASSERT( !l.find( v1.key() ));
+                CPPUNIT_ASSERT( !l.find( v2.key() ));
+                CPPUNIT_ASSERT( l.find( v3.key() ));
+                CPPUNIT_ASSERT( !l.empty() );
+                CPPUNIT_ASSERT( !l.unlink( v1 ) );
+                CPPUNIT_ASSERT( !l.unlink( v2 ) );
+
+                CPPUNIT_ASSERT( l.unlink( v3 ) );
+                CPPUNIT_ASSERT( !l.find_with( v1.key(), less<value_type>() ));
+                CPPUNIT_ASSERT( !l.find_with( v2.key(), less<value_type>(), find_functor() ));
+                CPPUNIT_ASSERT( !l.find( v3.key(), find_functor() ));
+                CPPUNIT_ASSERT( l.empty() );
+                CPPUNIT_ASSERT( !l.unlink( v1 ) );
+                CPPUNIT_ASSERT( !l.unlink( v2 ) );
+                CPPUNIT_ASSERT( !l.unlink( v3 ) );
+
+                // Apply retired pointer to clean links
+                OrdList::gc::force_dispose();
+
+                stat s( v3.s );
+                ret = l.ensure( v3, ensure_functor() );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v3.s.nEnsureNewCall == s.nEnsureNewCall + 1);
+                CPPUNIT_ASSERT( v3.s.nEnsureExistsCall == s.nEnsureExistsCall );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                s = v2.s;
+                ret = l.ensure( v2, ensure_functor() );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v2.s.nEnsureNewCall == s.nEnsureNewCall + 1);
+                CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == s.nEnsureExistsCall );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                s = v1.s;
+                ret = l.ensure( v1, ensure_functor() );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v1.s.nEnsureNewCall == s.nEnsureNewCall + 1);
+                CPPUNIT_ASSERT( v1.s.nEnsureExistsCall == s.nEnsureExistsCall );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                // Erase test
+                CPPUNIT_ASSERT( v1.s.nEraseCall == 0 );
+                CPPUNIT_ASSERT( l.erase( v1.key(), erase_functor()) );
+                CPPUNIT_ASSERT( v1.s.nEraseCall == 1 );
+                //CPPUNIT_ASSERT( v1.s.nDisposeCount == 0 );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                CPPUNIT_ASSERT( l.erase_with( v2.key(), less<value_type>() ) );
+                CPPUNIT_ASSERT( !l.erase( v2.key()));
+                //CPPUNIT_ASSERT( v2.s.nDisposeCount == 0 );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                CPPUNIT_ASSERT( v2.s.nEraseCall == 0 );
+                CPPUNIT_ASSERT( !l.erase( v2, erase_functor() ));
+                CPPUNIT_ASSERT( v2.s.nEraseCall == 0 );
+                CPPUNIT_ASSERT( !l.erase( v1 ));
+                //CPPUNIT_ASSERT( v2.s.nDisposeCount == 0 );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                CPPUNIT_ASSERT( v3.s.nEraseCall == 0 );
+                CPPUNIT_ASSERT( l.erase_with( v3, less<value_type>(), erase_functor() ));
+                CPPUNIT_ASSERT( v3.s.nEraseCall == 1 );
+                //CPPUNIT_ASSERT( v3.s.nDisposeCount == 0 );
+                CPPUNIT_ASSERT( l.empty() );
+
+                // Apply retired pointer to clean links
+                OrdList::gc::force_dispose();
+
+                // Unlink test
+                CPPUNIT_ASSERT( l.insert( v1 ));
+                CPPUNIT_ASSERT( l.insert( v3 ));
+                CPPUNIT_ASSERT( !l.empty() );
+                CPPUNIT_ASSERT( !l.unlink( v2 ));
+                CPPUNIT_ASSERT( l.unlink( v1 ));
+                CPPUNIT_ASSERT( !l.unlink( v1 ));
+                CPPUNIT_ASSERT( l.unlink( v3 ));
+                CPPUNIT_ASSERT( !l.unlink( v3 ));
+                CPPUNIT_ASSERT( l.empty() );
+
+                // Apply retired pointer
+                OrdList::gc::force_dispose();
+                CPPUNIT_ASSERT( v1.s.nDisposeCount == 3 );
+                CPPUNIT_ASSERT( v2.s.nDisposeCount == 2 );
+                CPPUNIT_ASSERT( v3.s.nDisposeCount == 3 );
+
+                // Destructor test (call disposer)
+                CPPUNIT_ASSERT( l.insert( v1 ));
+                CPPUNIT_ASSERT( l.insert( v3 ));
+                CPPUNIT_ASSERT( l.insert( v2 ));
+
+                // Iterator test
+                // begin/end
+                {
+                    typename OrdList::iterator it = l.begin();
+                    CPPUNIT_ASSERT( it != l.end() );
+                    CPPUNIT_ASSERT( it->nKey == v2.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v2.nVal );
+                    CPPUNIT_ASSERT( ++it != l.end() );
+                    CPPUNIT_ASSERT( it->nKey == v1.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v1.nVal );
+                    CPPUNIT_ASSERT( ++it != l.end() );
+                    CPPUNIT_ASSERT( it->nKey == v3.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v3.nVal );
+                    CPPUNIT_ASSERT( ++it == l.end() );
+                }
+
+                // cbegin/cend
+                {
+                    typename OrdList::const_iterator it = l.cbegin();
+                    CPPUNIT_ASSERT( it != l.cend() );
+                    CPPUNIT_ASSERT( it->nKey == v2.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v2.nVal );
+                    CPPUNIT_ASSERT( ++it != l.cend() );
+                    CPPUNIT_ASSERT( it->nKey == v1.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v1.nVal );
+                    CPPUNIT_ASSERT( ++it != l.cend() );
+                    CPPUNIT_ASSERT( it->nKey == v3.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v3.nVal );
+                    CPPUNIT_ASSERT( ++it == l.cend() );
+                }
+
+                // const begin/end
+                {
+                    OrdList const & lref = l;
+                    typename OrdList::const_iterator it = lref.begin();
+                    CPPUNIT_ASSERT( it != l.end() );
+                    CPPUNIT_ASSERT( it->nKey == v2.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v2.nVal );
+                    CPPUNIT_ASSERT( ++it != lref.end() );
+                    CPPUNIT_ASSERT( it->nKey == v1.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v1.nVal );
+                    CPPUNIT_ASSERT( ++it != l.end() );
+                    CPPUNIT_ASSERT( it->nKey == v3.nKey );
+                    CPPUNIT_ASSERT( it->nVal == v3.nVal );
+                    CPPUNIT_ASSERT( ++it == l.end() );
+                }
+            }
+
+            // Apply retired pointer
+            OrdList::gc::force_dispose();
+
+            CPPUNIT_ASSERT( v1.s.nDisposeCount == 4 );
+            CPPUNIT_ASSERT( v2.s.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v3.s.nDisposeCount == 4 );
+        }
+
+        template <class OrdList>
+        void test_int()
+        {
+            test_int_common<OrdList>();
+
+            OrdList l;
+            typename OrdList::guarded_ptr gp;
+
+            static int const nLimit = 20;
+            typename OrdList::value_type arrItem[nLimit];
+
+
+            {
+                int a[nLimit];
+                for (int i = 0; i < nLimit; ++i)
+                    a[i]=i;
+                std::random_shuffle( a, a + nLimit );
+
+                for (int i = 0; i < nLimit; ++i) {
+                    arrItem[i].nKey = a[i];
+                    arrItem[i].nVal = a[i] * 2;
+                }
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
+
+                for ( int i=0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( l.get( gp, arrItem[i].nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
+                    CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract( gp, arrItem[i].nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
+                    CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( !l.get( gp, arrItem[i].nKey ));
+                    CPPUNIT_ASSERT( gp.empty());
+                    CPPUNIT_ASSERT( !l.extract( gp, arrItem[i].nKey ));
+                    CPPUNIT_ASSERT( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty() );
+                CPPUNIT_ASSERT( !l.get( gp, nLimit/2 ));
+                CPPUNIT_ASSERT( gp.empty());
+                CPPUNIT_ASSERT( !l.extract( gp, nLimit/2 ));
+                CPPUNIT_ASSERT( gp.empty());
+
+                // Apply retired pointer
+                OrdList::gc::force_dispose();
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
+
+                for ( int i=0; i < nLimit; ++i ) {
+                    other_item itm( arrItem[i].nKey );
+                    CPPUNIT_ASSERT( l.get_with( gp, itm, other_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
+                    CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract_with( gp, itm, other_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( gp->nKey == arrItem[i].nKey );
+                    CPPUNIT_ASSERT( gp->nVal == arrItem[i].nVal );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( !l.get_with( gp, itm, other_less() ));
+                    CPPUNIT_ASSERT( gp.empty());
+                    CPPUNIT_ASSERT( !l.extract_with( gp, itm, other_less() ));
+                    CPPUNIT_ASSERT( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty() );
+                CPPUNIT_ASSERT( !l.get_with( gp, other_item(nLimit/2), other_less() ));
+                CPPUNIT_ASSERT( gp.empty());
+                CPPUNIT_ASSERT( !l.extract_with( gp, other_item(nLimit/2), other_less() ));
+                CPPUNIT_ASSERT( gp.empty());
+
+                // Apply retired pointer
+                OrdList::gc::force_dispose();
+
+                for ( int i=0; i < nLimit; i++ ) {
+                    CPPUNIT_ASSERT( arrItem[i].s.nDisposeCount == 2 );
+                }
+            }
+        }
+
+        template <class OrdList>
+        void test_rcu_int()
+        {
+            test_int_common<OrdList>();
+
+            OrdList l;
+            static int const nLimit = 20;
+            typename OrdList::value_type arrItem[nLimit];
+
+            typedef typename OrdList::rcu_lock rcu_lock;
+            typedef typename OrdList::value_type value_type;
+            typedef typename OrdList::gc rcu_type;
+
+            {
+                int a[nLimit];
+                for (int i = 0; i < nLimit; ++i)
+                    a[i]=i;
+                std::random_shuffle( a, a + nLimit );
+
+                for (int i = 0; i < nLimit; ++i) {
+                    arrItem[i].nKey = a[i];
+                    arrItem[i].nVal = a[i] * 2;
+                }
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
+
+                typename OrdList::exempt_ptr ep;
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get( a[i] );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->nKey == a[i] );
+                        CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract( ep, a[i] ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->nKey == a[i] );
+                        CPPUNIT_CHECK( (*ep).nVal == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get( a[i]) == NULL );
+                        CPPUNIT_CHECK( !l.extract( ep, a[i] ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get( a[0] ) == NULL );
+                    CPPUNIT_CHECK( !l.extract( ep, a[0] ) );
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+                // Apply retired pointer
+                OrdList::gc::force_dispose();
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( l.insert( arrItem[i] ) );
+                }
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    other_item itm( a[i] );
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get_with( itm, other_less() );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->nKey == a[i] );
+                        CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->nKey == a[i] );
+                        CPPUNIT_CHECK( ep->nVal == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get_with( itm, other_less()) == NULL );
+                        CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get_with( other_item(0), other_less() ) == NULL );
+                    CPPUNIT_CHECK( !l.extract_with( ep, other_item(0), other_less() ));
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+                // Apply retired pointer
+                OrdList::gc::force_dispose();
+            }
+        }
+
+        template <class OrdList>
+        void test_nogc_int()
+        {
+            typedef typename OrdList::value_type    value_type;
+            {
+                value_type v1( 10, 50 );
+                value_type v2( 5, 25  );
+                value_type v3( 20, 100 );
+                {
+                    OrdList l;
+                    CPPUNIT_ASSERT( l.empty() );
+
+                    CPPUNIT_ASSERT( l.insert( v1 ))     ;   // true
+                    CPPUNIT_ASSERT( l.find( v1.key() ) == &v1 );
+
+                    CPPUNIT_ASSERT( v1.s.nFindCall == 0 );
+                    CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
+                    CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
+
+                    CPPUNIT_ASSERT( l.find_with( v2.key(), less<value_type>() ) == NULL );
+                    CPPUNIT_ASSERT( !l.find_with( v3.key(), less<value_type>(), find_functor() ));
+                    CPPUNIT_ASSERT( !l.empty() );
+
+                    CPPUNIT_ASSERT( !l.insert( v1 ))    ;   // assertion "is_empty" is not raised since pNext is NULL
+
+                    {
+                        value_type v( v1 );
+                        CPPUNIT_ASSERT( !l.insert( v )) ;   // false
+                    }
+
+                    std::pair<bool, bool> ret = l.ensure( v2, ensure_functor() );
+                    CPPUNIT_ASSERT( ret.first );
+                    CPPUNIT_ASSERT( ret.second );
+                    CPPUNIT_ASSERT( v2.s.nEnsureNewCall == 1 );
+                    CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 0 );
+
+                    //CPPUNIT_ASSERT( !l.insert( v2 ))    ;   // assertion "is_empty"
+
+                    CPPUNIT_ASSERT( l.find( v1.key() ) == &v1 ) ;   // true
+
+                    CPPUNIT_ASSERT( v1.s.nFindCall == 1 );
+                    CPPUNIT_ASSERT( l.find( v1.key(), find_functor() ));
+                    CPPUNIT_ASSERT( v1.s.nFindCall == 2 );
+
+                    CPPUNIT_ASSERT( l.find( v2.key() ) == &v2 );
+
+                    CPPUNIT_ASSERT( v2.s.nFindCall == 0 );
+                    CPPUNIT_ASSERT( l.find( v2.key(), find_functor() ));
+                    CPPUNIT_ASSERT( v2.s.nFindCall == 1 );
+
+                    CPPUNIT_ASSERT( !l.find( v3.key() ));
+
+                    {
+                        value_type v( v2 );
+                        ret = l.ensure( v, ensure_functor() );
+
+                        CPPUNIT_ASSERT( ret.first );
+                        CPPUNIT_ASSERT( !ret.second );
+                        CPPUNIT_ASSERT( v2.s.nEnsureExistsCall == 1 );
+                        CPPUNIT_ASSERT( v.s.nEnsureExistsCall == 0 && v.s.nEnsureNewCall == 0 );
+                    }
+
+                    CPPUNIT_ASSERT( !l.empty() );
+
+                    CPPUNIT_ASSERT( l.insert( v3 ))     ;   // true
+                    CPPUNIT_ASSERT( l.find( v3.key() ) == &v3 );
+
+                    CPPUNIT_ASSERT( v3.s.nFindCall == 0 );
+                    CPPUNIT_ASSERT( l.find( v3.key(), find_functor() ));
+                    CPPUNIT_ASSERT( v3.s.nFindCall == 1 );
+
+                    {
+                        typename OrdList::iterator it = l.begin();
+                        CPPUNIT_ASSERT( it != l.end() );
+                        CPPUNIT_ASSERT( it->nKey == v2.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v2.nVal );
+                        CPPUNIT_ASSERT( ++it != l.end() );
+                        CPPUNIT_ASSERT( it->nKey == v1.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v1.nVal );
+                        CPPUNIT_ASSERT( it++ != l.end() );
+                        CPPUNIT_ASSERT( it->nKey == v3.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v3.nVal );
+                        CPPUNIT_ASSERT( it++ != l.end() );
+                        CPPUNIT_ASSERT( it == l.end() );
+                    }
+
+                    {
+                        OrdList const & lref = l;
+                        typename OrdList::const_iterator it = lref.begin();
+                        CPPUNIT_ASSERT( it != l.end() );
+                        CPPUNIT_ASSERT( it->nKey == v2.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v2.nVal );
+                        CPPUNIT_ASSERT( ++it != lref.end() );
+                        CPPUNIT_ASSERT( it->nKey == v1.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v1.nVal );
+                        CPPUNIT_ASSERT( it++ != l.end() );
+                        CPPUNIT_ASSERT( it->nKey == v3.nKey );
+                        CPPUNIT_ASSERT( it->nVal == v3.nVal );
+                        CPPUNIT_ASSERT( it++ != lref.end() );
+                        CPPUNIT_ASSERT( it == l.end() );
+                    }
+                }
+
+                // Disposer called on list destruction
+                CPPUNIT_ASSERT( v1.s.nDisposeCount == 1 );
+                CPPUNIT_ASSERT( v2.s.nDisposeCount == 1 );
+                CPPUNIT_ASSERT( v3.s.nDisposeCount == 1 );
+            }
+        }
+
+        void HP_base_cmp();
+        void HP_base_less();
+        void HP_base_cmpmix();
+        void HP_base_ic();
+        void HP_member_cmp();
+        void HP_member_less();
+        void HP_member_cmpmix();
+        void HP_member_ic();
+
+        void PTB_base_cmp();
+        void PTB_base_less();
+        void PTB_base_cmpmix();
+        void PTB_base_ic();
+        void PTB_member_cmp();
+        void PTB_member_less();
+        void PTB_member_cmpmix();
+        void PTB_member_ic();
+
+        void HRC_base_cmp();
+        void HRC_base_less();
+        void HRC_base_cmpmix();
+        void HRC_base_ic();
+
+        void RCU_GPI_base_cmp();
+        void RCU_GPI_base_less();
+        void RCU_GPI_base_cmpmix();
+        void RCU_GPI_base_ic();
+        void RCU_GPI_member_cmp();
+        void RCU_GPI_member_less();
+        void RCU_GPI_member_cmpmix();
+        void RCU_GPI_member_ic();
+
+        void RCU_GPB_base_cmp();
+        void RCU_GPB_base_less();
+        void RCU_GPB_base_cmpmix();
+        void RCU_GPB_base_ic();
+        void RCU_GPB_member_cmp();
+        void RCU_GPB_member_less();
+        void RCU_GPB_member_cmpmix();
+        void RCU_GPB_member_ic();
+
+        void RCU_GPT_base_cmp();
+        void RCU_GPT_base_less();
+        void RCU_GPT_base_cmpmix();
+        void RCU_GPT_base_ic();
+        void RCU_GPT_member_cmp();
+        void RCU_GPT_member_less();
+        void RCU_GPT_member_cmpmix();
+        void RCU_GPT_member_ic();
+
+        void RCU_SHB_base_cmp();
+        void RCU_SHB_base_less();
+        void RCU_SHB_base_cmpmix();
+        void RCU_SHB_base_ic();
+        void RCU_SHB_member_cmp();
+        void RCU_SHB_member_less();
+        void RCU_SHB_member_cmpmix();
+        void RCU_SHB_member_ic();
+
+        void RCU_SHT_base_cmp();
+        void RCU_SHT_base_less();
+        void RCU_SHT_base_cmpmix();
+        void RCU_SHT_base_ic();
+        void RCU_SHT_member_cmp();
+        void RCU_SHT_member_less();
+        void RCU_SHT_member_cmpmix();
+        void RCU_SHT_member_ic();
+
+        void nogc_base_cmp();
+        void nogc_base_less();
+        void nogc_base_cmpmix();
+        void nogc_base_ic();
+        void nogc_member_cmp();
+        void nogc_member_less();
+        void nogc_member_cmpmix();
+        void nogc_member_ic();
+
+
+        CPPUNIT_TEST_SUITE(IntrusiveMichaelListHeaderTest)
+            CPPUNIT_TEST(HP_base_cmp)
+            CPPUNIT_TEST(HP_base_less)
+            CPPUNIT_TEST(HP_base_cmpmix)
+            CPPUNIT_TEST(HP_base_ic)
+            CPPUNIT_TEST(HP_member_cmp)
+            CPPUNIT_TEST(HP_member_less)
+            CPPUNIT_TEST(HP_member_cmpmix)
+            CPPUNIT_TEST(HP_member_ic)
+
+            CPPUNIT_TEST(PTB_base_cmp)
+            CPPUNIT_TEST(PTB_base_less)
+            CPPUNIT_TEST(PTB_base_cmpmix)
+            CPPUNIT_TEST(PTB_base_ic)
+            CPPUNIT_TEST(PTB_member_cmp)
+            CPPUNIT_TEST(PTB_member_less)
+            CPPUNIT_TEST(PTB_member_cmpmix)
+            CPPUNIT_TEST(PTB_member_ic)
+
+            CPPUNIT_TEST(HRC_base_cmp)
+            CPPUNIT_TEST(HRC_base_less)
+            CPPUNIT_TEST(HRC_base_cmpmix)
+            CPPUNIT_TEST(HRC_base_ic)
+
+            CPPUNIT_TEST(RCU_GPI_base_cmp)
+            CPPUNIT_TEST(RCU_GPI_base_less)
+            CPPUNIT_TEST(RCU_GPI_base_cmpmix)
+            CPPUNIT_TEST(RCU_GPI_base_ic)
+            CPPUNIT_TEST(RCU_GPI_member_cmp)
+            CPPUNIT_TEST(RCU_GPI_member_less)
+            CPPUNIT_TEST(RCU_GPI_member_cmpmix)
+            CPPUNIT_TEST(RCU_GPI_member_ic)
+
+            CPPUNIT_TEST(RCU_GPB_base_cmp)
+            CPPUNIT_TEST(RCU_GPB_base_less)
+            CPPUNIT_TEST(RCU_GPB_base_cmpmix)
+            CPPUNIT_TEST(RCU_GPB_base_ic)
+            CPPUNIT_TEST(RCU_GPB_member_cmp)
+            CPPUNIT_TEST(RCU_GPB_member_less)
+            CPPUNIT_TEST(RCU_GPB_member_cmpmix)
+            CPPUNIT_TEST(RCU_GPB_member_ic)
+
+            CPPUNIT_TEST(RCU_GPT_base_cmp)
+            CPPUNIT_TEST(RCU_GPT_base_less)
+            CPPUNIT_TEST(RCU_GPT_base_cmpmix)
+            CPPUNIT_TEST(RCU_GPT_base_ic)
+            CPPUNIT_TEST(RCU_GPT_member_cmp)
+            CPPUNIT_TEST(RCU_GPT_member_less)
+            CPPUNIT_TEST(RCU_GPT_member_cmpmix)
+            CPPUNIT_TEST(RCU_GPT_member_ic)
+
+            CPPUNIT_TEST(nogc_base_cmp)
+            CPPUNIT_TEST(nogc_base_less)
+            CPPUNIT_TEST(nogc_base_cmpmix)
+            CPPUNIT_TEST(nogc_base_ic)
+            CPPUNIT_TEST(nogc_member_cmp)
+            CPPUNIT_TEST(nogc_member_less)
+            CPPUNIT_TEST(nogc_member_cmpmix)
+            CPPUNIT_TEST(nogc_member_ic)
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_michael_hp.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_michael_hp.cpp
new file mode 100644 (file)
index 0000000..9e568fa
--- /dev/null
@@ -0,0 +1,130 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_michael.h"
+#include <cds/intrusive/michael_list_hp.h>
+
+namespace ordlist {
+    void IntrusiveMichaelListHeaderTest::HP_base_cmp()
+    {
+        typedef base_int_item< cds::gc::HP > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::HP_base_less()
+    {
+        typedef base_int_item< cds::gc::HP > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::HP_base_cmpmix()
+    {
+        typedef base_int_item< cds::gc::HP > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::HP_base_ic()
+    {
+        typedef base_int_item< cds::gc::HP > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::HP_member_cmp()
+    {
+        typedef member_int_item< cds::gc::HP > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::HP_member_less()
+    {
+        typedef member_int_item< cds::gc::HP > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::HP_member_cmpmix()
+    {
+        typedef member_int_item< cds::gc::HP > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::HP_member_ic()
+    {
+        typedef member_int_item< cds::gc::HP > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+}   // namespace ordlist
+
+CPPUNIT_TEST_SUITE_REGISTRATION(ordlist::IntrusiveMichaelListHeaderTest);
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_michael_hrc.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_michael_hrc.cpp
new file mode 100644 (file)
index 0000000..5e0d5da
--- /dev/null
@@ -0,0 +1,64 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_michael.h"
+#include <cds/intrusive/michael_list_hrc.h>
+
+namespace ordlist {
+
+    void IntrusiveMichaelListHeaderTest::HRC_base_cmp()
+    {
+        typedef base_int_item< cds::gc::HRC > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::HRC_base_less()
+    {
+        typedef base_int_item< cds::gc::HRC > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::HRC_base_cmpmix()
+    {
+        typedef base_int_item< cds::gc::HRC > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::HRC_base_ic()
+    {
+        typedef base_int_item< cds::gc::HRC > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+
+}
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpb.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..03c4ded
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_michael.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/intrusive/michael_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >    RCU;
+    }
+
+    void IntrusiveMichaelListHeaderTest::RCU_GPB_base_cmp()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPB_base_less()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPB_base_cmpmix()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPB_base_ic()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPB_member_cmp()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPB_member_less()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPB_member_cmpmix()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPB_member_ic()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+
+}
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpi.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..3ed41ee
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_michael.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/intrusive/michael_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> >    RCU;
+    }
+
+    void IntrusiveMichaelListHeaderTest::RCU_GPI_base_cmp()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPI_base_less()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPI_base_cmpmix()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPI_base_ic()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPI_member_cmp()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPI_member_less()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPI_member_cmpmix()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPI_member_ic()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+
+}
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpt.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..27e400d
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_michael.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/intrusive/michael_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> >    RCU;
+    }
+
+    void IntrusiveMichaelListHeaderTest::RCU_GPT_base_cmp()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPT_base_less()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPT_base_cmpmix()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPT_base_ic()
+    {
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPT_member_cmp()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPT_member_less()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPT_member_cmpmix()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_GPT_member_ic()
+    {
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+    }
+
+}
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_shb.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..b6af0e6
--- /dev/null
@@ -0,0 +1,152 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_michael.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/intrusive/michael_list_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> >    RCU;
+    }
+#endif
+
+    void IntrusiveMichaelListHeaderTest::RCU_SHB_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHB_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHB_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHB_base_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHB_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHB_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHB_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHB_member_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+
+}
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_sht.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_michael_list_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..bcd07cb
--- /dev/null
@@ -0,0 +1,152 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_michael.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/intrusive/michael_list_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> >    RCU;
+    }
+#endif
+
+    void IntrusiveMichaelListHeaderTest::RCU_SHT_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHT_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHT_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHT_base_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHT_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHT_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHT_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+    void IntrusiveMichaelListHeaderTest::RCU_SHT_member_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< RCU > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_rcu_int<list>();
+#endif
+    }
+
+}
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_michael_nogc.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_michael_nogc.cpp
new file mode 100644 (file)
index 0000000..aeefabb
--- /dev/null
@@ -0,0 +1,129 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_michael.h"
+#include <cds/intrusive/michael_list_nogc.h>
+
+namespace ordlist {
+    void IntrusiveMichaelListHeaderTest::nogc_base_cmp()
+    {
+        typedef base_int_item< cds::gc::nogc > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::nogc_base_less()
+    {
+        typedef base_int_item< cds::gc::nogc > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::nogc_base_cmpmix()
+    {
+        typedef base_int_item< cds::gc::nogc > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::nogc_base_ic()
+    {
+        typedef base_int_item< cds::gc::nogc > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::nogc_member_cmp()
+    {
+        typedef member_int_item< cds::gc::nogc > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::nogc_member_less()
+    {
+        typedef member_int_item< cds::gc::nogc > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::nogc_member_cmpmix()
+    {
+        typedef member_int_item< cds::gc::nogc > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::nogc_member_ic()
+    {
+        typedef member_int_item< cds::gc::nogc > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_nogc_int<list>();
+    }
+
+} // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_intrusive_michael_ptb.cpp b/tests/test-hdr/ordered_list/hdr_intrusive_michael_ptb.cpp
new file mode 100644 (file)
index 0000000..ee984bf
--- /dev/null
@@ -0,0 +1,129 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_intrusive_michael.h"
+#include <cds/intrusive/michael_list_ptb.h>
+
+namespace ordlist {
+    void IntrusiveMichaelListHeaderTest::PTB_base_cmp()
+    {
+        typedef base_int_item< cds::gc::PTB > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::PTB_base_less()
+    {
+        typedef base_int_item< cds::gc::PTB > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::PTB_base_cmpmix()
+    {
+        typedef base_int_item< cds::gc::PTB > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::PTB_base_ic()
+    {
+        typedef base_int_item< cds::gc::PTB > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::PTB_member_cmp()
+    {
+        typedef member_int_item< cds::gc::PTB > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::PTB_member_less()
+    {
+        typedef member_int_item< cds::gc::PTB > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::PTB_member_cmpmix()
+    {
+        typedef member_int_item< cds::gc::PTB > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+    void IntrusiveMichaelListHeaderTest::PTB_member_ic()
+    {
+        typedef member_int_item< cds::gc::PTB > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >    list;
+        test_int<list>();
+    }
+
+} // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_lazy.h b/tests/test-hdr/ordered_list/hdr_lazy.h
new file mode 100644 (file)
index 0000000..db8607e
--- /dev/null
@@ -0,0 +1,774 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/container/lazy_list_base.h>
+
+namespace ordlist {
+    namespace cc = cds::container;
+    namespace co = cds::container::opt;
+
+    class LazyListTestHeader: public CppUnitMini::TestCase
+    {
+    public:
+        struct stat {
+            int nEnsureExistsCall;
+            int nEnsureNewCall;
+
+            stat()
+            {
+                nEnsureExistsCall
+                    = nEnsureNewCall
+                    = 0;
+            }
+        };
+
+        struct item {
+            int     nKey;
+            int     nVal;
+
+            stat    s;
+
+            item(int key)
+                : nKey( key )
+                , nVal( key * 2 )
+                , s()
+            {}
+
+            item(int key, int val)
+                : nKey( key )
+                , nVal(val)
+                , s()
+            {}
+
+            item( item const& v )
+                : nKey( v.nKey )
+                , nVal( v.nVal )
+                , s()
+            {}
+
+            int key() const
+            {
+                return nKey;
+            }
+        };
+
+        template <typename T>
+        struct lt
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() < v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() < v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 < v2.key();
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1.key() < v2.key() )
+                    return -1;
+                return v1.key() > v2.key() ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const T& v1, const Q& v2 ) const
+            {
+                if ( v1.key() < v2 )
+                    return -1;
+                return v1.key() > v2 ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const Q& v1, const T& v2 ) const
+            {
+                if ( v1 < v2.key() )
+                    return -1;
+                return v1 > v2.key() ? 1 : 0;
+            }
+        };
+
+        struct insert_functor {
+            void operator ()( item& i )
+            {
+                i.nVal = i.nKey * 1033;
+            }
+        };
+        struct dummy_insert_functor {
+            void operator ()( item& i )
+            {
+                // This functor should not be called
+                TestCase::current_test()->error( "CPPUNIT_ASSERT", "dummy_insert_functor should not be called", __FILE__, __LINE__ );
+            }
+        };
+
+        static void insert_function( item& i )
+        {
+            i.nVal = i.nKey * 1024;
+        }
+        static void dummy_insert_function( item& i )
+        {
+            // This function should not be called
+            TestCase::current_test()->error( "CPPUNIT_ASSERT", "dummy_insert_function should not be called", __FILE__, __LINE__ );
+        }
+
+        struct erase_functor {
+            unsigned int nEraseCall;
+
+            erase_functor()
+                : nEraseCall(0)
+            {}
+
+            void operator()( item const& /*i*/)
+            {
+                ++nEraseCall;
+            }
+        };
+
+        struct check_value {
+            unsigned int m_nMultiplier;
+
+            check_value( unsigned int nMultiplier )
+                : m_nMultiplier( nMultiplier )
+            {}
+
+            check_value( const check_value& s )
+                : m_nMultiplier( s.m_nMultiplier )
+            {}
+
+            void operator()( item& i, int )
+            {
+                CPPUNIT_ASSERT_CURRENT( int(i.nKey * m_nMultiplier) == i.nVal );
+            }
+        };
+
+        struct check_exact_value {
+            int m_nExpected;
+
+            check_exact_value( int nExpected )
+                : m_nExpected( nExpected )
+            {}
+
+            check_exact_value( check_exact_value const& s)
+                : m_nExpected( s.m_nExpected )
+            {}
+
+            void operator()( item& i, int )
+            {
+                CPPUNIT_ASSERT_CURRENT( i.nVal == m_nExpected );
+            }
+        };
+
+        struct dummy_check_value {
+            void operator()( item& i, int )
+            {
+                // This functor should not be called
+                TestCase::current_test()->error( "CPPUNIT_ASSERT", "dummy_check_value should not be called", __FILE__, __LINE__ );
+            }
+        };
+
+        struct ensure_functor {
+            void operator()( bool bNew, item& i, int n )
+            {
+                i.nVal = i.nKey * 1024;
+            }
+        };
+
+        static void ensure_func( bool bNew, item& i, int n )
+        {
+            i.nVal = n * 1033;
+        }
+
+        struct other_item
+        {
+            int nKey;
+
+            other_item()
+            {}
+
+            other_item(int n)
+                : nKey(n)
+            {}
+        };
+
+        struct other_less
+        {
+            template <typename T1, typename T2>
+            bool operator()( T1 const& t1, T2 const& t2 ) const
+            {
+                return t1.nKey < t2.nKey;
+            }
+        };
+
+    protected:
+        template <class OrdList>
+        void test_with( OrdList& l )
+        {
+            typedef typename OrdList::value_type    value_type;
+
+            // The list should be empty
+            CPPUNIT_ASSERT( l.empty() );
+
+            // insert test
+            CPPUNIT_ASSERT( l.insert( 50 ) );
+            CPPUNIT_ASSERT( l.insert( item( 25 )) );
+            CPPUNIT_ASSERT( l.insert( item( 100 )) );
+
+            // insert failed - such key exists
+            CPPUNIT_ASSERT( !l.insert( 50 ) );
+            CPPUNIT_ASSERT( !l.insert( item( 100 )) );
+
+            // clear test
+
+            // The list should not be empty
+            CPPUNIT_ASSERT( !l.empty() );
+            l.clear();
+            // and now the list is empty
+            CPPUNIT_ASSERT( l.empty() );
+
+            // Test insert with functor
+
+            CPPUNIT_ASSERT( l.insert( 100, insert_functor() ) );
+            // passed by ref
+            {
+                insert_functor f;
+                CPPUNIT_ASSERT( l.insert( item(25), boost::ref(f)) );
+                CPPUNIT_ASSERT( !l.insert( item(100), boost::ref(f)) );
+            }
+            // Test insert with function
+            CPPUNIT_ASSERT( l.insert( 50, insert_function ));
+            CPPUNIT_ASSERT( !l.insert( 25, dummy_insert_function ));
+            CPPUNIT_ASSERT( !l.insert( 100, dummy_insert_functor() ));
+
+            // The list should not be empty
+            CPPUNIT_ASSERT( !l.empty() );
+
+            // Check inserted values
+            {
+                int i;
+                i = 100;
+
+                CPPUNIT_ASSERT( l.find( 100 ));
+                CPPUNIT_ASSERT( l.find( i, check_value(1033) ));
+                {
+                    check_value f(1033);
+                    i = 25;
+                    CPPUNIT_ASSERT( l.find_with( 25, lt<value_type>() ));
+                    CPPUNIT_ASSERT( l.find_with( i, lt<value_type>(), boost::ref(f) ));
+                }
+                i = 50;
+                CPPUNIT_ASSERT( l.find( 50 ));
+                CPPUNIT_ASSERT( l.find( i, check_value(1024) ));
+
+                i = 10;
+                CPPUNIT_ASSERT( !l.find_with( 10, lt<value_type>() ));
+                CPPUNIT_ASSERT( !l.find_with( i, lt<value_type>(), dummy_check_value() ));
+                i = 75;
+                CPPUNIT_ASSERT( !l.find( 75 ));
+                CPPUNIT_ASSERT( !l.find( i, dummy_check_value() ));
+                i = 150;
+                CPPUNIT_ASSERT( !l.find( 150 ));
+                CPPUNIT_ASSERT( !l.find( i, dummy_check_value() ));
+            }
+
+            // The list should not be empty
+            CPPUNIT_ASSERT( !l.empty() );
+            l.clear();
+            // and now the list is empty
+            CPPUNIT_ASSERT( l.empty() );
+
+            // Ensure test
+            {
+                std::pair<bool, bool>   ensureResult;
+                ensure_functor f;
+                ensureResult = l.ensure( 100, ensure_functor() );
+                CPPUNIT_ASSERT( ensureResult.first );
+                CPPUNIT_ASSERT( ensureResult.second );
+
+                ensureResult = l.ensure( 200, boost::ref(f) );
+                CPPUNIT_ASSERT( ensureResult.first );
+                CPPUNIT_ASSERT( ensureResult.second );
+
+                ensureResult = l.ensure( 50, ensure_func );
+                CPPUNIT_ASSERT( ensureResult.first );
+                CPPUNIT_ASSERT( ensureResult.second );
+
+                int i;
+                i = 100;
+                CPPUNIT_ASSERT( l.find( i, check_value(1024) ));
+                i = 50;
+                CPPUNIT_ASSERT( l.find( i, check_value(1033) ));
+                i = 200;
+                CPPUNIT_ASSERT( l.find( i, check_value(1024) ));
+
+                // ensure existing key
+                ensureResult = l.ensure( 200, ensure_func );
+                CPPUNIT_ASSERT( ensureResult.first );
+                CPPUNIT_ASSERT( !ensureResult.second );
+                i = 200;
+                CPPUNIT_ASSERT( l.find( i, check_value(1033) ));
+
+                ensureResult = l.ensure( 50, ensure_functor() );
+                CPPUNIT_ASSERT( ensureResult.first );
+                CPPUNIT_ASSERT( !ensureResult.second );
+                i = 50;
+                CPPUNIT_ASSERT( l.find( i, check_value(1024) ));
+            }
+
+            // erase test (list: 50, 100, 200)
+            CPPUNIT_ASSERT( !l.empty() );
+            CPPUNIT_ASSERT( l.insert(160));
+            CPPUNIT_ASSERT( l.insert(250));
+            CPPUNIT_ASSERT( !l.empty() );
+
+            CPPUNIT_ASSERT( !l.erase( 150 ));
+
+            CPPUNIT_ASSERT( l.erase( 100 ));
+            CPPUNIT_ASSERT( !l.erase( 100 ));
+
+            CPPUNIT_ASSERT( l.erase_with( 200, lt<value_type>() ));
+            CPPUNIT_ASSERT( !l.erase_with( 200, lt<value_type>() ));
+
+            {
+                erase_functor ef;
+                CPPUNIT_ASSERT( ef.nEraseCall == 0 );
+                CPPUNIT_ASSERT( l.erase_with( 160, lt<value_type>(), cds::ref(ef) ));
+                CPPUNIT_ASSERT( ef.nEraseCall == 1 );
+                CPPUNIT_ASSERT( !l.erase_with( 160, lt<value_type>(), cds::ref(ef) ));
+                CPPUNIT_ASSERT( ef.nEraseCall == 1 );
+
+                CPPUNIT_ASSERT( l.erase( 250, cds::ref(ef) ));
+                CPPUNIT_ASSERT( ef.nEraseCall == 2 );
+                CPPUNIT_ASSERT( !l.erase( 250, cds::ref(ef) ));
+                CPPUNIT_ASSERT( ef.nEraseCall == 2 );
+            }
+
+            CPPUNIT_ASSERT( l.erase( 50 ));
+            CPPUNIT_ASSERT( !l.erase( 50 ));
+
+            CPPUNIT_ASSERT( l.empty() );
+
+            // clear empty list
+            l.clear();
+            CPPUNIT_ASSERT( l.empty() );
+
+#ifdef CDS_EMPLACE_SUPPORT
+            {
+                int i;
+                // insert test
+                CPPUNIT_ASSERT( l.emplace( 501 ) );
+                CPPUNIT_ASSERT( l.emplace( 251, 152 ));
+                CPPUNIT_ASSERT( l.emplace( item( 1001 )) );
+
+                // insert failed - such key exists
+                CPPUNIT_ASSERT( !l.emplace( 501, 2 ) );
+                CPPUNIT_ASSERT( !l.emplace( 251, 10) );
+
+                i = 501;
+                CPPUNIT_ASSERT( l.find( i, check_exact_value(501*2) ));
+                i = 251;
+                CPPUNIT_ASSERT( l.find( i, check_exact_value(152) ));
+                i = 1001;
+                CPPUNIT_ASSERT( l.find( i, check_exact_value(1001*2) ));
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+            }
+#endif
+
+            // Iterator test
+            {
+                int nCount = 100;
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.insert(i) );
+
+                int i = 0;
+                for ( typename OrdList::iterator it = l.begin(), itEnd = l.end(); it != itEnd; ++it, ++i ) {
+                    it->nVal = i * 2;
+                    CPPUNIT_ASSERT( it->nKey == i );
+                }
+
+                // Check that we have visited all items
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.find( i, check_value(2) ));
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+
+                // Const iterator
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.insert(i) );
+
+                i = 0;
+                const OrdList& rl = l;
+                for ( typename OrdList::const_iterator it = rl.begin(), itEnd = rl.end(); it != itEnd; ++it, ++i ) {
+                    // it->nVal = i * 2    ;    // not!
+                    CPPUNIT_ASSERT( it->nKey == i );
+                }
+
+                // Check that we have visited all items
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.find_with( i, lt<value_type>(), check_value(2) ));
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+            }
+        }
+
+        template <class OrdList>
+        void test()
+        {
+            typedef typename OrdList::guarded_ptr guarded_ptr;
+            typedef typename OrdList::value_type value_type;
+
+            OrdList l;
+            test_with( l );
+
+            static int const nLimit = 20;
+            int arr[nLimit];
+            for ( int i = 0; i < nLimit; i++ )
+                arr[i] = i;
+            std::random_shuffle( arr, arr + nLimit );
+
+            // extract/get
+            for ( int i = 0; i < nLimit; ++i )
+                l.insert( arr[i] );
+            {
+                guarded_ptr gp;
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arr[i];
+
+                    CPPUNIT_ASSERT( l.get(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey * 2 );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey*2 );
+                    gp.release();
+
+                    CPPUNIT_CHECK( !l.get(gp, nKey));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !l.extract( gp, nKey));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty());
+                CPPUNIT_CHECK( !l.get(gp, arr[0]));
+                CPPUNIT_CHECK( gp.empty());
+                CPPUNIT_CHECK( !l.extract( gp, arr[0]));
+                CPPUNIT_CHECK( gp.empty());
+            }
+
+            // extract_with/get_with
+            for ( int i = 0; i < nLimit; ++i )
+                l.insert( arr[i] );
+            {
+                guarded_ptr gp;
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arr[i];
+                    other_item key( nKey );
+
+                    CPPUNIT_ASSERT( l.get_with(gp, key, other_less()));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey * 2 );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract_with(gp, key, other_less()));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey*2 );
+                    gp.release();
+
+                    CPPUNIT_CHECK( !l.get_with(gp, key, other_less()));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !l.extract_with( gp, key, other_less()));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty());
+                CPPUNIT_CHECK( !l.get_with(gp, other_item(arr[0]), other_less()));
+                CPPUNIT_CHECK( gp.empty());
+                CPPUNIT_CHECK( !l.extract_with( gp, other_item(arr[0]), other_less()));
+                CPPUNIT_CHECK( gp.empty());
+            }
+
+        }
+
+        template <class OrdList>
+        void test_rcu()
+        {
+            OrdList l;
+            test_with( l );
+
+            static int const nLimit = 20;
+
+            typedef typename OrdList::rcu_lock rcu_lock;
+            typedef typename OrdList::value_type value_type;
+            typedef typename OrdList::gc rcu_type;
+
+            {
+                int a[nLimit];
+                for (int i = 0; i < nLimit; ++i)
+                    a[i]=i;
+                std::random_shuffle( a, a + nLimit );
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( l.insert( a[i] ) );
+
+                typename OrdList::exempt_ptr ep;
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get( a[i] );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->nKey == a[i] );
+                        CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract( ep, a[i] ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->nKey == a[i] );
+                        CPPUNIT_CHECK( (*ep).nVal == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get( a[i]) == NULL );
+                        CPPUNIT_CHECK( !l.extract( ep, a[i] ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get( a[0] ) == NULL );
+                    CPPUNIT_CHECK( !l.extract( ep, a[0] ) );
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( l.insert( a[i] ) );
+                }
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    other_item itm( a[i] );
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get_with( itm, other_less() );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->nKey == a[i] );
+                        CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->nKey == a[i] );
+                        CPPUNIT_CHECK( ep->nVal == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get_with( itm, other_less()) == NULL );
+                        CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get_with( other_item(0), other_less() ) == NULL );
+                    CPPUNIT_CHECK( !l.extract_with( ep, other_item(0), other_less() ));
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+            }
+        }
+
+        template <class OrdList>
+        void nogc_test()
+        {
+            typedef OrdList list;
+            typedef typename list::value_type    value_type;
+            typedef std::pair<typename list::iterator, bool> ensure_result;
+
+            typename list::iterator it;
+
+            list l;
+            CPPUNIT_ASSERT( l.empty() );
+            CPPUNIT_ASSERT( l.insert(50) != l.end() );
+            CPPUNIT_ASSERT( !l.empty() );
+
+            ensure_result eres = l.ensure( item(100, 33) );
+            CPPUNIT_ASSERT( eres.second );
+            CPPUNIT_ASSERT( eres.first != l.end() );
+            CPPUNIT_ASSERT( l.insert( item(150) ) != l.end() );
+
+            CPPUNIT_ASSERT( l.insert(100) == l.end() );
+            eres = l.ensure( item(50, 33) );
+            CPPUNIT_ASSERT( !eres.second );
+            CPPUNIT_ASSERT( eres.first->nVal == eres.first->nKey * 2 );
+            eres.first->nVal = 63;
+
+            it = l.find( 33 );
+            CPPUNIT_ASSERT( it == l.end() );
+
+            it = l.find( 50 );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 50 );
+            CPPUNIT_ASSERT( it->nVal == 63 );
+
+            it = l.find( 100 );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 100 );
+            CPPUNIT_ASSERT( it->nVal == 33 );
+
+            it = l.find_with( 150, lt<value_type>() );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 150 );
+            CPPUNIT_ASSERT( it->nVal == it->nKey * 2 );
+
+            CPPUNIT_ASSERT( !l.empty() );
+            l.clear();
+            CPPUNIT_ASSERT( l.empty() );
+
+#ifdef CDS_EMPLACE_SUPPORT
+            // insert test
+            CPPUNIT_ASSERT( l.emplace( 501 ) != l.end());
+            CPPUNIT_ASSERT( l.emplace( 251, 152 ) != l.end());
+            CPPUNIT_ASSERT( l.emplace( item( 1001 )) != l.end());
+
+            // insert failed - such key exists
+            CPPUNIT_ASSERT( l.emplace( 501, 2 ) == l.end());
+            CPPUNIT_ASSERT( l.emplace( 251, 10) == l.end());
+
+            it = l.find( 501 );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 501 );
+            CPPUNIT_ASSERT( it->nVal == 501 * 2 );
+
+            it = l.find_with( 251, lt<value_type>() );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 251 );
+            CPPUNIT_ASSERT( it->nVal == 152 );
+
+            it = l.find( 1001 );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 1001 );
+            CPPUNIT_ASSERT( it->nVal == 1001 * 2 );
+
+            l.clear();
+            CPPUNIT_ASSERT( l.empty() );
+#endif
+
+        }
+
+        void HP_cmp();
+        void HP_less();
+        void HP_cmpmix();
+        void HP_ic();
+
+        void PTB_cmp();
+        void PTB_less();
+        void PTB_cmpmix();
+        void PTB_ic();
+
+        void HRC_cmp();
+        void HRC_less();
+        void HRC_cmpmix();
+        void HRC_ic();
+
+        void RCU_GPI_cmp();
+        void RCU_GPI_less();
+        void RCU_GPI_cmpmix();
+        void RCU_GPI_ic();
+
+        void RCU_GPB_cmp();
+        void RCU_GPB_less();
+        void RCU_GPB_cmpmix();
+        void RCU_GPB_ic();
+
+        void RCU_GPT_cmp();
+        void RCU_GPT_less();
+        void RCU_GPT_cmpmix();
+        void RCU_GPT_ic();
+
+        void RCU_SHB_cmp();
+        void RCU_SHB_less();
+        void RCU_SHB_cmpmix();
+        void RCU_SHB_ic();
+
+        void RCU_SHT_cmp();
+        void RCU_SHT_less();
+        void RCU_SHT_cmpmix();
+        void RCU_SHT_ic();
+
+        void NOGC_cmp();
+        void NOGC_less();
+        void NOGC_cmpmix();
+        void NOGC_ic();
+
+        CPPUNIT_TEST_SUITE(LazyListTestHeader)
+            CPPUNIT_TEST(HP_cmp)
+            CPPUNIT_TEST(HP_less)
+            CPPUNIT_TEST(HP_cmpmix)
+            CPPUNIT_TEST(HP_ic)
+
+            CPPUNIT_TEST(PTB_cmp)
+            CPPUNIT_TEST(PTB_less)
+            CPPUNIT_TEST(PTB_cmpmix)
+            CPPUNIT_TEST(PTB_ic)
+
+            CPPUNIT_TEST(HRC_cmp)
+            CPPUNIT_TEST(HRC_less)
+            CPPUNIT_TEST(HRC_cmpmix)
+            CPPUNIT_TEST(HRC_ic)
+
+            CPPUNIT_TEST(RCU_GPI_cmp)
+            CPPUNIT_TEST(RCU_GPI_less)
+            CPPUNIT_TEST(RCU_GPI_cmpmix)
+            CPPUNIT_TEST(RCU_GPI_ic)
+
+            CPPUNIT_TEST(RCU_GPB_cmp)
+            CPPUNIT_TEST(RCU_GPB_less)
+            CPPUNIT_TEST(RCU_GPB_cmpmix)
+            CPPUNIT_TEST(RCU_GPB_ic)
+
+            CPPUNIT_TEST(RCU_GPT_cmp)
+            CPPUNIT_TEST(RCU_GPT_less)
+            CPPUNIT_TEST(RCU_GPT_cmpmix)
+            CPPUNIT_TEST(RCU_GPT_ic)
+
+            CPPUNIT_TEST(RCU_SHB_cmp)
+            CPPUNIT_TEST(RCU_SHB_less)
+            CPPUNIT_TEST(RCU_SHB_cmpmix)
+            CPPUNIT_TEST(RCU_SHB_ic)
+
+            CPPUNIT_TEST(RCU_SHT_cmp)
+            CPPUNIT_TEST(RCU_SHT_less)
+            CPPUNIT_TEST(RCU_SHT_cmpmix)
+            CPPUNIT_TEST(RCU_SHT_ic)
+
+            CPPUNIT_TEST(NOGC_cmp)
+            CPPUNIT_TEST(NOGC_less)
+            CPPUNIT_TEST(NOGC_cmpmix)
+            CPPUNIT_TEST(NOGC_ic)
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_hp.cpp b/tests/test-hdr/ordered_list/hdr_lazy_hp.cpp
new file mode 100644 (file)
index 0000000..a73eaf2
--- /dev/null
@@ -0,0 +1,102 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy.h"
+#include <cds/container/lazy_list_hp.h>
+
+namespace ordlist {
+    namespace {
+        struct HP_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+        };
+
+    }
+    void LazyListTestHeader::HP_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::HP, item, HP_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::HP, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+        };
+    }
+    void LazyListTestHeader::HP_less()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::HP, item, HP_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::HP, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>  less;
+        };
+    }
+    void LazyListTestHeader::HP_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::HP, item, HP_cmpmix_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::HP, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyListTestHeader::HP_ic()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::HP, item, HP_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::HP, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
+CPPUNIT_TEST_SUITE_REGISTRATION(ordlist::LazyListTestHeader);
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_hrc.cpp b/tests/test-hdr/ordered_list/hdr_lazy_hrc.cpp
new file mode 100644 (file)
index 0000000..6138fc1
--- /dev/null
@@ -0,0 +1,100 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy.h"
+#include <cds/container/lazy_list_hrc.h>
+
+namespace ordlist {
+    namespace {
+        struct HRC_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+        };
+    }
+    void LazyListTestHeader::HRC_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::HRC, item, HRC_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::HRC, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+        };
+    }
+    void LazyListTestHeader::HRC_less()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::HRC, item, HRC_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::HRC, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>  less;
+        };
+    }
+    void LazyListTestHeader::HRC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::HRC, item, HRC_cmpmix_traits> list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::HRC, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyListTestHeader::HRC_ic()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::HRC, item, HRC_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::HRC, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_kv.h b/tests/test-hdr/ordered_list/hdr_lazy_kv.h
new file mode 100644 (file)
index 0000000..a542d80
--- /dev/null
@@ -0,0 +1,685 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/container/lazy_list_base.h>
+
+namespace ordlist {
+    namespace cc = cds::container;
+    namespace co = cds::container::opt;
+
+    class LazyKVListTestHeader: public CppUnitMini::TestCase
+    {
+    public:
+        typedef int key_type;
+        struct value_type {
+            int m_val;
+
+            value_type()
+                : m_val(0)
+            {}
+
+            value_type( int n )
+                : m_val( n )
+            {}
+        };
+
+        template <typename T>
+        struct lt
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1 < v2;
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1 < v2 )
+                    return -1;
+                return v1 > v2 ? 1 : 0;
+            }
+        };
+
+        struct check_value {
+            int     m_nExpected;
+
+            check_value( int nExpected )
+                : m_nExpected( nExpected )
+            {}
+
+            template <typename T>
+            void operator ()( T& pair )
+            {
+                CPPUNIT_ASSERT_CURRENT( pair.second.m_val == m_nExpected );
+            }
+        };
+
+        struct insert_functor {
+            template <typename T>
+            void operator()( T& pair )
+            {
+                pair.second.m_val = pair.first * 10;
+            }
+        };
+
+        struct ensure_functor {
+            template <typename T>
+            void operator()( bool bNew, T& pair )
+            {
+                pair.second.m_val = pair.first * 50;
+            }
+        };
+
+        struct erase_functor {
+            int     nKey;
+            int     nVal;
+
+            erase_functor()
+                : nKey(0)
+                , nVal(0)
+            {}
+
+            template <typename T>
+            void operator()( T& i )
+            {
+                nKey = i.first;
+                nVal = i.second.m_val;
+            }
+        };
+
+        typedef float other_key;
+        struct other_less {
+            bool operator()( float f, int i ) const
+            {
+                return int(f) < i;
+            }
+            bool operator()( int i, float f ) const
+            {
+                return i < int(f);
+            }
+        };
+
+    protected:
+        template <class OrdList>
+        void test_with( OrdList& l)
+        {
+            typedef typename OrdList::value_type    value_type;
+
+            typename OrdList::iterator itTest;
+            typename OrdList::const_iterator citTest;
+
+            CPPUNIT_ASSERT( l.empty() );
+
+            // insert / find test
+            CPPUNIT_ASSERT( !l.find( 100 ));
+            CPPUNIT_ASSERT( l.insert( 100 ));
+            CPPUNIT_ASSERT( !l.empty() );
+            CPPUNIT_ASSERT( l.find( 100 ));
+
+            check_value chk(0);
+            CPPUNIT_ASSERT( l.find( 100, boost::ref( chk ) ));
+
+            CPPUNIT_ASSERT( !l.find_with( 50, lt<key_type>() ));
+            CPPUNIT_ASSERT( l.insert( 50, 500 ));
+            CPPUNIT_ASSERT( l.find_with( 50, lt<key_type>() ));
+            CPPUNIT_ASSERT( !l.insert( 50, 5 ));
+            chk.m_nExpected = 500;
+            CPPUNIT_ASSERT( l.find( 50, boost::ref( chk ) ));
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( l.find( 100, boost::ref( chk ) ));
+            CPPUNIT_ASSERT( !l.empty() );
+
+            CPPUNIT_ASSERT( !l.find( 150 ));
+            CPPUNIT_ASSERT( l.insert_key( 150, insert_functor() ));
+            CPPUNIT_ASSERT( l.find( 150 ));
+            chk.m_nExpected = 1500;
+            CPPUNIT_ASSERT( l.find_with( 150, lt<key_type>(), boost::ref( chk ) ));
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( l.find( 100, boost::ref( chk ) ));
+            chk.m_nExpected = 500;
+            CPPUNIT_ASSERT( l.find( 50, boost::ref( chk ) ));
+            CPPUNIT_ASSERT( !l.empty() );
+
+            // erase test
+
+            CPPUNIT_ASSERT( !l.erase( 500 ));
+            CPPUNIT_ASSERT( !l.empty() );
+
+            CPPUNIT_ASSERT( l.find( 50 ));
+            {
+                erase_functor ef;
+                l.erase( 50, boost::ref(ef));
+                CPPUNIT_ASSERT( ef.nKey == 50 );
+                CPPUNIT_ASSERT( ef.nVal == 500 );
+            }
+            CPPUNIT_ASSERT( !l.find( 50 ));
+
+            // ensure test
+            std::pair<bool, bool> bEnsureResult;
+            bEnsureResult = l.ensure( 100, ensure_functor() );
+            CPPUNIT_ASSERT( bEnsureResult.first );
+            CPPUNIT_ASSERT( !bEnsureResult.second );
+            chk.m_nExpected = 5000;
+            CPPUNIT_ASSERT( l.find( 100, boost::ref( chk ) ));
+
+            {
+                ensure_functor ef;
+                bEnsureResult = l.ensure( 50, boost::ref( ef ));
+            }
+            CPPUNIT_ASSERT( bEnsureResult.first );
+            CPPUNIT_ASSERT( bEnsureResult.second );
+            chk.m_nExpected = 2500;
+            CPPUNIT_ASSERT( l.find( 50, boost::ref( chk ) ));
+
+            // erase test
+            CPPUNIT_ASSERT( !l.empty() );
+            CPPUNIT_ASSERT( l.insert_key( 200, insert_functor() ));
+            CPPUNIT_ASSERT( l.insert( 25 ));
+            CPPUNIT_ASSERT( l.erase( 100 ));
+            CPPUNIT_ASSERT( l.erase( 150 ));
+            {
+                erase_functor ef;
+                CPPUNIT_ASSERT( l.erase_with( 200, lt<key_type>(), cds::ref(ef)) );
+                CPPUNIT_ASSERT( ef.nKey == 200 );
+                CPPUNIT_ASSERT( ef.nVal == 2000 );
+            }
+            CPPUNIT_ASSERT( l.erase_with( 25, lt<key_type>()))
+            CPPUNIT_ASSERT( l.erase( 50 ));
+            CPPUNIT_ASSERT( l.empty() );
+
+            // clear empty list
+            l.clear();
+            CPPUNIT_ASSERT( l.empty() );
+
+#ifdef CDS_EMPLACE_SUPPORT
+            // insert test
+            CPPUNIT_ASSERT( l.emplace( 501 ) );
+            CPPUNIT_ASSERT( l.emplace( 251, 152 ));
+
+            // insert failed - such key exists
+            CPPUNIT_ASSERT( !l.emplace( 501, 2 ) );
+            CPPUNIT_ASSERT( !l.emplace( 251, 10) );
+
+            check_value cv(0);
+            CPPUNIT_ASSERT( l.find( 501, cds::ref(cv) ));
+            cv.m_nExpected = 152;
+            CPPUNIT_ASSERT( l.find( 251, cds::ref(cv) ));
+
+            l.clear();
+            CPPUNIT_ASSERT( l.empty() );
+#endif
+
+            // Iterator test
+            {
+                int nCount = 100;
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.insert(i, i * 2 ) );
+
+                int i = 0;
+                for ( typename OrdList::iterator it = l.begin(), itEnd = l.end(); it != itEnd; ++it, ++i ) {
+                    CPPUNIT_ASSERT( it.key() == i );
+                    CPPUNIT_ASSERT( it.val().m_val == i * 2 );
+                    it.val().m_val = i * 3;
+                }
+
+                // Check that we have visited all items
+                for ( int i = 0; i < nCount; ++i ) {
+                    chk.m_nExpected = i * 3;
+                    CPPUNIT_ASSERT( l.find( i, boost::ref(chk) ));
+                }
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+
+                // Const iterator
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.insert(i, i * 7) );
+
+                i = 0;
+                const OrdList& rl = l;
+                for ( typename OrdList::const_iterator it = rl.begin(), itEnd = rl.end(); it != itEnd; ++it, ++i ) {
+                    CPPUNIT_ASSERT( it.key() == i );
+                    CPPUNIT_ASSERT( it.val().m_val == i * 7 );
+                }
+
+                // Check that we have visited all items
+                for ( int i = nCount; i > 0; --i ) {
+                    chk.m_nExpected = (i - 1) * 7;
+                    CPPUNIT_ASSERT( l.find_with( i - 1, lt<key_type>(), boost::ref(chk) ));
+                }
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+            }
+        }
+
+        template <class OrdList>
+        void test()
+        {
+            OrdList l;
+            test_with(l);
+
+            typedef typename OrdList::guarded_ptr guarded_ptr;
+
+            static int const nLimit = 20;
+            int arr[nLimit];
+            for ( int i = 0; i < nLimit; i++ )
+                arr[i] = i;
+            std::random_shuffle( arr, arr + nLimit );
+
+            // extract/get
+            for ( int i = 0; i < nLimit; ++i )
+                l.insert( arr[i], arr[i] * 2 );
+            {
+                guarded_ptr gp;
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arr[i];
+
+                    CPPUNIT_ASSERT( l.get(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey * 2 );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey*2 );
+                    gp.release();
+
+                    CPPUNIT_CHECK( !l.get(gp, nKey));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !l.extract( gp, nKey));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty());
+                CPPUNIT_CHECK( !l.get(gp, arr[0]));
+                CPPUNIT_CHECK( gp.empty());
+                CPPUNIT_CHECK( !l.extract( gp, arr[0]));
+                CPPUNIT_CHECK( gp.empty());
+            }
+
+            // extract_with/get_with
+            for ( int i = 0; i < nLimit; ++i )
+                l.insert( arr[i], arr[i] * 2 );
+            {
+                guarded_ptr gp;
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arr[i];
+                    other_key key = float(nKey + 0.3);
+
+                    CPPUNIT_ASSERT( l.get_with(gp, key, other_less()));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey * 2 );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract_with(gp, key, other_less()));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey*2 );
+                    gp.release();
+
+                    CPPUNIT_CHECK( !l.get_with(gp, key, other_less()));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !l.extract_with( gp, key, other_less()));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty());
+                CPPUNIT_CHECK( !l.get_with(gp, 3.4f, other_less()));
+                CPPUNIT_CHECK( gp.empty());
+                CPPUNIT_CHECK( !l.extract_with( gp, 3.4f, other_less()));
+                CPPUNIT_CHECK( gp.empty());
+            }
+        }
+
+        template <class OrdList>
+        void test_rcu()
+        {
+            OrdList l;
+            test_with(l);
+
+            static int const nLimit = 20;
+
+            typedef typename OrdList::rcu_lock rcu_lock;
+            typedef typename OrdList::value_type value_type;
+            typedef typename OrdList::gc rcu_type;
+
+            {
+                int a[nLimit];
+                for (int i = 0; i < nLimit; ++i)
+                    a[i]=i;
+                std::random_shuffle( a, a + nLimit );
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( l.insert( a[i], a[i]*2 ) );
+
+                typename OrdList::exempt_ptr ep;
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get( a[i] );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->first == a[i] );
+                        CPPUNIT_CHECK( pGet->second.m_val == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract( ep, a[i] ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->first == a[i] );
+                        CPPUNIT_CHECK( (*ep).second.m_val == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get( a[i]) == NULL );
+                        CPPUNIT_CHECK( !l.extract( ep, a[i] ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get( a[0] ) == NULL );
+                    CPPUNIT_CHECK( !l.extract( ep, a[0] ) );
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( l.insert( a[i], a[i]*2 ) );
+                }
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    float itm = a[i] + 0.3f;
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get_with( itm, other_less() );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->first == a[i] );
+                        CPPUNIT_CHECK( pGet->second.m_val == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->first == a[i] );
+                        CPPUNIT_CHECK( ep->second.m_val == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get_with( itm, other_less()) == NULL );
+                        CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get_with( 3.14f, other_less() ) == NULL );
+                    CPPUNIT_CHECK( !l.extract_with( ep, 3.14f, other_less() ));
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+            }
+        }
+
+        template <class OrdList>
+        void nogc_test()
+        {
+            typedef typename OrdList::value_type    value_type;
+            typedef typename OrdList::iterator      iterator;
+
+            {
+                OrdList l;
+                iterator it;
+
+                CPPUNIT_ASSERT( l.empty() );
+
+                // insert / find test
+                CPPUNIT_ASSERT( l.find( 100 ) == l.end() );
+                CPPUNIT_ASSERT( l.insert( 100 ) != l.end() );
+                CPPUNIT_ASSERT( !l.empty() );
+                it = l.find( 100 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 100 );
+                CPPUNIT_ASSERT( it.val().m_val == 0 );
+
+                CPPUNIT_ASSERT( l.find_with( 50, lt<key_type>() ) == l.end() );
+                CPPUNIT_ASSERT( l.insert( 50, 500 ) != l.end());
+                it = l.find( 50 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 50 );
+                CPPUNIT_ASSERT( it.val().m_val == 500 );
+
+                CPPUNIT_ASSERT( l.insert( 50, 5 ) == l.end() );
+                it = l.find( 50 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 50 );
+                CPPUNIT_ASSERT( it.val().m_val == 500 );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                CPPUNIT_ASSERT( l.find( 150 ) == l.end() );
+                CPPUNIT_ASSERT( l.insert_key( 150, insert_functor() ) != l.end() );
+                it = l.find( 150 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 150 );
+                CPPUNIT_ASSERT( it.val().m_val == 1500 );
+                it = l.find( 100 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 100 );
+                CPPUNIT_ASSERT( it.val().m_val == 0 );
+                it = l.find( 50 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 50 );
+                CPPUNIT_ASSERT( it.val().m_val == 500 );
+                it.val().m_val = 25;
+                it = l.find( 50 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 50 );
+                CPPUNIT_ASSERT( it.val().m_val == 25 );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                // ensure existing item
+                std::pair<iterator, bool> ensureResult;
+                ensureResult = l.ensure( 100 );
+                CPPUNIT_ASSERT( !ensureResult.second );
+                CPPUNIT_ASSERT( ensureResult.first.key() == 100 );
+                CPPUNIT_ASSERT( ensureResult.first.val().m_val == 0   );
+                ensureResult.first.val().m_val = 5;
+                it = l.find( 100 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 100 );
+                CPPUNIT_ASSERT( it.val().m_val == 5 );
+
+                CPPUNIT_ASSERT( !l.empty() );
+
+                // ensure new item
+                ensureResult = l.ensure( 1000 );
+                CPPUNIT_ASSERT( ensureResult.second );
+                CPPUNIT_ASSERT( ensureResult.first.key() == 1000 );
+                CPPUNIT_ASSERT( ensureResult.first.val().m_val == 0   );
+                ensureResult.first.val().m_val = 33;
+                ensureResult = l.ensure( 1000 );
+                CPPUNIT_ASSERT( !ensureResult.second );
+                CPPUNIT_ASSERT( ensureResult.first.key() == 1000 );
+                CPPUNIT_ASSERT( ensureResult.first.val().m_val == 33   );
+
+                // clear test
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+
+#ifdef CDS_EMPLACE_SUPPORT
+                // insert test
+                CPPUNIT_ASSERT( l.emplace( 501 ) != l.end());
+                CPPUNIT_ASSERT( l.emplace( 251, 152 ) != l.end());
+
+                // insert failed - such key exists
+                CPPUNIT_ASSERT( l.emplace( 501, 2 ) == l.end());
+                CPPUNIT_ASSERT( l.emplace( 251, 10) == l.end());
+
+                it = l.find(501);
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 501 );
+                CPPUNIT_ASSERT( it.val().m_val == 0 );
+
+                it = l.find(251);
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 251 );
+                CPPUNIT_ASSERT( it.val().m_val == 152 );
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+#endif
+
+                // Iterator test
+                {
+                    int nCount = 100;
+                    for ( int i = 0; i < nCount; ++i )
+                        CPPUNIT_ASSERT( l.insert(i, i * 2 ) != l.end() );
+
+                    int i = 0;
+                    for ( typename OrdList::iterator iter = l.begin(), itEnd = l.end(); iter != itEnd; ++iter, ++i ) {
+                        CPPUNIT_ASSERT( iter.key() == i );
+                        CPPUNIT_ASSERT( iter->first == i );
+                        CPPUNIT_ASSERT( (*iter).first == i );
+
+                        CPPUNIT_ASSERT( iter.val().m_val == i * 2 );
+                        CPPUNIT_ASSERT( iter->second.m_val == i * 2 );
+                        CPPUNIT_ASSERT( (*iter).second.m_val == i * 2 );
+
+                        iter.val().m_val = i * 3;
+                    }
+
+                    // Check that we have visited all items
+                    for ( int i = 0; i < nCount; ++i ) {
+                        it = l.find( i );
+                        CPPUNIT_ASSERT( it != l.end() );
+                        CPPUNIT_ASSERT( it.key() == i );
+                        CPPUNIT_ASSERT( it.val().m_val == i * 3 );
+                    }
+
+                    l.clear();
+                    CPPUNIT_ASSERT( l.empty() );
+
+                    // Const iterator
+                    for ( int i = 0; i < nCount; ++i )
+                        CPPUNIT_ASSERT( l.insert(i, i * 7) != l.end() );
+
+                    i = 0;
+                    const OrdList& rl = l;
+                    for ( typename OrdList::const_iterator iter = rl.begin(), itEnd = rl.end(); iter != itEnd; ++iter, ++i ) {
+                        CPPUNIT_ASSERT( iter.key() == i );
+                        CPPUNIT_ASSERT( iter->first == i );
+                        CPPUNIT_ASSERT( (*iter).first == i );
+
+                        CPPUNIT_ASSERT( iter.val().m_val == i * 7 );
+                        CPPUNIT_ASSERT( iter->second.m_val == i * 7 );
+                        CPPUNIT_ASSERT( (*iter).second.m_val == i * 7 );
+                        // it.val().m_val = i * 3    ; // error: const-iterator
+                    }
+
+                    l.clear();
+                    CPPUNIT_ASSERT( l.empty() );
+                }
+
+            }
+        }
+
+        void HP_cmp();
+        void HP_less();
+        void HP_cmpmix();
+        void HP_ic();
+
+        void PTB_cmp();
+        void PTB_less();
+        void PTB_cmpmix();
+        void PTB_ic();
+
+        void RCU_GPI_cmp();
+        void RCU_GPI_less();
+        void RCU_GPI_cmpmix();
+        void RCU_GPI_ic();
+
+        void RCU_GPB_cmp();
+        void RCU_GPB_less();
+        void RCU_GPB_cmpmix();
+        void RCU_GPB_ic();
+
+        void RCU_GPT_cmp();
+        void RCU_GPT_less();
+        void RCU_GPT_cmpmix();
+        void RCU_GPT_ic();
+
+        void RCU_SHB_cmp();
+        void RCU_SHB_less();
+        void RCU_SHB_cmpmix();
+        void RCU_SHB_ic();
+
+        void RCU_SHT_cmp();
+        void RCU_SHT_less();
+        void RCU_SHT_cmpmix();
+        void RCU_SHT_ic();
+
+        void HRC_cmp();
+        void HRC_less();
+        void HRC_cmpmix();
+        void HRC_ic();
+
+        void NOGC_cmp();
+        void NOGC_less();
+        void NOGC_cmpmix();
+        void NOGC_ic();
+
+        CPPUNIT_TEST_SUITE(LazyKVListTestHeader)
+            CPPUNIT_TEST(HP_cmp)
+            CPPUNIT_TEST(HP_less)
+            CPPUNIT_TEST(HP_cmpmix)
+            CPPUNIT_TEST(HP_ic)
+
+            CPPUNIT_TEST(PTB_cmp)
+            CPPUNIT_TEST(PTB_less)
+            CPPUNIT_TEST(PTB_cmpmix)
+            CPPUNIT_TEST(PTB_ic)
+
+            CPPUNIT_TEST(HRC_cmp)
+            CPPUNIT_TEST(HRC_less)
+            CPPUNIT_TEST(HRC_cmpmix)
+            CPPUNIT_TEST(HRC_ic)
+
+            CPPUNIT_TEST(RCU_GPI_cmp)
+            CPPUNIT_TEST(RCU_GPI_less)
+            CPPUNIT_TEST(RCU_GPI_cmpmix)
+            CPPUNIT_TEST(RCU_GPI_ic)
+
+            CPPUNIT_TEST(RCU_GPB_cmp)
+            CPPUNIT_TEST(RCU_GPB_less)
+            CPPUNIT_TEST(RCU_GPB_cmpmix)
+            CPPUNIT_TEST(RCU_GPB_ic)
+
+            CPPUNIT_TEST(RCU_GPT_cmp)
+            CPPUNIT_TEST(RCU_GPT_less)
+            CPPUNIT_TEST(RCU_GPT_cmpmix)
+            CPPUNIT_TEST(RCU_GPT_ic)
+
+            CPPUNIT_TEST(RCU_SHB_cmp)
+            CPPUNIT_TEST(RCU_SHB_less)
+            CPPUNIT_TEST(RCU_SHB_cmpmix)
+            CPPUNIT_TEST(RCU_SHB_ic)
+
+            CPPUNIT_TEST(RCU_SHT_cmp)
+            CPPUNIT_TEST(RCU_SHT_less)
+            CPPUNIT_TEST(RCU_SHT_cmpmix)
+            CPPUNIT_TEST(RCU_SHT_ic)
+
+            CPPUNIT_TEST(NOGC_cmp)
+            CPPUNIT_TEST(NOGC_less)
+            CPPUNIT_TEST(NOGC_cmpmix)
+            CPPUNIT_TEST(NOGC_ic)
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_kv_hp.cpp b/tests/test-hdr/ordered_list/hdr_lazy_kv_hp.cpp
new file mode 100644 (file)
index 0000000..f158356
--- /dev/null
@@ -0,0 +1,104 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy_kv.h"
+#include <cds/container/lazy_kvlist_hp.h>
+
+namespace ordlist {
+    namespace {
+        struct HP_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+        };
+
+    }
+    void LazyKVListTestHeader::HP_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::HP, key_type, value_type, HP_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::HP,
+            key_type,
+            value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+        };
+    }
+    void LazyKVListTestHeader::HP_less()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::HP, key_type, value_type, HP_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::HP, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>  less;
+        };
+    }
+    void LazyKVListTestHeader::HP_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::HP, key_type, value_type, HP_cmpmix_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::HP, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyKVListTestHeader::HP_ic()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::HP, key_type, value_type, HP_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::HP, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
+CPPUNIT_TEST_SUITE_REGISTRATION(ordlist::LazyKVListTestHeader);
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_kv_hrc.cpp b/tests/test-hdr/ordered_list/hdr_lazy_kv_hrc.cpp
new file mode 100644 (file)
index 0000000..165070e
--- /dev/null
@@ -0,0 +1,100 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy_kv.h"
+#include <cds/container/lazy_kvlist_hrc.h>
+
+namespace ordlist {
+    namespace {
+        struct HRC_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+        };
+    }
+    void LazyKVListTestHeader::HRC_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::HRC, key_type, value_type, HRC_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::HRC, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+        };
+    }
+    void LazyKVListTestHeader::HRC_less()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::HRC, key_type, value_type, HRC_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::HRC, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>  less;
+        };
+    }
+    void LazyKVListTestHeader::HRC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::HRC, key_type, value_type, HRC_cmpmix_traits> list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::HRC, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyKVListTestHeader::HRC_ic()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::HRC, key_type, value_type, HRC_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::HRC, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_kv_nogc.cpp b/tests/test-hdr/ordered_list/hdr_lazy_kv_nogc.cpp
new file mode 100644 (file)
index 0000000..4057af6
--- /dev/null
@@ -0,0 +1,103 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy_kv.h"
+#include <cds/container/lazy_kvlist_nogc.h>
+
+namespace ordlist {
+    namespace {
+        struct NOGC_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+        };
+
+    }
+    void LazyKVListTestHeader::NOGC_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::nogc, key_type, value_type, NOGC_cmp_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::nogc,
+            key_type,
+            value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+        };
+    }
+    void LazyKVListTestHeader::NOGC_less()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::nogc, key_type, value_type, NOGC_less_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::nogc, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>  less;
+        };
+    }
+    void LazyKVListTestHeader::NOGC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::nogc, key_type, value_type, NOGC_cmpmix_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::nogc, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyKVListTestHeader::NOGC_ic()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::nogc, key_type, value_type, NOGC_ic_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::nogc, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_kv_ptb.cpp b/tests/test-hdr/ordered_list/hdr_lazy_kv_ptb.cpp
new file mode 100644 (file)
index 0000000..5c02e57
--- /dev/null
@@ -0,0 +1,100 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy_kv.h"
+#include <cds/container/lazy_kvlist_ptb.h>
+
+namespace ordlist {
+    namespace {
+        struct PTB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+        };
+    }
+    void LazyKVListTestHeader::PTB_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::PTB, key_type, value_type, PTB_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::PTB, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+        };
+    }
+    void LazyKVListTestHeader::PTB_less()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::PTB, key_type, value_type, PTB_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::PTB, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>  less;
+        };
+    }
+    void LazyKVListTestHeader::PTB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::PTB, key_type, value_type, PTB_cmpmix_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::PTB, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyKVListTestHeader::PTB_ic()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< cds::gc::PTB, key_type, value_type, PTB_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< cds::gc::PTB, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpb.cpp b/tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..438dcd1
--- /dev/null
@@ -0,0 +1,103 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy_kv.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/lazy_kvlist_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        struct RCU_GPB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPB_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPB_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPB_less()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPB_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>  less;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPB_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPB_ic()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPB_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpi.cpp b/tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..0923320
--- /dev/null
@@ -0,0 +1,103 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy_kv.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/lazy_kvlist_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        struct RCU_GPI_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPI_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPI_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPI_less()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPI_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>  less;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPI_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPI_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPI_ic()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPI_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpt.cpp b/tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..03af928
--- /dev/null
@@ -0,0 +1,103 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy_kv.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/lazy_kvlist_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+
+        struct RCU_GPT_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPT_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPT_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPT_less()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPT_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>  less;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPT_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPT_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyKVListTestHeader::RCU_GPT_ic()
+    {
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_GPT_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_shb.cpp b/tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..b32ed9c
--- /dev/null
@@ -0,0 +1,122 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy_kv.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/lazy_kvlist_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+
+        struct RCU_SHB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+        };
+    }
+#endif
+
+    void LazyKVListTestHeader::RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_SHB_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+        };
+    }
+#endif
+
+    void LazyKVListTestHeader::RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_SHB_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>  less;
+        };
+    }
+#endif
+
+    void LazyKVListTestHeader::RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_SHB_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+#endif
+
+    void LazyKVListTestHeader::RCU_SHB_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_SHB_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_sht.cpp b/tests/test-hdr/ordered_list/hdr_lazy_kv_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..53b80aa
--- /dev/null
@@ -0,0 +1,119 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy_kv.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/lazy_kvlist_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+
+        struct RCU_SHT_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+        };
+    }
+#endif
+    void LazyKVListTestHeader::RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_SHT_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+        };
+    }
+#endif
+    void LazyKVListTestHeader::RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_SHT_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::cmp<LazyKVListTestHeader::key_type>   compare;
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>  less;
+        };
+    }
+#endif
+    void LazyKVListTestHeader::RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_SHT_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyKVListTestHeader::lt<LazyKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+#endif
+    void LazyKVListTestHeader::RCU_SHT_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyKVList< rcu_type, key_type, value_type, RCU_SHT_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyKVList< rcu_type, key_type, value_type,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_nogc.cpp b/tests/test-hdr/ordered_list/hdr_lazy_nogc.cpp
new file mode 100644 (file)
index 0000000..9b313a0
--- /dev/null
@@ -0,0 +1,100 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy.h"
+#include <cds/container/lazy_list_nogc.h>
+
+namespace ordlist {
+    namespace {
+        struct NOGC_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+        };
+    }
+    void LazyListTestHeader::NOGC_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::nogc, item, NOGC_cmp_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::nogc, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+        };
+    }
+    void LazyListTestHeader::NOGC_less()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::nogc, item, NOGC_less_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::nogc, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>  less;
+        };
+    }
+    void LazyListTestHeader::NOGC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::nogc, item, NOGC_cmpmix_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::nogc, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyListTestHeader::NOGC_ic()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::nogc, item, NOGC_ic_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::nogc, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_ptb.cpp b/tests/test-hdr/ordered_list/hdr_lazy_ptb.cpp
new file mode 100644 (file)
index 0000000..dbd0ba3
--- /dev/null
@@ -0,0 +1,100 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy.h"
+#include <cds/container/lazy_list_ptb.h>
+
+namespace ordlist {
+    namespace {
+        struct PTB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+        };
+    }
+    void LazyListTestHeader::PTB_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::PTB, item, PTB_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::PTB, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+        };
+    }
+    void LazyListTestHeader::PTB_less()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::PTB, item, PTB_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::PTB, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>  less;
+        };
+    }
+    void LazyListTestHeader::PTB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::PTB, item, PTB_cmpmix_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::PTB, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyListTestHeader::PTB_ic()
+    {
+        // traits-based version
+        typedef cc::LazyList< cds::gc::PTB, item, PTB_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< cds::gc::PTB, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_rcu_gpb.cpp b/tests/test-hdr/ordered_list/hdr_lazy_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..0c1c4a0
--- /dev/null
@@ -0,0 +1,103 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/lazy_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >    rcu_type;
+
+        struct RCU_GPB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+        };
+    }
+    void LazyListTestHeader::RCU_GPB_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPB_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+        };
+    }
+    void LazyListTestHeader::RCU_GPB_less()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPB_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>  less;
+        };
+    }
+    void LazyListTestHeader::RCU_GPB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPB_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyListTestHeader::RCU_GPB_ic()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPB_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_rcu_gpi.cpp b/tests/test-hdr/ordered_list/hdr_lazy_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..7106e62
--- /dev/null
@@ -0,0 +1,103 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/lazy_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> >    rcu_type;
+
+        struct RCU_GPI_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+        };
+    }
+    void LazyListTestHeader::RCU_GPI_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPI_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+        };
+    }
+    void LazyListTestHeader::RCU_GPI_less()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPI_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>  less;
+        };
+    }
+    void LazyListTestHeader::RCU_GPI_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPI_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyListTestHeader::RCU_GPI_ic()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPI_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_rcu_gpt.cpp b/tests/test-hdr/ordered_list/hdr_lazy_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..0ab8fda
--- /dev/null
@@ -0,0 +1,103 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/lazy_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> >    rcu_type;
+
+        struct RCU_GPT_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+        };
+    }
+    void LazyListTestHeader::RCU_GPT_cmp()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPT_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+        };
+    }
+    void LazyListTestHeader::RCU_GPT_less()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPT_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>  less;
+        };
+    }
+    void LazyListTestHeader::RCU_GPT_cmpmix()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPT_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void LazyListTestHeader::RCU_GPT_ic()
+    {
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_GPT_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_rcu_shb.cpp b/tests/test-hdr/ordered_list/hdr_lazy_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..44c3739
--- /dev/null
@@ -0,0 +1,119 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/lazy_list_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> >    rcu_type;
+
+        struct RCU_SHB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+        };
+    }
+#endif
+    void LazyListTestHeader::RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_SHB_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+        };
+    }
+#endif
+    void LazyListTestHeader::RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_SHB_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>  less;
+        };
+    }
+#endif
+    void LazyListTestHeader::RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_SHB_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+#endif
+    void LazyListTestHeader::RCU_SHB_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_SHB_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_lazy_rcu_sht.cpp b/tests/test-hdr/ordered_list/hdr_lazy_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..a83171f
--- /dev/null
@@ -0,0 +1,119 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_lazy.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/lazy_list_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> >    rcu_type;
+
+        struct RCU_SHT_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+        };
+    }
+#endif
+    void LazyListTestHeader::RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_SHT_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+        };
+    }
+#endif
+    void LazyListTestHeader::RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_SHT_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::cmp<LazyListTestHeader::item>   compare;
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>  less;
+        };
+    }
+#endif
+    void LazyListTestHeader::RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_SHT_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_ic_traits: public cc::lazy_list::type_traits
+        {
+            typedef LazyListTestHeader::lt<LazyListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+#endif
+    void LazyListTestHeader::RCU_SHT_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::LazyList< rcu_type, item, RCU_SHT_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::LazyList< rcu_type, item,
+            cc::lazy_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael.h b/tests/test-hdr/ordered_list/hdr_michael.h
new file mode 100644 (file)
index 0000000..34e14f1
--- /dev/null
@@ -0,0 +1,774 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/container/michael_list_base.h>
+
+namespace ordlist {
+    namespace cc = cds::container;
+    namespace co = cds::container::opt;
+
+    class MichaelListTestHeader: public CppUnitMini::TestCase
+    {
+    public:
+        struct stat {
+            int nEnsureExistsCall;
+            int nEnsureNewCall;
+
+            stat()
+            {
+                nEnsureExistsCall
+                    = nEnsureNewCall
+                    = 0;
+            }
+        };
+
+        struct item {
+            int     nKey;
+            int     nVal;
+
+            stat    s;
+
+            item(int key)
+                : nKey( key )
+                , nVal( key * 2 )
+                , s()
+            {}
+
+            item(int key, int val)
+                : nKey( key )
+                , nVal(val)
+                , s()
+            {}
+
+            item( const item& v )
+                : nKey( v.nKey )
+                , nVal( v.nVal )
+                , s()
+            {}
+
+            int key() const
+            {
+                return nKey;
+            }
+        };
+
+        template <typename T>
+        struct lt
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() < v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() < v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 < v2.key();
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1.key() < v2.key() )
+                    return -1;
+                return v1.key() > v2.key() ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const T& v1, const Q& v2 ) const
+            {
+                if ( v1.key() < v2 )
+                    return -1;
+                return v1.key() > v2 ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const Q& v1, const T& v2 ) const
+            {
+                if ( v1 < v2.key() )
+                    return -1;
+                return v1 > v2.key() ? 1 : 0;
+            }
+        };
+
+        struct insert_functor {
+            void operator ()( item& i )
+            {
+                i.nVal = i.nKey * 1033;
+            }
+        };
+        struct dummy_insert_functor {
+            void operator ()( item& i )
+            {
+                // This functor should not be called
+                TestCase::current_test()->error( "CPPUNIT_ASSERT", "dummy_insert_functor should not be called", __FILE__, __LINE__ );
+            }
+        };
+
+        struct erase_functor {
+            unsigned int nEraseCall;
+
+            erase_functor()
+                : nEraseCall(0)
+            {}
+
+            void operator()( item const& /*i*/)
+            {
+                ++nEraseCall;
+            }
+        };
+
+        static void insert_function( item& i )
+        {
+            i.nVal = i.nKey * 1024;
+        }
+        static void dummy_insert_function( item& i )
+        {
+            // This function should not be called
+            TestCase::current_test()->error( "CPPUNIT_ASSERT", "dummy_insert_function should not be called", __FILE__, __LINE__ );
+        }
+
+
+        struct check_value {
+            unsigned int m_nMultiplier;
+
+            check_value( unsigned int nMultiplier )
+                : m_nMultiplier( nMultiplier )
+            {}
+
+            check_value( const check_value& s )
+                : m_nMultiplier( s.m_nMultiplier )
+            {}
+
+            void operator()( item& i, int )
+            {
+                CPPUNIT_ASSERT_CURRENT( int(i.nKey * m_nMultiplier) == i.nVal );
+            }
+        };
+
+        struct check_exact_value {
+            int m_nExpected;
+
+            check_exact_value( int nExpected )
+                : m_nExpected( nExpected )
+            {}
+
+            check_exact_value( check_exact_value const& s)
+                : m_nExpected( s.m_nExpected )
+            {}
+
+            void operator()( item& i, int )
+            {
+                CPPUNIT_ASSERT_CURRENT( i.nVal == m_nExpected );
+            }
+        };
+
+        struct dummy_check_value {
+            void operator()( item& i, int )
+            {
+                // This functor should not be called
+                TestCase::current_test()->error( "CPPUNIT_ASSERT", "dummy_check_value should not be called", __FILE__, __LINE__ );
+            }
+        };
+
+        struct ensure_functor {
+            void operator()( bool bNew, item& i, int n )
+            {
+                i.nVal = i.nKey * 1024;
+            }
+        };
+
+        static void ensure_func( bool bNew, item& i, int n )
+        {
+            i.nVal = n * 1033;
+        }
+
+        struct other_item
+        {
+            int nKey;
+
+            other_item()
+            {}
+
+            other_item(int n)
+                : nKey(n)
+            {}
+        };
+
+        struct other_less
+        {
+            template <typename T1, typename T2>
+            bool operator()( T1 const& t1, T2 const& t2 ) const
+            {
+                return t1.nKey < t2.nKey;
+            }
+        };
+
+    protected:
+        template <class OrdList>
+        void test_with( OrdList& l )
+        {
+            typedef typename OrdList::value_type    value_type;
+
+            // The list should be empty
+            CPPUNIT_ASSERT( l.empty() );
+
+            // insert test
+            CPPUNIT_ASSERT( l.insert( 50 ) );
+            CPPUNIT_ASSERT( l.insert( item( 25 )) );
+            CPPUNIT_ASSERT( l.insert( item( 100 )) );
+
+            // insert failed - such key exists
+            CPPUNIT_ASSERT( !l.insert( 50 ) );
+            CPPUNIT_ASSERT( !l.insert( item( 100 )) );
+
+            // clear test
+
+            // The list should not be empty
+            CPPUNIT_ASSERT( !l.empty() );
+            l.clear();
+            // and now the list is empty
+            CPPUNIT_ASSERT( l.empty() );
+
+            // Test insert with functor
+
+            CPPUNIT_ASSERT( l.insert( 100, insert_functor() ) );
+            // passed by ref
+            {
+                insert_functor f;
+                CPPUNIT_ASSERT( l.insert( item(25), boost::ref(f)) );
+                CPPUNIT_ASSERT( !l.insert( item(100), boost::ref(f)) );
+            }
+            // Test insert with function
+            CPPUNIT_ASSERT( l.insert( 50, insert_function ));
+            CPPUNIT_ASSERT( !l.insert( 25, dummy_insert_function ));
+            CPPUNIT_ASSERT( !l.insert( 100, dummy_insert_functor() ));
+
+            // The list should not be empty
+            CPPUNIT_ASSERT( !l.empty() );
+
+            // Check inserted values
+            {
+                int i;
+                i = 100;
+                CPPUNIT_ASSERT( l.find( 100 ));
+                CPPUNIT_ASSERT( l.find( i, check_value(1033) ));
+                {
+                    check_value f(1033);
+                    i = 25;
+                    CPPUNIT_ASSERT( l.find_with( 25, lt<value_type>() ));
+                    CPPUNIT_ASSERT( l.find_with( i, lt<value_type>(), boost::ref(f) ));
+                }
+                i = 50;
+                CPPUNIT_ASSERT( l.find( 50 ));
+                CPPUNIT_ASSERT( l.find( i, check_value(1024) ));
+
+                i = 10;
+                CPPUNIT_ASSERT( !l.find_with( 10, lt<value_type>() ));
+                CPPUNIT_ASSERT( !l.find_with( i, lt<value_type>(), dummy_check_value() ));
+                i = 75;
+                CPPUNIT_ASSERT( !l.find( 75 ));
+                CPPUNIT_ASSERT( !l.find( i, dummy_check_value() ));
+                i = 150;
+                CPPUNIT_ASSERT( !l.find( 150 ));
+                CPPUNIT_ASSERT( !l.find( i, dummy_check_value() ));
+            }
+
+            // The list should not be empty
+            CPPUNIT_ASSERT( !l.empty() );
+            l.clear();
+            // and now the list is empty
+            CPPUNIT_ASSERT( l.empty() );
+
+            // Ensure test
+            {
+                std::pair<bool, bool>   ensureResult;
+                ensure_functor f;
+                ensureResult = l.ensure( 100, ensure_functor() );
+                CPPUNIT_ASSERT( ensureResult.first );
+                CPPUNIT_ASSERT( ensureResult.second );
+
+                ensureResult = l.ensure( 200, boost::ref(f) );
+                CPPUNIT_ASSERT( ensureResult.first );
+                CPPUNIT_ASSERT( ensureResult.second );
+
+                ensureResult = l.ensure( 50, ensure_func );
+                CPPUNIT_ASSERT( ensureResult.first );
+                CPPUNIT_ASSERT( ensureResult.second );
+
+                int i;
+                i = 100;
+                CPPUNIT_ASSERT( l.find( i, check_value(1024) ));
+                i = 50;
+                CPPUNIT_ASSERT( l.find( i, check_value(1033) ));
+                i = 200;
+                CPPUNIT_ASSERT( l.find( i, check_value(1024) ));
+
+                // ensure existing key
+                ensureResult = l.ensure( 200, ensure_func );
+                CPPUNIT_ASSERT( ensureResult.first );
+                CPPUNIT_ASSERT( !ensureResult.second );
+                i = 200;
+                CPPUNIT_ASSERT( l.find( i, check_value(1033) ));
+
+                ensureResult = l.ensure( 50, ensure_functor() );
+                CPPUNIT_ASSERT( ensureResult.first );
+                CPPUNIT_ASSERT( !ensureResult.second );
+                i = 50;
+                CPPUNIT_ASSERT( l.find( i, check_value(1024) ));
+            }
+
+            // erase test (list: 50, 100, 200)
+            CPPUNIT_ASSERT( !l.empty() );
+            CPPUNIT_ASSERT( l.insert(160));
+            CPPUNIT_ASSERT( l.insert(250));
+            CPPUNIT_ASSERT( !l.empty() );
+
+            CPPUNIT_ASSERT( !l.erase( 150 ));
+
+            CPPUNIT_ASSERT( l.erase( 100 ));
+            CPPUNIT_ASSERT( !l.erase( 100 ));
+
+            CPPUNIT_ASSERT( l.erase_with( 200, lt<value_type>() ));
+            CPPUNIT_ASSERT( !l.erase_with( 200, lt<value_type>() ));
+
+            {
+                erase_functor ef;
+                CPPUNIT_ASSERT( ef.nEraseCall == 0 );
+                CPPUNIT_ASSERT( l.erase_with( 160, lt<value_type>(), cds::ref(ef) ));
+                CPPUNIT_ASSERT( ef.nEraseCall == 1 );
+                CPPUNIT_ASSERT( !l.erase_with( 160, lt<value_type>(), cds::ref(ef) ));
+                CPPUNIT_ASSERT( ef.nEraseCall == 1 );
+
+                CPPUNIT_ASSERT( l.erase( 250, cds::ref(ef) ));
+                CPPUNIT_ASSERT( ef.nEraseCall == 2 );
+                CPPUNIT_ASSERT( !l.erase( 250, cds::ref(ef) ));
+                CPPUNIT_ASSERT( ef.nEraseCall == 2 );
+            }
+
+            CPPUNIT_ASSERT( l.erase( 50 ));
+            CPPUNIT_ASSERT( !l.erase( 50 ));
+
+            CPPUNIT_ASSERT( l.empty() );
+
+            // clear empty list
+            l.clear();
+            CPPUNIT_ASSERT( l.empty() );
+
+#ifdef CDS_EMPLACE_SUPPORT
+            {
+                int i;
+
+                // insert test
+                CPPUNIT_ASSERT( l.emplace( 501 ) );
+                CPPUNIT_ASSERT( l.emplace( 251, 152 ));
+                CPPUNIT_ASSERT( l.emplace( item( 1001 )) );
+
+                // insert failed - such key exists
+                CPPUNIT_ASSERT( !l.emplace( 501, 2 ) );
+                CPPUNIT_ASSERT( !l.emplace( 251, 10) );
+
+                i = 501;
+                CPPUNIT_ASSERT( l.find( i, check_exact_value(501*2) ));
+                i = 251;
+                CPPUNIT_ASSERT( l.find( i, check_exact_value(152) ));
+                i = 1001;
+                CPPUNIT_ASSERT( l.find( i, check_exact_value(1001*2) ));
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+            }
+#endif
+
+            // Iterator test
+            {
+                int nCount = 100;
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.insert(i) );
+
+                int i = 0;
+                for ( typename OrdList::iterator it = l.begin(), itEnd = l.end(); it != itEnd; ++it, ++i ) {
+                    it->nVal = i * 2;
+                    CPPUNIT_ASSERT( it->nKey == i );
+                }
+
+                // Check that we have visited all items
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.find( i, check_value(2) ));
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+
+                // Const iterator
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.insert(i) );
+
+                i = 0;
+                const OrdList& rl = l;
+                for ( typename OrdList::const_iterator it = rl.begin(), itEnd = rl.end(); it != itEnd; ++it, ++i ) {
+                    // it->nVal = i * 2    ;    // not!
+                    CPPUNIT_ASSERT( it->nKey == i );
+                }
+
+                // Check that we have visited all items
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.find( i, check_value(2) ));
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+            }
+        }
+
+        template <typename OrdList>
+        void test()
+        {
+            typedef typename OrdList::guarded_ptr guarded_ptr;
+            typedef typename OrdList::value_type value_type;
+
+            OrdList l;
+            test_with(l);
+
+            static int const nLimit = 20;
+            int arr[nLimit];
+            for ( int i = 0; i < nLimit; i++ )
+                arr[i] = i;
+            std::random_shuffle( arr, arr + nLimit );
+
+            // extract/get
+            for ( int i = 0; i < nLimit; ++i )
+                l.insert( arr[i] );
+            {
+                guarded_ptr gp;
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arr[i];
+
+                    CPPUNIT_ASSERT( l.get(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey * 2 );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey*2 );
+                    gp.release();
+
+                    CPPUNIT_CHECK( !l.get(gp, nKey));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !l.extract( gp, nKey));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty());
+                CPPUNIT_CHECK( !l.get(gp, arr[0]));
+                CPPUNIT_CHECK( gp.empty());
+                CPPUNIT_CHECK( !l.extract( gp, arr[0]));
+                CPPUNIT_CHECK( gp.empty());
+            }
+
+            // extract_with/get_with
+            for ( int i = 0; i < nLimit; ++i )
+                l.insert( arr[i] );
+            {
+                guarded_ptr gp;
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arr[i];
+                    other_item key( nKey );
+
+                    CPPUNIT_ASSERT( l.get_with(gp, key, other_less()));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey * 2 );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract_with(gp, key, other_less()));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey*2 );
+                    gp.release();
+
+                    CPPUNIT_CHECK( !l.get_with(gp, key, other_less()));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !l.extract_with( gp, key, other_less()));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty());
+                CPPUNIT_CHECK( !l.get_with(gp, other_item(arr[0]), other_less()));
+                CPPUNIT_CHECK( gp.empty());
+                CPPUNIT_CHECK( !l.extract_with( gp, other_item(arr[0]), other_less()));
+                CPPUNIT_CHECK( gp.empty());
+            }
+        }
+
+        template <typename OrdList>
+        void test_rcu()
+        {
+            OrdList l;
+            test_with(l);
+
+            static int const nLimit = 20;
+
+            typedef typename OrdList::rcu_lock rcu_lock;
+            typedef typename OrdList::value_type value_type;
+            typedef typename OrdList::gc rcu_type;
+
+            {
+                int a[nLimit];
+                for (int i = 0; i < nLimit; ++i)
+                    a[i]=i;
+                std::random_shuffle( a, a + nLimit );
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( l.insert( a[i] ) );
+
+                typename OrdList::exempt_ptr ep;
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get( a[i] );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->nKey == a[i] );
+                        CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract( ep, a[i] ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->nKey == a[i] );
+                        CPPUNIT_CHECK( (*ep).nVal == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get( a[i]) == NULL );
+                        CPPUNIT_CHECK( !l.extract( ep, a[i] ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get( a[0] ) == NULL );
+                    CPPUNIT_CHECK( !l.extract( ep, a[0] ) );
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( l.insert( a[i] ) );
+                }
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    other_item itm( a[i] );
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get_with( itm, other_less() );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->nKey == a[i] );
+                        CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->nKey == a[i] );
+                        CPPUNIT_CHECK( ep->nVal == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get_with( itm, other_less()) == NULL );
+                        CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get_with( other_item(0), other_less() ) == NULL );
+                    CPPUNIT_CHECK( !l.extract_with( ep, other_item(0), other_less() ));
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+            }
+
+        }
+
+        template <class OrdList>
+        void nogc_test()
+        {
+            typedef OrdList list;
+            typedef typename list::value_type    value_type;
+            typedef std::pair<typename list::iterator, bool> ensure_result;
+
+            typename list::iterator it;
+
+            list l;
+            CPPUNIT_ASSERT( l.empty() );
+            CPPUNIT_ASSERT( l.insert(50) != l.end() );
+            CPPUNIT_ASSERT( !l.empty() );
+
+            ensure_result eres = l.ensure( item(100, 33) );
+            CPPUNIT_ASSERT( eres.second );
+            CPPUNIT_ASSERT( eres.first != l.end() );
+            CPPUNIT_ASSERT( l.insert( item(150) ) != l.end() );
+
+            CPPUNIT_ASSERT( l.insert(100) == l.end() );
+            eres = l.ensure( item(50, 33) );
+            CPPUNIT_ASSERT( !eres.second );
+            CPPUNIT_ASSERT( eres.first->nVal == eres.first->nKey * 2 );
+            eres.first->nVal = 63;
+
+            it = l.find( 33 );
+            CPPUNIT_ASSERT( it == l.end() );
+
+            it = l.find( 50 );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 50 );
+            CPPUNIT_ASSERT( it->nVal == 63 );
+
+            it = l.find_with( 100, lt<value_type>() );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 100 );
+            CPPUNIT_ASSERT( it->nVal == 33 );
+
+            it = l.find( 150 );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 150 );
+            CPPUNIT_ASSERT( it->nVal == it->nKey * 2 );
+
+            CPPUNIT_ASSERT( !l.empty() );
+            l.clear();
+            CPPUNIT_ASSERT( l.empty() );
+
+#ifdef CDS_EMPLACE_SUPPORT
+            // insert test
+            CPPUNIT_ASSERT( l.emplace( 501 ) != l.end() );
+            CPPUNIT_ASSERT( l.emplace( 251, 152 ) != l.end());
+            CPPUNIT_ASSERT( l.emplace( item( 1001 )) != l.end() );
+
+            // insert failed - such key exists
+            CPPUNIT_ASSERT( l.emplace( 501, 2 ) == l.end() );
+            CPPUNIT_ASSERT( l.emplace( 251, 10) == l.end() );
+
+            it = l.find( 501 );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 501 );
+            CPPUNIT_ASSERT( it->nVal == 501 * 2 );
+
+            it = l.find( 251 );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 251 );
+            CPPUNIT_ASSERT( it->nVal == 152 );
+
+            it = l.find( 1001 );
+            CPPUNIT_ASSERT( it != l.end() );
+            CPPUNIT_ASSERT( it->nKey == 1001 );
+            CPPUNIT_ASSERT( it->nVal == 1001 * 2 );
+
+            l.clear();
+            CPPUNIT_ASSERT( l.empty() );
+#endif
+        }
+
+        void HP_cmp();
+        void HP_less();
+        void HP_cmpmix();
+        void HP_ic();
+
+        void PTB_cmp();
+        void PTB_less();
+        void PTB_cmpmix();
+        void PTB_ic();
+
+        void HRC_cmp();
+        void HRC_less();
+        void HRC_cmpmix();
+        void HRC_ic();
+
+        void RCU_GPI_cmp();
+        void RCU_GPI_less();
+        void RCU_GPI_cmpmix();
+        void RCU_GPI_ic();
+
+        void RCU_GPB_cmp();
+        void RCU_GPB_less();
+        void RCU_GPB_cmpmix();
+        void RCU_GPB_ic();
+
+        void RCU_GPT_cmp();
+        void RCU_GPT_less();
+        void RCU_GPT_cmpmix();
+        void RCU_GPT_ic();
+
+        void RCU_SHB_cmp();
+        void RCU_SHB_less();
+        void RCU_SHB_cmpmix();
+        void RCU_SHB_ic();
+
+        void RCU_SHT_cmp();
+        void RCU_SHT_less();
+        void RCU_SHT_cmpmix();
+        void RCU_SHT_ic();
+
+        void NOGC_cmp();
+        void NOGC_less();
+        void NOGC_cmpmix();
+        void NOGC_ic();
+
+        CPPUNIT_TEST_SUITE(MichaelListTestHeader)
+            CPPUNIT_TEST(HP_cmp)
+            CPPUNIT_TEST(HP_less)
+            CPPUNIT_TEST(HP_cmpmix)
+            CPPUNIT_TEST(HP_ic)
+
+            CPPUNIT_TEST(PTB_cmp)
+            CPPUNIT_TEST(PTB_less)
+            CPPUNIT_TEST(PTB_cmpmix)
+            CPPUNIT_TEST(PTB_ic)
+
+            CPPUNIT_TEST(HRC_cmp)
+            CPPUNIT_TEST(HRC_less)
+            CPPUNIT_TEST(HRC_cmpmix)
+            CPPUNIT_TEST(HRC_ic)
+
+            CPPUNIT_TEST(RCU_GPI_cmp)
+            CPPUNIT_TEST(RCU_GPI_less)
+            CPPUNIT_TEST(RCU_GPI_cmpmix)
+            CPPUNIT_TEST(RCU_GPI_ic)
+
+            CPPUNIT_TEST(RCU_GPB_cmp)
+            CPPUNIT_TEST(RCU_GPB_less)
+            CPPUNIT_TEST(RCU_GPB_cmpmix)
+            CPPUNIT_TEST(RCU_GPB_ic)
+
+            CPPUNIT_TEST(RCU_GPT_cmp)
+            CPPUNIT_TEST(RCU_GPT_less)
+            CPPUNIT_TEST(RCU_GPT_cmpmix)
+            CPPUNIT_TEST(RCU_GPT_ic)
+
+            CPPUNIT_TEST(RCU_SHB_cmp)
+            CPPUNIT_TEST(RCU_SHB_less)
+            CPPUNIT_TEST(RCU_SHB_cmpmix)
+            CPPUNIT_TEST(RCU_SHB_ic)
+
+            CPPUNIT_TEST(RCU_SHT_cmp)
+            CPPUNIT_TEST(RCU_SHT_less)
+            CPPUNIT_TEST(RCU_SHT_cmpmix)
+            CPPUNIT_TEST(RCU_SHT_ic)
+
+            CPPUNIT_TEST(NOGC_cmp)
+            CPPUNIT_TEST(NOGC_less)
+            CPPUNIT_TEST(NOGC_cmpmix)
+            CPPUNIT_TEST(NOGC_ic)
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_michael_hp.cpp b/tests/test-hdr/ordered_list/hdr_michael_hp.cpp
new file mode 100644 (file)
index 0000000..5ad61d7
--- /dev/null
@@ -0,0 +1,102 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael.h"
+#include <cds/container/michael_list_hp.h>
+
+namespace ordlist {
+    namespace {
+        struct HP_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+        };
+
+    }
+    void MichaelListTestHeader::HP_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::HP, item, HP_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::HP, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+        };
+    }
+    void MichaelListTestHeader::HP_less()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::HP, item, HP_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::HP, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>  less;
+        };
+    }
+    void MichaelListTestHeader::HP_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::HP, item, HP_cmpmix_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::HP, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelListTestHeader::HP_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::HP, item, HP_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::HP, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
+CPPUNIT_TEST_SUITE_REGISTRATION(ordlist::MichaelListTestHeader);
diff --git a/tests/test-hdr/ordered_list/hdr_michael_hrc.cpp b/tests/test-hdr/ordered_list/hdr_michael_hrc.cpp
new file mode 100644 (file)
index 0000000..be1bfdf
--- /dev/null
@@ -0,0 +1,100 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael.h"
+#include <cds/container/michael_list_hrc.h>
+
+namespace ordlist {
+    namespace {
+        struct HRC_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+        };
+    }
+    void MichaelListTestHeader::HRC_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::HRC, item, HRC_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::HRC, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+        };
+    }
+    void MichaelListTestHeader::HRC_less()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::HRC, item, HRC_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::HRC, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>  less;
+        };
+    }
+    void MichaelListTestHeader::HRC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::HRC, item, HRC_cmpmix_traits> list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::HRC, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelListTestHeader::HRC_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::HRC, item, HRC_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::HRC, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_kv.h b/tests/test-hdr/ordered_list/hdr_michael_kv.h
new file mode 100644 (file)
index 0000000..09253fb
--- /dev/null
@@ -0,0 +1,697 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/container/michael_list_base.h>
+
+namespace ordlist {
+    namespace cc = cds::container;
+    namespace co = cds::container::opt;
+
+    class MichaelKVListTestHeader: public CppUnitMini::TestCase
+    {
+    public:
+        typedef int key_type;
+        struct value_type {
+            int m_val;
+
+            value_type()
+                : m_val(0)
+            {}
+
+            value_type( int n )
+                : m_val( n )
+            {}
+        };
+
+        template <typename T>
+        struct lt
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1 < v2;
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1 < v2 )
+                    return -1;
+                return v1 > v2 ? 1 : 0;
+            }
+        };
+
+        struct check_value {
+            int     m_nExpected;
+
+            check_value( int nExpected )
+                : m_nExpected( nExpected )
+            {}
+
+            template <typename T>
+            void operator ()( T& pair )
+            {
+                CPPUNIT_ASSERT_CURRENT( pair.second.m_val == m_nExpected );
+            }
+        };
+
+        struct insert_functor {
+            template <typename T>
+            void operator()( T& pair )
+            {
+                pair.second.m_val = pair.first * 10;
+            }
+        };
+
+        struct ensure_functor {
+            template <typename T>
+            void operator()( bool bNew, T& pair )
+            {
+                pair.second.m_val = pair.first * 50;
+            }
+        };
+
+        struct erase_functor {
+            int     nKey;
+            int     nVal;
+
+            erase_functor()
+                : nKey(0)
+                , nVal(0)
+            {}
+
+            template <typename T>
+            void operator()( T& i )
+            {
+                nKey = i.first;
+                nVal = i.second.m_val;
+            }
+        };
+
+        typedef float other_key;
+        struct other_less {
+            bool operator()( float f, int i ) const
+            {
+                return int(f) < i;
+            }
+            bool operator()( int i, float f ) const
+            {
+                return i < int(f);
+            }
+        };
+
+    protected:
+        template <class OrdList>
+        void test_with( OrdList& l)
+        {
+            typedef typename OrdList::value_type    value_type;
+
+            typename OrdList::iterator itTest;
+            typename OrdList::const_iterator citTest;
+
+            CPPUNIT_ASSERT( l.empty() );
+
+            // insert / find test
+            CPPUNIT_ASSERT( !l.find( 100 ));
+            CPPUNIT_ASSERT( l.insert( 100 ));
+            CPPUNIT_ASSERT( !l.empty() );
+            CPPUNIT_ASSERT( l.find( 100 ));
+
+            check_value chk(0);
+            CPPUNIT_ASSERT( l.find( 100, boost::ref( chk ) ));
+
+            CPPUNIT_ASSERT( !l.find_with( 50, lt<key_type>() ));
+            CPPUNIT_ASSERT( l.insert( 50, 500 ));
+            CPPUNIT_ASSERT( l.find_with( 50, lt<key_type>() ));
+            CPPUNIT_ASSERT( !l.insert( 50, 5 ));
+            chk.m_nExpected = 500;
+            CPPUNIT_ASSERT( l.find_with( 50, lt<key_type>(), boost::ref( chk ) ));
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( l.find_with( 100, lt<key_type>(), boost::ref( chk ) ));
+            CPPUNIT_ASSERT( !l.empty() );
+
+            CPPUNIT_ASSERT( !l.find( 150 ));
+            CPPUNIT_ASSERT( l.insert_key( 150, insert_functor() ));
+            CPPUNIT_ASSERT( l.find( 150 ));
+            chk.m_nExpected = 1500;
+            CPPUNIT_ASSERT( l.find( 150, boost::ref( chk ) ));
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( l.find( 100, boost::ref( chk ) ));
+            chk.m_nExpected = 500;
+            CPPUNIT_ASSERT( l.find( 50, boost::ref( chk ) ));
+            CPPUNIT_ASSERT( !l.empty() );
+
+            // erase test
+
+            CPPUNIT_ASSERT( !l.erase( 500 ));
+            CPPUNIT_ASSERT( !l.empty() );
+
+            CPPUNIT_ASSERT( l.find( 50 ));
+            {
+                erase_functor ef;
+                l.erase( 50, boost::ref(ef));
+                CPPUNIT_ASSERT( ef.nKey == 50 );
+                CPPUNIT_ASSERT( ef.nVal == 500 );
+            }
+            CPPUNIT_ASSERT( !l.find( 50 ));
+
+            // ensure test
+            std::pair<bool, bool> bEnsureResult;
+            bEnsureResult = l.ensure( 100, ensure_functor() );
+            CPPUNIT_ASSERT( bEnsureResult.first );
+            CPPUNIT_ASSERT( !bEnsureResult.second );
+            chk.m_nExpected = 5000;
+            CPPUNIT_ASSERT( l.find( 100, boost::ref( chk ) ));
+
+            {
+                ensure_functor ef;
+                bEnsureResult = l.ensure( 50, boost::ref( ef ));
+            }
+            CPPUNIT_ASSERT( bEnsureResult.first );
+            CPPUNIT_ASSERT( bEnsureResult.second );
+            chk.m_nExpected = 2500;
+            CPPUNIT_ASSERT( l.find( 50, boost::ref( chk ) ));
+
+            // erase test
+            CPPUNIT_ASSERT( !l.empty() );
+            CPPUNIT_ASSERT( l.insert_key( 200, insert_functor() ));
+            CPPUNIT_ASSERT( l.insert( 25 ));
+            CPPUNIT_ASSERT( l.erase( 100 ));
+            CPPUNIT_ASSERT( l.erase( 150 ));
+            {
+                erase_functor ef;
+                CPPUNIT_ASSERT( l.erase_with( 200, lt<key_type>(), cds::ref(ef)) );
+                CPPUNIT_ASSERT( ef.nKey == 200 );
+                CPPUNIT_ASSERT( ef.nVal == 2000 );
+            }
+            CPPUNIT_ASSERT( l.erase_with( 25, lt<key_type>()))
+            CPPUNIT_ASSERT( l.erase( 50 ));
+            CPPUNIT_ASSERT( l.empty() );
+
+            // clear empty list
+            l.clear();
+            CPPUNIT_ASSERT( l.empty() );
+
+#ifdef CDS_EMPLACE_SUPPORT
+            // insert test
+            CPPUNIT_ASSERT( l.emplace( 501 ) );
+            CPPUNIT_ASSERT( l.emplace( 251, 152 ));
+
+            // insert failed - such key exists
+            CPPUNIT_ASSERT( !l.emplace( 501, 2 ) );
+            CPPUNIT_ASSERT( !l.emplace( 251, 10) );
+
+            check_value cv(0);
+            CPPUNIT_ASSERT( l.find( 501, cds::ref(cv) ));
+            cv.m_nExpected = 152;
+            CPPUNIT_ASSERT( l.find( 251, cds::ref(cv) ));
+
+            l.clear();
+            CPPUNIT_ASSERT( l.empty() );
+#endif
+
+            // Iterator test
+            {
+                int nCount = 100;
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.insert(i, i * 2 ) );
+
+                int i = 0;
+                for ( typename OrdList::iterator it = l.begin(), itEnd = l.end(); it != itEnd; ++it, ++i ) {
+                    CPPUNIT_ASSERT( it.key() == i );
+                    CPPUNIT_ASSERT( it->first == i );
+                    CPPUNIT_ASSERT( (*it).first == i );
+
+                    CPPUNIT_ASSERT( it.val().m_val == i * 2 );
+                    CPPUNIT_ASSERT( it->second.m_val == i * 2 );
+                    CPPUNIT_ASSERT( (*it).second.m_val == i * 2 );
+                    it.val().m_val = i * 3;
+                }
+
+                // Check that we have visited all items
+                for ( int i = 0; i < nCount; ++i ) {
+                    chk.m_nExpected = i * 3;
+                    CPPUNIT_ASSERT( l.find( i, boost::ref(chk) ));
+                }
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+
+                // Const iterator
+                for ( int i = 0; i < nCount; ++i )
+                    CPPUNIT_ASSERT( l.insert(i, i * 7) );
+
+                i = 0;
+                const OrdList& rl = l;
+                for ( typename OrdList::const_iterator it = rl.begin(), itEnd = rl.end(); it != itEnd; ++it, ++i ) {
+                    CPPUNIT_ASSERT( it.key() == i );
+                    CPPUNIT_ASSERT( it->first == i );
+                    CPPUNIT_ASSERT( (*it).first == i );
+
+                    CPPUNIT_ASSERT( it.val().m_val == i * 7 );
+                    CPPUNIT_ASSERT( it->second.m_val == i * 7 );
+                    CPPUNIT_ASSERT( (*it).second.m_val == i * 7 );
+                }
+
+                // Check that we have visited all items
+                for ( int i = 0; i < nCount; ++i ) {
+                    chk.m_nExpected = i * 7;
+                    CPPUNIT_ASSERT( l.find_with( i, lt<key_type>(),  boost::ref(chk) ));
+                }
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+            }
+        }
+
+        template <class OrdList>
+        void test()
+        {
+            OrdList l;
+            test_with(l);
+
+            typedef typename OrdList::guarded_ptr guarded_ptr;
+
+            static int const nLimit = 20;
+            int arr[nLimit];
+            for ( int i = 0; i < nLimit; i++ )
+                arr[i] = i;
+            std::random_shuffle( arr, arr + nLimit );
+
+            // extract/get
+            for ( int i = 0; i < nLimit; ++i )
+                l.insert( arr[i], arr[i] * 2 );
+            {
+                guarded_ptr gp;
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arr[i];
+
+                    CPPUNIT_ASSERT( l.get(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey * 2 );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey*2 );
+                    gp.release();
+
+                    CPPUNIT_CHECK( !l.get(gp, nKey));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !l.extract( gp, nKey));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty());
+                CPPUNIT_CHECK( !l.get(gp, arr[0]));
+                CPPUNIT_CHECK( gp.empty());
+                CPPUNIT_CHECK( !l.extract( gp, arr[0]));
+                CPPUNIT_CHECK( gp.empty());
+            }
+
+            // extract_with/get_with
+            for ( int i = 0; i < nLimit; ++i )
+                l.insert( arr[i], arr[i] * 2 );
+            {
+                guarded_ptr gp;
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arr[i];
+                    other_key key = float(nKey + 0.3);
+
+                    CPPUNIT_ASSERT( l.get_with(gp, key, other_less()));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey * 2 );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( l.extract_with(gp, key, other_less()));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+                    CPPUNIT_CHECK( gp->second.m_val == nKey*2 );
+                    gp.release();
+
+                    CPPUNIT_CHECK( !l.get_with(gp, key, other_less()));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !l.extract_with( gp, key, other_less()));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( l.empty());
+                CPPUNIT_CHECK( !l.get_with(gp, 3.4f, other_less()));
+                CPPUNIT_CHECK( gp.empty());
+                CPPUNIT_CHECK( !l.extract_with( gp, 3.4f, other_less()));
+                CPPUNIT_CHECK( gp.empty());
+            }
+        }
+
+        template <class OrdList>
+        void test_rcu()
+        {
+            OrdList l;
+            test_with(l);
+
+            static int const nLimit = 20;
+
+            typedef typename OrdList::rcu_lock rcu_lock;
+            typedef typename OrdList::value_type value_type;
+            typedef typename OrdList::gc rcu_type;
+
+            {
+                int a[nLimit];
+                for (int i = 0; i < nLimit; ++i)
+                    a[i]=i;
+                std::random_shuffle( a, a + nLimit );
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( l.insert( a[i], a[i]*2 ) );
+
+                typename OrdList::exempt_ptr ep;
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get( a[i] );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->first == a[i] );
+                        CPPUNIT_CHECK( pGet->second.m_val == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract( ep, a[i] ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->first == a[i] );
+                        CPPUNIT_CHECK( (*ep).second.m_val == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get( a[i]) == NULL );
+                        CPPUNIT_CHECK( !l.extract( ep, a[i] ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get( a[0] ) == NULL );
+                    CPPUNIT_CHECK( !l.extract( ep, a[0] ) );
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( l.insert( a[i], a[i]*2 ) );
+                }
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    float itm = a[i] + 0.3f;
+                    {
+                        rcu_lock lock;
+                        value_type * pGet = l.get_with( itm, other_less() );
+                        CPPUNIT_ASSERT( pGet != NULL );
+                        CPPUNIT_CHECK( pGet->first == a[i] );
+                        CPPUNIT_CHECK( pGet->second.m_val == a[i] * 2 );
+
+                        CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->first == a[i] );
+                        CPPUNIT_CHECK( ep->second.m_val == a[i] * 2 );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock lock;
+                        CPPUNIT_CHECK( l.get_with( itm, other_less()) == NULL );
+                        CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_ASSERT( l.empty() );
+
+                {
+                    rcu_lock lock;
+                    CPPUNIT_CHECK( l.get_with( 3.14f, other_less() ) == NULL );
+                    CPPUNIT_CHECK( !l.extract_with( ep, 3.14f, other_less() ));
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+            }
+
+        }
+
+        template <class OrdList>
+        void nogc_test()
+        {
+            typedef typename OrdList::value_type    value_type;
+            typedef typename OrdList::iterator      iterator;
+
+            {
+                OrdList l;
+                iterator it;
+
+                CPPUNIT_ASSERT( l.empty() );
+
+                // insert / find test
+                CPPUNIT_ASSERT( l.find( 100 ) == l.end() );
+                CPPUNIT_ASSERT( l.insert( 100 ) != l.end() );
+                CPPUNIT_ASSERT( !l.empty() );
+                it = l.find_with( 100, lt<key_type>() );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 100 );
+                CPPUNIT_ASSERT( it.val().m_val == 0 );
+
+                CPPUNIT_ASSERT( l.find_with( 50, lt<key_type>() ) == l.end() );
+                CPPUNIT_ASSERT( l.insert( 50, 500 ) != l.end());
+                it = l.find( 50 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 50 );
+                CPPUNIT_ASSERT( it.val().m_val == 500 );
+
+                CPPUNIT_ASSERT( l.insert( 50, 5 ) == l.end() );
+                it = l.find( 50 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 50 );
+                CPPUNIT_ASSERT( it.val().m_val == 500 );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                CPPUNIT_ASSERT( l.find( 150 ) == l.end() );
+                CPPUNIT_ASSERT( l.insert_key( 150, insert_functor() ) != l.end() );
+                it = l.find( 150 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 150 );
+                CPPUNIT_ASSERT( it.val().m_val == 1500 );
+                it = l.find( 100 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 100 );
+                CPPUNIT_ASSERT( it.val().m_val == 0 );
+                it = l.find( 50 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 50 );
+                CPPUNIT_ASSERT( it.val().m_val == 500 );
+                it.val().m_val = 25;
+                it = l.find( 50 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 50 );
+                CPPUNIT_ASSERT( it.val().m_val == 25 );
+                CPPUNIT_ASSERT( !l.empty() );
+
+                // ensure existing item
+                std::pair<iterator, bool> ensureResult;
+                ensureResult = l.ensure( 100 );
+                CPPUNIT_ASSERT( !ensureResult.second );
+                CPPUNIT_ASSERT( ensureResult.first.key() == 100 );
+                CPPUNIT_ASSERT( ensureResult.first.val().m_val == 0   );
+                ensureResult.first.val().m_val = 5;
+                it = l.find( 100 );
+                CPPUNIT_ASSERT( it != l.end() );
+                CPPUNIT_ASSERT( it.key() == 100 );
+                CPPUNIT_ASSERT( it.val().m_val == 5 );
+
+                CPPUNIT_ASSERT( !l.empty() );
+
+                // ensure new item
+                ensureResult = l.ensure( 1000 );
+                CPPUNIT_ASSERT( ensureResult.second );
+                CPPUNIT_ASSERT( ensureResult.first.key() == 1000 );
+                CPPUNIT_ASSERT( ensureResult.first.val().m_val == 0   );
+                ensureResult.first.val().m_val = 33;
+                ensureResult = l.ensure( 1000 );
+                CPPUNIT_ASSERT( !ensureResult.second );
+                CPPUNIT_ASSERT( ensureResult.first.key() == 1000 );
+                CPPUNIT_ASSERT( ensureResult.first.val().m_val == 33   );
+
+                // clear test
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+
+#ifdef CDS_EMPLACE_SUPPORT
+                // insert test
+                CPPUNIT_ASSERT( l.emplace( 501 ) != l.end());
+                CPPUNIT_ASSERT( l.emplace( 251, 152 ) != l.end());
+
+                // insert failed - such key exists
+                CPPUNIT_ASSERT( l.emplace( 501, 2 ) == l.end());
+                CPPUNIT_ASSERT( l.emplace( 251, 10) == l.end());
+
+                it = l.find( 501 );
+                CPPUNIT_ASSERT( it != l.end());
+                CPPUNIT_ASSERT( it.key() == 501 );
+                CPPUNIT_ASSERT( it.val().m_val == 0 );
+
+                it = l.find( 251 );
+                CPPUNIT_ASSERT( it != l.end());
+                CPPUNIT_ASSERT( it.key() == 251 );
+                CPPUNIT_ASSERT( it.val().m_val == 152 );
+
+                l.clear();
+                CPPUNIT_ASSERT( l.empty() );
+#endif
+
+                // Iterator test
+                {
+                    int nCount = 100;
+                    for ( int i = 0; i < nCount; ++i )
+                        CPPUNIT_ASSERT( l.insert(i, i * 2 ) != l.end() );
+
+                    int i = 0;
+                    for ( typename OrdList::iterator iter = l.begin(), itEnd = l.end(); iter != itEnd; ++iter, ++i ) {
+                        CPPUNIT_ASSERT( iter.key() == i );
+                        CPPUNIT_ASSERT( iter->first == i );
+                        CPPUNIT_ASSERT( (*iter).first == i );
+
+                        CPPUNIT_ASSERT( iter.val().m_val == i * 2 );
+                        CPPUNIT_ASSERT( iter->second.m_val == i * 2 );
+                        CPPUNIT_ASSERT( (*iter).second.m_val == i * 2 );
+
+                        iter.val().m_val = i * 3;
+                    }
+
+                    // Check that we have visited all items
+                    for ( int i = 0; i < nCount; ++i ) {
+                        it = l.find( i );
+                        CPPUNIT_ASSERT( it != l.end() );
+                        CPPUNIT_ASSERT( it.key() == i );
+                        CPPUNIT_ASSERT( it.val().m_val == i * 3 );
+                    }
+
+                    l.clear();
+                    CPPUNIT_ASSERT( l.empty() );
+
+                    // Const iterator
+                    for ( int i = 0; i < nCount; ++i )
+                        CPPUNIT_ASSERT( l.insert(i, i * 7) != l.end() );
+
+                    i = 0;
+                    const OrdList& rl = l;
+                    for ( typename OrdList::const_iterator iter = rl.begin(), itEnd = rl.end(); iter != itEnd; ++iter, ++i ) {
+                        CPPUNIT_ASSERT( iter.key() == i );
+                        CPPUNIT_ASSERT( iter->first == i );
+                        CPPUNIT_ASSERT( (*iter).first == i );
+
+                        CPPUNIT_ASSERT( iter.val().m_val == i * 7 );
+                        CPPUNIT_ASSERT( iter->second.m_val == i * 7 );
+                        CPPUNIT_ASSERT( (*iter).second.m_val == i * 7 );
+
+                        // it.val().m_val = i * 3    ; // error: const-iterator
+                    }
+
+                    l.clear();
+                    CPPUNIT_ASSERT( l.empty() );
+                }
+
+            }
+        }
+
+        void HP_cmp();
+        void HP_less();
+        void HP_cmpmix();
+        void HP_ic();
+
+        void PTB_cmp();
+        void PTB_less();
+        void PTB_cmpmix();
+        void PTB_ic();
+
+        void HRC_cmp();
+        void HRC_less();
+        void HRC_cmpmix();
+        void HRC_ic();
+
+        void RCU_GPI_cmp();
+        void RCU_GPI_less();
+        void RCU_GPI_cmpmix();
+        void RCU_GPI_ic();
+
+        void RCU_GPB_cmp();
+        void RCU_GPB_less();
+        void RCU_GPB_cmpmix();
+        void RCU_GPB_ic();
+
+        void RCU_GPT_cmp();
+        void RCU_GPT_less();
+        void RCU_GPT_cmpmix();
+        void RCU_GPT_ic();
+
+        void RCU_SHB_cmp();
+        void RCU_SHB_less();
+        void RCU_SHB_cmpmix();
+        void RCU_SHB_ic();
+
+        void RCU_SHT_cmp();
+        void RCU_SHT_less();
+        void RCU_SHT_cmpmix();
+        void RCU_SHT_ic();
+
+        void NOGC_cmp();
+        void NOGC_less();
+        void NOGC_cmpmix();
+        void NOGC_ic();
+
+        CPPUNIT_TEST_SUITE(MichaelKVListTestHeader)
+            CPPUNIT_TEST(HP_cmp)
+            CPPUNIT_TEST(HP_less)
+            CPPUNIT_TEST(HP_cmpmix)
+            CPPUNIT_TEST(HP_ic)
+
+            CPPUNIT_TEST(PTB_cmp)
+            CPPUNIT_TEST(PTB_less)
+            CPPUNIT_TEST(PTB_cmpmix)
+            CPPUNIT_TEST(PTB_ic)
+
+            CPPUNIT_TEST(HRC_cmp)
+            CPPUNIT_TEST(HRC_less)
+            CPPUNIT_TEST(HRC_cmpmix)
+            CPPUNIT_TEST(HRC_ic)
+
+            CPPUNIT_TEST(RCU_GPI_cmp)
+            CPPUNIT_TEST(RCU_GPI_less)
+            CPPUNIT_TEST(RCU_GPI_cmpmix)
+            CPPUNIT_TEST(RCU_GPI_ic)
+
+            CPPUNIT_TEST(RCU_GPB_cmp)
+            CPPUNIT_TEST(RCU_GPB_less)
+            CPPUNIT_TEST(RCU_GPB_cmpmix)
+            CPPUNIT_TEST(RCU_GPB_ic)
+
+            CPPUNIT_TEST(RCU_GPT_cmp)
+            CPPUNIT_TEST(RCU_GPT_less)
+            CPPUNIT_TEST(RCU_GPT_cmpmix)
+            CPPUNIT_TEST(RCU_GPT_ic)
+
+            CPPUNIT_TEST(RCU_SHB_cmp)
+            CPPUNIT_TEST(RCU_SHB_less)
+            CPPUNIT_TEST(RCU_SHB_cmpmix)
+            CPPUNIT_TEST(RCU_SHB_ic)
+
+            CPPUNIT_TEST(RCU_SHT_cmp)
+            CPPUNIT_TEST(RCU_SHT_less)
+            CPPUNIT_TEST(RCU_SHT_cmpmix)
+            CPPUNIT_TEST(RCU_SHT_ic)
+
+            CPPUNIT_TEST(NOGC_cmp)
+            CPPUNIT_TEST(NOGC_less)
+            CPPUNIT_TEST(NOGC_cmpmix)
+            CPPUNIT_TEST(NOGC_ic)
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_michael_kv_hp.cpp b/tests/test-hdr/ordered_list/hdr_michael_kv_hp.cpp
new file mode 100644 (file)
index 0000000..1c37323
--- /dev/null
@@ -0,0 +1,104 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael_kv.h"
+#include <cds/container/michael_kvlist_hp.h>
+
+namespace ordlist {
+    namespace {
+        struct HP_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+        };
+
+    }
+    void MichaelKVListTestHeader::HP_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::HP, key_type, value_type, HP_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::HP,
+            key_type,
+            value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+        };
+    }
+    void MichaelKVListTestHeader::HP_less()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::HP, key_type, value_type, HP_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::HP, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>  less;
+        };
+    }
+    void MichaelKVListTestHeader::HP_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::HP, key_type, value_type, HP_cmpmix_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::HP, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HP_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelKVListTestHeader::HP_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::HP, key_type, value_type, HP_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::HP, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
+CPPUNIT_TEST_SUITE_REGISTRATION(ordlist::MichaelKVListTestHeader);
diff --git a/tests/test-hdr/ordered_list/hdr_michael_kv_hrc.cpp b/tests/test-hdr/ordered_list/hdr_michael_kv_hrc.cpp
new file mode 100644 (file)
index 0000000..d59d80a
--- /dev/null
@@ -0,0 +1,100 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael_kv.h"
+#include <cds/container/michael_kvlist_hrc.h>
+
+namespace ordlist {
+    namespace {
+        struct HRC_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+        };
+    }
+    void MichaelKVListTestHeader::HRC_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::HRC, key_type, value_type, HRC_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::HRC, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+        };
+    }
+    void MichaelKVListTestHeader::HRC_less()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::HRC, key_type, value_type, HRC_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::HRC, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>  less;
+        };
+    }
+    void MichaelKVListTestHeader::HRC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::HRC, key_type, value_type, HRC_cmpmix_traits> list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::HRC, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct HRC_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelKVListTestHeader::HRC_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::HRC, key_type, value_type, HRC_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::HRC, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_kv_nogc.cpp b/tests/test-hdr/ordered_list/hdr_michael_kv_nogc.cpp
new file mode 100644 (file)
index 0000000..3eed766
--- /dev/null
@@ -0,0 +1,103 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael_kv.h"
+#include <cds/container/michael_kvlist_nogc.h>
+
+namespace ordlist {
+    namespace {
+        struct NOGC_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+        };
+
+    }
+    void MichaelKVListTestHeader::NOGC_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::nogc, key_type, value_type, NOGC_cmp_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::nogc,
+            key_type,
+            value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+        };
+    }
+    void MichaelKVListTestHeader::NOGC_less()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::nogc, key_type, value_type, NOGC_less_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::nogc, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>  less;
+        };
+    }
+    void MichaelKVListTestHeader::NOGC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::nogc, key_type, value_type, NOGC_cmpmix_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::nogc, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelKVListTestHeader::NOGC_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::nogc, key_type, value_type, NOGC_ic_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::nogc, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_kv_ptb.cpp b/tests/test-hdr/ordered_list/hdr_michael_kv_ptb.cpp
new file mode 100644 (file)
index 0000000..811e58b
--- /dev/null
@@ -0,0 +1,100 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael_kv.h"
+#include <cds/container/michael_kvlist_ptb.h>
+
+namespace ordlist {
+    namespace {
+        struct PTB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+        };
+    }
+    void MichaelKVListTestHeader::PTB_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::PTB, key_type, value_type, PTB_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::PTB, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+        };
+    }
+    void MichaelKVListTestHeader::PTB_less()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::PTB, key_type, value_type, PTB_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::PTB, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>  less;
+        };
+    }
+    void MichaelKVListTestHeader::PTB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::PTB, key_type, value_type, PTB_cmpmix_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::PTB, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelKVListTestHeader::PTB_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< cds::gc::PTB, key_type, value_type, PTB_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< cds::gc::PTB, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpb.cpp b/tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..c1141f8
--- /dev/null
@@ -0,0 +1,102 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael_kv.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/michael_kvlist_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+        struct RCU_GPB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPB_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPB_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPB_less()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPB_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>  less;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPB_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPB_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPB_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpi.cpp b/tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..a43472b
--- /dev/null
@@ -0,0 +1,102 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael_kv.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/michael_kvlist_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+        struct RCU_GPI_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPI_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPI_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPI_less()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPI_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>  less;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPI_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPI_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPI_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPI_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpt.cpp b/tests/test-hdr/ordered_list/hdr_michael_kv_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..9d75f52
--- /dev/null
@@ -0,0 +1,102 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael_kv.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/michael_kvlist_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+        struct RCU_GPT_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPT_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPT_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPT_less()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPT_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>  less;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPT_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPT_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelKVListTestHeader::RCU_GPT_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_GPT_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_kv_rcu_shb.cpp b/tests/test-hdr/ordered_list/hdr_michael_kv_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..1ee3be5
--- /dev/null
@@ -0,0 +1,117 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael_kv.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/michael_kvlist_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+        struct RCU_SHB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+        };
+    }
+#endif
+    void MichaelKVListTestHeader::RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_SHB_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+        };
+    }
+#endif
+    void MichaelKVListTestHeader::RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_SHB_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>  less;
+        };
+    }
+#endif
+    void MichaelKVListTestHeader::RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_SHB_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+#endif
+    void MichaelKVListTestHeader::RCU_SHB_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_SHB_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_michael_kv_rcu_sht.cpp b/tests/test-hdr/ordered_list/hdr_michael_kv_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..f7a069b
--- /dev/null
@@ -0,0 +1,117 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael_kv.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/michael_kvlist_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+        struct RCU_SHT_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+        };
+    }
+#endif
+    void MichaelKVListTestHeader::RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_SHT_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+        };
+    }
+#endif
+    void MichaelKVListTestHeader::RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_SHT_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::cmp<MichaelKVListTestHeader::key_type>   compare;
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>  less;
+        };
+    }
+#endif
+    void MichaelKVListTestHeader::RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_SHT_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<key_type> >
+                ,cc::opt::less< lt<key_type> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelKVListTestHeader::lt<MichaelKVListTestHeader::key_type>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+#endif
+    void MichaelKVListTestHeader::RCU_SHT_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type, RCU_SHT_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelKVList< rcu_type, key_type, value_type,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<key_type> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_michael_nogc.cpp b/tests/test-hdr/ordered_list/hdr_michael_nogc.cpp
new file mode 100644 (file)
index 0000000..b3de14e
--- /dev/null
@@ -0,0 +1,100 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael.h"
+#include <cds/container/michael_list_nogc.h>
+
+namespace ordlist {
+    namespace {
+        struct NOGC_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+        };
+    }
+    void MichaelListTestHeader::NOGC_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::nogc, item, NOGC_cmp_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::nogc, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+        };
+    }
+    void MichaelListTestHeader::NOGC_less()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::nogc, item, NOGC_less_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::nogc, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>  less;
+        };
+    }
+    void MichaelListTestHeader::NOGC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::nogc, item, NOGC_cmpmix_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::nogc, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+    namespace {
+        struct NOGC_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelListTestHeader::NOGC_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::nogc, item, NOGC_ic_traits > list;
+        nogc_test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::nogc, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        nogc_test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_ptb.cpp b/tests/test-hdr/ordered_list/hdr_michael_ptb.cpp
new file mode 100644 (file)
index 0000000..ef8cfe7
--- /dev/null
@@ -0,0 +1,100 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael.h"
+#include <cds/container/michael_list_ptb.h>
+
+namespace ordlist {
+    namespace {
+        struct PTB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+        };
+    }
+    void MichaelListTestHeader::PTB_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::PTB, item, PTB_cmp_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::PTB, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+        };
+    }
+    void MichaelListTestHeader::PTB_less()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::PTB, item, PTB_less_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::PTB, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>  less;
+        };
+    }
+    void MichaelListTestHeader::PTB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::PTB, item, PTB_cmpmix_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::PTB, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+    namespace {
+        struct PTB_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelListTestHeader::PTB_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelList< cds::gc::PTB, item, PTB_ic_traits > list;
+        test< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< cds::gc::PTB, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_rcu_gpb.cpp b/tests/test-hdr/ordered_list/hdr_michael_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..18d50f6
--- /dev/null
@@ -0,0 +1,104 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/michael_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >    rcu_type;
+
+        struct RCU_GPB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+        };
+    }
+
+    void MichaelListTestHeader::RCU_GPB_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPB_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+        };
+    }
+    void MichaelListTestHeader::RCU_GPB_less()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPB_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>  less;
+        };
+    }
+    void MichaelListTestHeader::RCU_GPB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPB_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPB_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelListTestHeader::RCU_GPB_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPB_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_rcu_gpi.cpp b/tests/test-hdr/ordered_list/hdr_michael_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..1fe5d25
--- /dev/null
@@ -0,0 +1,104 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/michael_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> >    rcu_type;
+
+        struct RCU_GPI_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+        };
+    }
+
+    void MichaelListTestHeader::RCU_GPI_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPI_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+        };
+    }
+    void MichaelListTestHeader::RCU_GPI_less()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPI_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>  less;
+        };
+    }
+    void MichaelListTestHeader::RCU_GPI_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPI_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPI_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelListTestHeader::RCU_GPI_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPI_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_rcu_gpt.cpp b/tests/test-hdr/ordered_list/hdr_michael_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..a53949e
--- /dev/null
@@ -0,0 +1,104 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/michael_list_rcu.h>
+
+namespace ordlist {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> >    rcu_type;
+
+        struct RCU_GPT_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+        };
+    }
+
+    void MichaelListTestHeader::RCU_GPT_cmp()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPT_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+        };
+    }
+    void MichaelListTestHeader::RCU_GPT_less()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPT_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>  less;
+        };
+    }
+    void MichaelListTestHeader::RCU_GPT_cmpmix()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPT_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+    namespace {
+        struct RCU_GPT_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+    void MichaelListTestHeader::RCU_GPT_ic()
+    {
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_GPT_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+    }
+
+}   // namespace ordlist
+
diff --git a/tests/test-hdr/ordered_list/hdr_michael_rcu_shb.cpp b/tests/test-hdr/ordered_list/hdr_michael_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..00bfedb
--- /dev/null
@@ -0,0 +1,119 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/michael_list_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> >    rcu_type;
+
+        struct RCU_SHB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+        };
+    }
+#endif
+
+    void MichaelListTestHeader::RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_SHB_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+        };
+    }
+#endif
+    void MichaelListTestHeader::RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_SHB_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>  less;
+        };
+    }
+#endif
+    void MichaelListTestHeader::RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_SHB_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHB_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+#endif
+    void MichaelListTestHeader::RCU_SHB_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_SHB_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+}   // namespace ordlist
diff --git a/tests/test-hdr/ordered_list/hdr_michael_rcu_sht.cpp b/tests/test-hdr/ordered_list/hdr_michael_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..2add5d8
--- /dev/null
@@ -0,0 +1,119 @@
+//$$CDS-header$$
+
+#include "ordered_list/hdr_michael.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/michael_list_rcu.h>
+
+namespace ordlist {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> >    rcu_type;
+
+        struct RCU_SHT_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+        };
+    }
+#endif
+
+    void MichaelListTestHeader::RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_SHT_cmp_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_less_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+        };
+    }
+#endif
+    void MichaelListTestHeader::RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_SHT_less_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::cmp<MichaelListTestHeader::item>   compare;
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>  less;
+        };
+    }
+#endif
+    void MichaelListTestHeader::RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_SHT_cmpmix_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::compare< cmp<item> >
+                ,cc::opt::less< lt<item> >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        struct RCU_SHT_ic_traits: public cc::michael_list::type_traits
+        {
+            typedef MichaelListTestHeader::lt<MichaelListTestHeader::item>   less;
+            typedef cds::atomicity::item_counter item_counter;
+        };
+    }
+#endif
+    void MichaelListTestHeader::RCU_SHT_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::MichaelList< rcu_type, item, RCU_SHT_ic_traits > list;
+        test_rcu< list >();
+
+        // option-based version
+
+        typedef cc::MichaelList< rcu_type, item,
+            cc::michael_list::make_traits<
+                cc::opt::less< lt<item> >
+                ,cc::opt::item_counter< cds::atomicity::item_counter >
+            >::type
+        > opt_list;
+        test_rcu< opt_list >();
+#endif
+    }
+
+}   // namespace ordlist
diff --git a/tests/test-hdr/priority_queue/hdr_fcpqueue_boost_stable_vector.cpp b/tests/test-hdr/priority_queue/hdr_fcpqueue_boost_stable_vector.cpp
new file mode 100644 (file)
index 0000000..4722ec5
--- /dev/null
@@ -0,0 +1,68 @@
+//$$CDS-header$$
+
+#include "priority_queue/hdr_pqueue.h"
+#include <cds/container/fcpriority_queue.h>
+#include <boost/container/stable_vector.hpp>
+#include <boost/container/deque.hpp>
+
+namespace priority_queue {
+
+    void PQueueHdrTest::FCPQueue_stablevector()
+    {
+        typedef cds::container::FCPriorityQueue<
+            PQueueHdrTest::value_type
+            ,std::priority_queue<
+                PQueueHdrTest::value_type
+                ,boost::container::stable_vector<PQueueHdrTest::value_type>
+                ,PQueueHdrTest::less
+            >
+        > pqueue_type;
+        test_fcpqueue<pqueue_type>();
+    }
+
+    void PQueueHdrTest::FCPQueue_stablevector_stat()
+    {
+        typedef cds::container::FCPriorityQueue<
+            PQueueHdrTest::value_type
+            ,std::priority_queue<
+                PQueueHdrTest::value_type
+                ,boost::container::stable_vector<PQueueHdrTest::value_type>
+                ,PQueueHdrTest::less
+            >
+            ,cds::container::fcpqueue::make_traits<
+                cds::opt::stat< cds::container::fcpqueue::stat<> >
+            >::type
+        > pqueue_type;
+        test_fcpqueue<pqueue_type>();
+    }
+
+        void PQueueHdrTest::FCPQueue_boost_deque()
+    {
+        typedef cds::container::FCPriorityQueue<
+            PQueueHdrTest::value_type
+            ,std::priority_queue<
+                PQueueHdrTest::value_type
+                ,boost::container::deque<PQueueHdrTest::value_type>
+                ,PQueueHdrTest::less
+            >
+        > pqueue_type;
+        test_fcpqueue<pqueue_type>();
+    }
+
+    void PQueueHdrTest::FCPQueue_boost_deque_stat()
+    {
+        typedef cds::container::FCPriorityQueue<
+            PQueueHdrTest::value_type
+            ,std::priority_queue<
+                PQueueHdrTest::value_type
+                ,boost::container::deque<PQueueHdrTest::value_type>
+                ,PQueueHdrTest::less
+            >
+            ,cds::container::fcpqueue::make_traits<
+                cds::opt::stat< cds::container::fcpqueue::stat<> >
+            >::type
+        > pqueue_type;
+        test_fcpqueue<pqueue_type>();
+    }
+
+} // namespace priorty_queue
diff --git a/tests/test-hdr/priority_queue/hdr_fcpqueue_deque.cpp b/tests/test-hdr/priority_queue/hdr_fcpqueue_deque.cpp
new file mode 100644 (file)
index 0000000..8370f45
--- /dev/null
@@ -0,0 +1,53 @@
+//$$CDS-header$$
+
+#include "priority_queue/hdr_pqueue.h"
+#include <cds/container/fcpriority_queue.h>
+#include <deque>
+
+namespace priority_queue {
+
+    void PQueueHdrTest::FCPQueue_deque()
+    {
+        typedef cds::container::FCPriorityQueue<
+            PQueueHdrTest::value_type
+            ,std::priority_queue<
+                PQueueHdrTest::value_type
+                ,std::deque<PQueueHdrTest::value_type>
+                ,PQueueHdrTest::less
+            >
+        > pqueue_type;
+        test_fcpqueue<pqueue_type>();
+    }
+
+    void PQueueHdrTest::FCPQueue_deque_stat()
+    {
+        typedef cds::container::FCPriorityQueue<
+            PQueueHdrTest::value_type
+            ,std::priority_queue<
+                PQueueHdrTest::value_type
+                ,std::deque<PQueueHdrTest::value_type>
+                ,PQueueHdrTest::less
+            >
+            ,cds::container::fcpqueue::make_traits<
+                cds::opt::stat< cds::container::fcpqueue::stat<> >
+            >::type
+        > pqueue_type;
+        test_fcpqueue<pqueue_type>();
+    }
+
+    void PQueueHdrTest::FCPQueue_deque_mutex()
+    {
+        typedef cds::container::FCPriorityQueue<
+            PQueueHdrTest::value_type
+            ,std::priority_queue<
+                PQueueHdrTest::value_type
+                ,std::deque<PQueueHdrTest::value_type>
+            >
+            ,cds::container::fcpqueue::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > pqueue_type;
+        test_fcpqueue<pqueue_type>();
+    }
+
+} // namespace priorty_queue
diff --git a/tests/test-hdr/priority_queue/hdr_fcpqueue_vector.cpp b/tests/test-hdr/priority_queue/hdr_fcpqueue_vector.cpp
new file mode 100644 (file)
index 0000000..4b860b5
--- /dev/null
@@ -0,0 +1,42 @@
+//$$CDS-header$$
+
+#include "priority_queue/hdr_pqueue.h"
+#include <cds/container/fcpriority_queue.h>
+
+namespace priority_queue {
+
+    void PQueueHdrTest::FCPQueue_vector()
+    {
+        typedef cds::container::FCPriorityQueue< PQueueHdrTest::value_type > pqueue_type;
+        test_fcpqueue<pqueue_type>();
+    }
+
+    void PQueueHdrTest::FCPQueue_vector_stat()
+    {
+        typedef cds::container::FCPriorityQueue<
+            PQueueHdrTest::value_type
+            ,std::priority_queue<
+                PQueueHdrTest::value_type
+                ,std::vector<PQueueHdrTest::value_type>
+                ,PQueueHdrTest::less
+            >
+            ,cds::container::fcpqueue::make_traits<
+                cds::opt::stat< cds::container::fcpqueue::stat<> >
+            >::type
+        > pqueue_type;
+        test_fcpqueue<pqueue_type>();
+    }
+
+    void PQueueHdrTest::FCPQueue_vector_mutex()
+    {
+        typedef cds::container::FCPriorityQueue<
+            PQueueHdrTest::value_type
+            ,std::priority_queue< PQueueHdrTest::value_type >
+            ,cds::container::fcpqueue::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > pqueue_type;
+        test_fcpqueue<pqueue_type>();
+    }
+
+} // namespace priorty_queue
diff --git a/tests/test-hdr/priority_queue/hdr_intrusive_mspqueue_dyn.cpp b/tests/test-hdr/priority_queue/hdr_intrusive_mspqueue_dyn.cpp
new file mode 100644 (file)
index 0000000..e588afd
--- /dev/null
@@ -0,0 +1,80 @@
+//$$CDS-header$$
+
+#include "priority_queue/hdr_intrusive_pqueue.h"
+#include <cds/intrusive/mspriority_queue.h>
+#include <cds/details/std/mutex.h>
+
+namespace priority_queue {
+    namespace intrusive_pqueue {
+        template <typename T, typename Traits>
+        struct constants<cds::intrusive::MSPriorityQueue<T, Traits> > {
+            static size_t const nCapacity = c_nCapacity - 1;
+        };
+    }
+
+    namespace {
+        typedef cds::opt::v::dynamic_buffer< char > buffer_type;
+    }
+
+    void IntrusivePQueueHdrTest::MSPQueue_dyn()
+    {
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
+            cds::intrusive::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+            >::type
+        > pqueue;
+
+        test_msq_dyn<pqueue>();
+    }
+
+    void IntrusivePQueueHdrTest::MSPQueue_dyn_cmp()
+    {
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
+            cds::intrusive::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::compare< IntrusivePQueueHdrTest::compare >
+            >::type
+        > pqueue;
+
+        test_msq_dyn<pqueue>();
+    }
+
+    void IntrusivePQueueHdrTest::MSPQueue_dyn_less()
+    {
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
+            cds::intrusive::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::less< std::less<IntrusivePQueueHdrTest::key_type> >
+            >::type
+        > pqueue;
+
+        test_msq_dyn<pqueue>();
+    }
+
+    void IntrusivePQueueHdrTest::MSPQueue_dyn_cmpless()
+    {
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
+            cds::intrusive::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::less< std::less<IntrusivePQueueHdrTest::key_type> >
+                ,cds::opt::compare< IntrusivePQueueHdrTest::compare >
+            >::type
+        > pqueue;
+
+        test_msq_dyn<pqueue>();
+    }
+
+    void IntrusivePQueueHdrTest::MSPQueue_dyn_cmp_mtx()
+    {
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
+            cds::intrusive::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::compare< IntrusivePQueueHdrTest::compare >
+                ,cds::opt::lock_type<cds_std::mutex>
+            >::type
+        > pqueue;
+
+        test_msq_dyn<pqueue>();
+    }
+
+} // namespace priority_queue
diff --git a/tests/test-hdr/priority_queue/hdr_intrusive_mspqueue_static.cpp b/tests/test-hdr/priority_queue/hdr_intrusive_mspqueue_static.cpp
new file mode 100644 (file)
index 0000000..37fcd8e
--- /dev/null
@@ -0,0 +1,80 @@
+//$$CDS-header$$
+
+#include "priority_queue/hdr_intrusive_pqueue.h"
+#include <cds/intrusive/mspriority_queue.h>
+#include <cds/details/std/mutex.h>
+
+namespace priority_queue {
+    namespace intrusive_pqueue {
+        template <typename T, typename Traits>
+        struct constants<cds::intrusive::MSPriorityQueue<T, Traits> > {
+            static size_t const nCapacity = c_nCapacity - 1;
+        };
+    }
+
+    namespace {
+        typedef cds::opt::v::static_buffer< char, IntrusivePQueueHdrTest::c_nCapacity > buffer_type;
+    }
+
+    void IntrusivePQueueHdrTest::MSPQueue_st()
+    {
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
+            cds::intrusive::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+            >::type
+        > pqueue;
+
+        test_msq_stat<pqueue>();
+    }
+
+    void IntrusivePQueueHdrTest::MSPQueue_st_cmp()
+    {
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
+            cds::intrusive::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::compare< IntrusivePQueueHdrTest::compare >
+            >::type
+        > pqueue;
+
+        test_msq_stat<pqueue>();
+    }
+
+    void IntrusivePQueueHdrTest::MSPQueue_st_less()
+    {
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
+            cds::intrusive::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::less< std::less<IntrusivePQueueHdrTest::key_type> >
+            >::type
+        > pqueue;
+
+        test_msq_stat<pqueue>();
+    }
+
+    void IntrusivePQueueHdrTest::MSPQueue_st_cmpless()
+    {
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
+            cds::intrusive::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::less< std::less<IntrusivePQueueHdrTest::key_type> >
+                ,cds::opt::compare< IntrusivePQueueHdrTest::compare >
+            >::type
+        > pqueue;
+
+        test_msq_stat<pqueue>();
+    }
+
+    void IntrusivePQueueHdrTest::MSPQueue_st_cmp_mtx()
+    {
+        typedef cds::intrusive::MSPriorityQueue< IntrusivePQueueHdrTest::key_type,
+            cds::intrusive::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::compare< IntrusivePQueueHdrTest::compare >
+                ,cds::opt::lock_type<cds_std::mutex>
+            >::type
+        > pqueue;
+
+        test_msq_stat<pqueue>();
+    }
+
+} // namespace priority_queue
diff --git a/tests/test-hdr/priority_queue/hdr_intrusive_pqueue.h b/tests/test-hdr/priority_queue/hdr_intrusive_pqueue.h
new file mode 100644 (file)
index 0000000..57f9e03
--- /dev/null
@@ -0,0 +1,214 @@
+//$$CDS-header$$
+
+#ifndef CDSHDRTEST_INTRUSIVE_PQUEUE_H
+#define CDSHDRTEST_INTRUSIVE_PQUEUE_H
+
+#include "cppunit/cppunit_proxy.h"
+#include "size_check.h"
+#include <algorithm>
+#include <cds/ref.h>
+
+namespace priority_queue {
+
+    namespace intrusive_pqueue {
+        static size_t const c_nCapacity = 1024 * 16;
+
+        struct another_disposer {
+            size_t   m_nCallCount;
+
+            another_disposer()
+                : m_nCallCount(0)
+            {}
+            template <typename T>
+            void operator()( T& p )
+            {
+                ++m_nCallCount;
+            }
+        };
+
+        template <typename PQueue>
+        struct constants {
+            static size_t const nCapacity = c_nCapacity;
+        };
+    } // namespace intrusive_pqueue
+
+    class IntrusivePQueueHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        static size_t const c_nCapacity = intrusive_pqueue::c_nCapacity;
+
+        typedef int     key_type;
+        static key_type const c_nMinValue = -123;
+
+        struct compare {
+            int operator()( key_type k1, key_type k2 ) const
+            {
+                return k1 - k2;
+            }
+        };
+
+        template <typename T>
+        class data_array
+        {
+            T *     pFirst;
+            T *     pLast;
+
+        public:
+            data_array( size_t nSize )
+                : pFirst( new T[nSize] )
+                , pLast( pFirst + nSize )
+            {
+                T i = c_nMinValue;
+                for ( T * p = pFirst; p != pLast; ++p, ++i )
+                    *p = i;
+
+                std::random_shuffle( pFirst, pLast );
+            }
+
+            ~data_array()
+            {
+                delete [] pFirst;
+            }
+
+            T * begin() { return pFirst; }
+            T * end()   { return pLast ; }
+            size_t size() const
+            {
+                return pLast - pFirst;
+            }
+        };
+
+    protected:
+        template <class PQueue>
+        void test_bounded_with( PQueue& pq )
+        {
+            data_array<key_type> arr( pq.capacity() );
+            key_type * pFirst = arr.begin();
+            key_type * pLast  = pFirst + pq.capacity();
+
+            CPPUNIT_ASSERT( pq.empty() );
+            CPPUNIT_ASSERT( pq.size() == 0 );
+            CPPUNIT_ASSERT( pq.capacity() == intrusive_pqueue::constants<PQueue>::nCapacity );
+
+            size_t nSize = 0;
+
+            // Push test
+            for ( key_type * p = pFirst; p < pLast; ++p ) {
+                CPPUNIT_ASSERT( pq.push( *p ));
+                CPPUNIT_ASSERT( !pq.empty() );
+                CPPUNIT_ASSERT( pq.size() == ++nSize );
+            }
+
+            CPPUNIT_ASSERT( pq.full() );
+            CPPUNIT_ASSERT( pq.size() == pq.capacity() );
+
+            // The queue is full
+            key_type k = c_nMinValue + key_type(c_nCapacity);
+            CPPUNIT_ASSERT( !pq.push( k ));
+            CPPUNIT_ASSERT( pq.full() );
+            CPPUNIT_ASSERT( pq.size() == pq.capacity() );
+
+            // Pop test
+            key_type nPrev = c_nMinValue + key_type(pq.capacity()) - 1;
+            key_type * p = pq.pop();
+            CPPUNIT_ASSERT( p != NULL );
+            CPPUNIT_CHECK_EX( *p == nPrev, "Expected=" << nPrev << ", current=" << *p );
+
+            CPPUNIT_ASSERT( pq.size() == pq.capacity() - 1 );
+            CPPUNIT_ASSERT( !pq.full() );
+            CPPUNIT_ASSERT( !pq.empty() );
+
+            nSize = pq.size();
+            while ( pq.size() > 1 ) {
+                p = pq.pop();
+                CPPUNIT_ASSERT( p != NULL );
+                CPPUNIT_CHECK_EX( *p == nPrev - 1, "Expected=" << nPrev - 1 << ", current=" << *p );
+                nPrev = *p;
+                --nSize;
+                CPPUNIT_ASSERT( pq.size() == nSize );
+            }
+
+            CPPUNIT_ASSERT( !pq.full() );
+            CPPUNIT_ASSERT( !pq.empty() );
+            CPPUNIT_ASSERT( pq.size() == 1 );
+
+            p = pq.pop();
+            CPPUNIT_ASSERT( p != NULL );
+            CPPUNIT_CHECK_EX( *p == c_nMinValue, "Expected=" << c_nMinValue << ", current=" << *p );
+
+            CPPUNIT_ASSERT( !pq.full() );
+            CPPUNIT_ASSERT( pq.empty() );
+            CPPUNIT_ASSERT( pq.size() == 0 );
+
+            // Clear test
+            for ( key_type * p = pFirst; p < pLast; ++p ) {
+                CPPUNIT_ASSERT( pq.push( *p ));
+            }
+            CPPUNIT_CHECK( !pq.empty() );
+            CPPUNIT_CHECK( pq.full() );
+            CPPUNIT_CHECK( pq.size() == pq.capacity() );
+            pq.clear();
+            CPPUNIT_CHECK( pq.empty() );
+            CPPUNIT_CHECK( !pq.full() );
+            CPPUNIT_CHECK( pq.size() == 0 );
+
+            // clear_with test
+            for ( key_type * p = pFirst; p < pLast; ++p ) {
+                CPPUNIT_ASSERT( pq.push( *p ));
+            }
+            CPPUNIT_ASSERT( !pq.empty() );
+            CPPUNIT_ASSERT( pq.full() );
+            CPPUNIT_ASSERT( pq.size() == pq.capacity() );
+
+            {
+                intrusive_pqueue::another_disposer disp;
+                pq.clear_with( cds::ref(disp) );
+                CPPUNIT_ASSERT( pq.empty() );
+                CPPUNIT_ASSERT( !pq.full() );
+                CPPUNIT_ASSERT( pq.size() == 0 );
+                CPPUNIT_ASSERT( disp.m_nCallCount == pq.capacity() );
+            }
+        }
+
+        template <class PQueue>
+        void test_msq_stat()
+        {
+            PQueue pq( 0 );   // argument should be ignored for static buffer
+            test_bounded_with( pq );
+        }
+        template <class PQueue>
+        void test_msq_dyn()
+        {
+            PQueue pq( c_nCapacity );
+            test_bounded_with( pq );
+        }
+
+    public:
+        void MSPQueue_st();
+        void MSPQueue_st_cmp();
+        void MSPQueue_st_less();
+        void MSPQueue_st_cmpless();
+        void MSPQueue_st_cmp_mtx();
+        void MSPQueue_dyn();
+        void MSPQueue_dyn_cmp();
+        void MSPQueue_dyn_less();
+        void MSPQueue_dyn_cmpless();
+        void MSPQueue_dyn_cmp_mtx();
+
+        CPPUNIT_TEST_SUITE(IntrusivePQueueHdrTest)
+            CPPUNIT_TEST(MSPQueue_st)
+            CPPUNIT_TEST(MSPQueue_st_cmp)
+            CPPUNIT_TEST(MSPQueue_st_less)
+            CPPUNIT_TEST(MSPQueue_st_cmpless)
+            CPPUNIT_TEST(MSPQueue_st_cmp_mtx)
+            CPPUNIT_TEST(MSPQueue_dyn)
+            CPPUNIT_TEST(MSPQueue_dyn_cmp)
+            CPPUNIT_TEST(MSPQueue_dyn_less)
+            CPPUNIT_TEST(MSPQueue_dyn_cmpless)
+            CPPUNIT_TEST(MSPQueue_dyn_cmp_mtx)
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+} // namespace priority_queue
+
+#endif // #ifndef CDSHDRTEST_INTRUSIVE_PQUEUE_H
diff --git a/tests/test-hdr/priority_queue/hdr_mspqueue_dyn.cpp b/tests/test-hdr/priority_queue/hdr_mspqueue_dyn.cpp
new file mode 100644 (file)
index 0000000..cb6e674
--- /dev/null
@@ -0,0 +1,80 @@
+//$$CDS-header$$
+
+#include "priority_queue/hdr_pqueue.h"
+#include <cds/container/mspriority_queue.h>
+#include <cds/details/std/mutex.h>
+
+namespace priority_queue {
+    namespace pqueue {
+        template <typename T, typename Traits>
+        struct constants<cds::container::MSPriorityQueue<T, Traits> > {
+            static size_t const nCapacity = c_nCapacity - 1;
+        };
+    }
+
+    namespace {
+        typedef cds::opt::v::dynamic_buffer< char > buffer_type;
+    }
+
+    void PQueueHdrTest::MSPQueue_dyn()
+    {
+        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type,
+            cds::container::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+            >::type
+        > pqueue;
+
+        test_msq_dyn<pqueue>();
+    }
+
+    void PQueueHdrTest::MSPQueue_dyn_cmp()
+    {
+        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type,
+            cds::container::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::compare< PQueueHdrTest::compare >
+            >::type
+        > pqueue;
+
+        test_msq_dyn<pqueue>();
+    }
+
+    void PQueueHdrTest::MSPQueue_dyn_less()
+    {
+        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type,
+            cds::container::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::less< PQueueHdrTest::less >
+            >::type
+        > pqueue;
+
+        test_msq_dyn<pqueue>();
+    }
+
+    void PQueueHdrTest::MSPQueue_dyn_cmpless()
+    {
+        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type,
+            cds::container::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::less< PQueueHdrTest::less >
+                ,cds::opt::compare< PQueueHdrTest::compare >
+            >::type
+        > pqueue;
+
+        test_msq_dyn<pqueue>();
+    }
+
+    void PQueueHdrTest::MSPQueue_dyn_cmp_mtx()
+    {
+        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type,
+            cds::container::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::compare< PQueueHdrTest::compare >
+                ,cds::opt::lock_type<cds_std::mutex>
+            >::type
+        > pqueue;
+
+        test_msq_dyn<pqueue>();
+    }
+
+} // namespace priority_queue
diff --git a/tests/test-hdr/priority_queue/hdr_mspqueue_static.cpp b/tests/test-hdr/priority_queue/hdr_mspqueue_static.cpp
new file mode 100644 (file)
index 0000000..e8ebbe3
--- /dev/null
@@ -0,0 +1,80 @@
+//$$CDS-header$$
+
+#include "priority_queue/hdr_pqueue.h"
+#include <cds/container/mspriority_queue.h>
+#include <cds/details/std/mutex.h>
+
+namespace priority_queue {
+    namespace pqueue {
+        template <typename T, typename Traits>
+        struct constants<cds::container::MSPriorityQueue<T, Traits> > {
+            static size_t const nCapacity = c_nCapacity - 1;
+        };
+    }
+
+    namespace {
+        typedef cds::opt::v::static_buffer< char, PQueueHdrTest::c_nCapacity > buffer_type;
+    }
+
+    void PQueueHdrTest::MSPQueue_st()
+    {
+        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type,
+            cds::container::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+            >::type
+        > pqueue;
+
+        test_msq_stat<pqueue>();
+    }
+
+    void PQueueHdrTest::MSPQueue_st_cmp()
+    {
+        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type,
+            cds::container::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::compare< PQueueHdrTest::compare >
+            >::type
+        > pqueue;
+
+        test_msq_stat<pqueue>();
+    }
+
+    void PQueueHdrTest::MSPQueue_st_less()
+    {
+        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type,
+            cds::container::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::less< PQueueHdrTest::less >
+            >::type
+        > pqueue;
+
+        test_msq_stat<pqueue>();
+    }
+
+    void PQueueHdrTest::MSPQueue_st_cmpless()
+    {
+        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type,
+            cds::container::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::less< PQueueHdrTest::less >
+                ,cds::opt::compare< PQueueHdrTest::compare >
+            >::type
+        > pqueue;
+
+        test_msq_stat<pqueue>();
+    }
+
+    void PQueueHdrTest::MSPQueue_st_cmp_mtx()
+    {
+        typedef cds::container::MSPriorityQueue< PQueueHdrTest::value_type,
+            cds::container::mspriority_queue::make_traits<
+                cds::opt::buffer< buffer_type >
+                ,cds::opt::compare< PQueueHdrTest::compare >
+                ,cds::opt::lock_type<cds_std::mutex>
+            >::type
+        > pqueue;
+
+        test_msq_stat<pqueue>();
+    }
+
+} // namespace priority_queue
diff --git a/tests/test-hdr/priority_queue/hdr_pqueue.h b/tests/test-hdr/priority_queue/hdr_pqueue.h
new file mode 100644 (file)
index 0000000..33c17cd
--- /dev/null
@@ -0,0 +1,377 @@
+//$$CDS-header$$
+
+#ifndef CDSHDRTEST_PQUEUE_H
+#define CDSHDRTEST_PQUEUE_H
+
+#include "cppunit/cppunit_proxy.h"
+#include "size_check.h"
+#include <algorithm>
+#include <cds/ref.h>
+
+namespace priority_queue {
+
+    namespace pqueue {
+        static size_t const c_nCapacity = 1024 * 16;
+
+        struct disposer {
+            size_t   m_nCallCount;
+
+            disposer()
+                : m_nCallCount(0)
+            {}
+
+            template <typename T>
+            void operator()( T& p )
+            {
+                ++m_nCallCount;
+            }
+        };
+
+        template <typename PQueue>
+        struct constants {
+            static size_t const nCapacity = c_nCapacity;
+        };
+    } // namespace pqueue
+
+    class PQueueHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        static size_t const c_nCapacity = pqueue::c_nCapacity;
+
+        typedef int     key_type;
+        static key_type const c_nMinValue = -123;
+
+        struct value_type {
+            key_type    k;
+            int         v;
+
+            value_type()
+            {}
+
+            value_type( value_type const& kv )
+                : k(kv.k)
+                , v(kv.v)
+            {}
+
+            value_type( key_type key )
+                : k(key)
+                , v(key)
+            {}
+
+            value_type( key_type key, int val )
+                : k(key)
+                , v(val)
+            {}
+
+            value_type( std::pair<key_type, int> const& p )
+                : k(p.first)
+                , v(p.second)
+            {}
+        };
+
+        struct compare {
+            int operator()( value_type k1, value_type k2 ) const
+            {
+                return k1.k - k2.k;
+            }
+        };
+
+        struct less {
+            bool operator()( value_type k1, value_type k2 ) const
+            {
+                return k1.k < k2.k;
+            }
+        };
+
+        template <typename T>
+        class data_array
+        {
+            T *     pFirst;
+            T *     pLast;
+
+        public:
+            data_array( size_t nSize )
+                : pFirst( new T[nSize] )
+                , pLast( pFirst + nSize )
+            {
+                key_type i = c_nMinValue;
+                for ( T * p = pFirst; p != pLast; ++p, ++i )
+                    p->k = p->v = i;
+
+                std::random_shuffle( pFirst, pLast );
+            }
+
+            ~data_array()
+            {
+                delete [] pFirst;
+            }
+
+            T * begin() { return pFirst; }
+            T * end()   { return pLast ; }
+            size_t size() const
+            {
+                return pLast - pFirst;
+            }
+        };
+
+        struct move_functor
+        {
+            void operator()( int& dest, value_type const& src ) const
+            {
+                dest = src.k;
+            }
+        };
+
+    protected:
+        template <class PQueue>
+        void test_bounded_with( PQueue& pq )
+        {
+            data_array<value_type> arr( pq.capacity() );
+            value_type * pFirst = arr.begin();
+            value_type * pLast  = pFirst + pq.capacity();
+
+            CPPUNIT_ASSERT( pq.empty() );
+            CPPUNIT_ASSERT( pq.size() == 0 );
+            CPPUNIT_ASSERT_EX( pq.capacity() == pqueue::constants<PQueue>::nCapacity,
+                "pq.capacity() = " << pq.capacity() << ", pqueue::constants<PQueue>::nCapacity = " << pqueue::constants<PQueue>::nCapacity
+                );
+
+            size_t nSize = 0;
+
+            // Push test
+            for ( value_type * p = pFirst; p < pLast; ++p ) {
+#ifdef CDS_EMPLACE_SUPPORT
+                switch ( pq.size() & 3 ) {
+                    case 1:
+                        CPPUNIT_ASSERT( pq.emplace( p->k, p->v ));
+                        break;
+                    case 2:
+                        CPPUNIT_ASSERT( pq.emplace( std::make_pair( p->k, p->v ) ));
+                        break;
+                    default:
+                        CPPUNIT_ASSERT( pq.push( *p ));
+                }
+#else
+                CPPUNIT_ASSERT( pq.push( *p ));
+#endif
+                CPPUNIT_ASSERT( !pq.empty() );
+                CPPUNIT_ASSERT( pq.size() == ++nSize );
+            }
+
+            CPPUNIT_ASSERT( pq.full() );
+            CPPUNIT_ASSERT( pq.size() == pq.capacity() );
+
+            // The queue is full
+            key_type k = c_nMinValue + key_type(c_nCapacity);
+            CPPUNIT_ASSERT( !pq.push( k ));
+            CPPUNIT_ASSERT( pq.full() );
+            CPPUNIT_ASSERT( pq.size() == pq.capacity() );
+
+            // Pop test
+            key_type nPrev = c_nMinValue + key_type(pq.capacity()) - 1;
+            value_type kv(0);
+            key_type   key;
+            CPPUNIT_ASSERT( pq.pop(kv) );
+            CPPUNIT_CHECK_EX( kv.k == nPrev, "Expected=" << nPrev << ", current=" << kv.k );
+
+            CPPUNIT_ASSERT( pq.size() == pq.capacity() - 1 );
+            CPPUNIT_ASSERT( !pq.full() );
+            CPPUNIT_ASSERT( !pq.empty() );
+
+            nSize = pq.size();
+            while ( pq.size() > 1 ) {
+                if ( pq.size() & 1 ) {
+                    CPPUNIT_ASSERT( pq.pop(kv) );
+                    CPPUNIT_CHECK_EX( kv.k == nPrev - 1, "Expected=" << nPrev - 1 << ", current=" << kv.k );
+                    nPrev = kv.k;
+                }
+                else {
+                    CPPUNIT_ASSERT( pq.pop_with( key, move_functor() ));
+                    CPPUNIT_CHECK_EX( key == nPrev - 1, "Expected=" << nPrev - 1 << ", current=" << key );
+                    nPrev = key;
+                }
+
+                --nSize;
+                CPPUNIT_ASSERT( pq.size() == nSize );
+            }
+
+            CPPUNIT_ASSERT( !pq.full() );
+            CPPUNIT_ASSERT( !pq.empty() );
+            CPPUNIT_ASSERT( pq.size() == 1 );
+
+            CPPUNIT_ASSERT( pq.pop(kv) );
+            CPPUNIT_CHECK_EX( kv.k == c_nMinValue, "Expected=" << c_nMinValue << ", current=" << kv.k );
+
+            CPPUNIT_ASSERT( !pq.full() );
+            CPPUNIT_ASSERT( pq.empty() );
+            CPPUNIT_ASSERT( pq.size() == 0 );
+
+            // Clear test
+            for ( value_type * p = pFirst; p < pLast; ++p ) {
+                CPPUNIT_ASSERT( pq.push( *p ));
+            }
+            CPPUNIT_ASSERT( !pq.empty() );
+            CPPUNIT_ASSERT( pq.full() );
+            CPPUNIT_ASSERT( pq.size() == pq.capacity() );
+            pq.clear();
+            CPPUNIT_ASSERT( pq.empty() );
+            CPPUNIT_ASSERT( !pq.full() );
+            CPPUNIT_ASSERT( pq.size() == 0 );
+
+            // clear_with test
+            for ( value_type * p = pFirst; p < pLast; ++p ) {
+                CPPUNIT_ASSERT( pq.push( *p ));
+            }
+            CPPUNIT_ASSERT( !pq.empty() );
+            CPPUNIT_ASSERT( pq.full() );
+            CPPUNIT_ASSERT( pq.size() == pq.capacity() );
+
+            {
+                pqueue::disposer disp;
+                pq.clear_with( cds::ref(disp) );
+                CPPUNIT_ASSERT( pq.empty() );
+                CPPUNIT_ASSERT( !pq.full() );
+                CPPUNIT_ASSERT( pq.size() == 0 );
+                CPPUNIT_ASSERT( disp.m_nCallCount == pq.capacity() );
+            }
+        }
+
+        template <class PQueue>
+        void test_msq_stat()
+        {
+            PQueue pq( 0 );   // argument should be ignored for static buffer
+            test_bounded_with( pq );
+        }
+        template <class PQueue>
+        void test_msq_dyn()
+        {
+            PQueue pq( c_nCapacity );
+            test_bounded_with( pq );
+        }
+
+        template <class PQueue>
+        void test_fcpqueue()
+        {
+            PQueue pq;
+
+            data_array<value_type> arr( c_nCapacity );
+            value_type * pFirst = arr.begin();
+            value_type * pLast  = pFirst + c_nCapacity;
+
+            CPPUNIT_ASSERT( pq.empty() );
+            CPPUNIT_ASSERT( pq.size() == 0 );
+
+            size_t nSize = 0;
+
+            // Push test
+            for ( value_type * p = pFirst; p < pLast; ++p ) {
+                CPPUNIT_ASSERT( pq.push( *p ));
+                CPPUNIT_ASSERT( !pq.empty() );
+                CPPUNIT_ASSERT( pq.size() == ++nSize );
+            }
+
+            CPPUNIT_ASSERT( pq.size() == c_nCapacity );
+
+            // Pop test
+            key_type nPrev = c_nMinValue + key_type(c_nCapacity) - 1;
+            value_type kv(0);
+            //key_type   key;
+            CPPUNIT_ASSERT( pq.pop(kv) );
+            CPPUNIT_CHECK_EX( kv.k == nPrev, "Expected=" << nPrev << ", current=" << kv.k );
+
+            CPPUNIT_ASSERT( pq.size() == c_nCapacity - 1 );
+            CPPUNIT_ASSERT( !pq.empty() );
+
+            nSize = pq.size();
+            while ( pq.size() > 1 ) {
+                CPPUNIT_ASSERT( pq.pop(kv) );
+                CPPUNIT_CHECK_EX( kv.k == nPrev - 1, "Expected=" << nPrev - 1 << ", current=" << kv.k );
+                nPrev = kv.k;
+
+                --nSize;
+                CPPUNIT_ASSERT( pq.size() == nSize );
+            }
+
+            CPPUNIT_ASSERT( !pq.empty() );
+            CPPUNIT_ASSERT( pq.size() == 1 );
+
+            CPPUNIT_ASSERT( pq.pop(kv) );
+            CPPUNIT_CHECK_EX( kv.k == c_nMinValue, "Expected=" << c_nMinValue << ", current=" << kv.k );
+
+            CPPUNIT_ASSERT( pq.empty() );
+            CPPUNIT_ASSERT( pq.size() == 0 );
+
+            // Clear test
+            for ( value_type * p = pFirst; p < pLast; ++p ) {
+                CPPUNIT_ASSERT( pq.push( *p ));
+            }
+            CPPUNIT_ASSERT( !pq.empty() );
+            CPPUNIT_ASSERT( pq.size() == c_nCapacity );
+
+            pq.clear();
+            CPPUNIT_ASSERT( pq.empty() );
+            CPPUNIT_ASSERT( pq.size() == 0 );
+        }
+
+    public:
+        void MSPQueue_st();
+        void MSPQueue_st_cmp();
+        void MSPQueue_st_less();
+        void MSPQueue_st_cmpless();
+        void MSPQueue_st_cmp_mtx();
+        void MSPQueue_dyn();
+        void MSPQueue_dyn_cmp();
+        void MSPQueue_dyn_less();
+        void MSPQueue_dyn_cmpless();
+        void MSPQueue_dyn_cmp_mtx();
+
+        void FCPQueue_vector();
+        void FCPQueue_vector_stat();
+        void FCPQueue_vector_mutex();
+        void FCPQueue_deque();
+        void FCPQueue_deque_stat();
+        void FCPQueue_deque_mutex();
+        void FCPQueue_boost_deque();
+        void FCPQueue_boost_deque_stat();
+        void FCPQueue_stablevector();
+        void FCPQueue_stablevector_stat();
+
+        CPPUNIT_TEST_SUITE(PQueueHdrTest)
+            CPPUNIT_TEST(MSPQueue_st)
+            CPPUNIT_TEST(MSPQueue_st_cmp)
+            CPPUNIT_TEST(MSPQueue_st_less)
+            CPPUNIT_TEST(MSPQueue_st_cmpless)
+            CPPUNIT_TEST(MSPQueue_st_cmp_mtx)
+            CPPUNIT_TEST(MSPQueue_dyn)
+            CPPUNIT_TEST(MSPQueue_dyn_cmp)
+            CPPUNIT_TEST(MSPQueue_dyn_less)
+            CPPUNIT_TEST(MSPQueue_dyn_cmpless)
+            CPPUNIT_TEST(MSPQueue_dyn_cmp_mtx)
+
+            CPPUNIT_TEST(FCPQueue_vector)
+            CPPUNIT_TEST(FCPQueue_vector_stat)
+            CPPUNIT_TEST(FCPQueue_vector_mutex)
+            CPPUNIT_TEST(FCPQueue_deque)
+            CPPUNIT_TEST(FCPQueue_deque_stat)
+            CPPUNIT_TEST(FCPQueue_deque_mutex)
+            CPPUNIT_TEST(FCPQueue_boost_deque)
+            CPPUNIT_TEST(FCPQueue_boost_deque_stat)
+            CPPUNIT_TEST(FCPQueue_stablevector)
+            CPPUNIT_TEST(FCPQueue_stablevector_stat)
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+} // namespace priority_queue
+
+namespace std {
+    template<>
+    struct less<priority_queue::PQueueHdrTest::value_type>
+    {
+        bool operator()( priority_queue::PQueueHdrTest::value_type const& v1, priority_queue::PQueueHdrTest::value_type const& v2) const
+        {
+            return priority_queue::PQueueHdrTest::less()( v1, v2 );
+        }
+    };
+}
+
+#endif // #ifndef CDSHDRTEST_PQUEUE_H
diff --git a/tests/test-hdr/priority_queue/hdr_priority_queue_reg.cpp b/tests/test-hdr/priority_queue/hdr_priority_queue_reg.cpp
new file mode 100644 (file)
index 0000000..c290965
--- /dev/null
@@ -0,0 +1,8 @@
+//$$CDS-header$$
+
+#include "priority_queue/hdr_intrusive_pqueue.h"
+#include "priority_queue/hdr_pqueue.h"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION_(priority_queue::IntrusivePQueueHdrTest, s_IntrusivePQueueHdrTest);
+CPPUNIT_TEST_SUITE_REGISTRATION_(priority_queue::PQueueHdrTest, s_PQueueHdrTest);
diff --git a/tests/test-hdr/queue/hdr_basketqueue_hrc.cpp b/tests/test-hdr/queue/hdr_basketqueue_hrc.cpp
new file mode 100644 (file)
index 0000000..4e2a815
--- /dev/null
@@ -0,0 +1,107 @@
+//$$CDS-header$$
+
+#include <cds/container/basket_queue.h>
+#include <cds/gc/hrc.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+
+    void Queue_TestHeader::BasketQueue_HRC()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::HRC, int
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HRC_Counted()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HRC_relax()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HRC_Counted_relax()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HRC_seqcst()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HRC_Counted_seqcst()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HRC_relax_align()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 16 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HRC_Counted_relax_align()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 32 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HRC_seqcst_align()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::no_special_alignment >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HRC_Counted_seqcst_align()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::cache_line_alignment >
+            >
+        >();
+    }
+
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_basketqueue_hzp.cpp b/tests/test-hdr/queue/hdr_basketqueue_hzp.cpp
new file mode 100644 (file)
index 0000000..7485a6f
--- /dev/null
@@ -0,0 +1,107 @@
+//$$CDS-header$$
+
+#include <cds/container/basket_queue.h>
+#include <cds/gc/hp.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+
+    void Queue_TestHeader::BasketQueue_HP()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::HP, int
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HP_Counted()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HP_relax()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HP_Counted_relax()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HP_seqcst()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HP_Counted_seqcst()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HP_relax_align()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 16 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HP_Counted_relax_align()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 32 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HP_seqcst_align()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::no_special_alignment >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_HP_Counted_seqcst_align()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::cache_line_alignment >
+            >
+        >();
+    }
+
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_basketqueue_ptb.cpp b/tests/test-hdr/queue/hdr_basketqueue_ptb.cpp
new file mode 100644 (file)
index 0000000..10a1876
--- /dev/null
@@ -0,0 +1,107 @@
+//$$CDS-header$$
+
+#include <cds/container/basket_queue.h>
+#include <cds/gc/ptb.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+
+    void Queue_TestHeader::BasketQueue_PTB()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::PTB, int
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_PTB_Counted()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_PTB_relax()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_PTB_Counted_relax()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_PTB_seqcst()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_PTB_Counted_seqcst()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_PTB_relax_align()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 16 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_PTB_Counted_relax_align()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 32 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_PTB_seqcst_align()
+    {
+        testNoItemCounter<
+            cds::container::BasketQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::no_special_alignment >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::BasketQueue_PTB_Counted_seqcst_align()
+    {
+        testWithItemCounter<
+            cds::container::BasketQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::cache_line_alignment >
+            >
+        >();
+    }
+
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_fcqueue.cpp b/tests/test-hdr/queue/hdr_fcqueue.cpp
new file mode 100644 (file)
index 0000000..4b2009d
--- /dev/null
@@ -0,0 +1,83 @@
+//$$CDS-header$$
+
+#include <cds/container/fcqueue.h>
+#include "queue/queue_test_header.h"
+
+#include <list>
+
+namespace queue {
+
+    void Queue_TestHeader::FCQueue_deque()
+    {
+        typedef cds::container::FCQueue<int> queue_type;
+        testFCQueue<queue_type>();
+    }
+
+    void Queue_TestHeader::FCQueue_deque_elimination()
+    {
+        typedef cds::container::FCQueue<int, std::queue< int, std::deque<int> >,
+            cds::container::fcqueue::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        > queue_type;
+        testFCQueue<queue_type>();
+    }
+
+    void Queue_TestHeader::FCQueue_deque_mutex()
+    {
+        typedef cds::container::FCQueue<int, std::queue< int, std::deque<int> >,
+            cds::container::fcqueue::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > queue_type;
+        testFCQueue<queue_type>();
+    }
+
+    void Queue_TestHeader::FCQueue_deque_stat()
+    {
+        typedef cds::container::FCQueue<int, std::queue< int, std::deque<int> >,
+            cds::container::fcqueue::make_traits<
+                cds::opt::stat< cds::container::fcqueue::stat<> >
+            >::type
+        > queue_type;
+        testFCQueue<queue_type>();
+    }
+
+    //
+    void Queue_TestHeader::FCQueue_list()
+    {
+        typedef cds::container::FCQueue<int, std::queue< int, std::list<int> > > queue_type;
+        testFCQueue<queue_type>();
+    }
+
+    void Queue_TestHeader::FCQueue_list_elimination()
+    {
+        typedef cds::container::FCQueue<int, std::queue< int, std::list<int> >,
+            cds::container::fcqueue::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        > queue_type;
+        testFCQueue<queue_type>();
+    }
+
+    void Queue_TestHeader::FCQueue_list_mutex()
+    {
+        typedef cds::container::FCQueue<int, std::queue<int, std::list<int> >,
+            cds::container::fcqueue::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > queue_type;
+        testFCQueue<queue_type>();
+    }
+
+    void Queue_TestHeader::FCQueue_list_stat()
+    {
+        typedef cds::container::FCQueue<int, std::queue< int, std::list<int> >,
+            cds::container::fcqueue::make_traits<
+            cds::opt::stat< cds::container::fcqueue::stat<> >
+            >::type
+        > queue_type;
+        testFCQueue<queue_type>();
+    }
+
+} // namespace queue
diff --git a/tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp b/tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp
new file mode 100644 (file)
index 0000000..40afd90
--- /dev/null
@@ -0,0 +1,188 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+
+#include "hdr_intrusive_basketqueue_node.h"
+#include <cds/gc/hp.h>
+
+namespace queue {
+
+#define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test_basket<X>(); }
+
+    namespace {
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_HP_default;
+
+        /// HP + item counter
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::sequential_consistent >
+        > BasketQueue_HP_default_ic;
+
+        /// HP + stat
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > BasketQueue_HP_default_stat;
+
+        // HP base hook
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_HP_base;
+
+        // HP member hook
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_HP_member;
+
+        /// HP base hook + item counter
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::relaxed_ordering >
+        > BasketQueue_HP_base_ic;
+
+        // HP member hook + item counter
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+       > BasketQueue_HP_member_ic;
+
+        // HP base hook + stat
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > BasketQueue_HP_base_stat;
+
+        // HP member hook + stat
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > BasketQueue_HP_member_stat;
+
+        // HP base hook + alignment
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::alignment< 32 >
+        > BasketQueue_HP_base_align;
+
+        // HP member hook + alignment
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< 32 >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_HP_member_align;
+
+        // HP base hook + no alignment
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::alignment< co::no_special_alignment >
+        > BasketQueue_HP_base_noalign;
+
+        // HP member hook + no alignment
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::member_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< co::no_special_alignment >
+        > BasketQueue_HP_member_noalign;
+
+
+        // HP base hook + cache alignment
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_HP_base_cachealign;
+
+        // HP member hook + cache alignment
+        typedef ci::BasketQueue< cds::gc::HP,
+            basket_queue::member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_HP_member_cachealign;
+
+    }
+
+    TEST(BasketQueue_HP_default)
+    TEST(BasketQueue_HP_default_ic)
+    TEST(BasketQueue_HP_default_stat)
+    TEST(BasketQueue_HP_base)
+    TEST(BasketQueue_HP_member)
+    TEST(BasketQueue_HP_base_ic)
+    TEST(BasketQueue_HP_member_ic)
+    TEST(BasketQueue_HP_base_stat)
+    TEST(BasketQueue_HP_member_stat)
+    TEST(BasketQueue_HP_base_align)
+    TEST(BasketQueue_HP_member_align)
+    TEST(BasketQueue_HP_base_noalign)
+    TEST(BasketQueue_HP_member_noalign)
+    TEST(BasketQueue_HP_base_cachealign)
+    TEST(BasketQueue_HP_member_cachealign)
+}
diff --git a/tests/test-hdr/queue/hdr_intrusive_basketqueue_hrc.cpp b/tests/test-hdr/queue/hdr_intrusive_basketqueue_hrc.cpp
new file mode 100644 (file)
index 0000000..7796bcb
--- /dev/null
@@ -0,0 +1,59 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+
+#include "hdr_intrusive_basketqueue_node.h"
+#include <cds/gc/hrc.h>
+
+namespace queue {
+
+#define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test_basket<X>(); }
+
+    namespace {
+        // HRC base hook
+        typedef ci::BasketQueue< cds::gc::HRC,
+            basket_queue::base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_HRC_base;
+
+        /// HRC base hook + item counter
+        typedef ci::BasketQueue< cds::gc::HRC,
+            basket_queue::base_hook_item<cds::gc::HRC>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::relaxed_ordering >
+        > BasketQueue_HRC_base_ic;
+
+        // HRC base hook + stat
+        typedef ci::BasketQueue< cds::gc::HRC,
+            basket_queue::base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > BasketQueue_HRC_base_stat;
+
+        // HRC base hook + alignment
+        typedef ci::BasketQueue< cds::gc::HRC,
+            basket_queue::base_hook_item<cds::gc::HRC>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,co::alignment< 32 >
+        > BasketQueue_HRC_base_align;
+
+    }
+
+    TEST(BasketQueue_HRC_base)
+    TEST(BasketQueue_HRC_base_ic)
+    TEST(BasketQueue_HRC_base_stat)
+    TEST(BasketQueue_HRC_base_align)
+}
diff --git a/tests/test-hdr/queue/hdr_intrusive_basketqueue_node.h b/tests/test-hdr/queue/hdr_intrusive_basketqueue_node.h
new file mode 100644 (file)
index 0000000..198ce6c
--- /dev/null
@@ -0,0 +1,39 @@
+//$$CDS-header$$
+
+#ifndef CDSTEST_HDR_TEST_INTRUSIVE_BASKET_QUEUE_NODE_H
+#define CDSTEST_HDR_TEST_INTRUSIVE_BASKET_QUEUE_NODE_H
+
+#include <cds/intrusive/basket_queue.h>
+
+namespace queue {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+
+    namespace basket_queue {
+        template <typename GC>
+        struct base_hook_item: public ci::basket_queue::node< GC >
+        {
+            int nVal;
+            int nDisposeCount;
+
+            base_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        template <typename GC>
+        struct member_hook_item
+        {
+            int nVal;
+            int nDisposeCount;
+            ci::basket_queue::node< GC > hMember;
+
+            member_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+    } // namespace basket_queue
+} // queue
+
+#endif // #ifndef CDSTEST_HDR_TEST_INTRUSIVE_BASKET_QUEUE_NODE_H
diff --git a/tests/test-hdr/queue/hdr_intrusive_basketqueue_ptb.cpp b/tests/test-hdr/queue/hdr_intrusive_basketqueue_ptb.cpp
new file mode 100644 (file)
index 0000000..db4a1c3
--- /dev/null
@@ -0,0 +1,165 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+
+#include "hdr_intrusive_basketqueue_node.h"
+#include <cds/gc/ptb.h>
+
+namespace queue {
+
+#define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test_basket<X>(); }
+
+    namespace {
+        // PTB base hook
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_PTB_base;
+
+        // PTB member hook
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_PTB_member;
+
+        /// PTB base hook + item counter
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::base_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::relaxed_ordering >
+        > BasketQueue_PTB_base_ic;
+
+        // PTB member hook + item counter
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+       > BasketQueue_PTB_member_ic;
+
+        // PTB base hook + stat
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > BasketQueue_PTB_base_stat;
+
+        // PTB member hook + stat
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > BasketQueue_PTB_member_stat;
+
+        // PTB base hook + alignment
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::base_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::alignment< 32 >
+        > BasketQueue_PTB_base_align;
+
+        // PTB member hook + alignment
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< 32 >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_PTB_member_align;
+
+        // PTB base hook + no alignment
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::alignment< co::no_special_alignment >
+        > BasketQueue_PTB_base_noalign;
+
+        // PTB member hook + no alignment
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::member_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< co::no_special_alignment >
+        > BasketQueue_PTB_member_noalign;
+
+
+        // PTB base hook + cache alignment
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::basket_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_PTB_base_cachealign;
+
+        // PTB member hook + cache alignment
+        typedef ci::BasketQueue< cds::gc::PTB,
+            basket_queue::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::basket_queue::member_hook<
+                    offsetof(basket_queue::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > BasketQueue_PTB_member_cachealign;
+
+    }
+
+    TEST(BasketQueue_PTB_base)
+    TEST(BasketQueue_PTB_member)
+    TEST(BasketQueue_PTB_base_ic)
+    TEST(BasketQueue_PTB_member_ic)
+    TEST(BasketQueue_PTB_base_stat)
+    TEST(BasketQueue_PTB_member_stat)
+    TEST(BasketQueue_PTB_base_align)
+    TEST(BasketQueue_PTB_member_align)
+    TEST(BasketQueue_PTB_base_noalign)
+    TEST(BasketQueue_PTB_member_noalign)
+    TEST(BasketQueue_PTB_base_cachealign)
+    TEST(BasketQueue_PTB_member_cachealign)
+}
diff --git a/tests/test-hdr/queue/hdr_intrusive_fcqueue.cpp b/tests/test-hdr/queue/hdr_intrusive_fcqueue.cpp
new file mode 100644 (file)
index 0000000..74bfb20
--- /dev/null
@@ -0,0 +1,298 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/intrusive/fcqueue.h>
+
+namespace queue {
+
+    class TestIntrusiveFCQueue: public CppUnitMini::TestCase
+    {
+        template <typename Hook>
+        struct base_hook_item: public Hook
+        {
+            int nVal;
+            int nDisposeCount;
+
+            base_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        template <typename Hook>
+        struct member_hook_item
+        {
+            int nVal;
+            int nDisposeCount;
+            Hook hMember;
+
+            member_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        struct disposer
+        {
+            template <typename T>
+            void operator ()( T * p )
+            {
+                ++p->nDisposeCount;
+            }
+        };
+
+        template <typename Queue>
+        void test()
+        {
+            Queue q;
+            test_with(q);
+        }
+
+        template <class Queue>
+        void test_with( Queue& q )
+        {
+            typedef typename Queue::value_type value_type;
+            value_type v1, v2, v3;
+            CPPUNIT_ASSERT( q.empty() );
+
+            v1.nVal = 1;
+            v2.nVal = 2;
+            v3.nVal = 3;
+            CPPUNIT_ASSERT( q.push(v1));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( q.push(v2));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( q.push(v3));
+            CPPUNIT_ASSERT( !q.empty() );
+
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+            value_type * pv;
+            pv = q.pop();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 1 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+            pv = q.pop();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 2 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+            pv = q.dequeue();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 3 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+            pv = q.dequeue();
+            CPPUNIT_ASSERT( pv == NULL );
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+            CPPUNIT_ASSERT( q.enqueue(v1));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( q.enqueue(v2));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( q.enqueue(v3));
+            CPPUNIT_ASSERT( !q.empty() );
+
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+            q.clear( true );    // call disposer
+            CPPUNIT_CHECK( q.empty() );
+            CPPUNIT_CHECK( v1.nDisposeCount == 1 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 1 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 1 );
+
+            CPPUNIT_ASSERT( q.push(v1));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( q.push(v2));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( q.push(v3));
+            CPPUNIT_ASSERT( !q.empty() );
+            q.clear( false );   // no disposer called
+            CPPUNIT_CHECK( q.empty() );
+            CPPUNIT_CHECK( v1.nDisposeCount == 1 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 1 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 1 );
+        }
+
+        void FCQueue_base();
+        void FCQueue_base_stat();
+        void FCQueue_base_elimination();
+        void FCQueue_base_elimination_mutex();
+        void FCQueue_base_seqcst();
+        void FCQueue_member();
+        void FCQueue_member_stat();
+        void FCQueue_member_elimination();
+        void FCQueue_member_elimination_mutex();
+        void FCQueue_member_seqcst();
+
+        CPPUNIT_TEST_SUITE(TestIntrusiveFCQueue)
+            CPPUNIT_TEST(FCQueue_base)
+            CPPUNIT_TEST(FCQueue_base_stat)
+            CPPUNIT_TEST(FCQueue_base_elimination)
+            CPPUNIT_TEST(FCQueue_base_elimination_mutex)
+            CPPUNIT_TEST(FCQueue_base_seqcst)
+            CPPUNIT_TEST(FCQueue_member)
+            CPPUNIT_TEST(FCQueue_member_stat)
+            CPPUNIT_TEST(FCQueue_member_elimination)
+            CPPUNIT_TEST(FCQueue_member_elimination_mutex)
+            CPPUNIT_TEST(FCQueue_member_seqcst)
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+
+    void TestIntrusiveFCQueue::FCQueue_base()
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void TestIntrusiveFCQueue::FCQueue_base_stat()
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void TestIntrusiveFCQueue::FCQueue_base_elimination()
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                ,cds::opt::enable_elimination< true >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void TestIntrusiveFCQueue::FCQueue_base_elimination_mutex()
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                ,cds::opt::enable_elimination< true >
+                ,cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void TestIntrusiveFCQueue::FCQueue_base_seqcst()
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void TestIntrusiveFCQueue::FCQueue_member()
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void TestIntrusiveFCQueue::FCQueue_member_stat()
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void TestIntrusiveFCQueue::FCQueue_member_elimination()
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                ,cds::opt::enable_elimination< true >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void TestIntrusiveFCQueue::FCQueue_member_elimination_mutex()
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                ,cds::opt::enable_elimination< true >
+                ,cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void TestIntrusiveFCQueue::FCQueue_member_seqcst()
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+} // namespace queue
+
+CPPUNIT_TEST_SUITE_REGISTRATION(queue::TestIntrusiveFCQueue);
diff --git a/tests/test-hdr/queue/hdr_intrusive_moirqueue_hp.cpp b/tests/test-hdr/queue/hdr_intrusive_moirqueue_hp.cpp
new file mode 100644 (file)
index 0000000..897e383
--- /dev/null
@@ -0,0 +1,186 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+#include "hdr_intrusive_singlelink_node.h"
+#include <cds/intrusive/moir_queue.h>
+#include <cds/gc/hp.h>
+
+namespace queue {
+
+#define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
+
+    namespace {
+        typedef ci::MoirQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_HP_default;
+
+        /// cds::gc::HP + item counter
+        typedef ci::MoirQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > MoirQueue_HP_default_ic;
+
+        /// cds::gc::HP + stat
+        typedef ci::MoirQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > MoirQueue_HP_default_stat;
+
+        // cds::gc::HP base hook
+        typedef ci::MoirQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_HP_base;
+
+        // cds::gc::HP member hook
+        typedef ci::MoirQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_HP_member;
+
+        /// cds::gc::HP base hook + item counter
+        typedef ci::MoirQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > MoirQueue_HP_base_ic;
+
+        // cds::gc::HP member hook + item counter
+        typedef ci::MoirQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+       > MoirQueue_HP_member_ic;
+
+        // cds::gc::HP base hook + stat
+        typedef ci::MoirQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > MoirQueue_HP_base_stat;
+
+        // cds::gc::HP member hook + stat
+        typedef ci::MoirQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > MoirQueue_HP_member_stat;
+
+        // cds::gc::HP base hook + alignment
+        typedef ci::MoirQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::alignment< 32 >
+        > MoirQueue_HP_base_align;
+
+        // cds::gc::HP member hook + alignment
+        typedef ci::MoirQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< 32 >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_HP_member_align;
+
+        // cds::gc::HP base hook + no alignment
+        typedef ci::MoirQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::alignment< co::no_special_alignment >
+        > MoirQueue_HP_base_noalign;
+
+        // cds::gc::HP member hook + no alignment
+        typedef ci::MoirQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< co::no_special_alignment >
+        > MoirQueue_HP_member_noalign;
+
+
+        // cds::gc::HP base hook + cache alignment
+        typedef ci::MoirQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_HP_base_cachealign;
+
+        // cds::gc::HP member hook + cache alignment
+        typedef ci::MoirQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_HP_member_cachealign;
+
+    }
+
+    TEST(MoirQueue_HP_default)
+    TEST(MoirQueue_HP_default_ic)
+    TEST(MoirQueue_HP_default_stat)
+    TEST(MoirQueue_HP_base)
+    TEST(MoirQueue_HP_member)
+    TEST(MoirQueue_HP_base_ic)
+    TEST(MoirQueue_HP_member_ic)
+    TEST(MoirQueue_HP_base_stat)
+    TEST(MoirQueue_HP_member_stat)
+    TEST(MoirQueue_HP_base_align)
+    TEST(MoirQueue_HP_member_align)
+    TEST(MoirQueue_HP_base_noalign)
+    TEST(MoirQueue_HP_member_noalign)
+    TEST(MoirQueue_HP_base_cachealign)
+    TEST(MoirQueue_HP_member_cachealign)
+}
diff --git a/tests/test-hdr/queue/hdr_intrusive_moirqueue_hrc.cpp b/tests/test-hdr/queue/hdr_intrusive_moirqueue_hrc.cpp
new file mode 100644 (file)
index 0000000..75031aa
--- /dev/null
@@ -0,0 +1,59 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+#include "hdr_intrusive_singlelink_node.h"
+#include <cds/intrusive/moir_queue.h>
+#include <cds/gc/hrc.h>
+
+namespace queue {
+
+#define TEST(X)     void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
+
+    namespace {
+
+        // HRC base hook
+        typedef ci::MoirQueue< cds::gc::HRC,
+            base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_HRC_base;
+
+        // HRC base hook + item counter
+        typedef ci::MoirQueue< cds::gc::HRC,
+            base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > MoirQueue_HRC_base_ic;
+
+        // HRC base hook + stat
+        typedef ci::MoirQueue< cds::gc::HRC,
+            base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > MoirQueue_HRC_base_stat;
+
+        // HRC base hook + alignment
+        typedef ci::MoirQueue< cds::gc::HRC,
+            base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::alignment< 128 >
+        > MoirQueue_HRC_base_align;
+    }
+
+    TEST(MoirQueue_HRC_base)
+    TEST(MoirQueue_HRC_base_ic)
+    TEST(MoirQueue_HRC_base_stat)
+    TEST(MoirQueue_HRC_base_align)
+
+} // namespace queue
diff --git a/tests/test-hdr/queue/hdr_intrusive_moirqueue_ptb.cpp b/tests/test-hdr/queue/hdr_intrusive_moirqueue_ptb.cpp
new file mode 100644 (file)
index 0000000..34e3f77
--- /dev/null
@@ -0,0 +1,168 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+#include "hdr_intrusive_singlelink_node.h"
+#include <cds/intrusive/moir_queue.h>
+#include <cds/gc/ptb.h>
+
+namespace queue {
+
+#define TEST(X)     void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
+
+    namespace {
+
+        // PTB base hook
+        typedef ci::MoirQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_PTB_base;
+
+        // PTB member hook
+        typedef ci::MoirQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_PTB_member;
+
+        /// PTB base hook + item counter
+        typedef ci::MoirQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::sequential_consistent >
+        > MoirQueue_PTB_base_ic;
+
+        // PTB member hook + item counter
+        typedef ci::MoirQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+       > MoirQueue_PTB_member_ic;
+
+        // PTB base hook + stat
+        typedef ci::MoirQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > MoirQueue_PTB_base_stat;
+
+        // PTB member hook + stat
+        typedef ci::MoirQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+            ,co::memory_model< co::v::relaxed_ordering >
+        > MoirQueue_PTB_member_stat;
+
+        // PTB base hook + alignment
+        typedef ci::MoirQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::alignment< 32 >
+        > MoirQueue_PTB_base_align;
+
+        // PTB member hook + alignment
+        typedef ci::MoirQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< 32 >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_PTB_member_align;
+
+        // PTB base hook + no alignment
+        typedef ci::MoirQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::alignment< co::no_special_alignment >
+        > MoirQueue_PTB_base_noalign;
+
+        // PTB member hook + no alignment
+        typedef ci::MoirQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< co::no_special_alignment >
+        > MoirQueue_PTB_member_noalign;
+
+
+        // PTB base hook + cache alignment
+        typedef ci::MoirQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_PTB_base_cachealign;
+
+        // PTB member hook + cache alignment
+        typedef ci::MoirQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MoirQueue_PTB_member_cachealign;
+
+    }   // namespace
+
+    TEST(MoirQueue_PTB_base)
+    TEST(MoirQueue_PTB_member)
+    TEST(MoirQueue_PTB_base_ic)
+    TEST(MoirQueue_PTB_member_ic)
+    TEST(MoirQueue_PTB_base_stat)
+    TEST(MoirQueue_PTB_member_stat)
+    TEST(MoirQueue_PTB_base_align)
+    TEST(MoirQueue_PTB_member_align)
+    TEST(MoirQueue_PTB_base_noalign)
+    TEST(MoirQueue_PTB_member_noalign)
+    TEST(MoirQueue_PTB_base_cachealign)
+    TEST(MoirQueue_PTB_member_cachealign)
+
+} // namespace queue
diff --git a/tests/test-hdr/queue/hdr_intrusive_msqueue.h b/tests/test-hdr/queue/hdr_intrusive_msqueue.h
new file mode 100644 (file)
index 0000000..e040c7d
--- /dev/null
@@ -0,0 +1,519 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/intrusive/base.h>
+
+namespace queue {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+
+    class IntrusiveQueueHeaderTest: public CppUnitMini::TestCase
+    {
+    public:
+
+        struct faked_disposer
+        {
+            template <typename T>
+            void operator ()( T * p )
+            {
+                ++p->nDisposeCount;
+            }
+        };
+
+
+        // Test for MSQueue and derivatives
+        template <class Queue>
+        void test()
+        {
+            typedef typename Queue::value_type value_type;
+            value_type v1, v2, v3;
+
+            {
+                Queue q;
+                CPPUNIT_ASSERT( q.empty() );
+
+                v1.nVal = 1;
+                v2.nVal = 2;
+                v3.nVal = 3;
+                CPPUNIT_ASSERT( q.push(v1));
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_ASSERT( q.push(v2));
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_ASSERT( q.push(v3));
+                CPPUNIT_ASSERT( !q.empty() );
+
+                CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+                value_type * pv;
+                pv = q.pop();
+                Queue::gc::scan();
+                CPPUNIT_ASSERT( pv != NULL );
+                CPPUNIT_ASSERT( pv->nVal == 1 );
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+                pv = q.pop();
+                Queue::gc::scan();
+                CPPUNIT_ASSERT( pv != NULL );
+                CPPUNIT_ASSERT( pv->nVal == 2 );
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_CHECK( v1.nDisposeCount == 1 );
+                CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+                pv = q.pop();
+                Queue::gc::scan();
+                CPPUNIT_ASSERT( pv != NULL );
+                CPPUNIT_ASSERT( pv->nVal == 3 );
+                CPPUNIT_ASSERT( q.empty() );
+                CPPUNIT_CHECK( v1.nDisposeCount == 1 );
+                CPPUNIT_CHECK( v2.nDisposeCount == 1 );
+                CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+                pv = q.pop();
+                CPPUNIT_ASSERT( pv == NULL );
+                CPPUNIT_CHECK( v1.nDisposeCount == 1 );
+                CPPUNIT_CHECK( v2.nDisposeCount == 1 );
+                CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+            }
+
+            Queue::gc::scan();
+            CPPUNIT_CHECK( v1.nDisposeCount == 1 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 1 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 1 );
+        }
+
+        // Test for BasketQueue and derivatives
+        template <class Queue>
+        void test_basket()
+        {
+            typedef typename Queue::value_type value_type;
+            value_type v1, v2, v3, v4;
+
+            {
+                Queue q;
+                CPPUNIT_ASSERT( q.empty() );
+
+                v1.nVal = 1;
+                v2.nVal = 2;
+                v3.nVal = 3;
+                v4.nVal = 4;
+                CPPUNIT_ASSERT( q.push(v1));
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_ASSERT( q.push(v2));
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_ASSERT( q.push(v3));
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_ASSERT( q.push(v4));
+                CPPUNIT_ASSERT( !q.empty() );
+
+                CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v4.nDisposeCount == 0 );
+
+                value_type * pv;
+                pv = q.pop();
+                Queue::gc::scan();
+                CPPUNIT_ASSERT( pv != NULL );
+                CPPUNIT_ASSERT( pv->nVal == 1 );
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v4.nDisposeCount == 0 );
+
+                pv = q.pop();
+                Queue::gc::scan();
+                CPPUNIT_ASSERT( pv != NULL );
+                CPPUNIT_ASSERT( pv->nVal == 2 );
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v4.nDisposeCount == 0 );
+
+                pv = q.pop();
+                Queue::gc::scan();
+                CPPUNIT_ASSERT( pv != NULL );
+                CPPUNIT_ASSERT( pv->nVal == 3 );
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+                CPPUNIT_CHECK( v4.nDisposeCount == 0 );
+
+                pv = q.pop();
+                Queue::gc::scan();
+                CPPUNIT_ASSERT( pv != NULL );
+                CPPUNIT_ASSERT( pv->nVal == 4 );
+                CPPUNIT_ASSERT( q.empty() );
+                CPPUNIT_CHECK( v1.nDisposeCount == 1 );
+                CPPUNIT_CHECK( v2.nDisposeCount == 1 );
+                CPPUNIT_CHECK( v3.nDisposeCount == 1 );
+                CPPUNIT_CHECK( v4.nDisposeCount == 0 );
+
+                pv = q.pop();
+                Queue::gc::scan();
+                CPPUNIT_CHECK( pv == NULL );
+                CPPUNIT_CHECK( v1.nDisposeCount == 1 );
+                CPPUNIT_CHECK( v2.nDisposeCount == 1 );
+                CPPUNIT_CHECK( v3.nDisposeCount == 1 );
+                CPPUNIT_CHECK( v4.nDisposeCount == 0 );
+            }
+
+            Queue::gc::scan();
+            CPPUNIT_CHECK( v1.nDisposeCount == 1 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 1 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 1 );
+            CPPUNIT_CHECK( v4.nDisposeCount == 1 );
+        }
+
+        // Test for a queue in what dequeued item should be manually disposed
+        template <class Queue>
+        void test2()
+        {
+            typedef typename Queue::value_type value_type;
+            value_type v1, v2, v3;
+            Queue q;
+            CPPUNIT_ASSERT( q.empty() );
+
+            v1.nVal = 1;
+            v2.nVal = 2;
+            v3.nVal = 3;
+            CPPUNIT_ASSERT( q.push(v1));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( q.push(v2));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( q.push(v3));
+            CPPUNIT_ASSERT( !q.empty() );
+
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+            value_type * pv;
+            pv = q.pop();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 1 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+            pv = q.pop();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 2 );
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+            pv = q.pop();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 3 );
+            CPPUNIT_ASSERT( q.empty() );
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+            pv = q.pop();
+            CPPUNIT_ASSERT( pv == NULL );
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+
+            CPPUNIT_ASSERT( q.push(v1));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( q.push(v2));
+            CPPUNIT_ASSERT( !q.empty() );
+            CPPUNIT_ASSERT( q.push(v3));
+            CPPUNIT_ASSERT( !q.empty() );
+
+            CPPUNIT_CHECK( v1.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 0 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 0 );
+            q.clear();
+            CPPUNIT_CHECK( q.empty() );
+            CPPUNIT_CHECK( v1.nDisposeCount == 1 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 1 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 1 );
+        }
+
+
+        void test_MSQueue_HP_default();
+        void test_MSQueue_HP_default_ic();
+        void test_MSQueue_HP_default_stat();
+        void test_MSQueue_HP_base();
+        void test_MSQueue_HP_member();
+        void test_MSQueue_HP_base_ic();
+        void test_MSQueue_HP_member_ic();
+        void test_MSQueue_HP_base_stat();
+        void test_MSQueue_HP_member_stat();
+        void test_MSQueue_HP_base_align();
+        void test_MSQueue_HP_member_align();
+        void test_MSQueue_HP_base_noalign();
+        void test_MSQueue_HP_member_noalign();
+        void test_MSQueue_HP_base_cachealign();
+        void test_MSQueue_HP_member_cachealign();
+        void test_MSQueue_HRC_base();
+        void test_MSQueue_HRC_base_ic();
+        void test_MSQueue_HRC_base_stat();
+        void test_MSQueue_HRC_base_align();
+        void test_MSQueue_PTB_base();
+        void test_MSQueue_PTB_member();
+        void test_MSQueue_PTB_base_ic();
+        void test_MSQueue_PTB_member_ic();
+        void test_MSQueue_PTB_base_stat();
+        void test_MSQueue_PTB_member_stat();
+        void test_MSQueue_PTB_base_align();
+        void test_MSQueue_PTB_member_align();
+        void test_MSQueue_PTB_base_noalign();
+        void test_MSQueue_PTB_member_noalign();
+        void test_MSQueue_PTB_base_cachealign();
+        void test_MSQueue_PTB_member_cachealign();
+
+        void test_MoirQueue_HP_default();
+        void test_MoirQueue_HP_default_ic();
+        void test_MoirQueue_HP_default_stat();
+        void test_MoirQueue_HP_base();
+        void test_MoirQueue_HP_member();
+        void test_MoirQueue_HP_base_ic();
+        void test_MoirQueue_HP_member_ic();
+        void test_MoirQueue_HP_base_stat();
+        void test_MoirQueue_HP_member_stat();
+        void test_MoirQueue_HP_base_align();
+        void test_MoirQueue_HP_member_align();
+        void test_MoirQueue_HP_base_noalign();
+        void test_MoirQueue_HP_member_noalign();
+        void test_MoirQueue_HP_base_cachealign();
+        void test_MoirQueue_HP_member_cachealign();
+        void test_MoirQueue_HRC_base();
+        void test_MoirQueue_HRC_base_ic();
+        void test_MoirQueue_HRC_base_stat();
+        void test_MoirQueue_HRC_base_align();
+        void test_MoirQueue_PTB_base();
+        void test_MoirQueue_PTB_member();
+        void test_MoirQueue_PTB_base_ic();
+        void test_MoirQueue_PTB_member_ic();
+        void test_MoirQueue_PTB_base_stat();
+        void test_MoirQueue_PTB_member_stat();
+        void test_MoirQueue_PTB_base_align();
+        void test_MoirQueue_PTB_member_align();
+        void test_MoirQueue_PTB_base_noalign();
+        void test_MoirQueue_PTB_member_noalign();
+        void test_MoirQueue_PTB_base_cachealign();
+        void test_MoirQueue_PTB_member_cachealign();
+
+        void test_OptimisticQueue_HP_default();
+        void test_OptimisticQueue_HP_default_ic();
+        void test_OptimisticQueue_HP_default_stat();
+        void test_OptimisticQueue_HP_base();
+        void test_OptimisticQueue_HP_member();
+        void test_OptimisticQueue_HP_base_ic();
+        void test_OptimisticQueue_HP_member_ic();
+        void test_OptimisticQueue_HP_base_stat();
+        void test_OptimisticQueue_HP_member_stat();
+        void test_OptimisticQueue_HP_base_align();
+        void test_OptimisticQueue_HP_member_align();
+        void test_OptimisticQueue_HP_base_noalign();
+        void test_OptimisticQueue_HP_member_noalign();
+        void test_OptimisticQueue_HP_base_cachealign();
+        void test_OptimisticQueue_HP_member_cachealign();
+        void test_OptimisticQueue_PTB_base();
+        void test_OptimisticQueue_PTB_member();
+        void test_OptimisticQueue_PTB_base_ic();
+        void test_OptimisticQueue_PTB_member_ic();
+        void test_OptimisticQueue_PTB_base_stat();
+        void test_OptimisticQueue_PTB_member_stat();
+        void test_OptimisticQueue_PTB_base_align();
+        void test_OptimisticQueue_PTB_member_align();
+        void test_OptimisticQueue_PTB_base_noalign();
+        void test_OptimisticQueue_PTB_member_noalign();
+        void test_OptimisticQueue_PTB_base_cachealign();
+        void test_OptimisticQueue_PTB_member_cachealign();
+
+        void test_BasketQueue_HP_default();
+        void test_BasketQueue_HP_default_ic();
+        void test_BasketQueue_HP_default_stat();
+        void test_BasketQueue_HP_base();
+        void test_BasketQueue_HP_member();
+        void test_BasketQueue_HP_base_ic();
+        void test_BasketQueue_HP_member_ic();
+        void test_BasketQueue_HP_base_stat();
+        void test_BasketQueue_HP_member_stat();
+        void test_BasketQueue_HP_base_align();
+        void test_BasketQueue_HP_member_align();
+        void test_BasketQueue_HP_base_noalign();
+        void test_BasketQueue_HP_member_noalign();
+        void test_BasketQueue_HP_base_cachealign();
+        void test_BasketQueue_HP_member_cachealign();
+        void test_BasketQueue_HRC_base();
+        void test_BasketQueue_HRC_base_ic();
+        void test_BasketQueue_HRC_base_stat();
+        void test_BasketQueue_HRC_base_align();
+        void test_BasketQueue_PTB_base();
+        void test_BasketQueue_PTB_member();
+        void test_BasketQueue_PTB_base_ic();
+        void test_BasketQueue_PTB_member_ic();
+        void test_BasketQueue_PTB_base_stat();
+        void test_BasketQueue_PTB_member_stat();
+        void test_BasketQueue_PTB_base_align();
+        void test_BasketQueue_PTB_member_align();
+        void test_BasketQueue_PTB_base_noalign();
+        void test_BasketQueue_PTB_member_noalign();
+        void test_BasketQueue_PTB_base_cachealign();
+        void test_BasketQueue_PTB_member_cachealign();
+
+        void test_TsigasCycleQueue_stat();
+        void test_TsigasCycleQueue_stat_ic();
+        void test_TsigasCycleQueue_dyn();
+        void test_TsigasCycleQueue_dyn_ic();
+
+        void test_VyukovMPMCCycleQueue_stat();
+        void test_VyukovMPMCCycleQueue_stat_ic();
+        void test_VyukovMPMCCycleQueue_dyn();
+        void test_VyukovMPMCCycleQueue_dyn_ic();
+
+        CPPUNIT_TEST_SUITE(IntrusiveQueueHeaderTest)
+            CPPUNIT_TEST(test_MSQueue_HP_default)
+            CPPUNIT_TEST(test_MSQueue_HP_default_ic)
+            CPPUNIT_TEST(test_MSQueue_HP_default_stat)
+            CPPUNIT_TEST(test_MSQueue_HP_base)
+            CPPUNIT_TEST(test_MSQueue_HP_member)
+            CPPUNIT_TEST(test_MSQueue_HP_base_ic)
+            CPPUNIT_TEST(test_MSQueue_HP_member_ic)
+            CPPUNIT_TEST(test_MSQueue_HP_base_stat)
+            CPPUNIT_TEST(test_MSQueue_HP_member_stat)
+            CPPUNIT_TEST(test_MSQueue_HP_base_align)
+            CPPUNIT_TEST(test_MSQueue_HP_member_align)
+            CPPUNIT_TEST(test_MSQueue_HP_base_noalign)
+            CPPUNIT_TEST(test_MSQueue_HP_member_noalign)
+            CPPUNIT_TEST(test_MSQueue_HP_base_cachealign)
+            CPPUNIT_TEST(test_MSQueue_HP_member_cachealign)
+            CPPUNIT_TEST(test_MSQueue_HRC_base)
+            CPPUNIT_TEST(test_MSQueue_HRC_base_ic)
+            CPPUNIT_TEST(test_MSQueue_HRC_base_stat)
+            CPPUNIT_TEST(test_MSQueue_HRC_base_align)
+            CPPUNIT_TEST(test_MSQueue_PTB_base)
+            CPPUNIT_TEST(test_MSQueue_PTB_member)
+            CPPUNIT_TEST(test_MSQueue_PTB_base_ic)
+            CPPUNIT_TEST(test_MSQueue_PTB_member_ic)
+            CPPUNIT_TEST(test_MSQueue_PTB_base_stat)
+            CPPUNIT_TEST(test_MSQueue_PTB_member_stat)
+            CPPUNIT_TEST(test_MSQueue_PTB_base_align)
+            CPPUNIT_TEST(test_MSQueue_PTB_member_align)
+            CPPUNIT_TEST(test_MSQueue_PTB_base_noalign)
+            CPPUNIT_TEST(test_MSQueue_PTB_member_noalign)
+            CPPUNIT_TEST(test_MSQueue_PTB_base_cachealign)
+            CPPUNIT_TEST(test_MSQueue_PTB_member_cachealign)
+
+            CPPUNIT_TEST(test_MoirQueue_HP_default)
+            CPPUNIT_TEST(test_MoirQueue_HP_default_ic)
+            CPPUNIT_TEST(test_MoirQueue_HP_default_stat)
+            CPPUNIT_TEST(test_MoirQueue_HP_base)
+            CPPUNIT_TEST(test_MoirQueue_HP_member)
+            CPPUNIT_TEST(test_MoirQueue_HP_base_ic)
+            CPPUNIT_TEST(test_MoirQueue_HP_member_ic)
+            CPPUNIT_TEST(test_MoirQueue_HP_base_stat)
+            CPPUNIT_TEST(test_MoirQueue_HP_member_stat)
+            CPPUNIT_TEST(test_MoirQueue_HP_base_align)
+            CPPUNIT_TEST(test_MoirQueue_HP_member_align)
+            CPPUNIT_TEST(test_MoirQueue_HP_base_noalign)
+            CPPUNIT_TEST(test_MoirQueue_HP_member_noalign)
+            CPPUNIT_TEST(test_MoirQueue_HP_base_cachealign)
+            CPPUNIT_TEST(test_MoirQueue_HP_member_cachealign)
+            CPPUNIT_TEST(test_MoirQueue_HRC_base)
+            CPPUNIT_TEST(test_MoirQueue_HRC_base_ic)
+            CPPUNIT_TEST(test_MoirQueue_HRC_base_stat)
+            CPPUNIT_TEST(test_MoirQueue_HRC_base_align)
+            CPPUNIT_TEST(test_MoirQueue_PTB_base)
+            CPPUNIT_TEST(test_MoirQueue_PTB_member)
+            CPPUNIT_TEST(test_MoirQueue_PTB_base_ic)
+            CPPUNIT_TEST(test_MoirQueue_PTB_member_ic)
+            CPPUNIT_TEST(test_MoirQueue_PTB_base_stat)
+            CPPUNIT_TEST(test_MoirQueue_PTB_member_stat)
+            CPPUNIT_TEST(test_MoirQueue_PTB_base_align)
+            CPPUNIT_TEST(test_MoirQueue_PTB_member_align)
+            CPPUNIT_TEST(test_MoirQueue_PTB_base_noalign)
+            CPPUNIT_TEST(test_MoirQueue_PTB_member_noalign)
+            CPPUNIT_TEST(test_MoirQueue_PTB_base_cachealign)
+            CPPUNIT_TEST(test_MoirQueue_PTB_member_cachealign)
+
+            CPPUNIT_TEST(test_OptimisticQueue_HP_default)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_default_ic)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_default_stat)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_base)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_member)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_base_ic)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_member_ic)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_base_stat)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_member_stat)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_base_align)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_member_align)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_base_noalign)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_member_noalign)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_base_cachealign)
+            CPPUNIT_TEST(test_OptimisticQueue_HP_member_cachealign)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_base)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_member)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_base_ic)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_member_ic)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_base_stat)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_member_stat)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_base_align)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_member_align)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_base_noalign)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_member_noalign)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_base_cachealign)
+            CPPUNIT_TEST(test_OptimisticQueue_PTB_member_cachealign)
+
+            CPPUNIT_TEST(test_BasketQueue_HP_default)
+            CPPUNIT_TEST(test_BasketQueue_HP_default_ic)
+            CPPUNIT_TEST(test_BasketQueue_HP_default_stat)
+            CPPUNIT_TEST(test_BasketQueue_HP_base)
+            CPPUNIT_TEST(test_BasketQueue_HP_member)
+            CPPUNIT_TEST(test_BasketQueue_HP_base_ic)
+            CPPUNIT_TEST(test_BasketQueue_HP_member_ic)
+            CPPUNIT_TEST(test_BasketQueue_HP_base_stat)
+            CPPUNIT_TEST(test_BasketQueue_HP_member_stat)
+            CPPUNIT_TEST(test_BasketQueue_HP_base_align)
+            CPPUNIT_TEST(test_BasketQueue_HP_member_align)
+            CPPUNIT_TEST(test_BasketQueue_HP_base_noalign)
+            CPPUNIT_TEST(test_BasketQueue_HP_member_noalign)
+            CPPUNIT_TEST(test_BasketQueue_HP_base_cachealign)
+            CPPUNIT_TEST(test_BasketQueue_HP_member_cachealign)
+            CPPUNIT_TEST(test_BasketQueue_HRC_base)
+            CPPUNIT_TEST(test_BasketQueue_HRC_base_ic)
+            CPPUNIT_TEST(test_BasketQueue_HRC_base_stat)
+            CPPUNIT_TEST(test_BasketQueue_HRC_base_align)
+            CPPUNIT_TEST(test_BasketQueue_PTB_base)
+            CPPUNIT_TEST(test_BasketQueue_PTB_member)
+            CPPUNIT_TEST(test_BasketQueue_PTB_base_ic)
+            CPPUNIT_TEST(test_BasketQueue_PTB_member_ic)
+            CPPUNIT_TEST(test_BasketQueue_PTB_base_stat)
+            CPPUNIT_TEST(test_BasketQueue_PTB_member_stat)
+            CPPUNIT_TEST(test_BasketQueue_PTB_base_align)
+            CPPUNIT_TEST(test_BasketQueue_PTB_member_align)
+            CPPUNIT_TEST(test_BasketQueue_PTB_base_noalign)
+            CPPUNIT_TEST(test_BasketQueue_PTB_member_noalign)
+            CPPUNIT_TEST(test_BasketQueue_PTB_base_cachealign)
+            CPPUNIT_TEST(test_BasketQueue_PTB_member_cachealign)
+
+            CPPUNIT_TEST(test_TsigasCycleQueue_stat)
+            CPPUNIT_TEST(test_TsigasCycleQueue_stat_ic)
+            CPPUNIT_TEST(test_TsigasCycleQueue_dyn)
+            CPPUNIT_TEST(test_TsigasCycleQueue_dyn_ic)
+
+            CPPUNIT_TEST(test_VyukovMPMCCycleQueue_stat);
+            CPPUNIT_TEST(test_VyukovMPMCCycleQueue_stat_ic);
+            CPPUNIT_TEST(test_VyukovMPMCCycleQueue_dyn);
+            CPPUNIT_TEST(test_VyukovMPMCCycleQueue_dyn_ic);
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_intrusive_msqueue_hp.cpp b/tests/test-hdr/queue/hdr_intrusive_msqueue_hp.cpp
new file mode 100644 (file)
index 0000000..929b344
--- /dev/null
@@ -0,0 +1,191 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+#include "hdr_intrusive_singlelink_node.h"
+
+#include <cds/intrusive/msqueue.h>
+#include <cds/gc/hp.h>
+
+namespace queue {
+
+#define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
+
+    namespace {
+        typedef ci::MSQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_HP_default;
+
+        /// HP + item counter
+        typedef ci::MSQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::sequential_consistent >
+        > MSQueue_HP_default_ic;
+
+        /// HP + stat
+        typedef ci::MSQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > MSQueue_HP_default_stat;
+
+        // HP base hook
+        typedef ci::MSQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_HP_base;
+
+        // HP member hook
+        typedef ci::MSQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_HP_member;
+
+        /// HP base hook + item counter
+        typedef ci::MSQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::relaxed_ordering >
+        > MSQueue_HP_base_ic;
+
+        // HP member hook + item counter
+        typedef ci::MSQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+       > MSQueue_HP_member_ic;
+
+        // HP base hook + stat
+        typedef ci::MSQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > MSQueue_HP_base_stat;
+
+        // HP member hook + stat
+        typedef ci::MSQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > MSQueue_HP_member_stat;
+
+        // HP base hook + alignment
+        typedef ci::MSQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::alignment< 32 >
+        > MSQueue_HP_base_align;
+
+        // HP member hook + alignment
+        typedef ci::MSQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< 32 >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_HP_member_align;
+
+        // HP base hook + no alignment
+        typedef ci::MSQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::alignment< co::no_special_alignment >
+        > MSQueue_HP_base_noalign;
+
+        // HP member hook + no alignment
+        typedef ci::MSQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< co::no_special_alignment >
+        > MSQueue_HP_member_noalign;
+
+
+        // HP base hook + cache alignment
+        typedef ci::MSQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_HP_base_cachealign;
+
+        // HP member hook + cache alignment
+        typedef ci::MSQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_HP_member_cachealign;
+
+    }
+
+    TEST(MSQueue_HP_default)
+    TEST(MSQueue_HP_default_ic)
+    TEST(MSQueue_HP_default_stat)
+    TEST(MSQueue_HP_base)
+    TEST(MSQueue_HP_member)
+    TEST(MSQueue_HP_base_ic)
+    TEST(MSQueue_HP_member_ic)
+    TEST(MSQueue_HP_base_stat)
+    TEST(MSQueue_HP_member_stat)
+    TEST(MSQueue_HP_base_align)
+    TEST(MSQueue_HP_member_align)
+    TEST(MSQueue_HP_base_noalign)
+    TEST(MSQueue_HP_member_noalign)
+    TEST(MSQueue_HP_base_cachealign)
+    TEST(MSQueue_HP_member_cachealign)
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(queue::IntrusiveQueueHeaderTest);
diff --git a/tests/test-hdr/queue/hdr_intrusive_msqueue_hrc.cpp b/tests/test-hdr/queue/hdr_intrusive_msqueue_hrc.cpp
new file mode 100644 (file)
index 0000000..2a64b70
--- /dev/null
@@ -0,0 +1,60 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+#include "hdr_intrusive_singlelink_node.h"
+
+#include <cds/intrusive/msqueue.h>
+#include <cds/gc/hrc.h>
+
+namespace queue {
+
+#define TEST(X)     void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
+
+    namespace {
+
+        // HRC base hook
+        typedef ci::MSQueue< cds::gc::HRC,
+            base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_HRC_base;
+
+        // HRC base hook + item counter
+        typedef ci::MSQueue< cds::gc::HRC,
+            base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > MSQueue_HRC_base_ic;
+
+        // HRC base hook + stat
+        typedef ci::MSQueue< cds::gc::HRC,
+            base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > MSQueue_HRC_base_stat;
+
+        // HRC base hook + alignment
+        typedef ci::MSQueue< cds::gc::HRC,
+            base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::alignment< 128 >
+        > MSQueue_HRC_base_align;
+    }
+
+    TEST(MSQueue_HRC_base)
+    TEST(MSQueue_HRC_base_ic)
+    TEST(MSQueue_HRC_base_stat)
+    TEST(MSQueue_HRC_base_align)
+
+} // namespace queue
diff --git a/tests/test-hdr/queue/hdr_intrusive_msqueue_ptb.cpp b/tests/test-hdr/queue/hdr_intrusive_msqueue_ptb.cpp
new file mode 100644 (file)
index 0000000..7db1ced
--- /dev/null
@@ -0,0 +1,167 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+#include "hdr_intrusive_singlelink_node.h"
+
+#include <cds/intrusive/msqueue.h>
+#include <cds/gc/ptb.h>
+
+namespace queue {
+
+#define TEST(X)     void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
+
+    namespace {
+
+        // PTB base hook
+        typedef ci::MSQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_PTB_base;
+
+        // PTB member hook
+        typedef ci::MSQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_PTB_member;
+
+        /// PTB base hook + item counter
+        typedef ci::MSQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > MSQueue_PTB_base_ic;
+
+        // PTB member hook + item counter
+        typedef ci::MSQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+       > MSQueue_PTB_member_ic;
+
+        // PTB base hook + stat
+        typedef ci::MSQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > MSQueue_PTB_base_stat;
+
+        // PTB member hook + stat
+        typedef ci::MSQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > MSQueue_PTB_member_stat;
+
+        // PTB base hook + alignment
+        typedef ci::MSQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::alignment< 32 >
+        > MSQueue_PTB_base_align;
+
+        // PTB member hook + alignment
+        typedef ci::MSQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< 32 >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_PTB_member_align;
+
+        // PTB base hook + no alignment
+        typedef ci::MSQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::alignment< co::no_special_alignment >
+        > MSQueue_PTB_base_noalign;
+
+        // PTB member hook + no alignment
+        typedef ci::MSQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< co::no_special_alignment >
+        > MSQueue_PTB_member_noalign;
+
+
+        // PTB base hook + cache alignment
+        typedef ci::MSQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_PTB_base_cachealign;
+
+        // PTB member hook + cache alignment
+        typedef ci::MSQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > MSQueue_PTB_member_cachealign;
+
+    }   // namespace
+
+    TEST(MSQueue_PTB_base)
+    TEST(MSQueue_PTB_member)
+    TEST(MSQueue_PTB_base_ic)
+    TEST(MSQueue_PTB_member_ic)
+    TEST(MSQueue_PTB_base_stat)
+    TEST(MSQueue_PTB_member_stat)
+    TEST(MSQueue_PTB_base_align)
+    TEST(MSQueue_PTB_member_align)
+    TEST(MSQueue_PTB_base_noalign)
+    TEST(MSQueue_PTB_member_noalign)
+    TEST(MSQueue_PTB_base_cachealign)
+    TEST(MSQueue_PTB_member_cachealign)
+
+} // namespace queue
diff --git a/tests/test-hdr/queue/hdr_intrusive_optimisticqueue_hp.cpp b/tests/test-hdr/queue/hdr_intrusive_optimisticqueue_hp.cpp
new file mode 100644 (file)
index 0000000..7cfecbe
--- /dev/null
@@ -0,0 +1,211 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+#include <cds/intrusive/optimistic_queue.h>
+#include <cds/gc/hp.h>
+
+namespace queue {
+
+#define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
+
+    namespace {
+        template <typename GC>
+        struct base_hook_item: public ci::optimistic_queue::node< GC >
+        {
+            int nVal;
+            int nDisposeCount;
+
+            base_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        template <typename GC>
+        struct member_hook_item
+        {
+            ci::optimistic_queue::node< GC > hMember;
+            int nVal;
+            int nDisposeCount;
+
+            member_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > OptimisticQueue_HP_default;
+
+        /// HP + item counter
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > OptimisticQueue_HP_default_ic;
+
+        /// HP + stat
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+            ,co::memory_model< co::v::sequential_consistent >
+        > OptimisticQueue_HP_default_stat;
+
+        // HP base hook
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::memory_model< co::v::relaxed_ordering >
+        > OptimisticQueue_HP_base;
+
+        // HP member hook
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > OptimisticQueue_HP_member;
+
+        /// HP base hook + item counter
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > OptimisticQueue_HP_base_ic;
+
+        // HP member hook + item counter
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+       > OptimisticQueue_HP_member_ic;
+
+        // HP base hook + stat
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > OptimisticQueue_HP_base_stat;
+
+        // HP member hook + stat
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > OptimisticQueue_HP_member_stat;
+
+        // HP base hook + alignment
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::alignment< 32 >
+        > OptimisticQueue_HP_base_align;
+
+        // HP member hook + alignment
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< 32 >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > OptimisticQueue_HP_member_align;
+
+        // HP base hook + no alignment
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::alignment< co::no_special_alignment >
+        > OptimisticQueue_HP_base_noalign;
+
+        // HP member hook + no alignment
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< co::no_special_alignment >
+        > OptimisticQueue_HP_member_noalign;
+
+
+        // HP base hook + cache alignment
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > OptimisticQueue_HP_base_cachealign;
+
+        // HP member hook + cache alignment
+        typedef ci::OptimisticQueue< cds::gc::HP,
+            member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > OptimisticQueue_HP_member_cachealign;
+
+    }
+
+    TEST(OptimisticQueue_HP_default)
+    TEST(OptimisticQueue_HP_default_ic)
+    TEST(OptimisticQueue_HP_default_stat)
+    TEST(OptimisticQueue_HP_base)
+    TEST(OptimisticQueue_HP_member)
+    TEST(OptimisticQueue_HP_base_ic)
+    TEST(OptimisticQueue_HP_member_ic)
+    TEST(OptimisticQueue_HP_base_stat)
+    TEST(OptimisticQueue_HP_member_stat)
+    TEST(OptimisticQueue_HP_base_align)
+    TEST(OptimisticQueue_HP_member_align)
+    TEST(OptimisticQueue_HP_base_noalign)
+    TEST(OptimisticQueue_HP_member_noalign)
+    TEST(OptimisticQueue_HP_base_cachealign)
+    TEST(OptimisticQueue_HP_member_cachealign)
+}
diff --git a/tests/test-hdr/queue/hdr_intrusive_optimisticqueue_ptb.cpp b/tests/test-hdr/queue/hdr_intrusive_optimisticqueue_ptb.cpp
new file mode 100644 (file)
index 0000000..71261cf
--- /dev/null
@@ -0,0 +1,187 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+#include <cds/intrusive/optimistic_queue.h>
+#include <cds/gc/ptb.h>
+
+namespace queue {
+
+#define TEST(X)     void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
+
+    namespace {
+        template <typename GC>
+        struct base_hook_item: public ci::optimistic_queue::node< GC >
+        {
+            int nVal;
+            int nDisposeCount;
+
+            base_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        template <typename GC>
+        struct member_hook_item
+        {
+            int nVal;
+            int nDisposeCount;
+            ci::optimistic_queue::node< GC > hMember;
+
+            member_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        // PTB base hook
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > OptimisticQueue_PTB_base;
+
+        // PTB member hook
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > OptimisticQueue_PTB_member;
+
+        /// PTB base hook + item counter
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::item_counter< cds::atomicity::item_counter >
+        > OptimisticQueue_PTB_base_ic;
+
+        // PTB member hook + item counter
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+       > OptimisticQueue_PTB_member_ic;
+
+        // PTB base hook + stat
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > OptimisticQueue_PTB_base_stat;
+
+        // PTB member hook + stat
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::stat< ci::queue_stat<> >
+        > OptimisticQueue_PTB_member_stat;
+
+        // PTB base hook + alignment
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::alignment< 32 >
+        > OptimisticQueue_PTB_base_align;
+
+        // PTB member hook + alignment
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< 32 >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > OptimisticQueue_PTB_member_align;
+
+        // PTB base hook + no alignment
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::alignment< co::no_special_alignment >
+        > OptimisticQueue_PTB_base_noalign;
+
+        // PTB member hook + no alignment
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< co::no_special_alignment >
+        > OptimisticQueue_PTB_member_noalign;
+
+
+        // PTB base hook + cache alignment
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > OptimisticQueue_PTB_base_cachealign;
+
+        // PTB member hook + cache alignment
+        typedef ci::OptimisticQueue< cds::gc::PTB,
+            member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::optimistic_queue::member_hook<
+                    offsetof(member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,co::alignment< co::cache_line_alignment >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+        > OptimisticQueue_PTB_member_cachealign;
+
+    }   // namespace
+
+    TEST(OptimisticQueue_PTB_base)
+    TEST(OptimisticQueue_PTB_member)
+    TEST(OptimisticQueue_PTB_base_ic)
+    TEST(OptimisticQueue_PTB_member_ic)
+    TEST(OptimisticQueue_PTB_base_stat)
+    TEST(OptimisticQueue_PTB_member_stat)
+    TEST(OptimisticQueue_PTB_base_align)
+    TEST(OptimisticQueue_PTB_member_align)
+    TEST(OptimisticQueue_PTB_base_noalign)
+    TEST(OptimisticQueue_PTB_member_noalign)
+    TEST(OptimisticQueue_PTB_base_cachealign)
+    TEST(OptimisticQueue_PTB_member_cachealign)
+
+} // namespace queue
diff --git a/tests/test-hdr/queue/hdr_intrusive_segmented_queue.h b/tests/test-hdr/queue/hdr_intrusive_segmented_queue.h
new file mode 100644 (file)
index 0000000..53d3e5f
--- /dev/null
@@ -0,0 +1,208 @@
+//$$CDS-header$$
+
+#ifndef __CDSHDR_QUEUE_INTRUSIVE_SEGMENTED_QUEUE_H
+#define __CDSHDR_QUEUE_INTRUSIVE_SEGMENTED_QUEUE_H
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/intrusive/base.h>
+#include "size_check.h"
+
+namespace queue {
+
+    class HdrIntrusiveSegmentedQueue: public CppUnitMini::TestCase
+    {
+        struct item {
+            int  nValue;
+
+            size_t  nDisposeCount;
+            size_t  nDispose2Count;
+
+            item()
+                : nValue(0)
+                , nDisposeCount(0)
+                , nDispose2Count(0)
+            {}
+
+            item( int nVal )
+                : nValue(nVal)
+                , nDisposeCount(0)
+                , nDispose2Count(0)
+            {}
+        };
+
+        struct Disposer
+        {
+            void operator()( item * p )
+            {
+                ++p->nDisposeCount;
+            }
+        };
+
+        struct Disposer2
+        {
+            void operator()( item * p )
+            {
+                ++p->nDispose2Count;
+            }
+        };
+
+        template <typename Queue>
+        void test()
+        {
+            for ( size_t nQuasiFactor = 2; nQuasiFactor <= 256; ++nQuasiFactor ) {
+                CPPUNIT_MSG( "QuasiFactor=" << nQuasiFactor << "..." );
+                test_qf<Queue>( nQuasiFactor );
+            }
+        }
+
+        template <typename Queue>
+        void test_qf( size_t nQuasiFactor )
+        {
+            typedef typename Queue::value_type value_type;
+
+            static size_t const c_nItemCount = 1000;
+            value_type val[c_nItemCount];
+            for ( int i = 0; i < static_cast<int>(sizeof(val)/sizeof(val[0])); ++i )
+                val[i].nValue = i;
+
+            {
+                Queue q( nQuasiFactor );
+                CPPUNIT_CHECK( q.quasi_factor() == cds::beans::ceil2(nQuasiFactor) );
+                CPPUNIT_CHECK( misc::check_size( q, 0 ));
+                CPPUNIT_CHECK( q.empty() );
+
+                // push/enqueue
+                for ( size_t i = 0; i < sizeof(val)/sizeof(val[0]); ++i ) {
+                    if ( i & 1 ) {
+                        CPPUNIT_ASSERT( q.push( val[i] ));
+                    }
+                    else {
+                        CPPUNIT_ASSERT( q.enqueue( val[i] ));
+                    }
+
+                    CPPUNIT_CHECK( misc::check_size( q, i + 1 ));
+                }
+                CPPUNIT_CHECK( !q.empty() );
+
+                // pop/dequeue
+                size_t nCount = 0;
+                while ( !q.empty() ) {
+                    value_type * pVal;
+                    if ( nCount & 1 )
+                        pVal = q.pop();
+                    else
+                        pVal = q.dequeue();
+
+                    CPPUNIT_ASSERT( pVal != NULL );
+
+                    int nSegment = int( nCount / q.quasi_factor() );
+                    int nMin = nSegment * int(q.quasi_factor());
+                    int nMax = nMin + int(q.quasi_factor()) - 1;
+                    CPPUNIT_CHECK_EX( nMin <= pVal->nValue && pVal->nValue <= nMax, nMin << " <= " << pVal->nValue << " <= " << nMax );
+
+                    ++nCount;
+                    CPPUNIT_CHECK( misc::check_size( q, sizeof(val)/sizeof(val[0]) - nCount ));
+                }
+                CPPUNIT_CHECK( nCount == sizeof(val)/sizeof(val[0]) );
+                CPPUNIT_CHECK( q.empty() );
+                CPPUNIT_CHECK( misc::check_size( q, 0 ));
+
+                // pop from empty queue
+                CPPUNIT_ASSERT( q.pop() == NULL );
+                CPPUNIT_CHECK( q.empty() );
+                CPPUNIT_CHECK( misc::check_size( q, 0 ));
+
+                // check if Disposer has not been called
+                Queue::gc::force_dispose();
+                for ( int i = 0; i < static_cast<int>( sizeof(val)/sizeof(val[0]) ); ++i ) {
+                    CPPUNIT_CHECK( val[i].nDisposeCount == 0 );
+                    CPPUNIT_CHECK( val[i].nDispose2Count == 0 );
+                }
+
+                // Manually dispose the items
+                for ( int i = 0; i < static_cast<int>( sizeof(val)/sizeof(val[0])); ++i )
+                    Queue::gc::template retire<Disposer>( &(val[i]) );
+
+                // check if Disposer has been called
+                Queue::gc::force_dispose();
+                for ( int i = 0; i < static_cast<int>( sizeof(val)/sizeof(val[0])); ++i ) {
+                    CPPUNIT_CHECK( val[i].nDisposeCount == 1 );
+                    CPPUNIT_CHECK( val[i].nDispose2Count == 0 );
+                }
+
+
+                // clear
+                for ( int i = 0; i < static_cast<int>( sizeof(val)/sizeof(val[0])); ++i )
+                    CPPUNIT_CHECK( q.push( val[i] ) );
+                CPPUNIT_CHECK( misc::check_size( q, sizeof(val)/sizeof(val[0]) ));
+                CPPUNIT_CHECK( !q.empty() );
+
+                q.clear();
+                CPPUNIT_CHECK( misc::check_size( q, 0));
+                CPPUNIT_CHECK( q.empty() );
+
+                // check if Disposer has been called
+                Queue::gc::force_dispose();
+                for ( int i = 0; i < static_cast<int>( sizeof(val)/sizeof(val[0])); ++i ) {
+                    CPPUNIT_CHECK( val[i].nDisposeCount == 2 );
+                    CPPUNIT_CHECK( val[i].nDispose2Count == 0 );
+                }
+
+                // clear_with
+                for ( int i = 0; i < static_cast<int>( sizeof(val)/sizeof(val[0])); ++i )
+                    CPPUNIT_CHECK( q.push( val[i] ) );
+                CPPUNIT_CHECK( misc::check_size( q, sizeof(val)/sizeof(val[0]) ));
+                CPPUNIT_CHECK( !q.empty() );
+
+                q.clear_with( Disposer2() );
+                CPPUNIT_CHECK( misc::check_size( q, 0));
+                CPPUNIT_CHECK( q.empty() );
+
+                // check if Disposer has been called
+                Queue::gc::force_dispose();
+                for ( int i = 0; i < static_cast<int>( sizeof(val)/sizeof(val[0])); ++i ) {
+                    CPPUNIT_CHECK( val[i].nDisposeCount == 2 );
+                    CPPUNIT_CHECK( val[i].nDispose2Count == 1 );
+                }
+
+                // check clear on destruct
+                for ( int i = 0; i < static_cast<int>( sizeof(val)/sizeof(val[0])); ++i )
+                    CPPUNIT_CHECK( q.push( val[i] ) );
+                CPPUNIT_CHECK( misc::check_size( q, sizeof(val)/sizeof(val[0]) ));
+                CPPUNIT_CHECK( !q.empty() );
+            }
+
+            // check if Disposer has been called
+            Queue::gc::force_dispose();
+            for ( int i = 0; i < static_cast<int>( sizeof(val)/sizeof(val[0])); ++i ) {
+                CPPUNIT_CHECK( val[i].nDisposeCount == 3 );
+                CPPUNIT_CHECK( val[i].nDispose2Count == 1 );
+            }
+        }
+
+        void SegmQueue_HP();
+        void SegmQueue_HP_mutex();
+        void SegmQueue_HP_shuffle();
+        void SegmQueue_HP_stat();
+
+        void SegmQueue_PTB();
+        void SegmQueue_PTB_mutex();
+        void SegmQueue_PTB_shuffle();
+        void SegmQueue_PTB_stat();
+
+        CPPUNIT_TEST_SUITE(HdrIntrusiveSegmentedQueue)
+            CPPUNIT_TEST( SegmQueue_HP )
+            CPPUNIT_TEST( SegmQueue_HP_mutex )
+            CPPUNIT_TEST( SegmQueue_HP_shuffle )
+            CPPUNIT_TEST( SegmQueue_HP_stat )
+
+            CPPUNIT_TEST( SegmQueue_PTB )
+            CPPUNIT_TEST( SegmQueue_PTB_mutex )
+            CPPUNIT_TEST( SegmQueue_PTB_shuffle )
+            CPPUNIT_TEST( SegmQueue_PTB_stat )
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+} // namespace queue
+
+#endif // __CDSHDR_QUEUE_INTRUSIVE_SEGMENTED_QUEUE_H
diff --git a/tests/test-hdr/queue/hdr_intrusive_segmented_queue_hp.cpp b/tests/test-hdr/queue/hdr_intrusive_segmented_queue_hp.cpp
new file mode 100644 (file)
index 0000000..5e83889
--- /dev/null
@@ -0,0 +1,61 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_segmented_queue.h"
+#include <cds/intrusive/segmented_queue.h>
+#include <cds/gc/hp.h>
+
+namespace queue {
+
+    void HdrIntrusiveSegmentedQueue::SegmQueue_HP()
+    {
+        typedef cds::intrusive::SegmentedQueue< cds::gc::HP, item,
+            cds::intrusive::segmented_queue::make_traits<
+                cds::intrusive::opt::disposer< Disposer >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrIntrusiveSegmentedQueue::SegmQueue_HP_mutex()
+    {
+        typedef cds::intrusive::SegmentedQueue< cds::gc::HP, item,
+            cds::intrusive::segmented_queue::make_traits<
+                cds::intrusive::opt::disposer< Disposer >
+                ,cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrIntrusiveSegmentedQueue::SegmQueue_HP_shuffle()
+    {
+        typedef cds::intrusive::SegmentedQueue< cds::gc::HP, item,
+            cds::intrusive::segmented_queue::make_traits<
+                cds::intrusive::opt::disposer< Disposer >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::permutation_generator< cds::opt::v::random_shuffle_permutation<> >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrIntrusiveSegmentedQueue::SegmQueue_HP_stat()
+    {
+        typedef cds::intrusive::SegmentedQueue< cds::gc::HP, item,
+            cds::intrusive::segmented_queue::make_traits<
+                cds::intrusive::opt::disposer< Disposer >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::permutation_generator< cds::opt::v::random_permutation<> >
+                ,cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+} // namespace queue
+
+CPPUNIT_TEST_SUITE_REGISTRATION(queue::HdrIntrusiveSegmentedQueue);
diff --git a/tests/test-hdr/queue/hdr_intrusive_segmented_queue_ptb.cpp b/tests/test-hdr/queue/hdr_intrusive_segmented_queue_ptb.cpp
new file mode 100644 (file)
index 0000000..94166e6
--- /dev/null
@@ -0,0 +1,59 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_segmented_queue.h"
+#include <cds/intrusive/segmented_queue.h>
+#include <cds/gc/ptb.h>
+
+namespace queue {
+
+    void HdrIntrusiveSegmentedQueue::SegmQueue_PTB()
+    {
+        typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, item,
+            cds::intrusive::segmented_queue::make_traits<
+                cds::intrusive::opt::disposer< Disposer >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrIntrusiveSegmentedQueue::SegmQueue_PTB_mutex()
+    {
+        typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, item,
+            cds::intrusive::segmented_queue::make_traits<
+                cds::intrusive::opt::disposer< Disposer >
+                ,cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrIntrusiveSegmentedQueue::SegmQueue_PTB_shuffle()
+    {
+        typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, item,
+            cds::intrusive::segmented_queue::make_traits<
+                cds::intrusive::opt::disposer< Disposer >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::permutation_generator< cds::opt::v::random_shuffle_permutation<> >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrIntrusiveSegmentedQueue::SegmQueue_PTB_stat()
+    {
+        typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, item,
+            cds::intrusive::segmented_queue::make_traits<
+                cds::intrusive::opt::disposer< Disposer >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::permutation_generator< cds::opt::v::random_permutation<> >
+                ,cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+} // namespace queue
diff --git a/tests/test-hdr/queue/hdr_intrusive_singlelink_node.h b/tests/test-hdr/queue/hdr_intrusive_singlelink_node.h
new file mode 100644 (file)
index 0000000..e6ecc3a
--- /dev/null
@@ -0,0 +1,37 @@
+//$$CDS-header$$
+
+#ifndef CDSTEST_HDR_TEST_INTRUSIVE_SINGLELINK_NODE_H
+#define CDSTEST_HDR_TEST_INTRUSIVE_SINGLELINK_NODE_H
+
+#include <cds/intrusive/single_link_struct.h>
+
+namespace queue {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+
+    template <typename GC>
+    struct base_hook_item: public ci::single_link::node< GC >
+    {
+        int nVal;
+        int nDisposeCount;
+
+        base_hook_item()
+            : nDisposeCount(0)
+        {}
+    };
+
+    template <typename GC>
+    struct member_hook_item
+    {
+        int nVal;
+        int nDisposeCount;
+        ci::single_link::node< GC > hMember;
+
+        member_hook_item()
+            : nDisposeCount(0)
+        {}
+    };
+
+} // queue
+
+#endif // #ifndef CDSTEST_HDR_TEST_INTRUSIVE_SINGLELINK_NODE_H
diff --git a/tests/test-hdr/queue/hdr_intrusive_tsigas_cycle_queue.cpp b/tests/test-hdr/queue/hdr_intrusive_tsigas_cycle_queue.cpp
new file mode 100644 (file)
index 0000000..6a602ca
--- /dev/null
@@ -0,0 +1,79 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+#include <cds/intrusive/tsigas_cycle_queue.h>
+
+namespace queue {
+
+#define TEST(X)     void IntrusiveQueueHeaderTest::test_##X() { test2<X>(); }
+
+    namespace {
+        struct item {
+            int nVal;
+            int nDisposeCount;
+
+            item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        typedef ci::TsigasCycleQueue<
+            item
+            ,co::buffer< co::v::static_buffer< int, 1024 > >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::memory_model< co::v::sequential_consistent >
+        > TsigasCycleQueue_stat;
+
+        typedef ci::TsigasCycleQueue<
+            item
+            ,co::buffer< co::v::static_buffer< int, 1024 > >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::relaxed_ordering >
+        > TsigasCycleQueue_stat_ic;
+
+        class TsigasCycleQueue_dyn
+            : public ci::TsigasCycleQueue<
+                item
+                ,co::buffer< co::v::dynamic_buffer< int > >
+                ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            >
+        {
+            typedef ci::TsigasCycleQueue<
+                item
+                ,co::buffer< co::v::dynamic_buffer< int > >
+                ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            > base_class;
+        public:
+            TsigasCycleQueue_dyn()
+                : base_class( 1024 )
+            {}
+        };
+
+        class TsigasCycleQueue_dyn_ic
+            : public ci::TsigasCycleQueue<
+                item
+                ,co::buffer< co::v::dynamic_buffer< int > >
+                ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >
+        {
+            typedef ci::TsigasCycleQueue<
+                item
+                ,co::buffer< co::v::dynamic_buffer< int > >
+                ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            > base_class;
+        public:
+            TsigasCycleQueue_dyn_ic()
+                : base_class( 1024 )
+            {}
+        };
+    }
+
+    TEST(TsigasCycleQueue_stat)
+    TEST(TsigasCycleQueue_stat_ic)
+    TEST(TsigasCycleQueue_dyn)
+    TEST(TsigasCycleQueue_dyn_ic)
+
+} // namespace queue
diff --git a/tests/test-hdr/queue/hdr_intrusive_vyukovmpmc_cycle_queue.cpp b/tests/test-hdr/queue/hdr_intrusive_vyukovmpmc_cycle_queue.cpp
new file mode 100644 (file)
index 0000000..e46dc85
--- /dev/null
@@ -0,0 +1,79 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_msqueue.h"
+#include <cds/intrusive/vyukov_mpmc_cycle_queue.h>
+
+namespace queue {
+
+#define TEST(X)     void IntrusiveQueueHeaderTest::test_##X() { test2<X>(); }
+
+    namespace {
+        struct item {
+            int nVal;
+            int nDisposeCount;
+
+            item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        typedef ci::VyukovMPMCCycleQueue<
+            item
+            ,co::buffer< co::v::static_buffer< int, 1024 > >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::memory_model< co::v::sequential_consistent >
+        > VyukovMPMCCycleQueue_stat;
+
+        typedef ci::VyukovMPMCCycleQueue<
+            item
+            ,co::buffer< co::v::static_buffer< int, 1024 > >
+            ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,co::memory_model< co::v::relaxed_ordering >
+        > VyukovMPMCCycleQueue_stat_ic;
+
+        class VyukovMPMCCycleQueue_dyn
+            : public ci::VyukovMPMCCycleQueue<
+                item
+                ,co::buffer< co::v::dynamic_buffer< int > >
+                ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            >
+        {
+            typedef ci::VyukovMPMCCycleQueue<
+                item
+                ,co::buffer< co::v::dynamic_buffer< int > >
+                ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+            > base_class;
+        public:
+            VyukovMPMCCycleQueue_dyn()
+                : base_class( 1024 )
+            {}
+        };
+
+        class VyukovMPMCCycleQueue_dyn_ic
+            : public ci::VyukovMPMCCycleQueue<
+                item
+                ,co::buffer< co::v::dynamic_buffer< int > >
+                ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >
+        {
+            typedef ci::VyukovMPMCCycleQueue<
+                item
+                ,co::buffer< co::v::dynamic_buffer< int > >
+                ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            > base_class;
+        public:
+            VyukovMPMCCycleQueue_dyn_ic()
+                : base_class( 1024 )
+            {}
+        };
+    }
+
+    TEST(VyukovMPMCCycleQueue_stat)
+    TEST(VyukovMPMCCycleQueue_stat_ic)
+    TEST(VyukovMPMCCycleQueue_dyn)
+    TEST(VyukovMPMCCycleQueue_dyn_ic)
+
+} // namespace queue
diff --git a/tests/test-hdr/queue/hdr_moirqueue_hrc.cpp b/tests/test-hdr/queue/hdr_moirqueue_hrc.cpp
new file mode 100644 (file)
index 0000000..aca82e2
--- /dev/null
@@ -0,0 +1,107 @@
+//$$CDS-header$$
+
+#include <cds/container/moir_queue.h>
+#include <cds/gc/hrc.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+
+    void Queue_TestHeader::MoirQueue_HRC()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::HRC, int
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HRC_Counted()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HRC_relax()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HRC_Counted_relax()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HRC_seqcst()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HRC_Counted_seqcst()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HRC_relax_align()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 16 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HRC_Counted_relax_align()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 32 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HRC_seqcst_align()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::no_special_alignment >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HRC_Counted_seqcst_align()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::cache_line_alignment >
+            >
+        >();
+    }
+
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_moirqueue_hzp.cpp b/tests/test-hdr/queue/hdr_moirqueue_hzp.cpp
new file mode 100644 (file)
index 0000000..f4560d8
--- /dev/null
@@ -0,0 +1,107 @@
+//$$CDS-header$$
+
+#include <cds/container/moir_queue.h>
+#include <cds/gc/hp.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+
+    void Queue_TestHeader::MoirQueue_HP()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::HP, int
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HP_Counted()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HP_relax()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HP_Counted_relax()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HP_seqcst()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HP_Counted_seqcst()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HP_relax_align()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 16 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HP_Counted_relax_align()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 32 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HP_seqcst_align()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::no_special_alignment >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_HP_Counted_seqcst_align()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::cache_line_alignment >
+            >
+        >();
+    }
+
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_moirqueue_ptb.cpp b/tests/test-hdr/queue/hdr_moirqueue_ptb.cpp
new file mode 100644 (file)
index 0000000..dccfc3d
--- /dev/null
@@ -0,0 +1,107 @@
+//$$CDS-header$$
+
+#include <cds/container/moir_queue.h>
+#include <cds/gc/ptb.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+
+    void Queue_TestHeader::MoirQueue_PTB()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::PTB, int
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_PTB_Counted()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_PTB_relax()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_PTB_Counted_relax()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_PTB_seqcst()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_PTB_Counted_seqcst()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_PTB_relax_align()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 16 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_PTB_Counted_relax_align()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 32 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_PTB_seqcst_align()
+    {
+        testNoItemCounter<
+            cds::container::MoirQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::no_special_alignment >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MoirQueue_PTB_Counted_seqcst_align()
+    {
+        testWithItemCounter<
+            cds::container::MoirQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::cache_line_alignment >
+            >
+        >();
+    }
+
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_msqueue_hrc.cpp b/tests/test-hdr/queue/hdr_msqueue_hrc.cpp
new file mode 100644 (file)
index 0000000..a8883c3
--- /dev/null
@@ -0,0 +1,107 @@
+//$$CDS-header$$
+
+#include <cds/container/msqueue.h>
+#include <cds/gc/hrc.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+
+    void Queue_TestHeader::MSQueue_HRC()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::HRC, int
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HRC_Counted()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HRC_relax()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HRC_Counted_relax()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HRC_seqcst()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HRC_Counted_seqcst()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HRC_relax_align()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 16 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HRC_Counted_relax_align()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 32 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HRC_seqcst_align()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::HRC, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::no_special_alignment >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HRC_Counted_seqcst_align()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::HRC, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::cache_line_alignment >
+            >
+        >();
+    }
+
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_msqueue_hzp.cpp b/tests/test-hdr/queue/hdr_msqueue_hzp.cpp
new file mode 100644 (file)
index 0000000..72557ae
--- /dev/null
@@ -0,0 +1,107 @@
+//$$CDS-header$$
+
+#include <cds/container/msqueue.h>
+#include <cds/gc/hp.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+
+    void Queue_TestHeader::MSQueue_HP()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::HP, int
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HP_Counted()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HP_relax()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HP_Counted_relax()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HP_seqcst()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HP_Counted_seqcst()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HP_relax_align()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 16 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HP_Counted_relax_align()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 32 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HP_seqcst_align()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::no_special_alignment >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_HP_Counted_seqcst_align()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::cache_line_alignment >
+            >
+        >();
+    }
+
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_msqueue_ptb.cpp b/tests/test-hdr/queue/hdr_msqueue_ptb.cpp
new file mode 100644 (file)
index 0000000..d0dbb6a
--- /dev/null
@@ -0,0 +1,107 @@
+//$$CDS-header$$
+
+#include <cds/container/msqueue.h>
+#include <cds/gc/ptb.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+
+    void Queue_TestHeader::MSQueue_PTB()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::PTB, int
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_PTB_Counted()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_PTB_relax()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_PTB_Counted_relax()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_PTB_seqcst()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_PTB_Counted_seqcst()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_PTB_relax_align()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 16 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_PTB_Counted_relax_align()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 32 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_PTB_seqcst_align()
+    {
+        testNoItemCounter<
+            cds::container::MSQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::no_special_alignment >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::MSQueue_PTB_Counted_seqcst_align()
+    {
+        testWithItemCounter<
+            cds::container::MSQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::cache_line_alignment >
+            >
+        >();
+    }
+
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_optimistic_hzp.cpp b/tests/test-hdr/queue/hdr_optimistic_hzp.cpp
new file mode 100644 (file)
index 0000000..31c4db8
--- /dev/null
@@ -0,0 +1,107 @@
+//$$CDS-header$$
+
+#include <cds/container/optimistic_queue.h>
+#include <cds/gc/hp.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+
+    void Queue_TestHeader::OptimisticQueue_HP()
+    {
+        testNoItemCounter<
+            cds::container::OptimisticQueue< cds::gc::HP, int
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_HP_Counted()
+    {
+        testWithItemCounter<
+            cds::container::OptimisticQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_HP_relax()
+    {
+        testNoItemCounter<
+            cds::container::OptimisticQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_HP_Counted_relax()
+    {
+        testWithItemCounter<
+            cds::container::OptimisticQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_HP_seqcst()
+    {
+        testNoItemCounter<
+            cds::container::OptimisticQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_HP_Counted_seqcst()
+    {
+        testWithItemCounter<
+            cds::container::OptimisticQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_HP_relax_align()
+    {
+        testNoItemCounter<
+            cds::container::OptimisticQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 16 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_HP_Counted_relax_align()
+    {
+        testWithItemCounter<
+            cds::container::OptimisticQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 32 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_HP_seqcst_align()
+    {
+        testNoItemCounter<
+            cds::container::OptimisticQueue< cds::gc::HP, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::no_special_alignment >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_HP_Counted_seqcst_align()
+    {
+        testWithItemCounter<
+            cds::container::OptimisticQueue< cds::gc::HP, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::cache_line_alignment >
+            >
+        >();
+    }
+
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_optimistic_ptb.cpp b/tests/test-hdr/queue/hdr_optimistic_ptb.cpp
new file mode 100644 (file)
index 0000000..a1fa4ee
--- /dev/null
@@ -0,0 +1,107 @@
+//$$CDS-header$$
+
+#include <cds/container/optimistic_queue.h>
+#include <cds/gc/ptb.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+
+    void Queue_TestHeader::OptimisticQueue_PTB()
+    {
+        testNoItemCounter<
+            cds::container::OptimisticQueue< cds::gc::PTB, int
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_PTB_Counted()
+    {
+        testWithItemCounter<
+            cds::container::OptimisticQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_PTB_relax()
+    {
+        testNoItemCounter<
+            cds::container::OptimisticQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_PTB_Counted_relax()
+    {
+        testWithItemCounter<
+            cds::container::OptimisticQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_PTB_seqcst()
+    {
+        testNoItemCounter<
+            cds::container::OptimisticQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_PTB_Counted_seqcst()
+    {
+        testWithItemCounter<
+            cds::container::OptimisticQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_PTB_relax_align()
+    {
+        testNoItemCounter<
+            cds::container::OptimisticQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 16 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_PTB_Counted_relax_align()
+    {
+        testWithItemCounter<
+            cds::container::OptimisticQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::relaxed_ordering>
+                ,cds::opt::alignment< 32 >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_PTB_seqcst_align()
+    {
+        testNoItemCounter<
+            cds::container::OptimisticQueue< cds::gc::PTB, int
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::no_special_alignment >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::OptimisticQueue_PTB_Counted_seqcst_align()
+    {
+        testWithItemCounter<
+            cds::container::OptimisticQueue< cds::gc::PTB, int
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::memory_model< cds::opt::v::sequential_consistent>
+                ,cds::opt::alignment< cds::opt::cache_line_alignment >
+            >
+        >();
+    }
+
+}   // namespace queue
diff --git a/tests/test-hdr/queue/hdr_rwqueue.cpp b/tests/test-hdr/queue/hdr_rwqueue.cpp
new file mode 100644 (file)
index 0000000..c0dce8c
--- /dev/null
@@ -0,0 +1,28 @@
+//$$CDS-header$$
+
+#include <cds/container/rwqueue.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+    void Queue_TestHeader::RWQueue_()
+    {
+        testNoItemCounter<
+            cds::container::RWQueue<
+                int
+                ,cds::opt::lock_type< cds::SpinLock >
+            >
+        >();
+    }
+
+    void Queue_TestHeader::RWQueue_Counted()
+    {
+        testWithItemCounter<
+            cds::container::RWQueue<
+            int
+            ,cds::opt::lock_type< cds::SpinLock >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        >();
+    }
+}
diff --git a/tests/test-hdr/queue/hdr_segmented_queue.h b/tests/test-hdr/queue/hdr_segmented_queue.h
new file mode 100644 (file)
index 0000000..acb415c
--- /dev/null
@@ -0,0 +1,242 @@
+//$$CDS-header$$
+
+#ifndef __CDSHDR_QUEUE_SEGMENTED_QUEUE_H
+#define __CDSHDR_QUEUE_SEGMENTED_QUEUE_H
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/intrusive/base.h>
+#include <cds/ref.h>
+#include "size_check.h"
+
+namespace queue {
+
+    class HdrSegmentedQueue: public CppUnitMini::TestCase
+    {
+        struct item {
+            size_t nVal;
+
+            item() {}
+            item( size_t v ): nVal(v) {}
+            item( size_t nMajor, size_t nMinor ): nVal( nMajor * 16 + nMinor ) {}
+        };
+
+        struct other_item {
+            size_t  nVal;
+        };
+
+        struct push_functor {
+            void operator()( item& dest, other_item const& src ) const
+            {
+                dest.nVal = src.nVal;
+            }
+        };
+
+        struct pop_functor {
+            size_t nCount;
+
+            void operator()( other_item& dest, item const& src )
+            {
+                dest.nVal = src.nVal;
+                ++nCount;
+            }
+
+            pop_functor()
+                : nCount(0)
+            {}
+        };
+
+        template <typename Queue>
+        void test()
+        {
+            for ( size_t nQuasiFactor = 2; nQuasiFactor <= 256; ++nQuasiFactor ) {
+                CPPUNIT_MSG( "QuasiFactor=" << nQuasiFactor << "..." );
+                test_qf<Queue>( nQuasiFactor );
+            }
+        }
+
+        template <typename Queue>
+        void test_qf( size_t nQuasiFactor )
+        {
+            typedef typename Queue::value_type value_type;
+
+            static size_t const c_nItemCount = 1000;
+
+            {
+                Queue q( nQuasiFactor );
+                CPPUNIT_CHECK( q.quasi_factor() == cds::beans::ceil2(nQuasiFactor) );
+                CPPUNIT_CHECK( q.empty() );
+                CPPUNIT_CHECK( misc::check_size( q, 0 ));
+
+                // push/enqueue
+                for ( size_t i = 0; i < c_nItemCount; ++i ) {
+                    if ( i & 1 ) {
+                        CPPUNIT_ASSERT( q.push(item(i)) );
+                    }
+                    else {
+                        CPPUNIT_ASSERT( q.enqueue(item(i)) );
+                    }
+                    CPPUNIT_CHECK( misc::check_size( q, i + 1 ));
+                    CPPUNIT_CHECK( !q.empty() );
+                }
+
+                // pop/dequeue
+                size_t nCount = 0;
+                while ( !q.empty() ) {
+                    value_type v;
+                    if ( nCount & 1 ) {
+                        CPPUNIT_ASSERT( q.pop( v ) );
+                    }
+                    else {
+                        CPPUNIT_ASSERT( q.dequeue( v ));
+                    }
+
+                    int nSegment = int( nCount / q.quasi_factor() );
+                    int nMin = nSegment * int(q.quasi_factor());
+                    int nMax = nMin + int(q.quasi_factor()) - 1;
+                    CPPUNIT_CHECK_EX( nMin <= static_cast<int>(v.nVal) && static_cast<int>( v.nVal ) <= nMax, nMin << " <= " << v.nVal << " <= " << nMax );
+
+                    ++nCount;
+                    CPPUNIT_CHECK( misc::check_size( q, c_nItemCount - nCount ));
+                }
+                CPPUNIT_CHECK( nCount == c_nItemCount );
+                CPPUNIT_CHECK( q.empty() );
+                CPPUNIT_CHECK( misc::check_size( q, 0 ));
+
+
+                // push/pop with functor
+                for ( size_t i = 0; i < c_nItemCount; ++i ) {
+                    other_item itm;
+                    itm.nVal = i;
+                    if ( i & 1 ) {
+                        CPPUNIT_ASSERT( q.push( itm, push_functor() ));
+                    }
+                    else {
+                        CPPUNIT_ASSERT( q.enqueue( itm, push_functor() ));
+                    }
+                    CPPUNIT_CHECK( misc::check_size( q, i + 1 ));
+                    CPPUNIT_CHECK( !q.empty() );
+                }
+
+                {
+                    pop_functor pf;
+                    other_item v;
+
+                    nCount = 0;
+                    while ( !q.empty() ) {
+                        if ( nCount & 1 ) {
+                            CPPUNIT_ASSERT( q.pop( v, cds::ref(pf) ));
+                        }
+                        else {
+                            CPPUNIT_ASSERT( q.dequeue( v, cds::ref(pf) ));
+                        }
+
+                        // It is possible c_nItemCount % quasi_factor() != 0
+                        // In this case the segment cannot be calculated here
+                        size_t nMin = nCount > q.quasi_factor() ? nCount - q.quasi_factor() : 0;
+                        size_t nMax = nCount + q.quasi_factor();
+                        CPPUNIT_CHECK_EX( nMin <= v.nVal && v.nVal <= nMax, nMin << " <= " << v.nVal << " <= " << nMax );
+
+                        ++nCount;
+                        CPPUNIT_CHECK( pf.nCount == nCount );
+                        CPPUNIT_CHECK( misc::check_size( q, c_nItemCount - nCount ));
+                    }
+                    CPPUNIT_CHECK( nCount == c_nItemCount );
+                    CPPUNIT_CHECK( q.empty() );
+                    CPPUNIT_CHECK( misc::check_size( q, 0 ));
+                }
+
+                //emplace
+#       ifdef CDS_EMPLACE_SUPPORT
+                {
+                    size_t nMajor = 0;
+                    size_t nMinor = 0;
+                    for ( size_t i = 0; i < c_nItemCount; ++i ) {
+                        CPPUNIT_CHECK( q.emplace( nMajor, nMinor ));
+                        if ( nMinor  == 15 ) {
+                            ++nMajor;
+                            nMinor = 0;
+                        }
+                        else
+                            ++nMinor;
+                        CPPUNIT_CHECK( !q.empty() );
+                    }
+                    CPPUNIT_CHECK( misc::check_size( q, c_nItemCount ));
+
+                    nCount = 0;
+                    while ( !q.empty() ) {
+                        value_type v;
+                        if ( nCount & 1 ) {
+                            CPPUNIT_ASSERT( q.pop( v ) );
+                        }
+                        else {
+                            CPPUNIT_ASSERT( q.dequeue( v ));
+                        }
+
+                        size_t nMin = nCount > q.quasi_factor() ? nCount - q.quasi_factor() : 0;
+                        size_t nMax = nCount + q.quasi_factor();
+                        CPPUNIT_CHECK_EX( nMin <= v.nVal && v.nVal <= nMax, nMin << " <= " << v.nVal << " <= " << nMax );
+
+                        ++nCount;
+                        CPPUNIT_CHECK( misc::check_size( q, c_nItemCount - nCount ));
+                    }
+                    CPPUNIT_CHECK( nCount == c_nItemCount );
+                    CPPUNIT_CHECK( q.empty() );
+                    CPPUNIT_CHECK( misc::check_size( q, 0 ));
+                }
+#       endif
+
+                // pop from empty queue
+                {
+                    value_type v;
+                    v.nVal = c_nItemCount + 1;
+                    CPPUNIT_CHECK( q.empty() );
+                    CPPUNIT_ASSERT( !q.pop( v ));
+                    CPPUNIT_CHECK( q.empty() );
+                    CPPUNIT_CHECK( misc::check_size( q, 0 ));
+                    CPPUNIT_CHECK( v.nVal == c_nItemCount + 1 );
+                }
+
+                // clear
+                for ( size_t i = 0; i < c_nItemCount; ++i ) {
+                    if ( i & 1 ) {
+                        CPPUNIT_ASSERT( q.push(item(i)) );
+                    }
+                    else {
+                        CPPUNIT_ASSERT( q.enqueue(item(i)) );
+                    }
+                    CPPUNIT_CHECK( misc::check_size( q, i + 1 ));
+                    CPPUNIT_CHECK( !q.empty() );
+                }
+
+                q.clear();
+                CPPUNIT_CHECK( misc::check_size( q, 0 ));
+                CPPUNIT_CHECK( q.empty() );
+            }
+        }
+
+        void SegmQueue_HP();
+        void SegmQueue_HP_mutex();
+        void SegmQueue_HP_shuffle();
+        void SegmQueue_HP_stat();
+
+        void SegmQueue_PTB();
+        void SegmQueue_PTB_mutex();
+        void SegmQueue_PTB_shuffle();
+        void SegmQueue_PTB_stat();
+
+        CPPUNIT_TEST_SUITE(HdrSegmentedQueue)
+            CPPUNIT_TEST( SegmQueue_HP )
+            CPPUNIT_TEST( SegmQueue_HP_mutex )
+            CPPUNIT_TEST( SegmQueue_HP_shuffle )
+            CPPUNIT_TEST( SegmQueue_HP_stat )
+
+            CPPUNIT_TEST( SegmQueue_PTB )
+            CPPUNIT_TEST( SegmQueue_PTB_mutex )
+            CPPUNIT_TEST( SegmQueue_PTB_shuffle )
+            CPPUNIT_TEST( SegmQueue_PTB_stat )
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+} // namespace queue
+
+#endif //#ifndef __CDSHDR_QUEUE_SEGMENTED_QUEUE_H
diff --git a/tests/test-hdr/queue/hdr_segmented_queue_hp.cpp b/tests/test-hdr/queue/hdr_segmented_queue_hp.cpp
new file mode 100644 (file)
index 0000000..bcecfc0
--- /dev/null
@@ -0,0 +1,54 @@
+//$$CDS-header$$
+
+#include "hdr_segmented_queue.h"
+#include <cds/container/segmented_queue.h>
+#include <cds/gc/hp.h>
+
+namespace queue {
+
+    void HdrSegmentedQueue::SegmQueue_HP()
+    {
+        typedef cds::container::SegmentedQueue< cds::gc::HP, item > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrSegmentedQueue::SegmQueue_HP_mutex()
+    {
+        typedef cds::container::SegmentedQueue< cds::gc::HP, item,
+            cds::container::segmented_queue::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrSegmentedQueue::SegmQueue_HP_shuffle()
+    {
+        typedef cds::container::SegmentedQueue< cds::gc::HP, item,
+            cds::container::segmented_queue::make_traits<
+                cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::permutation_generator< cds::opt::v::random_shuffle_permutation<> >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrSegmentedQueue::SegmQueue_HP_stat()
+    {
+        typedef cds::container::SegmentedQueue< cds::gc::HP, item,
+            cds::container::segmented_queue::make_traits<
+                cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::permutation_generator< cds::opt::v::random_permutation<> >
+                ,cds::opt::stat< cds::container::segmented_queue::stat<> >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+} // namespace queue
+
+CPPUNIT_TEST_SUITE_REGISTRATION(queue::HdrSegmentedQueue);
diff --git a/tests/test-hdr/queue/hdr_segmented_queue_ptb.cpp b/tests/test-hdr/queue/hdr_segmented_queue_ptb.cpp
new file mode 100644 (file)
index 0000000..74788a1
--- /dev/null
@@ -0,0 +1,52 @@
+//$$CDS-header$$
+
+#include "hdr_segmented_queue.h"
+#include <cds/container/segmented_queue.h>
+#include <cds/gc/ptb.h>
+
+namespace queue {
+
+    void HdrSegmentedQueue::SegmQueue_PTB()
+    {
+        typedef cds::container::SegmentedQueue< cds::gc::PTB, item > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrSegmentedQueue::SegmQueue_PTB_mutex()
+    {
+        typedef cds::container::SegmentedQueue< cds::gc::PTB, item,
+            cds::container::segmented_queue::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrSegmentedQueue::SegmQueue_PTB_shuffle()
+    {
+        typedef cds::container::SegmentedQueue< cds::gc::PTB, item,
+            cds::container::segmented_queue::make_traits<
+                cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::permutation_generator< cds::opt::v::random_shuffle_permutation<> >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+    void HdrSegmentedQueue::SegmQueue_PTB_stat()
+    {
+        typedef cds::container::SegmentedQueue< cds::gc::PTB, item,
+            cds::container::segmented_queue::make_traits<
+                cds::opt::item_counter< cds::atomicity::item_counter >
+                ,cds::opt::permutation_generator< cds::opt::v::random_permutation<> >
+                ,cds::opt::stat< cds::container::segmented_queue::stat<> >
+            >::type
+        > queue_type;
+
+        test<queue_type>();
+    }
+
+} // namespace queue
diff --git a/tests/test-hdr/queue/hdr_vyukov_mpmc_cyclic.cpp b/tests/test-hdr/queue/hdr_vyukov_mpmc_cyclic.cpp
new file mode 100644 (file)
index 0000000..4041acb
--- /dev/null
@@ -0,0 +1,53 @@
+//$$CDS-header$$
+
+#include <cds/container/vyukov_mpmc_cycle_queue.h>
+
+#include "queue/queue_test_header.h"
+
+namespace queue {
+    namespace {
+        class VyukovMPMCCyclicQueue_int:
+            public cds::container::VyukovMPMCCycleQueue<
+                int,
+                cds::opt::buffer<cds::opt::v::static_buffer<int, 1024 *32 > >
+            >
+        {
+            typedef cds::container::VyukovMPMCCycleQueue<
+                int,
+                cds::opt::buffer<cds::opt::v::static_buffer<int, 1024 *32 > >
+            > base_class;
+        public:
+            VyukovMPMCCyclicQueue_int()
+                : base_class(1024 * 32)
+            {}
+        };
+
+        class VyukovMPMCCyclicQueue_int_ic:
+            public cds::container::VyukovMPMCCycleQueue<
+                int,
+                cds::opt::buffer<cds::opt::v::dynamic_buffer<int> >,
+                cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        {
+            typedef cds::container::VyukovMPMCCycleQueue<
+                int,
+                cds::opt::buffer<cds::opt::v::dynamic_buffer<int> >,
+                cds::opt::item_counter< cds::atomicity::item_counter >
+            > base_class;
+        public:
+            VyukovMPMCCyclicQueue_int_ic()
+                : base_class( 32 * 1024 )
+            {}
+        };
+    }
+
+    void Queue_TestHeader::Vyukov_MPMCCyclicQueue()
+    {
+        testNoItemCounter< VyukovMPMCCyclicQueue_int >();
+    }
+
+    void Queue_TestHeader::Vyukov_MPMCCyclicQueue_Counted()
+    {
+        testWithItemCounter< VyukovMPMCCyclicQueue_int_ic >();
+    }
+}
diff --git a/tests/test-hdr/queue/queue_test_header.cpp b/tests/test-hdr/queue/queue_test_header.cpp
new file mode 100644 (file)
index 0000000..8a00355
--- /dev/null
@@ -0,0 +1,4 @@
+//$$CDS-header$$
+
+#include "queue/queue_test_header.h"
+CPPUNIT_TEST_SUITE_REGISTRATION(queue::Queue_TestHeader);
diff --git a/tests/test-hdr/queue/queue_test_header.h b/tests/test-hdr/queue/queue_test_header.h
new file mode 100644 (file)
index 0000000..be39266
--- /dev/null
@@ -0,0 +1,423 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_QUEUE_SIMPLE_H
+#define __UNIT_QUEUE_SIMPLE_H
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/details/defs.h>
+
+namespace queue {
+
+    //
+    // Test queue operation in single thread mode
+    //
+    class Queue_TestHeader: public CppUnitMini::TestCase
+    {
+    protected:
+        template <class Queue>
+        void testNoItemCounter()
+        {
+            Queue   q;
+            test_with( q );
+            test_emplace( q );
+        }
+
+        template <class Queue>
+        void test_with( Queue& q )
+        {
+            int     it;
+            int     nPrev;
+
+            for ( size_t i = 0; i < 3; ++i ) {
+                CPPUNIT_ASSERT( q.empty() );
+#ifndef _DEBUG
+                CPPUNIT_ASSERT( q.size() == 0 );
+#endif
+                CPPUNIT_ASSERT( q.enqueue( 1 ) );
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_ASSERT( q.push( 10 ) );
+                CPPUNIT_ASSERT( !q.empty() );
+#ifndef _DEBUG
+                CPPUNIT_ASSERT( q.size() == 0 )     ;   // no queue's item counter!
+#endif
+
+                it = -1;
+                CPPUNIT_ASSERT( q.pop( it ) );
+                CPPUNIT_ASSERT( it == 1 );
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_ASSERT( q.dequeue( it ) );
+                CPPUNIT_ASSERT( it == 10 );
+#ifndef _DEBUG
+                CPPUNIT_ASSERT( q.size() == 0 );
+#endif
+                CPPUNIT_ASSERT( q.empty() );
+                it += 2009;
+                nPrev = it;
+                CPPUNIT_ASSERT( !q.dequeue( it ) );
+                CPPUNIT_ASSERT( it == nPrev )       ;   // it must not be changed!
+            }
+        }
+
+        template <class Queue>
+        void test_emplace( Queue& q )
+        {
+#   ifdef CDS_EMPLACE_SUPPORT
+            int     it;
+            for ( size_t i = 0; i < 3; ++i ) {
+                CPPUNIT_ASSERT( q.emplace( static_cast<int>( i * 42 )) );
+                CPPUNIT_ASSERT( !q.empty() );
+                it = -1;
+                CPPUNIT_ASSERT( q.pop( it ));
+                CPPUNIT_ASSERT( it == static_cast<int>( i * 42 ));
+                CPPUNIT_ASSERT( q.empty() );
+            }
+#   endif
+        }
+
+        template <class Queue>
+        void testWithItemCounter()
+        {
+            Queue   q;
+            test_ic_with( q );
+            test_emplace_ic( q );
+        }
+
+        template <class Queue>
+        void testFCQueue()
+        {
+            Queue   q;
+            test_ic_with( q );
+        }
+
+        template <class Queue>
+        void test_ic_with( Queue& q )
+        {
+            int     it;
+            int     nPrev;
+
+            for ( size_t i = 0; i < 3; ++i ) {
+                CPPUNIT_ASSERT( q.empty() );
+                CPPUNIT_ASSERT( q.size() == 0 );
+                CPPUNIT_ASSERT( q.enqueue( 1 ) );
+                CPPUNIT_ASSERT( q.size() == 1 );
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_ASSERT( q.push( 10 ) );
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_ASSERT( q.size() == 2 );
+
+                it = -1;
+                CPPUNIT_ASSERT( q.pop( it ) );
+                CPPUNIT_ASSERT( it == 1 );
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_ASSERT( q.size() == 1 );
+                CPPUNIT_ASSERT( q.dequeue( it ) );
+                CPPUNIT_ASSERT( it == 10 );
+                CPPUNIT_ASSERT( q.size() == 0 );
+                CPPUNIT_ASSERT( q.empty() );
+                CPPUNIT_ASSERT( q.size() == 0 );
+                it += 2009;
+                nPrev = it;
+                CPPUNIT_ASSERT( !q.dequeue( it ) );
+                CPPUNIT_ASSERT( it == nPrev )       ;   // it must not be changed!
+
+                CPPUNIT_ASSERT( q.empty() );
+                CPPUNIT_ASSERT( q.size() == 0 );
+            }
+        }
+
+        template <class Queue>
+        void test_emplace_ic( Queue& q )
+        {
+#   ifdef CDS_EMPLACE_SUPPORT
+            int     it = 0;
+            for ( size_t i = 0; i < 3; ++i ) {
+                CPPUNIT_ASSERT( q.emplace( (int) i * 10 ) );
+                CPPUNIT_ASSERT( !q.empty() );
+                CPPUNIT_ASSERT( q.size() == 1 );
+                CPPUNIT_ASSERT( q.pop( it ));
+                CPPUNIT_ASSERT( it == (int) i * 10 );
+                CPPUNIT_ASSERT( q.empty() );
+                CPPUNIT_ASSERT( q.size() == 0 );
+            }
+#   endif
+        }
+
+    public:
+        void MSQueue_HP();
+        void MSQueue_HP_relax();
+        void MSQueue_HP_seqcst();
+        void MSQueue_HP_relax_align();
+        void MSQueue_HP_seqcst_align();
+        void MSQueue_HP_Counted();
+        void MSQueue_HP_Counted_relax();
+        void MSQueue_HP_Counted_seqcst();
+        void MSQueue_HP_Counted_relax_align();
+        void MSQueue_HP_Counted_seqcst_align();
+
+        void MSQueue_HRC();
+        void MSQueue_HRC_relax();
+        void MSQueue_HRC_seqcst();
+        void MSQueue_HRC_relax_align();
+        void MSQueue_HRC_seqcst_align();
+        void MSQueue_HRC_Counted();
+        void MSQueue_HRC_Counted_relax();
+        void MSQueue_HRC_Counted_seqcst();
+        void MSQueue_HRC_Counted_relax_align();
+        void MSQueue_HRC_Counted_seqcst_align();
+
+        void MSQueue_PTB();
+        void MSQueue_PTB_relax();
+        void MSQueue_PTB_seqcst();
+        void MSQueue_PTB_relax_align();
+        void MSQueue_PTB_seqcst_align();
+        void MSQueue_PTB_Counted();
+        void MSQueue_PTB_Counted_relax();
+        void MSQueue_PTB_Counted_seqcst();
+        void MSQueue_PTB_Counted_relax_align();
+        void MSQueue_PTB_Counted_seqcst_align();
+
+        void MoirQueue_HP();
+        void MoirQueue_HP_relax();
+        void MoirQueue_HP_seqcst();
+        void MoirQueue_HP_relax_align();
+        void MoirQueue_HP_seqcst_align();
+        void MoirQueue_HP_Counted();
+        void MoirQueue_HP_Counted_relax();
+        void MoirQueue_HP_Counted_seqcst();
+        void MoirQueue_HP_Counted_relax_align();
+        void MoirQueue_HP_Counted_seqcst_align();
+
+        void MoirQueue_HRC();
+        void MoirQueue_HRC_relax();
+        void MoirQueue_HRC_seqcst();
+        void MoirQueue_HRC_relax_align();
+        void MoirQueue_HRC_seqcst_align();
+        void MoirQueue_HRC_Counted();
+        void MoirQueue_HRC_Counted_relax();
+        void MoirQueue_HRC_Counted_seqcst();
+        void MoirQueue_HRC_Counted_relax_align();
+        void MoirQueue_HRC_Counted_seqcst_align();
+
+        void MoirQueue_PTB();
+        void MoirQueue_PTB_relax();
+        void MoirQueue_PTB_seqcst();
+        void MoirQueue_PTB_relax_align();
+        void MoirQueue_PTB_seqcst_align();
+        void MoirQueue_PTB_Counted();
+        void MoirQueue_PTB_Counted_relax();
+        void MoirQueue_PTB_Counted_seqcst();
+        void MoirQueue_PTB_Counted_relax_align();
+        void MoirQueue_PTB_Counted_seqcst_align();
+
+        void OptimisticQueue_HP();
+        void OptimisticQueue_HP_relax();
+        void OptimisticQueue_HP_seqcst();
+        void OptimisticQueue_HP_relax_align();
+        void OptimisticQueue_HP_seqcst_align();
+        void OptimisticQueue_HP_Counted();
+        void OptimisticQueue_HP_Counted_relax();
+        void OptimisticQueue_HP_Counted_seqcst();
+        void OptimisticQueue_HP_Counted_relax_align();
+        void OptimisticQueue_HP_Counted_seqcst_align();
+
+        void OptimisticQueue_PTB();
+        void OptimisticQueue_PTB_relax();
+        void OptimisticQueue_PTB_seqcst();
+        void OptimisticQueue_PTB_relax_align();
+        void OptimisticQueue_PTB_seqcst_align();
+        void OptimisticQueue_PTB_Counted();
+        void OptimisticQueue_PTB_Counted_relax();
+        void OptimisticQueue_PTB_Counted_seqcst();
+        void OptimisticQueue_PTB_Counted_relax_align();
+        void OptimisticQueue_PTB_Counted_seqcst_align();
+
+        void BasketQueue_HP();
+        void BasketQueue_HP_relax();
+        void BasketQueue_HP_seqcst();
+        void BasketQueue_HP_relax_align();
+        void BasketQueue_HP_seqcst_align();
+        void BasketQueue_HP_Counted();
+        void BasketQueue_HP_Counted_relax();
+        void BasketQueue_HP_Counted_seqcst();
+        void BasketQueue_HP_Counted_relax_align();
+        void BasketQueue_HP_Counted_seqcst_align();
+
+        void BasketQueue_HRC();
+        void BasketQueue_HRC_relax();
+        void BasketQueue_HRC_seqcst();
+        void BasketQueue_HRC_relax_align();
+        void BasketQueue_HRC_seqcst_align();
+        void BasketQueue_HRC_Counted();
+        void BasketQueue_HRC_Counted_relax();
+        void BasketQueue_HRC_Counted_seqcst();
+        void BasketQueue_HRC_Counted_relax_align();
+        void BasketQueue_HRC_Counted_seqcst_align();
+
+        void BasketQueue_PTB();
+        void BasketQueue_PTB_relax();
+        void BasketQueue_PTB_seqcst();
+        void BasketQueue_PTB_relax_align();
+        void BasketQueue_PTB_seqcst_align();
+        void BasketQueue_PTB_Counted();
+        void BasketQueue_PTB_Counted_relax();
+        void BasketQueue_PTB_Counted_seqcst();
+        void BasketQueue_PTB_Counted_relax_align();
+        void BasketQueue_PTB_Counted_seqcst_align();
+
+        void FCQueue_deque();
+        void FCQueue_deque_elimination();
+        void FCQueue_deque_mutex();
+        void FCQueue_deque_stat();
+        void FCQueue_list();
+        void FCQueue_list_elimination();
+        void FCQueue_list_mutex();
+        void FCQueue_list_stat();
+
+        void Vyukov_MPMCCyclicQueue();
+        void Vyukov_MPMCCyclicQueue_Counted();
+
+        void RWQueue_();
+        void RWQueue_Counted();
+
+        CPPUNIT_TEST_SUITE(Queue_TestHeader)
+            CPPUNIT_TEST(MSQueue_HP);
+            CPPUNIT_TEST(MSQueue_HP_relax);
+            CPPUNIT_TEST(MSQueue_HP_seqcst);
+            CPPUNIT_TEST(MSQueue_HP_relax_align);
+            CPPUNIT_TEST(MSQueue_HP_seqcst_align);
+            CPPUNIT_TEST(MSQueue_HP_Counted);
+            CPPUNIT_TEST(MSQueue_HP_Counted_relax);
+            CPPUNIT_TEST(MSQueue_HP_Counted_seqcst);
+            CPPUNIT_TEST(MSQueue_HP_Counted_relax_align);
+            CPPUNIT_TEST(MSQueue_HP_Counted_seqcst_align);
+
+            CPPUNIT_TEST(MSQueue_HRC);
+            CPPUNIT_TEST(MSQueue_HRC_relax);
+            CPPUNIT_TEST(MSQueue_HRC_seqcst);
+            CPPUNIT_TEST(MSQueue_HRC_relax_align);
+            CPPUNIT_TEST(MSQueue_HRC_seqcst_align);
+            CPPUNIT_TEST(MSQueue_HRC_Counted);
+            CPPUNIT_TEST(MSQueue_HRC_Counted_relax);
+            CPPUNIT_TEST(MSQueue_HRC_Counted_seqcst);
+            CPPUNIT_TEST(MSQueue_HRC_Counted_relax_align);
+            CPPUNIT_TEST(MSQueue_HRC_Counted_seqcst_align);
+
+            CPPUNIT_TEST(MSQueue_PTB);
+            CPPUNIT_TEST(MSQueue_PTB_relax);
+            CPPUNIT_TEST(MSQueue_PTB_seqcst);
+            CPPUNIT_TEST(MSQueue_PTB_relax_align);
+            CPPUNIT_TEST(MSQueue_PTB_seqcst_align);
+            CPPUNIT_TEST(MSQueue_PTB_Counted);
+            CPPUNIT_TEST(MSQueue_PTB_Counted_relax);
+            CPPUNIT_TEST(MSQueue_PTB_Counted_seqcst);
+            CPPUNIT_TEST(MSQueue_PTB_Counted_relax_align);
+            CPPUNIT_TEST(MSQueue_PTB_Counted_seqcst_align);
+
+            CPPUNIT_TEST(MoirQueue_HP);
+            CPPUNIT_TEST(MoirQueue_HP_relax);
+            CPPUNIT_TEST(MoirQueue_HP_seqcst);
+            CPPUNIT_TEST(MoirQueue_HP_relax_align);
+            CPPUNIT_TEST(MoirQueue_HP_seqcst_align);
+            CPPUNIT_TEST(MoirQueue_HP_Counted);
+            CPPUNIT_TEST(MoirQueue_HP_Counted_relax);
+            CPPUNIT_TEST(MoirQueue_HP_Counted_seqcst);
+            CPPUNIT_TEST(MoirQueue_HP_Counted_relax_align);
+            CPPUNIT_TEST(MoirQueue_HP_Counted_seqcst_align);
+
+            CPPUNIT_TEST(MoirQueue_HRC);
+            CPPUNIT_TEST(MoirQueue_HRC_relax);
+            CPPUNIT_TEST(MoirQueue_HRC_seqcst);
+            CPPUNIT_TEST(MoirQueue_HRC_relax_align);
+            CPPUNIT_TEST(MoirQueue_HRC_seqcst_align);
+            CPPUNIT_TEST(MoirQueue_HRC_Counted);
+            CPPUNIT_TEST(MoirQueue_HRC_Counted_relax);
+            CPPUNIT_TEST(MoirQueue_HRC_Counted_seqcst);
+            CPPUNIT_TEST(MoirQueue_HRC_Counted_relax_align);
+            CPPUNIT_TEST(MoirQueue_HRC_Counted_seqcst_align);
+
+            CPPUNIT_TEST(MoirQueue_PTB);
+            CPPUNIT_TEST(MoirQueue_PTB_relax);
+            CPPUNIT_TEST(MoirQueue_PTB_seqcst);
+            CPPUNIT_TEST(MoirQueue_PTB_relax_align);
+            CPPUNIT_TEST(MoirQueue_PTB_seqcst_align);
+            CPPUNIT_TEST(MoirQueue_PTB_Counted);
+            CPPUNIT_TEST(MoirQueue_PTB_Counted_relax);
+            CPPUNIT_TEST(MoirQueue_PTB_Counted_seqcst);
+            CPPUNIT_TEST(MoirQueue_PTB_Counted_relax_align);
+            CPPUNIT_TEST(MoirQueue_PTB_Counted_seqcst_align);
+
+            CPPUNIT_TEST(OptimisticQueue_HP);
+            CPPUNIT_TEST(OptimisticQueue_HP_relax);
+            CPPUNIT_TEST(OptimisticQueue_HP_seqcst);
+            CPPUNIT_TEST(OptimisticQueue_HP_relax_align);
+            CPPUNIT_TEST(OptimisticQueue_HP_seqcst_align);
+            CPPUNIT_TEST(OptimisticQueue_HP_Counted);
+            CPPUNIT_TEST(OptimisticQueue_HP_Counted_relax);
+            CPPUNIT_TEST(OptimisticQueue_HP_Counted_seqcst);
+            CPPUNIT_TEST(OptimisticQueue_HP_Counted_relax_align);
+            CPPUNIT_TEST(OptimisticQueue_HP_Counted_seqcst_align);
+
+            CPPUNIT_TEST(OptimisticQueue_PTB);
+            CPPUNIT_TEST(OptimisticQueue_PTB_relax);
+            CPPUNIT_TEST(OptimisticQueue_PTB_seqcst);
+            CPPUNIT_TEST(OptimisticQueue_PTB_relax_align);
+            CPPUNIT_TEST(OptimisticQueue_PTB_seqcst_align);
+            CPPUNIT_TEST(OptimisticQueue_PTB_Counted);
+            CPPUNIT_TEST(OptimisticQueue_PTB_Counted_relax);
+            CPPUNIT_TEST(OptimisticQueue_PTB_Counted_seqcst);
+            CPPUNIT_TEST(OptimisticQueue_PTB_Counted_relax_align);
+            CPPUNIT_TEST(OptimisticQueue_PTB_Counted_seqcst_align);
+
+            CPPUNIT_TEST(BasketQueue_HP);
+            CPPUNIT_TEST(BasketQueue_HP_relax);
+            CPPUNIT_TEST(BasketQueue_HP_seqcst);
+            CPPUNIT_TEST(BasketQueue_HP_relax_align);
+            CPPUNIT_TEST(BasketQueue_HP_seqcst_align);
+            CPPUNIT_TEST(BasketQueue_HP_Counted);
+            CPPUNIT_TEST(BasketQueue_HP_Counted_relax);
+            CPPUNIT_TEST(BasketQueue_HP_Counted_seqcst);
+            CPPUNIT_TEST(BasketQueue_HP_Counted_relax_align);
+            CPPUNIT_TEST(BasketQueue_HP_Counted_seqcst_align);
+
+            CPPUNIT_TEST(BasketQueue_HRC);
+            CPPUNIT_TEST(BasketQueue_HRC_relax);
+            CPPUNIT_TEST(BasketQueue_HRC_seqcst);
+            CPPUNIT_TEST(BasketQueue_HRC_relax_align);
+            CPPUNIT_TEST(BasketQueue_HRC_seqcst_align);
+            CPPUNIT_TEST(BasketQueue_HRC_Counted);
+            CPPUNIT_TEST(BasketQueue_HRC_Counted_relax);
+            CPPUNIT_TEST(BasketQueue_HRC_Counted_seqcst);
+            CPPUNIT_TEST(BasketQueue_HRC_Counted_relax_align);
+            CPPUNIT_TEST(BasketQueue_HRC_Counted_seqcst_align);
+
+            CPPUNIT_TEST(BasketQueue_PTB);
+            CPPUNIT_TEST(BasketQueue_PTB_relax);
+            CPPUNIT_TEST(BasketQueue_PTB_seqcst);
+            CPPUNIT_TEST(BasketQueue_PTB_relax_align);
+            CPPUNIT_TEST(BasketQueue_PTB_seqcst_align);
+            CPPUNIT_TEST(BasketQueue_PTB_Counted);
+            CPPUNIT_TEST(BasketQueue_PTB_Counted_relax);
+            CPPUNIT_TEST(BasketQueue_PTB_Counted_seqcst);
+            CPPUNIT_TEST(BasketQueue_PTB_Counted_relax_align);
+            CPPUNIT_TEST(BasketQueue_PTB_Counted_seqcst_align);
+
+            CPPUNIT_TEST(FCQueue_deque)
+            CPPUNIT_TEST(FCQueue_deque_elimination)
+            CPPUNIT_TEST(FCQueue_deque_mutex)
+            CPPUNIT_TEST(FCQueue_deque_stat)
+            CPPUNIT_TEST(FCQueue_list)
+            CPPUNIT_TEST(FCQueue_list_elimination)
+            CPPUNIT_TEST(FCQueue_list_mutex)
+            CPPUNIT_TEST(FCQueue_list_stat)
+
+            CPPUNIT_TEST(RWQueue_);
+            CPPUNIT_TEST(RWQueue_Counted);
+
+            CPPUNIT_TEST(Vyukov_MPMCCyclicQueue);
+            CPPUNIT_TEST(Vyukov_MPMCCyclicQueue_Counted);
+        CPPUNIT_TEST_SUITE_END();
+
+    };
+} // namespace queue
+
+#endif // #ifndef __UNIT_QUEUE_SIMPLE_H
diff --git a/tests/test-hdr/set/hdr_cuckoo_set.cpp b/tests/test-hdr/set/hdr_cuckoo_set.cpp
new file mode 100644 (file)
index 0000000..673950b
--- /dev/null
@@ -0,0 +1,630 @@
+//$$CDS-header$$
+
+#include "set/hdr_cuckoo_set.h"
+#include <cds/container/cuckoo_set.h>
+
+namespace set {
+
+    void CuckooSetHdrTest::Cuckoo_Striped_list_unord()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::equal_to< equal< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, equal< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_list_unord_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,co::equal_to< equal< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, equal< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_list_cmp()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_list_cmp_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_list_less()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::striping<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_list_less_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,co::less< less< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_list_less_cmp()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::striping<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_list_less_cmp_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,co::less< less< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_list_less_cmp_eq()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::equal_to< equal< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::striping<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_list_less_cmp_eq_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::equal_to< equal< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+
+    // Vector
+    void CuckooSetHdrTest::Cuckoo_Striped_vector_unord()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::equal_to< equal< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            >::type
+        > set_t;
+
+        test_int<set_t, equal< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_vector_unord_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,co::equal_to< equal< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, equal< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_vector_cmp()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_vector_cmp_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_vector_less()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::striping<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_vector_less_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,co::less< less< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_vector_less_cmp()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::striping<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_vector_less_cmp_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,co::less< less< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_vector_less_cmp_eq()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::equal_to< equal< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::striping<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Striped_vector_less_cmp_eq_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::equal_to< equal< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+    // Refinable set
+    void CuckooSetHdrTest::Cuckoo_Refinable_list_unord()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::equal_to< equal< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::refinable<> >
+            >::type
+        > set_t;
+
+        test_int<set_t, equal< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_list_unord_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,co::equal_to< equal< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, equal< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_list_cmp()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::refinable<> >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_list_cmp_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_list_less()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::refinable<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_list_less_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,co::less< less< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_list_less_cmp()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::refinable<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_list_less_cmp_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,co::less< less< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_list_less_cmp_eq()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::equal_to< equal< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::refinable<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_list_less_cmp_eq_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::equal_to< equal< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::list >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+
+
+    // Refinable Vector
+    void CuckooSetHdrTest::Cuckoo_Refinable_vector_unord()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::equal_to< equal< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                ,co::mutex_policy< cc::cuckoo::refinable<> >
+            >::type
+        > set_t;
+
+        test_int<set_t, equal< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_vector_unord_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,co::equal_to< equal< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, equal< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_vector_cmp()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::refinable<> >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_vector_cmp_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_vector_less()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::refinable<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_vector_less_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,co::less< less< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_vector_less_cmp()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::refinable<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            >::type
+        > set_t;
+
+        test_int<set_t, less< item > >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_vector_less_cmp_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,co::less< less< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< cmp< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_vector_less_cmp_eq()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::equal_to< equal< item > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< cc::cuckoo::refinable<> >
+                ,cc::cuckoo::store_hash< false >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+    void CuckooSetHdrTest::Cuckoo_Refinable_vector_less_cmp_eq_storehash()
+    {
+        typedef cc::CuckooSet< item,
+             cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,co::less< less< item > >
+                ,co::compare< cmp< item > >
+                ,co::equal_to< equal< item > >
+                ,cc::cuckoo::store_hash< true >
+                ,cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+            >::type
+        > set_t;
+
+        test_int<set_t, less<item> >();
+    }
+
+} // namespace set
+
+CPPUNIT_TEST_SUITE_REGISTRATION(set::CuckooSetHdrTest);
diff --git a/tests/test-hdr/set/hdr_cuckoo_set.h b/tests/test-hdr/set/hdr_cuckoo_set.h
new file mode 100644 (file)
index 0000000..f58f9f2
--- /dev/null
@@ -0,0 +1,611 @@
+//$$CDS-header$$
+
+#ifndef __CDSTEST_HDR_CUCKOO_SET_H
+#define __CDSTEST_HDR_CUCKOO_SET_H
+
+#include "cppunit/cppunit_proxy.h"
+#include "size_check.h"
+
+#include <cds/opt/hash.h>
+#include <cds/os/timer.h>
+#include <cds/ref.h>
+#include <algorithm>    // random_shuffle
+
+// forward namespace declaration
+namespace cds {
+    namespace container {}
+    namespace opt {}
+}
+
+namespace set {
+    using misc::check_size;
+
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+
+    class CuckooSetHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        struct stat
+        {
+            unsigned int nFindCount     ;   // count of find-functor calling
+            unsigned int nEnsureNewCount;
+            unsigned int nEnsureCount;
+
+            stat()
+            {
+                memset( this, 0, sizeof(*this));
+            }
+
+            void copy( stat const& s )
+            {
+                nFindCount = s.nFindCount;
+                nEnsureCount = s.nEnsureCount;
+                nEnsureNewCount = s.nEnsureNewCount;
+            }
+        };
+
+        struct item: public stat
+        {
+            int nKey;
+            int nVal;
+
+            item()
+            {}
+
+            item( int key )
+                : nKey( key )
+                , nVal( key )
+            {}
+
+            item (int key, int val )
+                : nKey(key)
+                , nVal( val )
+            {}
+
+            item( std::pair<int,int> const& p )
+                : nKey( p.first )
+                , nVal( p.second )
+            {}
+
+            item( item const& i )
+                : nKey( i.nKey )
+                , nVal( i.nVal )
+            {}
+
+            item& operator=(item const& i)
+            {
+                nKey = i.nKey;
+                nVal = i.nVal;
+                stat::copy(i);
+
+                return *this;
+            }
+
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            item( item&& i )
+                : nKey( i.nKey )
+                , nVal( i.nVal )
+            {}
+#endif
+
+            int key() const
+            {
+                return nKey;
+            }
+
+            int val() const
+            {
+                return nVal;
+            }
+        };
+
+        struct hash1 {
+            size_t operator()( int i ) const
+            {
+                return co::v::hash<int>()( i );
+            }
+
+            size_t operator()( std::pair<int,int> const& i ) const
+            {
+                return co::v::hash<int>()( i.first );
+            }
+
+            template <typename Item>
+            size_t operator()( Item const& i ) const
+            {
+                return (*this)( i.key() );
+            }
+        };
+
+        struct hash2: private hash1
+        {
+            typedef hash1 base_class;
+
+            size_t operator()( int i ) const
+            {
+                return ~( base_class::operator()(i));
+            }
+            template <typename Item>
+            size_t operator()( const Item& i ) const
+            {
+                return ~( base_class::operator()(i));
+            }
+            size_t operator()( std::pair<int,int> const& i ) const
+            {
+                return ~( base_class::operator()(i));
+            }
+        };
+
+        struct simple_item_counter {
+            size_t  m_nCount;
+
+            simple_item_counter()
+                : m_nCount(0)
+            {}
+
+            size_t operator ++()
+            {
+                return ++m_nCount;
+            }
+
+            size_t operator --()
+            {
+                return --m_nCount;
+            }
+
+            void reset()
+            {
+                m_nCount = 0;
+            }
+
+            operator size_t() const
+            {
+                return m_nCount;
+            }
+        };
+
+        template <typename T>
+        struct less
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() < v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() < v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 < v2.key();
+            }
+
+            bool operator ()( std::pair<int, int> const& v1, const T& v2 ) const
+            {
+                return v1.first < v2.key();
+            }
+
+            bool operator ()(const T& v1, std::pair<int, int> const& v2 ) const
+            {
+                return v1.key() < v2.first;
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1.key() < v2.key() )
+                    return -1;
+                return v1.key() > v2.key() ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const T& v1, const Q& v2 ) const
+            {
+                if ( v1.key() < v2 )
+                    return -1;
+                return v1.key() > v2 ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const Q& v1, const T& v2 ) const
+            {
+                if ( v1 < v2.key() )
+                    return -1;
+                return v1 > v2.key() ? 1 : 0;
+            }
+
+            int operator()( std::pair<int,int> const& v1, T const& v2 ) const
+            {
+                if ( v1.first < v2.key() )
+                    return -1;
+                return v1.first > v2.key() ? 1 : 0;
+            }
+
+            int operator()( T const& v1, std::pair<int,int> const& v2 ) const
+            {
+                if ( v1.key() < v2.first )
+                    return -1;
+                return v1.key() > v2.first ? 1 : 0;
+            }
+        };
+
+        template <typename T>
+        struct equal
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() == v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() == v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 == v2.key();
+            }
+
+            bool operator ()( std::pair<int, int> const& v1, const T& v2 ) const
+            {
+                return v1.first == v2.key();
+            }
+
+            bool operator ()(const T& v1, std::pair<int, int> const& v2 ) const
+            {
+                return v1.key() == v2.first;
+            }
+        };
+
+        struct find_functor
+        {
+            template <typename Item, typename T>
+            void operator()( Item& i, T& val )
+            {
+                ++i.nFindCount;
+            }
+            template <typename Item, typename T>
+            void operator()( Item& i, T const& val )
+            {
+                ++i.nFindCount;
+            }
+        };
+
+        template <typename Item>
+        struct copy_found
+        {
+            Item    m_found;
+
+            template <typename T>
+            void operator()( Item& i, T& /*val*/ )
+            {
+                m_found = i;
+            }
+
+            void operator()( Item const& i )
+            {
+                m_found = i;
+            }
+        };
+
+        struct insert_functor
+        {
+            template <typename Item>
+            void operator()(Item& i )
+            {
+                i.nVal = i.nKey * 100;
+            }
+        };
+
+        template <typename Item, typename Q>
+        static void ensure_func( bool bNew, Item& i, Q& /*val*/ )
+        {
+            if ( bNew )
+                ++i.nEnsureNewCount;
+            else
+                ++i.nEnsureCount;
+        }
+
+        struct ensure_functor
+        {
+            template <typename Item, typename Q>
+            void operator()( bool bNew, Item& i, Q& val )
+            {
+                ensure_func( bNew, i, val );
+            }
+        };
+
+        template <class Set, typename Predicate>
+        void test_int_with( Set& s, Predicate pred )
+        {
+            typedef typename Set::value_type    value_type;
+
+            item itm;
+            int key;
+
+            // insert/find test
+            CPPUNIT_ASSERT( !s.find( 10 ) );
+            CPPUNIT_ASSERT( s.insert( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( s.find( 10 ) );
+
+            CPPUNIT_ASSERT( !s.insert( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            CPPUNIT_ASSERT( !s.find_with( 20, pred ) );
+            CPPUNIT_ASSERT( s.insert( std::make_pair(20, 25) ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( s.find_with( 10, pred ) );
+            CPPUNIT_ASSERT( s.find( key = 20 ) );
+            CPPUNIT_ASSERT( s.find_with( key, pred, find_functor() ) );
+            {
+                copy_found<item> f;
+                key = 20;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+                CPPUNIT_ASSERT( f.m_found.nFindCount == 1 );
+            }
+            {
+                copy_found<item> f;
+                key = 20;
+                CPPUNIT_ASSERT( s.find_with( key, pred, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+                CPPUNIT_ASSERT( f.m_found.nFindCount == 1 );
+            }
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( !s.find( 25 ) );
+            CPPUNIT_ASSERT( s.insert( std::make_pair(25, -1), insert_functor() ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            {
+                copy_found<item> f;
+                key = 25;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 25 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 2500 );
+            }
+
+            // ensure test
+            key = 10;
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 10 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 10 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 0 );
+            }
+            std::pair<bool, bool> ensureResult = s.ensure( key, ensure_functor() );
+            CPPUNIT_ASSERT( ensureResult.first && !ensureResult.second );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 10 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 10 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 1 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 0 );
+            }
+
+            ensureResult = s.ensure( std::make_pair(13, 1300), ensure_functor() );
+            CPPUNIT_ASSERT( ensureResult.first && ensureResult.second );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 4 ));
+            {
+                copy_found<item> f;
+                key = 13;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 13 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 1300 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 1 );
+            }
+
+            // erase test
+            CPPUNIT_ASSERT( s.erase(13) );
+            CPPUNIT_ASSERT( !s.find( 13 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            CPPUNIT_ASSERT( !s.erase(13) );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find( 10 ));
+            CPPUNIT_ASSERT( s.erase_with( 10, pred ));
+            CPPUNIT_ASSERT( !s.find( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.erase_with(10, pred) );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( s.find(20) );
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.erase( 20, boost::ref(f) ));
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+
+                CPPUNIT_ASSERT( s.insert(235))
+                    CPPUNIT_ASSERT( s.erase_with( 235, pred, boost::ref(f) ));
+                CPPUNIT_ASSERT( f.m_found.nKey == 235 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 235 );
+            }
+            CPPUNIT_ASSERT( !s.find( 20 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            CPPUNIT_ASSERT( s.emplace( 151 )) ;  // key = 151,  val = 151
+            CPPUNIT_ASSERT( s.emplace( 174, 471 )) ;    // key = 174, val = 471
+            CPPUNIT_ASSERT( s.emplace( std::make_pair( 190, 91 ) )) ; // key == 190, val = 91
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find(151));
+            CPPUNIT_ASSERT( s.find_with(174, pred ));
+            CPPUNIT_ASSERT( s.find(190));
+
+            {
+                copy_found<item> f;
+                key = 151;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 151 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 151 );
+
+                key = 174;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 174 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 471 );
+
+                key = 190;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 190 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 91 );
+            }
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+#       endif
+        }
+
+        template <class Set, class Predicate>
+        void test_int()
+        {
+            Set s( 32, 4, 3 );
+            CPPUNIT_ASSERT( s.bucket_count() == 32 );
+            CPPUNIT_ASSERT( s.lock_count() == 32 );
+
+            cds::OS::Timer    timer;
+
+            test_int_with( s, Predicate() );
+
+            // Resizing test
+            for ( int i = 0; i < 10000; i++ ) {
+                s.insert( i );
+            }
+
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+        }
+
+    public:
+        void Cuckoo_Striped_list_unord();
+        void Cuckoo_Striped_list_unord_storehash();
+        void Cuckoo_Striped_list_cmp();
+        void Cuckoo_Striped_list_cmp_storehash();
+        void Cuckoo_Striped_list_less();
+        void Cuckoo_Striped_list_less_storehash();
+        void Cuckoo_Striped_list_less_cmp();
+        void Cuckoo_Striped_list_less_cmp_storehash();
+        void Cuckoo_Striped_list_less_cmp_eq();
+        void Cuckoo_Striped_list_less_cmp_eq_storehash();
+
+        void Cuckoo_Striped_vector_unord();
+        void Cuckoo_Striped_vector_unord_storehash();
+        void Cuckoo_Striped_vector_cmp();
+        void Cuckoo_Striped_vector_cmp_storehash();
+        void Cuckoo_Striped_vector_less();
+        void Cuckoo_Striped_vector_less_storehash();
+        void Cuckoo_Striped_vector_less_cmp();
+        void Cuckoo_Striped_vector_less_cmp_storehash();
+        void Cuckoo_Striped_vector_less_cmp_eq();
+        void Cuckoo_Striped_vector_less_cmp_eq_storehash();
+
+        void Cuckoo_Refinable_list_unord();
+        void Cuckoo_Refinable_list_unord_storehash();
+        void Cuckoo_Refinable_list_cmp();
+        void Cuckoo_Refinable_list_cmp_storehash();
+        void Cuckoo_Refinable_list_less();
+        void Cuckoo_Refinable_list_less_storehash();
+        void Cuckoo_Refinable_list_less_cmp();
+        void Cuckoo_Refinable_list_less_cmp_storehash();
+        void Cuckoo_Refinable_list_less_cmp_eq();
+        void Cuckoo_Refinable_list_less_cmp_eq_storehash();
+
+        void Cuckoo_Refinable_vector_unord();
+        void Cuckoo_Refinable_vector_unord_storehash();
+        void Cuckoo_Refinable_vector_cmp();
+        void Cuckoo_Refinable_vector_cmp_storehash();
+        void Cuckoo_Refinable_vector_less();
+        void Cuckoo_Refinable_vector_less_storehash();
+        void Cuckoo_Refinable_vector_less_cmp();
+        void Cuckoo_Refinable_vector_less_cmp_storehash();
+        void Cuckoo_Refinable_vector_less_cmp_eq();
+        void Cuckoo_Refinable_vector_less_cmp_eq_storehash();
+
+        CPPUNIT_TEST_SUITE(CuckooSetHdrTest)
+            CPPUNIT_TEST( Cuckoo_Striped_list_unord)
+            CPPUNIT_TEST( Cuckoo_Striped_list_unord_storehash)
+            CPPUNIT_TEST( Cuckoo_Striped_list_cmp)
+            CPPUNIT_TEST( Cuckoo_Striped_list_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_Striped_list_less)
+            CPPUNIT_TEST( Cuckoo_Striped_list_less_storehash)
+            CPPUNIT_TEST( Cuckoo_Striped_list_less_cmp)
+            CPPUNIT_TEST( Cuckoo_Striped_list_less_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_Striped_list_less_cmp_eq)
+            CPPUNIT_TEST( Cuckoo_Striped_list_less_cmp_eq_storehash)
+
+            CPPUNIT_TEST( Cuckoo_Striped_vector_unord)
+            CPPUNIT_TEST( Cuckoo_Striped_vector_unord_storehash)
+            CPPUNIT_TEST( Cuckoo_Striped_vector_cmp)
+            CPPUNIT_TEST( Cuckoo_Striped_vector_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_Striped_vector_less)
+            CPPUNIT_TEST( Cuckoo_Striped_vector_less_storehash)
+            CPPUNIT_TEST( Cuckoo_Striped_vector_less_cmp)
+            CPPUNIT_TEST( Cuckoo_Striped_vector_less_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_Striped_vector_less_cmp_eq)
+            CPPUNIT_TEST( Cuckoo_Striped_vector_less_cmp_eq_storehash)
+
+            CPPUNIT_TEST( Cuckoo_Refinable_list_unord)
+            CPPUNIT_TEST( Cuckoo_Refinable_list_unord_storehash)
+            CPPUNIT_TEST( Cuckoo_Refinable_list_cmp)
+            CPPUNIT_TEST( Cuckoo_Refinable_list_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_Refinable_list_less)
+            CPPUNIT_TEST( Cuckoo_Refinable_list_less_storehash)
+            CPPUNIT_TEST( Cuckoo_Refinable_list_less_cmp)
+            CPPUNIT_TEST( Cuckoo_Refinable_list_less_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_Refinable_list_less_cmp_eq)
+            CPPUNIT_TEST( Cuckoo_Refinable_list_less_cmp_eq_storehash)
+
+            CPPUNIT_TEST( Cuckoo_Refinable_vector_unord)
+            CPPUNIT_TEST( Cuckoo_Refinable_vector_unord_storehash)
+            CPPUNIT_TEST( Cuckoo_Refinable_vector_cmp)
+            CPPUNIT_TEST( Cuckoo_Refinable_vector_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_Refinable_vector_less)
+            CPPUNIT_TEST( Cuckoo_Refinable_vector_less_storehash)
+            CPPUNIT_TEST( Cuckoo_Refinable_vector_less_cmp)
+            CPPUNIT_TEST( Cuckoo_Refinable_vector_less_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_Refinable_vector_less_cmp_eq)
+            CPPUNIT_TEST( Cuckoo_Refinable_vector_less_cmp_eq_storehash)
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+} // namespace set
+
+#endif // #ifndef __CDSTEST_HDR_CUCKOO_SET_H
diff --git a/tests/test-hdr/set/hdr_intrusive_cuckoo_refinable_set.cpp b/tests/test-hdr/set/hdr_intrusive_cuckoo_refinable_set.cpp
new file mode 100644 (file)
index 0000000..12523c7
--- /dev/null
@@ -0,0 +1,646 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_cuckoo_set.h"
+#include <cds/intrusive/cuckoo_set.h>
+
+#include "set/intrusive_cuckoo_set_common.h"
+#include "../unit/print_cuckoo_stat.h"
+
+namespace set {
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_basehook_equal()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 0 > >  item_type;
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                co::hash< std::tuple< hash1, hash2 > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_basehook_equal()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_basehook_sort_cmp()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_basehook_sort_cmp()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_basehook_sort_less()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_basehook_sort_less()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_basehook_sort_cmpmix()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_basehook_sort_cmpmix()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<8>, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_basehook_sort_cmpmix_stat()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<8>, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+                ,co::stat< ci::cuckoo::stat >
+            >::type
+        > set_type;
+
+        unsigned int nProbesetSize = set_type::node_type::probeset_size ? set_type::node_type::probeset_size : 4;
+        set_type s( 256, nProbesetSize, nProbesetSize / 2 );
+        test_with( s );
+        CPPUNIT_MSG( s.statistics() << s.mutex_policy_statistics() );
+    }
+
+
+    // base hook, store hash
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_basehook_equal_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 2 > >  item_type;
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_basehook_equal_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_basehook_sort_cmp_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_basehook_sort_cmp_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_basehook_sort_less_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_basehook_sort_less_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_basehook_sort_cmpmix_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_basehook_sort_cmpmix_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<8>, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+
+    // Member hook
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_memberhook_equal()
+    {
+        typedef IntrusiveCuckooSetHdrTest::member_item< ci::cuckoo::node< ci::cuckoo::list, 0 > >  item_type;
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember)> >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_memberhook_equal()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_memberhook_sort_cmp()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_memberhook_sort_cmp()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_memberhook_sort_less()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_memberhook_sort_less()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_memberhook_sort_cmpmix()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_memberhook_sort_cmpmix()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<8>, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+
+    // member hook, store hash
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_memberhook_equal_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_memberhook_equal_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_memberhook_sort_cmp_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_memberhook_sort_cmp_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_memberhook_sort_less_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_memberhook_sort_less_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_list_memberhook_sort_cmpmix_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_refinable_vector_memberhook_sort_cmpmix_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<8>, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::mutex_policy< ci::cuckoo::refinable<> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_cuckoo_set.cpp b/tests/test-hdr/set/hdr_intrusive_cuckoo_set.cpp
new file mode 100644 (file)
index 0000000..8634270
--- /dev/null
@@ -0,0 +1,615 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_cuckoo_set.h"
+#include <cds/intrusive/cuckoo_set.h>
+
+#include "set/intrusive_cuckoo_set_common.h"
+#include "../unit/print_cuckoo_stat.h"
+
+namespace set {
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_basehook_equal()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 0 > >  item_type;
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_basehook_equal()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_basehook_sort_cmp()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_basehook_sort_cmp()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_basehook_sort_less()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_basehook_sort_less()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_basehook_sort_cmpmix()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_basehook_sort_cmpmix()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<8>, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_basehook_sort_cmpmix_stat()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<8>, 0 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+                ,co::stat< ci::cuckoo::stat >
+            >::type
+        > set_type;
+
+        unsigned int nProbesetSize = set_type::node_type::probeset_size ? set_type::node_type::probeset_size : 4;
+        set_type s( 256, nProbesetSize, nProbesetSize / 2 );
+        test_with( s );
+        CPPUNIT_MSG( s.statistics() << s.mutex_policy_statistics() );
+    }
+
+
+    // base hook, store hash
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_basehook_equal_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 2 > >  item_type;
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_basehook_equal_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_basehook_sort_cmp_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_basehook_sort_cmp_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_basehook_sort_less_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_basehook_sort_less_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_basehook_sort_cmpmix_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::list, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_basehook_sort_cmpmix_storehash()
+    {
+        typedef IntrusiveCuckooSetHdrTest::base_item< ci::cuckoo::node< ci::cuckoo::vector<8>, 2 > >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::base_hook<
+                    ci::cuckoo::probeset_type< item_type::probeset_type >
+                    ,ci::cuckoo::store_hash< item_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+
+    // Member hook
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_memberhook_equal()
+    {
+        typedef IntrusiveCuckooSetHdrTest::member_item< ci::cuckoo::node< ci::cuckoo::list, 0 > >  item_type;
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember)> >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_memberhook_equal()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_memberhook_sort_cmp()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_memberhook_sort_cmp()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_memberhook_sort_less()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_memberhook_sort_less()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_memberhook_sort_cmpmix()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_memberhook_sort_cmpmix()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<8>, 0 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+
+    // member hook, store hash
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_memberhook_equal_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_memberhook_equal_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::equal_to< equal_to<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_memberhook_sort_cmp_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_memberhook_sort_cmp_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_memberhook_sort_less_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_memberhook_sort_less_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<4>, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_list_memberhook_sort_cmpmix_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::list, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+    void IntrusiveCuckooSetHdrTest::Cuckoo_striped_vector_memberhook_sort_cmpmix_storehash()
+    {
+        typedef ci::cuckoo::node< ci::cuckoo::vector<8>, 2 > node_type;
+        typedef IntrusiveCuckooSetHdrTest::member_item< node_type >  item_type;
+
+        typedef ci::CuckooSet< item_type
+            ,ci::cuckoo::make_traits<
+                ci::opt::hook< ci::cuckoo::member_hook< offsetof(item_type, hMember),
+                    ci::cuckoo::probeset_type< node_type::probeset_type >
+                    ,ci::cuckoo::store_hash< node_type::hash_array_size >
+                > >
+                ,co::hash< std::tuple< hash1, hash2 > >
+                ,co::less< IntrusiveCuckooSetHdrTest::less<item_type> >
+                ,co::compare< IntrusiveCuckooSetHdrTest::cmp<item_type> >
+            >::type
+        > set_type;
+
+        test_cuckoo<set_type>();
+    }
+
+}   // namespace set
+
+CPPUNIT_TEST_SUITE_REGISTRATION(set::IntrusiveCuckooSetHdrTest);
diff --git a/tests/test-hdr/set/hdr_intrusive_cuckoo_set.h b/tests/test-hdr/set/hdr_intrusive_cuckoo_set.h
new file mode 100644 (file)
index 0000000..ba105d3
--- /dev/null
@@ -0,0 +1,651 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/opt/hash.h>
+
+// cds::intrusive namespace forward declaration
+namespace cds { namespace intrusive {}}
+
+namespace set {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+
+    // MichaelHashSet
+    class IntrusiveCuckooSetHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        struct stat
+        {
+            unsigned int nDisposeCount  ;   // count of disposer calling
+            unsigned int nFindCount     ;   // count of find-functor calling
+            unsigned int nFindArgCount;
+            unsigned int nInsertCount;
+            unsigned int nEnsureNewCount;
+            unsigned int nEnsureCount;
+            unsigned int nEraseCount;
+
+            stat()
+            {
+                memset( this, 0, sizeof(*this));
+            }
+
+            stat& operator=( stat const& s)
+            {
+                memcpy( this, &s, sizeof(*this));
+                return *this;
+            }
+        };
+
+        struct item
+        {
+            int nKey;
+            int nVal;
+
+            item()
+            {}
+
+            item(int key, int val)
+                : nKey( key )
+                , nVal(val)
+            {}
+
+            item(const item& v )
+                : nKey( v.nKey )
+                , nVal( v.nVal )
+            {}
+
+            int key() const
+            {
+                return nKey;
+            }
+
+            int val() const
+            {
+                return nVal;
+            }
+        };
+
+        template <typename Hook>
+        struct base_item
+            : public item
+            , public Hook
+            , public stat
+
+        {
+            base_item()
+            {}
+
+            base_item(int key, int val)
+                : item( key, val )
+            {}
+
+            base_item(const base_item& v )
+                : item( static_cast<item const&>(v) )
+                , stat()
+            {}
+        };
+
+        template <typename Hook>
+        struct member_item
+            : public item
+            , public stat
+        {
+            Hook hMember;
+
+            member_item()
+            {}
+
+            member_item(int key, int val)
+                : item( key, val )
+            {}
+
+            member_item(const member_item& v )
+                : item( static_cast<item const&>(v))
+                , stat()
+            {}
+        };
+
+        struct find_key {
+            int nKey;
+
+            find_key( int key )
+                : nKey(key)
+            {}
+        };
+
+        struct hash_int {
+            size_t operator()( int i ) const
+            {
+                return co::v::hash<int>()( i );
+            }
+            template <typename Item>
+            size_t operator()( const Item& i ) const
+            {
+                return (*this)( i.key() );
+            }
+            size_t operator()( find_key const& i) const
+            {
+                return co::v::hash<int>()( i.nKey );
+            }
+        };
+
+        template <typename T>
+        struct less
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() < v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() < v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 < v2.key();
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1.key() < v2.key() )
+                    return -1;
+                return v1.key() > v2.key() ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const T& v1, const Q& v2 ) const
+            {
+                if ( v1.key() < v2 )
+                    return -1;
+                return v1.key() > v2 ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const Q& v1, const T& v2 ) const
+            {
+                if ( v1 < v2.key() )
+                    return -1;
+                return v1 > v2.key() ? 1 : 0;
+            }
+        };
+
+        struct faked_disposer
+        {
+            template <typename T>
+            void operator ()( T * p )
+            {
+                ++p->nDisposeCount;
+            }
+        };
+
+        struct insert_functor {
+            template <typename Item>
+            void operator()( Item& e)
+            {
+                ++e.nInsertCount;
+            }
+        };
+
+        struct ensure_functor {
+            template <typename Item>
+            void operator()( bool bNew, Item& e, Item& arg )
+            {
+                if ( bNew ) {
+                    ++e.nEnsureNewCount;
+                    CPPUNIT_ASSERT_CURRENT( &e == &arg );
+                }
+                else
+                    ++e.nEnsureCount;
+            }
+        };
+
+        struct erase_functor {
+            template< typename Item >
+            void operator()( Item& e )
+            {
+                ++e.nEraseCount;
+            }
+        };
+
+        struct find_functor {
+            template <typename Item, typename What>
+            void operator()( Item& e, What& )
+            {
+                ++e.nFindCount;
+            }
+
+            template <typename Item>
+            void operator()( Item& e, Item& w )
+            {
+                ++e.nFindCount;
+                ++w.nFindArgCount;
+            }
+        };
+
+        struct less2 {
+            template <typename Item>
+            bool operator()( Item const& e, find_key const& k ) const
+            {
+                return e.key() < k.nKey;
+            }
+            template <typename Item>
+            bool operator()( find_key const& k, Item const& e ) const
+            {
+                return k.nKey < e.key();
+            }
+            template <typename Item>
+            bool operator()( Item const& e, int k ) const
+            {
+                return e.key() < k;
+            }
+            template <typename Item>
+            bool operator()( int k, Item const& e ) const
+            {
+                return k < e.key();
+            }
+        };
+
+        struct equal_to2 {
+            template <typename Item>
+            bool operator()( Item const& e, find_key const& k ) const
+            {
+                return e.key() == k.nKey;
+            }
+            template <typename Item>
+            bool operator()( find_key const& k, Item const& e ) const
+            {
+                return k.nKey == e.key();
+            }
+            template <typename Item>
+            bool operator()( Item const& e, int k ) const
+            {
+                return e.key() == k;
+            }
+            template <typename Item>
+            bool operator()( int k, Item const& e ) const
+            {
+                return k == e.key();
+            }
+        };
+
+        template <typename T>
+        struct auto_dispose {
+            T * m_pArr;
+            auto_dispose( T * pArr ): m_pArr( pArr ) {}
+            ~auto_dispose() { delete[] m_pArr; }
+        };
+
+        template <class Set>
+        void test_with(Set& s)
+        {
+            typedef typename Set::value_type    value_type;
+
+            int const k1 = 10;
+            int const k2 = 25;
+            int const k3 = 51;
+
+            int const v1 = 25;
+            int const v2 = 56;
+            int const v3 = 23;
+
+            value_type e1( k1, v1 );
+            value_type e2( k2, v2 );
+            value_type e3( k3, v3);
+
+            stat s1 = e1;
+            stat s2 = e2;
+            stat s3 = e3;
+
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( s.size() == 0 );
+
+            CPPUNIT_ASSERT( !s.find(k1));
+            CPPUNIT_ASSERT( !s.find_with(k2, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ));
+            CPPUNIT_ASSERT( !s.find(k3));
+
+            CPPUNIT_ASSERT( s.insert(e1));
+            CPPUNIT_ASSERT( s.find(e1));
+            CPPUNIT_ASSERT( s.find(k1));
+            CPPUNIT_ASSERT( s.find_with(k1, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type()));
+            CPPUNIT_ASSERT( !s.find(e2));
+            CPPUNIT_ASSERT( !s.find(e3));
+
+            CPPUNIT_ASSERT( e2.nInsertCount == 0 );
+            CPPUNIT_ASSERT( s.insert(e2, insert_functor() ));
+            CPPUNIT_ASSERT( e2.nInsertCount == 1 );
+            CPPUNIT_ASSERT( s.find(e1, find_functor() ));
+            CPPUNIT_ASSERT( e1.nFindCount == 1 );
+            CPPUNIT_ASSERT( e1.nFindArgCount == 1 );
+            CPPUNIT_ASSERT( s.find(k1, find_functor() ));
+            CPPUNIT_ASSERT( e1.nFindCount == 2 );
+            CPPUNIT_ASSERT( e1.nFindArgCount == 1 );
+            CPPUNIT_ASSERT( s.find_with(k2, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
+            CPPUNIT_ASSERT( e2.nFindCount == 1 );
+            CPPUNIT_ASSERT( e2.nFindArgCount == 0 );
+            CPPUNIT_ASSERT( s.find(e2, find_functor() ));
+            CPPUNIT_ASSERT( e2.nFindCount == 2 );
+            CPPUNIT_ASSERT( e2.nFindArgCount == 1 );
+            CPPUNIT_ASSERT( !s.find(k3, find_functor()));
+            CPPUNIT_ASSERT( e3.nFindCount == 0 );
+            CPPUNIT_ASSERT( e3.nFindArgCount == 0 );
+            CPPUNIT_ASSERT( !s.find(e3, find_functor()));
+            CPPUNIT_ASSERT( e3.nFindCount == 0 );
+            CPPUNIT_ASSERT( e3.nFindArgCount == 0 );
+
+            s1 = e1 ; s2 = e2 ; s3 = e3;
+
+            CPPUNIT_ASSERT( e3.nEnsureNewCount == 0 );
+            CPPUNIT_ASSERT( e3.nEnsureCount == 0 );
+            CPPUNIT_ASSERT( s.ensure( e3, ensure_functor() ) == std::make_pair(true, true));
+            CPPUNIT_ASSERT( e3.nEnsureNewCount == 1 );
+            CPPUNIT_ASSERT( e3.nEnsureCount == 0 );
+            CPPUNIT_ASSERT( s.find_with(find_key(k1), typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
+            CPPUNIT_ASSERT( e1.nFindCount == s1.nFindCount + 1 );
+            CPPUNIT_ASSERT( e1.nFindArgCount == s1.nFindArgCount );
+            CPPUNIT_ASSERT( s.find_with(k1, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
+            CPPUNIT_ASSERT( e1.nFindCount == s1.nFindCount + 2 );
+            CPPUNIT_ASSERT( e1.nFindArgCount == s1.nFindArgCount );
+            CPPUNIT_ASSERT( s.find_with(k2, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
+            CPPUNIT_ASSERT( e2.nFindCount == s2.nFindCount + 1 );
+            CPPUNIT_ASSERT( e2.nFindArgCount == s2.nFindArgCount );
+            CPPUNIT_ASSERT( s.find_with(find_key(k2), typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ));
+            CPPUNIT_ASSERT( e2.nFindCount == s2.nFindCount + 1 )        ;   // unchanged, no find_functor
+            CPPUNIT_ASSERT( e2.nFindArgCount == s2.nFindArgCount );
+            CPPUNIT_ASSERT( s.find_with(k3, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ));
+            CPPUNIT_ASSERT( e3.nFindCount == s3.nFindCount )            ;   // unchanged, no find_functor
+            CPPUNIT_ASSERT( e3.nFindArgCount == s3.nFindArgCount );
+            CPPUNIT_ASSERT( s.find_with(find_key(k3), typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
+            CPPUNIT_ASSERT( e3.nFindCount == s3.nFindCount + 1 );
+            CPPUNIT_ASSERT( e3.nFindArgCount == s3.nFindArgCount );
+
+            s1 = e1 ; s2 = e2 ; s3 = e3;
+
+            // insert existing elements
+            {
+                value_type eu( k2, 1000 );
+                CPPUNIT_ASSERT( !s.insert( eu ));
+                CPPUNIT_ASSERT( !s.insert( eu, insert_functor() ));
+                CPPUNIT_ASSERT( e2.nInsertCount == s2.nInsertCount );
+
+                CPPUNIT_ASSERT( s.ensure( eu, ensure_functor()) == std::make_pair(true, false));
+                CPPUNIT_ASSERT( e2.nInsertCount == s2.nInsertCount );
+                CPPUNIT_ASSERT( e2.nEnsureCount == s2.nEnsureCount + 1 );
+                CPPUNIT_ASSERT( e2.nEnsureNewCount == s2.nEnsureNewCount  );
+            }
+
+            s1 = e1 ; s2 = e2 ; s3 = e3;
+
+            // unlink & erase test
+            {
+                value_type eu( k2, 10 );
+                CPPUNIT_ASSERT( !s.unlink(eu));
+            }
+
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( s.size() == 3 );
+
+            CPPUNIT_ASSERT( s.unlink( e1 ) );
+            CPPUNIT_ASSERT( s.erase_with( k2, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ) == &e2 );
+            CPPUNIT_ASSERT( s.erase( e2 ) == NULL );
+            CPPUNIT_ASSERT( e3.nEraseCount == 0 );
+            CPPUNIT_ASSERT( s.erase_with( k3, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), erase_functor()) == &e3 );
+            CPPUNIT_ASSERT( e3.nEraseCount == 1 );
+            CPPUNIT_ASSERT( s.erase( k3, erase_functor()) == NULL );
+            CPPUNIT_ASSERT( e3.nEraseCount == 1 );
+
+            CPPUNIT_ASSERT( s.insert( e3 ) );
+            CPPUNIT_ASSERT( s.erase( e3 ) == &e3 );
+            CPPUNIT_ASSERT( e3.nEraseCount == 1 );
+
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( s.size() == 0 );
+
+            s1 = e1 ; s2 = e2 ; s3 = e3;
+
+            // clear & clear_and_dispose test
+            CPPUNIT_ASSERT( s.insert(e1));
+            CPPUNIT_ASSERT( s.insert(e2));
+            CPPUNIT_ASSERT( s.insert(e3));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( s.size() == 3 );
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( s.size() == 0 );
+
+            CPPUNIT_ASSERT( s.insert(e1));
+            CPPUNIT_ASSERT( s.insert(e2));
+            CPPUNIT_ASSERT( s.insert(e3));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( s.size() == 3 );
+
+            CPPUNIT_ASSERT( e1.nDisposeCount == 0 );
+            CPPUNIT_ASSERT( e2.nDisposeCount == 0 );
+            CPPUNIT_ASSERT( e3.nDisposeCount == 0 );
+            s.clear_and_dispose( faked_disposer() );
+            CPPUNIT_ASSERT( e1.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( e2.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( e3.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( s.size() == 0 );
+
+            // resize test (up to 64K elements)
+            size_t const nSize = 64 * 1024;
+            value_type * arr = new value_type[nSize];
+            auto_dispose<value_type> ad(arr);
+            for ( size_t i = 0; i < nSize; ++i ) {
+                value_type * p = new (arr + i) value_type( (int) i, (int) i * 2 );
+                CPPUNIT_ASSERT_EX( s.insert( *p, insert_functor() ), "i=" << i );
+                CPPUNIT_ASSERT_EX( p->nInsertCount == 1, "i=" << i );
+                //for ( size_t j = 0; j <= i; ++j ) {
+                //    if ( !s.find((int) j) ) {
+                //        CPPUNIT_MSG( "Key " << j << " is not found after inserting key " << i );
+                //    }
+                //}
+            }
+
+            for ( size_t i = 0; i < nSize; ++i )
+                CPPUNIT_ASSERT_EX( s.find((int) i), "Key " << i << " is not found" );
+
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( s.size() == nSize );
+            s.clear_and_dispose( faked_disposer() );
+            for ( size_t i = 0; i < nSize; ++i ) {
+                CPPUNIT_ASSERT_EX( arr[i].nDisposeCount == 1, "i=" << i );
+            }
+        }
+
+        template <class Set>
+        void test()
+        {
+            // default ctor
+            {
+                Set s;
+                test_with(s);
+            }
+
+            // ctor with explicit initial capacity
+            {
+                Set s(256);
+                test_with(s);
+            }
+        }
+
+        template <class Set>
+        void test_cuckoo()
+        {
+            unsigned int nProbesetSize = Set::node_type::probeset_size ? Set::node_type::probeset_size : 4;
+            Set s( 256, nProbesetSize, nProbesetSize / 2 );
+            test_with( s );
+        }
+
+        // ***********************************************************
+        // Cuckoo hashing (striped)
+
+        void Cuckoo_striped_list_basehook_equal();
+        void Cuckoo_striped_vector_basehook_equal();
+        void Cuckoo_striped_list_basehook_sort_cmp();
+        void Cuckoo_striped_vector_basehook_sort_cmp();
+        void Cuckoo_striped_list_basehook_sort_less();
+        void Cuckoo_striped_vector_basehook_sort_less();
+        void Cuckoo_striped_list_basehook_sort_cmpmix();
+        void Cuckoo_striped_vector_basehook_sort_cmpmix();
+        void Cuckoo_striped_vector_basehook_sort_cmpmix_stat();
+
+        void Cuckoo_striped_list_basehook_equal_storehash();
+        void Cuckoo_striped_vector_basehook_equal_storehash();
+        void Cuckoo_striped_list_basehook_sort_cmp_storehash();
+        void Cuckoo_striped_vector_basehook_sort_cmp_storehash();
+        void Cuckoo_striped_list_basehook_sort_less_storehash();
+        void Cuckoo_striped_vector_basehook_sort_less_storehash();
+        void Cuckoo_striped_list_basehook_sort_cmpmix_storehash();
+        void Cuckoo_striped_vector_basehook_sort_cmpmix_storehash();
+
+        void Cuckoo_striped_list_memberhook_equal();
+        void Cuckoo_striped_vector_memberhook_equal();
+        void Cuckoo_striped_list_memberhook_sort_cmp();
+        void Cuckoo_striped_vector_memberhook_sort_cmp();
+        void Cuckoo_striped_list_memberhook_sort_less();
+        void Cuckoo_striped_vector_memberhook_sort_less();
+        void Cuckoo_striped_list_memberhook_sort_cmpmix();
+        void Cuckoo_striped_vector_memberhook_sort_cmpmix();
+
+        void Cuckoo_striped_list_memberhook_equal_storehash();
+        void Cuckoo_striped_vector_memberhook_equal_storehash();
+        void Cuckoo_striped_list_memberhook_sort_cmp_storehash();
+        void Cuckoo_striped_vector_memberhook_sort_cmp_storehash();
+        void Cuckoo_striped_list_memberhook_sort_less_storehash();
+        void Cuckoo_striped_vector_memberhook_sort_less_storehash();
+        void Cuckoo_striped_list_memberhook_sort_cmpmix_storehash();
+        void Cuckoo_striped_vector_memberhook_sort_cmpmix_storehash();
+
+        // ***********************************************************
+        // Cuckoo hashing (refinable)
+
+        void Cuckoo_refinable_list_basehook_equal();
+        void Cuckoo_refinable_vector_basehook_equal();
+        void Cuckoo_refinable_list_basehook_sort_cmp();
+        void Cuckoo_refinable_vector_basehook_sort_cmp();
+        void Cuckoo_refinable_list_basehook_sort_less();
+        void Cuckoo_refinable_vector_basehook_sort_less();
+        void Cuckoo_refinable_list_basehook_sort_cmpmix();
+        void Cuckoo_refinable_vector_basehook_sort_cmpmix();
+        void Cuckoo_refinable_vector_basehook_sort_cmpmix_stat();
+
+        void Cuckoo_refinable_list_basehook_equal_storehash();
+        void Cuckoo_refinable_vector_basehook_equal_storehash();
+        void Cuckoo_refinable_list_basehook_sort_cmp_storehash();
+        void Cuckoo_refinable_vector_basehook_sort_cmp_storehash();
+        void Cuckoo_refinable_list_basehook_sort_less_storehash();
+        void Cuckoo_refinable_vector_basehook_sort_less_storehash();
+        void Cuckoo_refinable_list_basehook_sort_cmpmix_storehash();
+        void Cuckoo_refinable_vector_basehook_sort_cmpmix_storehash();
+
+        void Cuckoo_refinable_list_memberhook_equal();
+        void Cuckoo_refinable_vector_memberhook_equal();
+        void Cuckoo_refinable_list_memberhook_sort_cmp();
+        void Cuckoo_refinable_vector_memberhook_sort_cmp();
+        void Cuckoo_refinable_list_memberhook_sort_less();
+        void Cuckoo_refinable_vector_memberhook_sort_less();
+        void Cuckoo_refinable_list_memberhook_sort_cmpmix();
+        void Cuckoo_refinable_vector_memberhook_sort_cmpmix();
+
+        void Cuckoo_refinable_list_memberhook_equal_storehash();
+        void Cuckoo_refinable_vector_memberhook_equal_storehash();
+        void Cuckoo_refinable_list_memberhook_sort_cmp_storehash();
+        void Cuckoo_refinable_vector_memberhook_sort_cmp_storehash();
+        void Cuckoo_refinable_list_memberhook_sort_less_storehash();
+        void Cuckoo_refinable_vector_memberhook_sort_less_storehash();
+        void Cuckoo_refinable_list_memberhook_sort_cmpmix_storehash();
+        void Cuckoo_refinable_vector_memberhook_sort_cmpmix_storehash();
+
+        CPPUNIT_TEST_SUITE(IntrusiveCuckooSetHdrTest)
+            // ***********************************************************
+            // Cuckoo hashing (striped)
+
+            CPPUNIT_TEST( Cuckoo_striped_list_basehook_equal)
+            CPPUNIT_TEST( Cuckoo_striped_vector_basehook_equal)
+            CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmp)
+            CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmp)
+            CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_less)
+            CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_less)
+            CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmpmix)
+            CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmpmix)
+            CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmpmix_stat)
+
+            CPPUNIT_TEST( Cuckoo_striped_list_basehook_equal_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_vector_basehook_equal_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_less_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_less_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmpmix_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmpmix_storehash)
+
+            CPPUNIT_TEST( Cuckoo_striped_list_memberhook_equal)
+            CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_equal)
+            CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmp)
+            CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmp)
+            CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_less)
+            CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_less)
+            CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmpmix)
+            CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmpmix)
+
+            CPPUNIT_TEST( Cuckoo_striped_list_memberhook_equal_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_equal_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_less_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_less_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmpmix_storehash)
+            CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmpmix_storehash)
+
+            // ***********************************************************
+            // Cuckoo hashing (refinable)
+
+            CPPUNIT_TEST( Cuckoo_refinable_list_basehook_equal)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_equal)
+            CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmp)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmp)
+            CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_less)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_less)
+            CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmpmix)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmpmix)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmpmix_stat)
+
+            CPPUNIT_TEST( Cuckoo_refinable_list_basehook_equal_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_equal_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_less_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_less_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmpmix_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmpmix_storehash)
+
+            CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_equal)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_equal)
+            CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmp)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmp)
+            CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_less)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_less)
+            CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmpmix)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmpmix)
+
+            CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_equal_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_equal_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmp_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_less_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_less_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmpmix_storehash)
+            CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmpmix_storehash)
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_hp.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_hp.cpp
new file mode 100644 (file)
index 0000000..2753b2d
--- /dev/null
@@ -0,0 +1,150 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/michael_list_hp.h>
+#include <cds/intrusive/michael_set.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::HP_base_cmp()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::HP> > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HP_base_less()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::HP> > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HP_base_cmpmix()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::HP> > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HP_member_cmp()
+    {
+        typedef member_int_item< ci::michael_list::node<cds::gc::HP> > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HP_member_less()
+    {
+        typedef member_int_item< ci::michael_list::node<cds::gc::HP> > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HP_member_cmpmix()
+    {
+        typedef member_int_item< ci::michael_list::node<cds::gc::HP> > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+
+} // namespace set
+CPPUNIT_TEST_SUITE_REGISTRATION(set::IntrusiveHashSetHdrTest);
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_hp_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_hp_lazy.cpp
new file mode 100644 (file)
index 0000000..e409ce8
--- /dev/null
@@ -0,0 +1,150 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/lazy_list_hp.h>
+#include <cds/intrusive/michael_set.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::HP_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::HP> > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::opt::back_off< cds::backoff::pause >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HP_base_less_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::HP> > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HP_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::HP> > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HP_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<cds::gc::HP> > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HP_member_less_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<cds::gc::HP> > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HP_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<cds::gc::HP> > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HP, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_hrc.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_hrc.cpp
new file mode 100644 (file)
index 0000000..d164497
--- /dev/null
@@ -0,0 +1,74 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/michael_list_hrc.h>
+#include <cds/intrusive/michael_set.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::HRC_base_cmp()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::HRC> > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HRC, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HRC_base_less()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::HRC> > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HRC, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HRC_base_cmpmix()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::HRC> > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HRC, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_hrc_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_hrc_lazy.cpp
new file mode 100644 (file)
index 0000000..66926ee
--- /dev/null
@@ -0,0 +1,74 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/lazy_list_hrc.h>
+#include <cds/intrusive/michael_set.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::HRC_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::HRC> > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HRC, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HRC_base_less_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::HRC> > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HRC, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::HRC_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::HRC> > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::HRC, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_nogc.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_nogc.cpp
new file mode 100644 (file)
index 0000000..4ffa61f
--- /dev/null
@@ -0,0 +1,147 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/michael_list_nogc.h>
+#include <cds/intrusive/michael_set_nogc.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::nogc_base_cmp()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::nogc> > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::nogc_base_less()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::nogc> > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::nogc_base_cmpmix()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::nogc> > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::nogc_member_cmp()
+    {
+        typedef member_int_item< ci::michael_list::node<cds::gc::nogc> > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::nogc_member_less()
+    {
+        typedef member_int_item< ci::michael_list::node<cds::gc::nogc> > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::nogc_member_cmpmix()
+    {
+        typedef member_int_item< ci::michael_list::node<cds::gc::nogc> > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_nogc_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_nogc_lazy.cpp
new file mode 100644 (file)
index 0000000..59a229b
--- /dev/null
@@ -0,0 +1,147 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/lazy_list_nogc.h>
+#include <cds/intrusive/michael_set_nogc.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::nogc_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::nogc> > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::nogc_base_less_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::nogc> > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::nogc_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::nogc> > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::nogc_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<cds::gc::nogc> > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::nogc_member_less_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<cds::gc::nogc> > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::nogc_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<cds::gc::nogc> > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::nogc, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_ptb.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_ptb.cpp
new file mode 100644 (file)
index 0000000..d079a21
--- /dev/null
@@ -0,0 +1,149 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/michael_list_ptb.h>
+#include <cds/intrusive/michael_set.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::PTB_base_cmp()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::PTB> > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::PTB_base_less()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::PTB> > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::PTB_base_cmpmix()
+    {
+        typedef base_int_item< ci::michael_list::node<cds::gc::PTB> > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::PTB_member_cmp()
+    {
+        typedef member_int_item< ci::michael_list::node<cds::gc::PTB> > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::PTB_member_less()
+    {
+        typedef member_int_item< ci::michael_list::node<cds::gc::PTB> > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::PTB_member_cmpmix()
+    {
+        typedef member_int_item< ci::michael_list::node<cds::gc::PTB> > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_ptb_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_ptb_lazy.cpp
new file mode 100644 (file)
index 0000000..716ce59
--- /dev/null
@@ -0,0 +1,149 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/lazy_list_ptb.h>
+#include <cds/intrusive/michael_set.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::PTB_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::PTB> > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::PTB_base_less_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::PTB> > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::PTB_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<cds::gc::PTB> > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::PTB_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<cds::gc::PTB> > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::PTB_member_less_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<cds::gc::PTB> > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::PTB_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<cds::gc::PTB> > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< cds::gc::PTB, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpb.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..e1b77af
--- /dev/null
@@ -0,0 +1,154 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/intrusive/michael_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >   RCU;
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_base_cmp()
+    {
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_base_less()
+    {
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_base_cmpmix()
+    {
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_member_cmp()
+    {
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_member_less()
+    {
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_member_cmpmix()
+    {
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpb_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpb_lazy.cpp
new file mode 100644 (file)
index 0000000..0960ba1
--- /dev/null
@@ -0,0 +1,154 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/intrusive/michael_set_rcu.h>
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> >   RCU;
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::opt::back_off< cds::backoff::pause >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_base_less_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_member_less_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPB_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpi.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..51e95e7
--- /dev/null
@@ -0,0 +1,154 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/intrusive/michael_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> >   RCU;
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_base_cmp()
+    {
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_base_less()
+    {
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_base_cmpmix()
+    {
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_member_cmp()
+    {
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_member_less()
+    {
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_member_cmpmix()
+    {
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpi_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpi_lazy.cpp
new file mode 100644 (file)
index 0000000..cae46da
--- /dev/null
@@ -0,0 +1,154 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/intrusive/michael_set_rcu.h>
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> >   RCU;
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::opt::back_off< cds::backoff::pause >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_base_less_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_member_less_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPI_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpt.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..5cead1e
--- /dev/null
@@ -0,0 +1,154 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/intrusive/michael_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> >   RCU;
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_base_cmp()
+    {
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_base_less()
+    {
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_base_cmpmix()
+    {
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_member_cmp()
+    {
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_member_less()
+    {
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_member_cmpmix()
+    {
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpt_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_gpt_lazy.cpp
new file mode 100644 (file)
index 0000000..fe5e3ae
--- /dev/null
@@ -0,0 +1,154 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/intrusive/michael_set_rcu.h>
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> >   RCU;
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::opt::back_off< cds::backoff::pause >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_base_less_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_member_less_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_GPT_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_shb.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..b97f68a
--- /dev/null
@@ -0,0 +1,168 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/intrusive/michael_set_rcu.h>
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> >   RCU;
+    }
+#endif
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_shb_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_shb_lazy.cpp
new file mode 100644 (file)
index 0000000..4f914a5
--- /dev/null
@@ -0,0 +1,168 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/intrusive/michael_set_rcu.h>
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> >   RCU;
+    }
+#endif
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_base_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::opt::back_off< cds::backoff::pause >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_base_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_base_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_member_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_member_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHB_member_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_sht.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..0d41411
--- /dev/null
@@ -0,0 +1,168 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/intrusive/michael_set_rcu.h>
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> >   RCU;
+    }
+#endif
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::michael_list::node<RCU> > item;
+        typedef ci::MichaelList< RCU
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_sht_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_michael_set_rcu_sht_lazy.cpp
new file mode 100644 (file)
index 0000000..0b8697a
--- /dev/null
@@ -0,0 +1,167 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/intrusive/michael_set_rcu.h>
+
+namespace set {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> >   RCU;
+    }
+#endif
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_base_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::opt::back_off< cds::backoff::pause >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_base_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_base_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<RCU> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_member_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_member_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::RCU_SHT_member_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::lazy_list::node<RCU> > item;
+        typedef ci::LazyList< RCU
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<RCU>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::MichaelHashSet< RCU, bucket_type,
+            ci::michael_set::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+
+        test_rcu_int<set>();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_refinable_hashset_avlset.cpp b/tests/test-hdr/set/hdr_intrusive_refinable_hashset_avlset.cpp
new file mode 100644 (file)
index 0000000..b754e76
--- /dev/null
@@ -0,0 +1,101 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_avl_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::avl_set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::avl_set_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_avl_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::back_off< cds::backoff::empty >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_avl_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<64> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_avl_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_avl_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::avl_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_avl_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::avl_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_avl_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::avl_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_refinable_hashset_list.cpp b/tests/test-hdr/set/hdr_intrusive_refinable_hashset_list.cpp
new file mode 100644 (file)
index 0000000..6918278
--- /dev/null
@@ -0,0 +1,196 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_list.h>
+#include <cds/intrusive/striped_set.h>
+
+#include <cds/details/std/type_traits.h>    // std::is_same
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::list_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::list_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_list_basehook_cmp()
+    {
+        typedef ci::StripedSet<
+            bi::list<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_list_basehook_less()
+    {
+        typedef ci::StripedSet<
+            bi::list<base_item_type>
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_list_basehook_cmpmix()
+    {
+        typedef ci::StripedSet<
+            bi::list<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_list_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::list<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<8> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_list_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::list<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        set_type s( 128, ci::striped_set::single_bucket_size_threshold<0>(4) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_list_memberhook_cmp()
+    {
+        typedef ci::StripedSet<
+            bi::list<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::list_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_list_memberhook_less()
+    {
+        typedef ci::StripedSet<
+            bi::list<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::list_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_list_memberhook_cmpmix()
+    {
+        typedef ci::StripedSet<
+            bi::list<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::list_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_list_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::list<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::list_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<8> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<member_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_list_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::list<
+            member_item_type
+            , bi::member_hook< member_item_type, bi::list_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<member_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        set_type s( 128, ci::striped_set::single_bucket_size_threshold<0>(4) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_refinable_hashset_set.cpp b/tests/test-hdr/set/hdr_intrusive_refinable_hashset_set.cpp
new file mode 100644 (file)
index 0000000..0c65ea6
--- /dev/null
@@ -0,0 +1,101 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::set_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<64> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_refinable_hashset_sgset.cpp b/tests/test-hdr/set/hdr_intrusive_refinable_hashset_sgset.cpp
new file mode 100644 (file)
index 0000000..0ce2ee6
--- /dev/null
@@ -0,0 +1,101 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_sg_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::bs_set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::bs_set_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_sg_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_sg_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<64> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_sg_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_sg_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_sg_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_sg_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_refinable_hashset_slist.cpp b/tests/test-hdr/set/hdr_intrusive_refinable_hashset_slist.cpp
new file mode 100644 (file)
index 0000000..1e019d3
--- /dev/null
@@ -0,0 +1,196 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_slist.h>
+#include <cds/intrusive/striped_set.h>
+
+#include <cds/details/std/type_traits.h>    // std::is_same
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::slist_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::slist_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_slist_basehook_cmp()
+    {
+        typedef ci::StripedSet<
+            bi::slist<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_slist_basehook_less()
+    {
+        typedef ci::StripedSet<
+            bi::slist<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_slist_basehook_cmpmix()
+    {
+        typedef ci::StripedSet<
+            bi::slist<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_slist_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::slist<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<8> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_slist_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::slist<base_item_type>
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        set_type s( 128, ci::striped_set::single_bucket_size_threshold<0>(4) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_slist_memberhook_cmp()
+    {
+        typedef ci::StripedSet<
+            bi::slist<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::slist_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_slist_memberhook_less()
+    {
+        typedef ci::StripedSet<
+            bi::slist<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::slist_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_slist_memberhook_cmpmix()
+    {
+        typedef ci::StripedSet<
+            bi::slist<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::slist_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_slist_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::slist<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::slist_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<8> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<member_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_slist_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::slist<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::slist_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<member_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        set_type s( 128, ci::striped_set::single_bucket_size_threshold<0>(4) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_refinable_hashset_splayset.cpp b/tests/test-hdr/set/hdr_intrusive_refinable_hashset_splayset.cpp
new file mode 100644 (file)
index 0000000..2e1ac24
--- /dev/null
@@ -0,0 +1,101 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_splay_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::splay_set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::splay_set_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_splay_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::back_off< cds::backoff::empty >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_splay_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<64> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_splay_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_splay_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::splay_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_splay_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::splay_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_splay_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::splay_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_refinable_hashset_treapset.cpp b/tests/test-hdr/set/hdr_intrusive_refinable_hashset_treapset.cpp
new file mode 100644 (file)
index 0000000..a827691
--- /dev/null
@@ -0,0 +1,116 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_treap_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::bs_set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::bs_set_member_hook<> > member_item_type;
+
+        template <typename T>
+        struct priority_cmp: private IntrusiveStripedSetHdrTest::less<T>
+        {
+            typedef IntrusiveStripedSetHdrTest::less<T> base_class;
+
+            template <typename A, typename B>
+            bool operator()( A const& a, B const& b ) const
+            {
+                return base_class::operator()( b, a );
+            }
+        };
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_treap_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> >, bi::priority<priority_cmp<base_item_type> >  >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_treap_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> >, bi::priority<priority_cmp<base_item_type> > >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<64> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_treap_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> >, bi::priority<priority_cmp<base_item_type> > >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_treap_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+                , bi::priority<priority_cmp<member_item_type> >
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_treap_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+                , bi::priority<priority_cmp<member_item_type> >
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_treap_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+                , bi::priority<priority_cmp<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_refinable_hashset_uset.cpp b/tests/test-hdr/set/hdr_intrusive_refinable_hashset_uset.cpp
new file mode 100644 (file)
index 0000000..59b5d45
--- /dev/null
@@ -0,0 +1,183 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_unordered_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::unordered_set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::unordered_set_member_hook<> > member_item_type;
+
+        struct hasher: private IntrusiveStripedSetHdrTest::hash_int
+        {
+            typedef IntrusiveStripedSetHdrTest::hash_int base_class;
+
+            size_t operator()( int i ) const
+            {
+                return ~( base_class::operator()(i));
+            }
+            template <typename Item>
+            size_t operator()( const Item& i ) const
+            {
+                return ~( base_class::operator()(i));
+            }
+            size_t operator()( IntrusiveStripedSetHdrTest::find_key const& i) const
+            {
+                return ~( base_class::operator()(i));
+            }
+        };
+
+        template <typename T>
+        struct is_equal: private IntrusiveStripedSetHdrTest::cmp<T>
+        {
+            typedef IntrusiveStripedSetHdrTest::cmp<T> base_class;
+
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return base_class::operator()( v1, v2 ) == 0;
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return base_class::operator()( v1, v2 ) == 0;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return base_class::operator()( v1, v2 ) == 0;
+            }
+        };
+
+        template <size_t Capacity, typename T, class Alloc = CDS_DEFAULT_ALLOCATOR>
+        struct dyn_buffer: public co::v::dynamic_buffer< T, Alloc >
+        {
+            typedef co::v::dynamic_buffer< T, Alloc >   base_class;
+        public:
+            template <typename Q>
+            struct rebind {
+                typedef dyn_buffer<Capacity, Q, Alloc> other   ;  ///< Rebinding result type
+            };
+
+            dyn_buffer()
+                : base_class( Capacity )
+            {}
+        };
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_unordered_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<base_item_type
+                , bi::hash< hasher >
+                , bi::equal< is_equal<base_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_unordered_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<base_item_type
+                , bi::hash< hasher >
+                , bi::equal< is_equal<base_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::buffer< co::v::static_buffer< cds::any_type, 64 > >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_unordered_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<base_item_type
+                , bi::hash< hasher >
+                , bi::equal< is_equal<base_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::buffer< dyn_buffer< 256, cds::any_type, std::allocator<int> > >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(512) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_unordered_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<member_item_type
+                , bi::member_hook< member_item_type, bi::unordered_set_member_hook<>, &member_item_type::hMember>
+                , bi::hash< hasher >
+                , bi::equal< is_equal<member_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_unordered_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<member_item_type
+                , bi::member_hook< member_item_type, bi::unordered_set_member_hook<>, &member_item_type::hMember>
+                , bi::hash< hasher >
+                , bi::equal< is_equal<member_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::buffer< dyn_buffer< 64, cds::any_type, std::allocator<int> > >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Refinable_unordered_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<member_item_type
+                , bi::member_hook< member_item_type, bi::unordered_set_member_hook<>, &member_item_type::hMember>
+                , bi::hash< hasher >
+                , bi::equal< is_equal<member_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::mutex_policy< ci::striped_set::refinable<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::buffer< co::v::static_buffer< cds::any_type, 128 > >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_set.h b/tests/test-hdr/set/hdr_intrusive_set.h
new file mode 100644 (file)
index 0000000..12ca4ea
--- /dev/null
@@ -0,0 +1,1748 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include "size_check.h"
+
+#include <cds/opt/hash.h>
+#include <cds/ref.h>
+#include <algorithm>    // random_shuffle
+
+// forward declaration
+namespace cds { namespace intrusive {} }
+
+namespace set {
+    using misc::check_size;
+
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+
+    class IntrusiveHashSetHdrTest: public CppUnitMini::TestCase
+    {
+    protected:
+        struct stat
+        {
+            unsigned int nDisposeCount  ;   // count of disposer calling
+            unsigned int nFindCount     ;   // count of find-functor calling
+            unsigned int nEnsureNewCount;
+            unsigned int nEnsureCount;
+            mutable unsigned int nEraseCount;
+
+            stat()
+            {
+                memset( this, 0, sizeof(*this));
+            }
+        };
+
+        template <typename Node>
+        struct base_int_item
+            : public Node
+            , public stat
+
+        {
+            int nKey;
+            int nVal;
+
+            base_int_item()
+            {}
+
+            base_int_item(int key, int val)
+                : nKey( key )
+                , nVal(val)
+            {}
+
+            base_int_item(const base_int_item& v )
+                : stat()
+                , nKey( v.nKey )
+                , nVal( v.nVal )
+            {}
+
+            int key() const
+            {
+                return nKey;
+            }
+        };
+
+        template <typename Node>
+        struct member_int_item: public stat
+        {
+            int nKey;
+            int nVal;
+
+            Node hMember;
+
+            stat s;
+
+            member_int_item()
+            {}
+
+            member_int_item(int key, int val)
+                : nKey( key )
+                , nVal(val)
+            {}
+
+            member_int_item(const member_int_item& v )
+                : stat()
+                , nKey( v.nKey )
+                , nVal( v.nVal )
+            {}
+
+            int key() const
+            {
+                return nKey;
+            }
+        };
+
+        struct hash_int {
+            size_t operator()( int i ) const
+            {
+                return co::v::hash<int>()( i );
+            }
+            template <typename Item>
+            size_t operator()( const Item& i ) const
+            {
+                return (*this)( i.key() );
+            }
+        };
+
+        struct simple_item_counter {
+            size_t  m_nCount;
+
+            simple_item_counter()
+                : m_nCount(0)
+            {}
+
+            size_t operator ++()
+            {
+                return ++m_nCount;
+            }
+
+            size_t operator --()
+            {
+                return --m_nCount;
+            }
+
+            void reset()
+            {
+                m_nCount = 0;
+            }
+
+            operator size_t() const
+            {
+                return m_nCount;
+            }
+
+        };
+
+
+        template <typename T>
+        struct less
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() < v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() < v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 < v2.key();
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1.key() < v2.key() )
+                    return -1;
+                return v1.key() > v2.key() ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const T& v1, const Q& v2 ) const
+            {
+                if ( v1.key() < v2 )
+                    return -1;
+                return v1.key() > v2 ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const Q& v1, const T& v2 ) const
+            {
+                if ( v1 < v2.key() )
+                    return -1;
+                return v1 > v2.key() ? 1 : 0;
+            }
+        };
+
+        struct faked_disposer
+        {
+            template <typename T>
+            void operator ()( T * p )
+            {
+                ++p->nDisposeCount;
+            }
+        };
+
+        struct find_functor
+        {
+            template <typename Item, typename T>
+            void operator()( Item& item, T& val )
+            {
+                ++item.nFindCount;
+            }
+        };
+
+        struct insert_functor
+        {
+            template <typename Item>
+            void operator()(Item& item )
+            {
+                item.nVal = item.nKey * 100;
+            }
+        };
+
+        struct ensure_functor
+        {
+            template <typename Item>
+            void operator()( bool bNew, Item& item, Item& val )
+            {
+                if ( bNew )
+                    ++item.nEnsureNewCount;
+                else
+                    ++item.nEnsureCount;
+            }
+        };
+
+        struct erase_functor
+        {
+            template <typename Item>
+            void operator()( Item const& item )
+            {
+                item.nEraseCount++;
+            }
+        };
+
+        template <class Set>
+        void test_int_with( Set& s )
+        {
+            typedef typename Set::value_type    value_type;
+
+            value_type v1( 10, 50 );
+            value_type v2( 5, 25  );
+            value_type v3( 20, 100 );
+            int key;
+
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            // insert/find test
+            CPPUNIT_ASSERT( !s.find( v1.key() ));
+            CPPUNIT_ASSERT( s.insert( v1 ));
+            CPPUNIT_ASSERT( s.find( v1.key() ));
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( !s.find_with( v2.key(), less<value_type>() ));
+            CPPUNIT_ASSERT( s.insert( v2 ));
+            CPPUNIT_ASSERT( v2.nFindCount == 0 );
+            CPPUNIT_ASSERT( s.find_with( key = v2.key(), less<value_type>(), find_functor() ));
+            CPPUNIT_ASSERT( v2.nFindCount == 1 );
+            v2.nFindCount = 0;
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            {
+                insert_functor  fi;
+                find_functor    ff;
+                CPPUNIT_ASSERT( !s.find( v3 ));
+                CPPUNIT_ASSERT( v3.nVal != v3.nKey * 100 );
+                CPPUNIT_ASSERT( s.insert( v3, cds::ref(fi) ));
+                CPPUNIT_ASSERT( v3.nVal == v3.nKey * 100 );
+                CPPUNIT_ASSERT( v3.nFindCount == 0 );
+                CPPUNIT_ASSERT( s.find( v3, cds::ref(ff) ));
+                CPPUNIT_ASSERT( v3.nFindCount == 1 );
+                v3.nFindCount = 0;
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+                CPPUNIT_ASSERT( !s.empty() );
+            }
+
+            // unlink test
+            CPPUNIT_ASSERT( s.unlink( v1 ));
+            CPPUNIT_ASSERT( !s.find( v1 ));
+            CPPUNIT_ASSERT( s.find( v2 ));
+            CPPUNIT_ASSERT( s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( !s.unlink( v1 ));
+            CPPUNIT_ASSERT( !s.find( v1 ));
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( s.find_with( v3, less<value_type>() ));
+            CPPUNIT_ASSERT( s.unlink( v3 ));
+            CPPUNIT_ASSERT( !s.find_with( v3, less<value_type>() ));
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            CPPUNIT_ASSERT( s.find( v2 ));
+            CPPUNIT_ASSERT( s.unlink( v2 ));
+            CPPUNIT_ASSERT( !s.find( v1 ));
+            CPPUNIT_ASSERT( !s.find( v2 ));
+            CPPUNIT_ASSERT( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            CPPUNIT_ASSERT( s.empty() );
+
+            Set::gc::force_dispose();
+            // unlink function calls disposer
+            CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
+
+            // ensure test
+            {
+                ensure_functor f;
+                std::pair<bool, bool> ret = s.ensure( v1, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v1.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v1.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( check_size( s, 1 ));
+
+                ret = s.ensure( v2, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v2.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v2.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( check_size( s, 2 ));
+
+                ret = s.ensure( v3, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v3.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v3.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                CPPUNIT_ASSERT( s.find( v1 ));
+                CPPUNIT_ASSERT( s.find( v2 ));
+                CPPUNIT_ASSERT( s.find( v3 ));
+
+                ret = s.ensure( v1, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( !ret.second );
+                CPPUNIT_ASSERT( v1.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v1.nEnsureCount == 1 );
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                ret = s.ensure( v2, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( !ret.second );
+                CPPUNIT_ASSERT( v2.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v2.nEnsureCount == 1 );
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                ret = s.ensure( v3, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( !ret.second );
+                CPPUNIT_ASSERT( v3.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v3.nEnsureCount == 1 );
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                CPPUNIT_ASSERT( s.find( v1 ));
+                CPPUNIT_ASSERT( s.find( v2 ));
+                CPPUNIT_ASSERT( s.find( v3 ));
+            }
+
+            // erase test
+            CPPUNIT_ASSERT( s.find( v1 ));
+            CPPUNIT_ASSERT( s.find_with( v2, less<value_type>() ));
+            CPPUNIT_ASSERT( s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( s.erase( v1 ));
+            CPPUNIT_ASSERT( !s.find( v1 ));
+            CPPUNIT_ASSERT( s.find( v2 ));
+            CPPUNIT_ASSERT( s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( v1.nEraseCount == 0 );
+            CPPUNIT_ASSERT( !s.erase( v1, erase_functor() ));
+            CPPUNIT_ASSERT( v1.nEraseCount == 0 );
+            CPPUNIT_ASSERT( !s.find( v1 ));
+            CPPUNIT_ASSERT( s.find( v2 ));
+            CPPUNIT_ASSERT( s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( v2.nEraseCount == 0 );
+            CPPUNIT_ASSERT( s.erase_with( v2.key(), less<value_type>(), erase_functor() ));
+            CPPUNIT_ASSERT( v2.nEraseCount == 1 );
+            CPPUNIT_ASSERT( !s.find( v1 ));
+            CPPUNIT_ASSERT( !s.find( v2 ));
+            CPPUNIT_ASSERT( s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( !s.erase( v2.key() ));
+            CPPUNIT_ASSERT( !s.find( v1 ));
+            CPPUNIT_ASSERT( !s.find( v2 ));
+            CPPUNIT_ASSERT( s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( s.erase( v3 ));
+            CPPUNIT_ASSERT( !s.find( v1 ));
+            CPPUNIT_ASSERT( !s.find( v2 ));
+            CPPUNIT_ASSERT( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            CPPUNIT_ASSERT( s.empty() );
+
+            // dispose test
+            Set::gc::force_dispose();
+            CPPUNIT_ASSERT( v1.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 2 );
+
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( s.insert( v1 ));
+            CPPUNIT_ASSERT( s.insert( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            {
+                value_type v( v1 );
+                CPPUNIT_ASSERT( !s.unlink( v ) );
+            }
+
+            CPPUNIT_ASSERT( s.unlink( v3 ) );
+            CPPUNIT_ASSERT( s.find( v1 ));
+            CPPUNIT_ASSERT( !s.find( v2 ));
+            CPPUNIT_ASSERT( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( !s.unlink( v3 ));
+            CPPUNIT_ASSERT( s.find( v1 ));
+            CPPUNIT_ASSERT( !s.find( v2 ));
+            CPPUNIT_ASSERT( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( s.unlink( v1 ));
+            CPPUNIT_ASSERT( !s.find( v1 ));
+            CPPUNIT_ASSERT( !s.find( v2 ));
+            CPPUNIT_ASSERT( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            CPPUNIT_ASSERT( s.empty() );
+
+            CPPUNIT_ASSERT( !s.unlink( v2 ));
+            CPPUNIT_ASSERT( !s.find( v1 ));
+            CPPUNIT_ASSERT( !s.find( v2 ));
+            CPPUNIT_ASSERT( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            CPPUNIT_ASSERT( s.empty() );
+
+            Set::gc::force_dispose();
+            CPPUNIT_ASSERT( v1.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 3 );
+
+            // clear test
+            CPPUNIT_ASSERT( s.insert( v1 ));
+            CPPUNIT_ASSERT( s.insert( v3 ));
+            CPPUNIT_ASSERT( s.insert( v2 ));
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            Set::gc::force_dispose();
+            CPPUNIT_CHECK( v1.nDisposeCount == 4 );
+            CPPUNIT_CHECK( v2.nDisposeCount == 3 );
+            CPPUNIT_CHECK( v3.nDisposeCount == 4 );
+        }
+
+
+        template <class Set>
+        void test_int()
+        {
+            {
+                Set s( 64, 4 );
+                test_int_with( s );
+            }
+
+            // Iterator test
+            test_iter<Set>();
+
+            // extract/get test
+            {
+                typedef typename Set::value_type    value_type;
+                typedef typename Set::guarded_ptr   guarded_ptr;
+
+                static size_t const nLimit = 1024;
+                value_type arrItems[nLimit];
+                int arr[nLimit];
+                for ( size_t i = 0; i < nLimit; ++i )
+                    arr[i] = (int) i;
+                std::random_shuffle( arr, arr + nLimit );
+
+                for ( size_t i = 0; i < nLimit; ++i ) {
+                    arrItems[i].nKey = arr[i];
+                    arrItems[i].nVal = arr[i] * 2;
+                }
+
+                Set s( nLimit, 2 );
+                for ( size_t i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arrItems[i] ));
+
+                guarded_ptr gp;
+                for ( size_t i = 0; i < nLimit; i += 2 ) {
+                    int nKey = arr[i];
+                    CPPUNIT_ASSERT( s.get( gp, nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey * 2 );
+
+                    CPPUNIT_ASSERT( s.extract( gp, nKey ));
+                    CPPUNIT_ASSERT( !gp.empty() );
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey * 2 );
+                    gp.release();
+
+                    CPPUNIT_CHECK( !s.get( gp, nKey ));
+                    CPPUNIT_ASSERT( gp.empty() );
+                    CPPUNIT_CHECK( !s.extract( gp, nKey ));
+                    CPPUNIT_CHECK( gp.empty() );
+
+                    nKey = arr[i+1];
+                    CPPUNIT_ASSERT( s.get_with( gp, nKey, less<value_type>() ));
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey * 2 );
+
+                    CPPUNIT_ASSERT( s.extract_with( gp, nKey, less<value_type>() ));
+                    CPPUNIT_ASSERT( !gp.empty() );
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey * 2 );
+                    gp.release();
+
+                    CPPUNIT_CHECK( !s.get_with( gp, nKey, less<value_type>() ));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !s.extract_with( gp, nKey, less<value_type>() ));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_CHECK( s.empty() );
+                CPPUNIT_CHECK( check_size( s, 0 ));
+
+                CPPUNIT_CHECK( !s.get( gp, 100 ));
+                CPPUNIT_CHECK( !s.extract( gp, 100 ));
+                CPPUNIT_CHECK( gp.empty() );
+
+                Set::gc::force_dispose();
+            }
+        }
+
+        template <class Set>
+        void test_iter()
+        {
+            typedef typename Set::value_type    value_type;
+            typedef typename Set::iterator set_iterator;
+            typedef typename Set::iterator const_set_iterator;
+
+            value_type  v[500];
+            {
+                Set s( 100, 4 );
+
+                for ( int i = 0; unsigned(i) < sizeof(v)/sizeof(v[0]); ++i ) {
+                    v[i].nKey = i;
+                    v[i].nVal = i * 2;
+
+                    CPPUNIT_ASSERT( s.insert( v[i] ));
+                }
+
+                int nCount = 0;
+                for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                    it->nVal = (*it).nKey;
+                    ++nCount;
+                }
+                CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+                nCount = 0;
+                for ( const_set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                    ++nCount;
+                }
+                CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+                for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                    CPPUNIT_ASSERT( v[i].nKey == v[i].nVal );
+                }
+            }
+
+            Set::gc::force_dispose();
+
+            for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nDisposeCount == 1 );
+            }
+        }
+
+        template <class Set>
+        void test_int_nogc()
+        {
+            typedef typename Set::value_type    value_type;
+
+            value_type v1( 10, 50 );
+            value_type v2( 5, 25  );
+            value_type v3( 20, 100 );
+            int key;
+
+            {
+                {
+                    Set s( 64, 4 );
+
+                    // insert test
+                    CPPUNIT_ASSERT( s.empty() );
+                    CPPUNIT_ASSERT( check_size( s, 0 ));
+
+                    // insert/find test
+                    CPPUNIT_ASSERT( s.find( v1.key() ) == NULL );
+                    CPPUNIT_ASSERT( s.insert( v1 ));
+                    CPPUNIT_ASSERT( s.find_with( v1.key(), less<value_type>() ) == &v1 );
+                    CPPUNIT_ASSERT( check_size( s, 1 ));
+                    CPPUNIT_ASSERT( !s.empty() );
+
+                    CPPUNIT_ASSERT( s.find( v2.key() ) == NULL );
+                    CPPUNIT_ASSERT( s.insert( v2 ));
+                    CPPUNIT_ASSERT( v2.nFindCount == 0 );
+                    CPPUNIT_ASSERT( s.find( key = v2.key(), find_functor() ));
+                    CPPUNIT_ASSERT( v2.nFindCount == 1 );
+                    v2.nFindCount = 0;
+                    CPPUNIT_ASSERT( check_size( s, 2 ));
+                    CPPUNIT_ASSERT( !s.empty() );
+
+                    {
+                        find_functor    ff;
+                        CPPUNIT_ASSERT( s.find( v3 ) == NULL );
+                        CPPUNIT_ASSERT( s.insert( v3 ));
+                        CPPUNIT_ASSERT( v3.nFindCount == 0 );
+                        CPPUNIT_ASSERT( s.find_with( v3, less<value_type>(), cds::ref(ff) ));
+                        CPPUNIT_ASSERT( v3.nFindCount == 1 );
+                        v3.nFindCount = 0;
+                        CPPUNIT_ASSERT( check_size( s, 3 ));
+                        CPPUNIT_ASSERT( !s.empty() );
+                    }
+                }
+
+                // s.clear()   ; // not all set supports clear() method
+                CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
+                CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
+                CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
+
+
+                // ensure test
+                {
+                    Set s( 64, 4 );
+
+                    ensure_functor f;
+                    std::pair<bool, bool> ret = s.ensure( v1, f );
+                    CPPUNIT_ASSERT( ret.first );
+                    CPPUNIT_ASSERT( ret.second );
+                    CPPUNIT_ASSERT( v1.nEnsureNewCount == 1 );
+                    CPPUNIT_ASSERT( v1.nEnsureCount == 0 );
+                    CPPUNIT_ASSERT( check_size( s, 1 ));
+
+                    ret = s.ensure( v2, f );
+                    CPPUNIT_ASSERT( ret.first );
+                    CPPUNIT_ASSERT( ret.second );
+                    CPPUNIT_ASSERT( v2.nEnsureNewCount == 1 );
+                    CPPUNIT_ASSERT( v2.nEnsureCount == 0 );
+                    CPPUNIT_ASSERT( check_size( s, 2 ));
+
+                    ret = s.ensure( v3, f );
+                    CPPUNIT_ASSERT( ret.first );
+                    CPPUNIT_ASSERT( ret.second );
+                    CPPUNIT_ASSERT( v3.nEnsureNewCount == 1 );
+                    CPPUNIT_ASSERT( v3.nEnsureCount == 0 );
+                    CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                    CPPUNIT_ASSERT( s.find( v1 ) == &v1 );
+                    CPPUNIT_ASSERT( s.find( v2 ) == &v2 );
+                    CPPUNIT_ASSERT( s.find( v3 ) == &v3 );
+
+                    ret = s.ensure( v1, f );
+                    CPPUNIT_ASSERT( ret.first );
+                    CPPUNIT_ASSERT( !ret.second );
+                    CPPUNIT_ASSERT( v1.nEnsureNewCount == 1 );
+                    CPPUNIT_ASSERT( v1.nEnsureCount == 1 );
+                    CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                    ret = s.ensure( v2, f );
+                    CPPUNIT_ASSERT( ret.first );
+                    CPPUNIT_ASSERT( !ret.second );
+                    CPPUNIT_ASSERT( v2.nEnsureNewCount == 1 );
+                    CPPUNIT_ASSERT( v2.nEnsureCount == 1 );
+                    CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                    ret = s.ensure( v3, f );
+                    CPPUNIT_ASSERT( ret.first );
+                    CPPUNIT_ASSERT( !ret.second );
+                    CPPUNIT_ASSERT( v3.nEnsureNewCount == 1 );
+                    CPPUNIT_ASSERT( v3.nEnsureCount == 1 );
+                    CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                    CPPUNIT_ASSERT( s.find( v1 ) == &v1 );
+                    CPPUNIT_ASSERT( s.find( v2 ) == &v2 );
+                    CPPUNIT_ASSERT( s.find( v3 ) == &v3 );
+                }
+            }
+
+            // dispose on destruct test
+            CPPUNIT_ASSERT( v1.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 2 );
+
+            // Iterator test
+            test_iter<Set>();
+        }
+
+
+#define ASSERT_RCU_FIND( _expr ) { rcu_lock rl; CPPUNIT_ASSERT( _expr ); }
+        template <class Set>
+        void test_rcu_int_with( Set& s )
+        {
+            typedef typename Set::value_type    value_type;
+            typedef typename Set::gc::scoped_lock rcu_lock;
+
+            value_type v1( 10, 50 );
+            value_type v2( 5, 25  );
+            value_type v3( 20, 100 );
+            value_type v4( 40, 400 );
+            int key;
+
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            // insert/find test
+
+            ASSERT_RCU_FIND( !s.find_with( v1.key(), less<value_type>() ));
+            CPPUNIT_ASSERT( s.insert( v1 ));
+            ASSERT_RCU_FIND( s.find_with( v1.key(), less<value_type>()) );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            ASSERT_RCU_FIND( !s.find( v2.key() ));
+            CPPUNIT_ASSERT( s.insert( v2 ));
+            CPPUNIT_ASSERT( v2.nFindCount == 0 );
+            CPPUNIT_ASSERT( s.find( key = v2.key(), find_functor() ));
+            CPPUNIT_ASSERT( v2.nFindCount == 1 );
+            v2.nFindCount = 0;
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            {
+                insert_functor  fi;
+                find_functor    ff;
+                ASSERT_RCU_FIND( !s.find( v3 ));
+                CPPUNIT_ASSERT( v3.nVal != v3.nKey * 100 );
+                CPPUNIT_ASSERT( s.insert( v3, cds::ref(fi) ));
+                CPPUNIT_ASSERT( v3.nVal == v3.nKey * 100 );
+                CPPUNIT_ASSERT( v3.nFindCount == 0 );
+                CPPUNIT_ASSERT( s.find_with( v3, less<value_type>(), cds::ref(ff) ));
+                CPPUNIT_ASSERT( v3.nFindCount == 1 );
+                v3.nFindCount = 0;
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+                CPPUNIT_ASSERT( !s.empty() );
+            }
+
+            // unlink test
+            CPPUNIT_ASSERT( s.unlink( v1 ));
+            ASSERT_RCU_FIND( !s.find( v1 ));
+            ASSERT_RCU_FIND( s.find( v2 ));
+            ASSERT_RCU_FIND( s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( !s.unlink( v1 ));
+            ASSERT_RCU_FIND( !s.find( v1 ));
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            ASSERT_RCU_FIND( s.find( v3 ) );
+            CPPUNIT_ASSERT( s.unlink( v3 ));
+            ASSERT_RCU_FIND( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            ASSERT_RCU_FIND( s.find( v2 ));
+            CPPUNIT_ASSERT( s.unlink( v2 ));
+            ASSERT_RCU_FIND( !s.find( v1 ));
+            ASSERT_RCU_FIND( !s.find( v2 ));
+            ASSERT_RCU_FIND( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            CPPUNIT_ASSERT( s.empty() );
+
+            Set::gc::force_dispose();
+            // unlink function calls disposer
+            CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
+
+            // ensure test
+            {
+                ensure_functor f;
+                std::pair<bool, bool> ret = s.ensure( v1, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v1.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v1.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( check_size( s, 1 ));
+
+                ret = s.ensure( v2, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v2.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v2.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( check_size( s, 2 ));
+
+                ret = s.ensure( v3, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( ret.second );
+                CPPUNIT_ASSERT( v3.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v3.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                ASSERT_RCU_FIND( s.find( v1 ));
+                ASSERT_RCU_FIND( s.find( v2 ));
+                ASSERT_RCU_FIND( s.find( v3 ));
+
+                ret = s.ensure( v1, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( !ret.second );
+                CPPUNIT_ASSERT( v1.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v1.nEnsureCount == 1 );
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                ret = s.ensure( v2, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( !ret.second );
+                CPPUNIT_ASSERT( v2.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v2.nEnsureCount == 1 );
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                ret = s.ensure( v3, f );
+                CPPUNIT_ASSERT( ret.first );
+                CPPUNIT_ASSERT( !ret.second );
+                CPPUNIT_ASSERT( v3.nEnsureNewCount == 1 );
+                CPPUNIT_ASSERT( v3.nEnsureCount == 1 );
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                ASSERT_RCU_FIND( s.find( v1 ) );
+                ASSERT_RCU_FIND( s.find( v2 ));
+                ASSERT_RCU_FIND( s.find( v3 ));
+            }
+
+            // erase test
+            ASSERT_RCU_FIND( s.find( v1 ));
+            ASSERT_RCU_FIND( s.find_with( v2, less<value_type>() ));
+            ASSERT_RCU_FIND( s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( v1.nEraseCount == 0 );
+            CPPUNIT_ASSERT( s.erase_with( v1, less<value_type>(), erase_functor() ));
+            CPPUNIT_ASSERT( v1.nEraseCount == 1 );
+            ASSERT_RCU_FIND( !s.find( v1 ));
+            ASSERT_RCU_FIND( s.find( v2 ) );
+            ASSERT_RCU_FIND( s.find( v3 ) );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( !s.erase( v1 ));
+            ASSERT_RCU_FIND( !s.find( v1 ));
+            ASSERT_RCU_FIND( s.find( v2 ));
+            ASSERT_RCU_FIND( s.find( v3 ) );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            ASSERT_RCU_FIND( !s.find( v4 ));
+            CPPUNIT_ASSERT( s.insert(v4));
+            ASSERT_RCU_FIND( s.find( v4.key() ));
+            CPPUNIT_ASSERT( s.erase_with( v4.key(), less<value_type>() ));
+            ASSERT_RCU_FIND( !s.find( v4.key() ));
+
+            CPPUNIT_ASSERT( s.erase( v2.key() ));
+            ASSERT_RCU_FIND( !s.find( v1 ));
+            ASSERT_RCU_FIND( !s.find( v2 ));
+            ASSERT_RCU_FIND( s.find( v3 ) );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( !s.erase( v2.key() ));
+            ASSERT_RCU_FIND( !s.find( v1 ));
+            ASSERT_RCU_FIND( !s.find( v2 ));
+            ASSERT_RCU_FIND( s.find( v3 ) );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( v3.nEraseCount == 0 );
+            CPPUNIT_ASSERT( s.erase( v3, erase_functor() ));
+            CPPUNIT_ASSERT( v3.nEraseCount == 1 );
+            ASSERT_RCU_FIND( !s.find( v1 ));
+            ASSERT_RCU_FIND( !s.find( v2 ));
+            ASSERT_RCU_FIND( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            CPPUNIT_ASSERT( s.empty() );
+
+            // dispose test
+            Set::gc::force_dispose();
+            CPPUNIT_ASSERT( v1.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v4.nDisposeCount == 1 );
+
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( s.insert( v1 ));
+            CPPUNIT_ASSERT( s.insert( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            {
+                value_type v( v1 );
+                CPPUNIT_ASSERT( !s.unlink( v ) );
+            }
+
+            CPPUNIT_ASSERT( s.unlink( v3 ) );
+            ASSERT_RCU_FIND( s.find( v1 ));
+            ASSERT_RCU_FIND( !s.find( v2 ));
+            ASSERT_RCU_FIND( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( !s.unlink( v3 ));
+            ASSERT_RCU_FIND( s.find( v1 ));
+            ASSERT_RCU_FIND( !s.find( v2 ));
+            ASSERT_RCU_FIND( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( s.unlink( v1 ));
+            ASSERT_RCU_FIND( !s.find( v1 ));
+            ASSERT_RCU_FIND( !s.find( v2 ));
+            ASSERT_RCU_FIND( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            CPPUNIT_ASSERT( s.empty() );
+
+            CPPUNIT_ASSERT( !s.unlink( v2 ));
+            ASSERT_RCU_FIND( !s.find( v1 ));
+            ASSERT_RCU_FIND( !s.find( v2 ));
+            ASSERT_RCU_FIND( !s.find( v3 ));
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            CPPUNIT_ASSERT( s.empty() );
+
+            Set::gc::force_dispose();
+            CPPUNIT_ASSERT( v1.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 2 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v4.nDisposeCount == 1 );
+
+            // clear test
+            CPPUNIT_ASSERT( s.insert( v1 ));
+            CPPUNIT_ASSERT( s.insert( v3 ));
+            CPPUNIT_ASSERT( s.insert( v2 ));
+
+            s.clear();
+            Set::gc::force_dispose();
+            CPPUNIT_ASSERT( v1.nDisposeCount == 4 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 3 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 4 );
+            CPPUNIT_ASSERT( v4.nDisposeCount == 1 );
+        }
+#undef ASSERT_RCU_FIND
+
+        template <class Set>
+        void test_rcu_int()
+        {
+            {
+                Set s( 64, 4 );
+                test_rcu_int_with( s );
+            }
+
+            // Iterator test
+            test_iter<Set>();
+
+            // Extract tests
+            typedef typename Set::gc    rcu;
+            typedef typename Set::value_type    value_type;
+            typedef typename Set::rcu_lock      rcu_lock;
+
+            typename Set::exempt_ptr ep;
+
+            {
+                static size_t const nLimit = 1024;
+                value_type arrItems[nLimit];
+                int arr[nLimit];
+                for ( size_t i = 0; i < nLimit; ++i )
+                    arr[i] = (int) i;
+                std::random_shuffle( arr, arr + nLimit );
+
+                for ( size_t i = 0; i < nLimit; ++i ) {
+                    arrItems[i].nKey = arr[i];
+                    arrItems[i].nVal = arr[i] * 2;
+                }
+
+                Set s( nLimit, 2 );
+                for ( size_t i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arrItems[i] ));
+
+                for ( size_t i = 0; i < nLimit; i += 2 ) {
+                    value_type * pVal;
+                    int nKey = arr[i];
+                    {
+                        rcu_lock l;
+                        pVal = s.get( nKey );
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->nKey == nKey );
+                        CPPUNIT_CHECK( pVal->nVal == nKey * 2 );
+
+                        CPPUNIT_ASSERT( s.extract( ep, nKey ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( pVal->nKey == ep->nKey );
+                        CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock l;
+                        CPPUNIT_CHECK( s.get( nKey ) == NULL );
+                        CPPUNIT_CHECK( !s.extract( ep, nKey ));
+                        CPPUNIT_CHECK( ep.empty() );
+
+                        nKey = arr[i+1];
+                        pVal = s.get_with( nKey, less<value_type>() );
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->nKey == nKey );
+                        CPPUNIT_CHECK( pVal->nVal == nKey * 2 );
+
+                        CPPUNIT_ASSERT( s.extract_with( ep, nKey, less<value_type>() ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( pVal->nKey == ep->nKey );
+                        CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock l;
+                        CPPUNIT_CHECK( s.get_with( nKey, less<value_type>() ) == NULL );
+                        CPPUNIT_CHECK( !s.extract_with( ep, nKey, less<value_type>() ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_CHECK( s.empty() );
+                CPPUNIT_CHECK( check_size( s, 0 ));
+                {
+                    rcu_lock l;
+                    CPPUNIT_CHECK( s.get( 100 ) == NULL );
+                    CPPUNIT_CHECK( !s.extract( ep, 100 ));
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+
+                Set::gc::force_dispose();
+            }
+        }
+
+        // MichaelHashSet + MichaelList
+        void HP_base_cmp();
+        void HP_base_less();
+        void HP_base_cmpmix();
+        void HP_member_cmp();
+        void HP_member_less();
+        void HP_member_cmpmix();
+
+        void PTB_base_cmp();
+        void PTB_base_less();
+        void PTB_base_cmpmix();
+        void PTB_member_cmp();
+        void PTB_member_less();
+        void PTB_member_cmpmix();
+
+        void HRC_base_cmp();
+        void HRC_base_less();
+        void HRC_base_cmpmix();
+
+        void RCU_GPI_base_cmp();
+        void RCU_GPI_base_less();
+        void RCU_GPI_base_cmpmix();
+        void RCU_GPI_member_cmp();
+        void RCU_GPI_member_less();
+        void RCU_GPI_member_cmpmix();
+
+        void RCU_GPB_base_cmp();
+        void RCU_GPB_base_less();
+        void RCU_GPB_base_cmpmix();
+        void RCU_GPB_member_cmp();
+        void RCU_GPB_member_less();
+        void RCU_GPB_member_cmpmix();
+
+        void RCU_GPT_base_cmp();
+        void RCU_GPT_base_less();
+        void RCU_GPT_base_cmpmix();
+        void RCU_GPT_member_cmp();
+        void RCU_GPT_member_less();
+        void RCU_GPT_member_cmpmix();
+
+        void RCU_SHB_base_cmp();
+        void RCU_SHB_base_less();
+        void RCU_SHB_base_cmpmix();
+        void RCU_SHB_member_cmp();
+        void RCU_SHB_member_less();
+        void RCU_SHB_member_cmpmix();
+
+        void RCU_SHT_base_cmp();
+        void RCU_SHT_base_less();
+        void RCU_SHT_base_cmpmix();
+        void RCU_SHT_member_cmp();
+        void RCU_SHT_member_less();
+        void RCU_SHT_member_cmpmix();
+
+        void nogc_base_cmp();
+        void nogc_base_less();
+        void nogc_base_cmpmix();
+        void nogc_member_cmp();
+        void nogc_member_less();
+        void nogc_member_cmpmix();
+
+        // MichaelHashSet + LazyList
+        void HP_base_cmp_lazy();
+        void HP_base_less_lazy();
+        void HP_base_cmpmix_lazy();
+        void HP_member_cmp_lazy();
+        void HP_member_less_lazy();
+        void HP_member_cmpmix_lazy();
+
+        void PTB_base_cmp_lazy();
+        void PTB_base_less_lazy();
+        void PTB_base_cmpmix_lazy();
+        void PTB_member_cmp_lazy();
+        void PTB_member_less_lazy();
+        void PTB_member_cmpmix_lazy();
+
+        void HRC_base_cmp_lazy();
+        void HRC_base_less_lazy();
+        void HRC_base_cmpmix_lazy();
+
+        void RCU_GPI_base_cmp_lazy();
+        void RCU_GPI_base_less_lazy();
+        void RCU_GPI_base_cmpmix_lazy();
+        void RCU_GPI_member_cmp_lazy();
+        void RCU_GPI_member_less_lazy();
+        void RCU_GPI_member_cmpmix_lazy();
+
+        void RCU_GPB_base_cmp_lazy();
+        void RCU_GPB_base_less_lazy();
+        void RCU_GPB_base_cmpmix_lazy();
+        void RCU_GPB_member_cmp_lazy();
+        void RCU_GPB_member_less_lazy();
+        void RCU_GPB_member_cmpmix_lazy();
+
+        void RCU_GPT_base_cmp_lazy();
+        void RCU_GPT_base_less_lazy();
+        void RCU_GPT_base_cmpmix_lazy();
+        void RCU_GPT_member_cmp_lazy();
+        void RCU_GPT_member_less_lazy();
+        void RCU_GPT_member_cmpmix_lazy();
+
+        void RCU_SHB_base_cmp_lazy();
+        void RCU_SHB_base_less_lazy();
+        void RCU_SHB_base_cmpmix_lazy();
+        void RCU_SHB_member_cmp_lazy();
+        void RCU_SHB_member_less_lazy();
+        void RCU_SHB_member_cmpmix_lazy();
+
+        void RCU_SHT_base_cmp_lazy();
+        void RCU_SHT_base_less_lazy();
+        void RCU_SHT_base_cmpmix_lazy();
+        void RCU_SHT_member_cmp_lazy();
+        void RCU_SHT_member_less_lazy();
+        void RCU_SHT_member_cmpmix_lazy();
+
+        void nogc_base_cmp_lazy();
+        void nogc_base_less_lazy();
+        void nogc_base_cmpmix_lazy();
+        void nogc_member_cmp_lazy();
+        void nogc_member_less_lazy();
+        void nogc_member_cmpmix_lazy();
+
+        // SplitListSet + MichaelList [dyn - dynamic bucket table, st - static bucket table]
+        void split_dyn_HP_base_cmp();
+        void split_dyn_HP_base_less();
+        void split_dyn_HP_base_cmpmix();
+        void split_dyn_HP_member_cmp();
+        void split_dyn_HP_member_less();
+        void split_dyn_HP_member_cmpmix();
+        void split_st_HP_base_cmp();
+        void split_st_HP_base_less();
+        void split_st_HP_base_cmpmix();
+        void split_st_HP_member_cmp();
+        void split_st_HP_member_less();
+        void split_st_HP_member_cmpmix();
+
+        void split_dyn_PTB_base_cmp();
+        void split_dyn_PTB_base_less();
+        void split_dyn_PTB_base_cmpmix();
+        void split_dyn_PTB_member_cmp();
+        void split_dyn_PTB_member_less();
+        void split_dyn_PTB_member_cmpmix();
+        void split_st_PTB_base_cmp();
+        void split_st_PTB_base_less();
+        void split_st_PTB_base_cmpmix();
+        void split_st_PTB_member_cmp();
+        void split_st_PTB_member_less();
+        void split_st_PTB_member_cmpmix();
+
+        void split_dyn_HRC_base_cmp();
+        void split_dyn_HRC_base_less();
+        void split_dyn_HRC_base_cmpmix();
+        void split_st_HRC_base_cmp();
+        void split_st_HRC_base_less();
+        void split_st_HRC_base_cmpmix();
+
+        void split_dyn_RCU_GPI_base_cmp();
+        void split_dyn_RCU_GPI_base_less();
+        void split_dyn_RCU_GPI_base_cmpmix();
+        void split_dyn_RCU_GPI_member_cmp();
+        void split_dyn_RCU_GPI_member_less();
+        void split_dyn_RCU_GPI_member_cmpmix();
+        void split_st_RCU_GPI_base_cmp();
+        void split_st_RCU_GPI_base_less();
+        void split_st_RCU_GPI_base_cmpmix();
+        void split_st_RCU_GPI_member_cmp();
+        void split_st_RCU_GPI_member_less();
+        void split_st_RCU_GPI_member_cmpmix();
+
+        void split_dyn_RCU_GPB_base_cmp();
+        void split_dyn_RCU_GPB_base_less();
+        void split_dyn_RCU_GPB_base_cmpmix();
+        void split_dyn_RCU_GPB_member_cmp();
+        void split_dyn_RCU_GPB_member_less();
+        void split_dyn_RCU_GPB_member_cmpmix();
+        void split_st_RCU_GPB_base_cmp();
+        void split_st_RCU_GPB_base_less();
+        void split_st_RCU_GPB_base_cmpmix();
+        void split_st_RCU_GPB_member_cmp();
+        void split_st_RCU_GPB_member_less();
+        void split_st_RCU_GPB_member_cmpmix();
+
+        void split_dyn_RCU_GPT_base_cmp();
+        void split_dyn_RCU_GPT_base_less();
+        void split_dyn_RCU_GPT_base_cmpmix();
+        void split_dyn_RCU_GPT_member_cmp();
+        void split_dyn_RCU_GPT_member_less();
+        void split_dyn_RCU_GPT_member_cmpmix();
+        void split_st_RCU_GPT_base_cmp();
+        void split_st_RCU_GPT_base_less();
+        void split_st_RCU_GPT_base_cmpmix();
+        void split_st_RCU_GPT_member_cmp();
+        void split_st_RCU_GPT_member_less();
+        void split_st_RCU_GPT_member_cmpmix();
+
+        void split_dyn_RCU_SHB_base_cmp();
+        void split_dyn_RCU_SHB_base_less();
+        void split_dyn_RCU_SHB_base_cmpmix();
+        void split_dyn_RCU_SHB_member_cmp();
+        void split_dyn_RCU_SHB_member_less();
+        void split_dyn_RCU_SHB_member_cmpmix();
+        void split_st_RCU_SHB_base_cmp();
+        void split_st_RCU_SHB_base_less();
+        void split_st_RCU_SHB_base_cmpmix();
+        void split_st_RCU_SHB_member_cmp();
+        void split_st_RCU_SHB_member_less();
+        void split_st_RCU_SHB_member_cmpmix();
+
+        void split_dyn_RCU_SHT_base_cmp();
+        void split_dyn_RCU_SHT_base_less();
+        void split_dyn_RCU_SHT_base_cmpmix();
+        void split_dyn_RCU_SHT_member_cmp();
+        void split_dyn_RCU_SHT_member_less();
+        void split_dyn_RCU_SHT_member_cmpmix();
+        void split_st_RCU_SHT_base_cmp();
+        void split_st_RCU_SHT_base_less();
+        void split_st_RCU_SHT_base_cmpmix();
+        void split_st_RCU_SHT_member_cmp();
+        void split_st_RCU_SHT_member_less();
+        void split_st_RCU_SHT_member_cmpmix();
+
+        void split_dyn_nogc_base_cmp();
+        void split_dyn_nogc_base_less();
+        void split_dyn_nogc_base_cmpmix();
+        void split_dyn_nogc_member_cmp();
+        void split_dyn_nogc_member_less();
+        void split_dyn_nogc_member_cmpmix();
+        void split_st_nogc_base_cmp();
+        void split_st_nogc_base_less();
+        void split_st_nogc_base_cmpmix();
+        void split_st_nogc_member_cmp();
+        void split_st_nogc_member_less();
+        void split_st_nogc_member_cmpmix();
+
+
+        // SplitListSet + LazyList [dyn - dynamic bucket table, st - static bucket table]
+        void split_dyn_HP_base_cmp_lazy();
+        void split_dyn_HP_base_less_lazy();
+        void split_dyn_HP_base_cmpmix_lazy();
+        void split_dyn_HP_member_cmp_lazy();
+        void split_dyn_HP_member_less_lazy();
+        void split_dyn_HP_member_cmpmix_lazy();
+        void split_st_HP_base_cmp_lazy();
+        void split_st_HP_base_less_lazy();
+        void split_st_HP_base_cmpmix_lazy();
+        void split_st_HP_member_cmp_lazy();
+        void split_st_HP_member_less_lazy();
+        void split_st_HP_member_cmpmix_lazy();
+
+        void split_dyn_PTB_base_cmp_lazy();
+        void split_dyn_PTB_base_less_lazy();
+        void split_dyn_PTB_base_cmpmix_lazy();
+        void split_dyn_PTB_member_cmp_lazy();
+        void split_dyn_PTB_member_less_lazy();
+        void split_dyn_PTB_member_cmpmix_lazy();
+        void split_st_PTB_base_cmp_lazy();
+        void split_st_PTB_base_less_lazy();
+        void split_st_PTB_base_cmpmix_lazy();
+        void split_st_PTB_member_cmp_lazy();
+        void split_st_PTB_member_less_lazy();
+        void split_st_PTB_member_cmpmix_lazy();
+
+        void split_dyn_HRC_base_cmp_lazy();
+        void split_dyn_HRC_base_less_lazy();
+        void split_dyn_HRC_base_cmpmix_lazy();
+        void split_st_HRC_base_cmp_lazy();
+        void split_st_HRC_base_less_lazy();
+        void split_st_HRC_base_cmpmix_lazy();
+
+        void split_dyn_RCU_GPI_base_cmp_lazy();
+        void split_dyn_RCU_GPI_base_less_lazy();
+        void split_dyn_RCU_GPI_base_cmpmix_lazy();
+        void split_dyn_RCU_GPI_member_cmp_lazy();
+        void split_dyn_RCU_GPI_member_less_lazy();
+        void split_dyn_RCU_GPI_member_cmpmix_lazy();
+        void split_st_RCU_GPI_base_cmp_lazy();
+        void split_st_RCU_GPI_base_less_lazy();
+        void split_st_RCU_GPI_base_cmpmix_lazy();
+        void split_st_RCU_GPI_member_cmp_lazy();
+        void split_st_RCU_GPI_member_less_lazy();
+        void split_st_RCU_GPI_member_cmpmix_lazy();
+
+        void split_dyn_RCU_GPB_base_cmp_lazy();
+        void split_dyn_RCU_GPB_base_less_lazy();
+        void split_dyn_RCU_GPB_base_cmpmix_lazy();
+        void split_dyn_RCU_GPB_member_cmp_lazy();
+        void split_dyn_RCU_GPB_member_less_lazy();
+        void split_dyn_RCU_GPB_member_cmpmix_lazy();
+        void split_st_RCU_GPB_base_cmp_lazy();
+        void split_st_RCU_GPB_base_less_lazy();
+        void split_st_RCU_GPB_base_cmpmix_lazy();
+        void split_st_RCU_GPB_member_cmp_lazy();
+        void split_st_RCU_GPB_member_less_lazy();
+        void split_st_RCU_GPB_member_cmpmix_lazy();
+
+        void split_dyn_RCU_GPT_base_cmp_lazy();
+        void split_dyn_RCU_GPT_base_less_lazy();
+        void split_dyn_RCU_GPT_base_cmpmix_lazy();
+        void split_dyn_RCU_GPT_member_cmp_lazy();
+        void split_dyn_RCU_GPT_member_less_lazy();
+        void split_dyn_RCU_GPT_member_cmpmix_lazy();
+        void split_st_RCU_GPT_base_cmp_lazy();
+        void split_st_RCU_GPT_base_less_lazy();
+        void split_st_RCU_GPT_base_cmpmix_lazy();
+        void split_st_RCU_GPT_member_cmp_lazy();
+        void split_st_RCU_GPT_member_less_lazy();
+        void split_st_RCU_GPT_member_cmpmix_lazy();
+
+        void split_dyn_RCU_SHB_base_cmp_lazy();
+        void split_dyn_RCU_SHB_base_less_lazy();
+        void split_dyn_RCU_SHB_base_cmpmix_lazy();
+        void split_dyn_RCU_SHB_member_cmp_lazy();
+        void split_dyn_RCU_SHB_member_less_lazy();
+        void split_dyn_RCU_SHB_member_cmpmix_lazy();
+        void split_st_RCU_SHB_base_cmp_lazy();
+        void split_st_RCU_SHB_base_less_lazy();
+        void split_st_RCU_SHB_base_cmpmix_lazy();
+        void split_st_RCU_SHB_member_cmp_lazy();
+        void split_st_RCU_SHB_member_less_lazy();
+        void split_st_RCU_SHB_member_cmpmix_lazy();
+
+        void split_dyn_RCU_SHT_base_cmp_lazy();
+        void split_dyn_RCU_SHT_base_less_lazy();
+        void split_dyn_RCU_SHT_base_cmpmix_lazy();
+        void split_dyn_RCU_SHT_member_cmp_lazy();
+        void split_dyn_RCU_SHT_member_less_lazy();
+        void split_dyn_RCU_SHT_member_cmpmix_lazy();
+        void split_st_RCU_SHT_base_cmp_lazy();
+        void split_st_RCU_SHT_base_less_lazy();
+        void split_st_RCU_SHT_base_cmpmix_lazy();
+        void split_st_RCU_SHT_member_cmp_lazy();
+        void split_st_RCU_SHT_member_less_lazy();
+        void split_st_RCU_SHT_member_cmpmix_lazy();
+
+        void split_dyn_nogc_base_cmp_lazy();
+        void split_dyn_nogc_base_less_lazy();
+        void split_dyn_nogc_base_cmpmix_lazy();
+        void split_dyn_nogc_member_cmp_lazy();
+        void split_dyn_nogc_member_less_lazy();
+        void split_dyn_nogc_member_cmpmix_lazy();
+        void split_st_nogc_base_cmp_lazy();
+        void split_st_nogc_base_less_lazy();
+        void split_st_nogc_base_cmpmix_lazy();
+        void split_st_nogc_member_cmp_lazy();
+        void split_st_nogc_member_less_lazy();
+        void split_st_nogc_member_cmpmix_lazy();
+
+        CPPUNIT_TEST_SUITE(IntrusiveHashSetHdrTest)
+            CPPUNIT_TEST(HP_base_cmp)
+            CPPUNIT_TEST(HP_base_less)
+            CPPUNIT_TEST(HP_base_cmpmix)
+            CPPUNIT_TEST(HP_member_cmp)
+            CPPUNIT_TEST(HP_member_less)
+            CPPUNIT_TEST(HP_member_cmpmix)
+
+            CPPUNIT_TEST(PTB_base_cmp)
+            CPPUNIT_TEST(PTB_base_less)
+            CPPUNIT_TEST(PTB_base_cmpmix)
+            CPPUNIT_TEST(PTB_member_cmp)
+            CPPUNIT_TEST(PTB_member_less)
+            CPPUNIT_TEST(PTB_member_cmpmix)
+
+            CPPUNIT_TEST(HRC_base_cmp)
+            CPPUNIT_TEST(HRC_base_less)
+            CPPUNIT_TEST(HRC_base_cmpmix)
+
+            CPPUNIT_TEST(RCU_GPI_base_cmp)
+            CPPUNIT_TEST(RCU_GPI_base_less)
+            CPPUNIT_TEST(RCU_GPI_base_cmpmix)
+            CPPUNIT_TEST(RCU_GPI_member_cmp)
+            CPPUNIT_TEST(RCU_GPI_member_less)
+            CPPUNIT_TEST(RCU_GPI_member_cmpmix)
+
+            CPPUNIT_TEST(RCU_GPB_base_cmp)
+            CPPUNIT_TEST(RCU_GPB_base_less)
+            CPPUNIT_TEST(RCU_GPB_base_cmpmix)
+            CPPUNIT_TEST(RCU_GPB_member_cmp)
+            CPPUNIT_TEST(RCU_GPB_member_less)
+            CPPUNIT_TEST(RCU_GPB_member_cmpmix)
+
+            CPPUNIT_TEST(RCU_GPT_base_cmp)
+            CPPUNIT_TEST(RCU_GPT_base_less)
+            CPPUNIT_TEST(RCU_GPT_base_cmpmix)
+            CPPUNIT_TEST(RCU_GPT_member_cmp)
+            CPPUNIT_TEST(RCU_GPT_member_less)
+            CPPUNIT_TEST(RCU_GPT_member_cmpmix)
+
+            CPPUNIT_TEST(RCU_SHB_base_cmp)
+            CPPUNIT_TEST(RCU_SHB_base_less)
+            CPPUNIT_TEST(RCU_SHB_base_cmpmix)
+            CPPUNIT_TEST(RCU_SHB_member_cmp)
+            CPPUNIT_TEST(RCU_SHB_member_less)
+            CPPUNIT_TEST(RCU_SHB_member_cmpmix)
+
+            CPPUNIT_TEST(RCU_SHT_base_cmp)
+            CPPUNIT_TEST(RCU_SHT_base_less)
+            CPPUNIT_TEST(RCU_SHT_base_cmpmix)
+            CPPUNIT_TEST(RCU_SHT_member_cmp)
+            CPPUNIT_TEST(RCU_SHT_member_less)
+            CPPUNIT_TEST(RCU_SHT_member_cmpmix)
+
+            CPPUNIT_TEST(nogc_base_cmp)
+            CPPUNIT_TEST(nogc_base_less)
+            CPPUNIT_TEST(nogc_base_cmpmix)
+            CPPUNIT_TEST(nogc_member_cmp)
+            CPPUNIT_TEST(nogc_member_less)
+            CPPUNIT_TEST(nogc_member_cmpmix)
+
+            CPPUNIT_TEST(HP_base_cmp_lazy)
+            CPPUNIT_TEST(HP_base_less_lazy)
+            CPPUNIT_TEST(HP_base_cmpmix_lazy)
+            CPPUNIT_TEST(HP_member_cmp_lazy)
+            CPPUNIT_TEST(HP_member_less_lazy)
+            CPPUNIT_TEST(HP_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(PTB_base_cmp_lazy)
+            CPPUNIT_TEST(PTB_base_less_lazy)
+            CPPUNIT_TEST(PTB_base_cmpmix_lazy)
+            CPPUNIT_TEST(PTB_member_cmp_lazy)
+            CPPUNIT_TEST(PTB_member_less_lazy)
+            CPPUNIT_TEST(PTB_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(HRC_base_cmp_lazy)
+            CPPUNIT_TEST(HRC_base_less_lazy)
+            CPPUNIT_TEST(HRC_base_cmpmix_lazy)
+
+            CPPUNIT_TEST(RCU_GPI_base_cmp_lazy)
+            CPPUNIT_TEST(RCU_GPI_base_less_lazy)
+            CPPUNIT_TEST(RCU_GPI_base_cmpmix_lazy)
+            CPPUNIT_TEST(RCU_GPI_member_cmp_lazy)
+            CPPUNIT_TEST(RCU_GPI_member_less_lazy)
+            CPPUNIT_TEST(RCU_GPI_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(RCU_GPB_base_cmp_lazy)
+            CPPUNIT_TEST(RCU_GPB_base_less_lazy)
+            CPPUNIT_TEST(RCU_GPB_base_cmpmix_lazy)
+            CPPUNIT_TEST(RCU_GPB_member_cmp_lazy)
+            CPPUNIT_TEST(RCU_GPB_member_less_lazy)
+            CPPUNIT_TEST(RCU_GPB_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(RCU_GPT_base_cmp_lazy)
+            CPPUNIT_TEST(RCU_GPT_base_less_lazy)
+            CPPUNIT_TEST(RCU_GPT_base_cmpmix_lazy)
+            CPPUNIT_TEST(RCU_GPT_member_cmp_lazy)
+            CPPUNIT_TEST(RCU_GPT_member_less_lazy)
+            CPPUNIT_TEST(RCU_GPT_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(RCU_SHB_base_cmp_lazy)
+            CPPUNIT_TEST(RCU_SHB_base_less_lazy)
+            CPPUNIT_TEST(RCU_SHB_base_cmpmix_lazy)
+            CPPUNIT_TEST(RCU_SHB_member_cmp_lazy)
+            CPPUNIT_TEST(RCU_SHB_member_less_lazy)
+            CPPUNIT_TEST(RCU_SHB_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(RCU_SHT_base_cmp_lazy)
+            CPPUNIT_TEST(RCU_SHT_base_less_lazy)
+            CPPUNIT_TEST(RCU_SHT_base_cmpmix_lazy)
+            CPPUNIT_TEST(RCU_SHT_member_cmp_lazy)
+            CPPUNIT_TEST(RCU_SHT_member_less_lazy)
+            CPPUNIT_TEST(RCU_SHT_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(nogc_base_cmp_lazy)
+            CPPUNIT_TEST(nogc_base_less_lazy)
+            CPPUNIT_TEST(nogc_base_cmpmix_lazy)
+            CPPUNIT_TEST(nogc_member_cmp_lazy)
+            CPPUNIT_TEST(nogc_member_less_lazy)
+            CPPUNIT_TEST(nogc_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(split_dyn_HP_base_cmp)
+            CPPUNIT_TEST(split_dyn_HP_base_less)
+            CPPUNIT_TEST(split_dyn_HP_base_cmpmix)
+            CPPUNIT_TEST(split_dyn_HP_member_cmp)
+            CPPUNIT_TEST(split_dyn_HP_member_less)
+            CPPUNIT_TEST(split_dyn_HP_member_cmpmix)
+            CPPUNIT_TEST(split_st_HP_base_cmp)
+            CPPUNIT_TEST(split_st_HP_base_less)
+            CPPUNIT_TEST(split_st_HP_base_cmpmix)
+            CPPUNIT_TEST(split_st_HP_member_cmp)
+            CPPUNIT_TEST(split_st_HP_member_less)
+            CPPUNIT_TEST(split_st_HP_member_cmpmix)
+
+            CPPUNIT_TEST(split_dyn_PTB_base_cmp)
+            CPPUNIT_TEST(split_dyn_PTB_base_less)
+            CPPUNIT_TEST(split_dyn_PTB_base_cmpmix)
+            CPPUNIT_TEST(split_dyn_PTB_member_cmp)
+            CPPUNIT_TEST(split_dyn_PTB_member_less)
+            CPPUNIT_TEST(split_dyn_PTB_member_cmpmix)
+            CPPUNIT_TEST(split_st_PTB_base_cmp)
+            CPPUNIT_TEST(split_st_PTB_base_less)
+            CPPUNIT_TEST(split_st_PTB_base_cmpmix)
+            CPPUNIT_TEST(split_st_PTB_member_cmp)
+            CPPUNIT_TEST(split_st_PTB_member_less)
+            CPPUNIT_TEST(split_st_PTB_member_cmpmix)
+
+            CPPUNIT_TEST(split_dyn_HRC_base_cmp)
+            CPPUNIT_TEST(split_dyn_HRC_base_less)
+            CPPUNIT_TEST(split_dyn_HRC_base_cmpmix)
+            CPPUNIT_TEST(split_st_HRC_base_cmp)
+            CPPUNIT_TEST(split_st_HRC_base_less)
+            CPPUNIT_TEST(split_st_HRC_base_cmpmix)
+
+            CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmp)
+            CPPUNIT_TEST(split_dyn_RCU_GPI_base_less)
+            CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmpmix)
+            CPPUNIT_TEST(split_dyn_RCU_GPI_member_cmp)
+            CPPUNIT_TEST(split_dyn_RCU_GPI_member_less)
+            CPPUNIT_TEST(split_dyn_RCU_GPI_member_cmpmix)
+            CPPUNIT_TEST(split_st_RCU_GPI_base_cmp)
+            CPPUNIT_TEST(split_st_RCU_GPI_base_less)
+            CPPUNIT_TEST(split_st_RCU_GPI_base_cmpmix)
+            CPPUNIT_TEST(split_st_RCU_GPI_member_cmp)
+            CPPUNIT_TEST(split_st_RCU_GPI_member_less)
+            CPPUNIT_TEST(split_st_RCU_GPI_member_cmpmix)
+
+            CPPUNIT_TEST(split_dyn_RCU_GPB_base_cmp)
+            CPPUNIT_TEST(split_dyn_RCU_GPB_base_less)
+            CPPUNIT_TEST(split_dyn_RCU_GPB_base_cmpmix)
+            CPPUNIT_TEST(split_dyn_RCU_GPB_member_cmp)
+            CPPUNIT_TEST(split_dyn_RCU_GPB_member_less)
+            CPPUNIT_TEST(split_dyn_RCU_GPB_member_cmpmix)
+            CPPUNIT_TEST(split_st_RCU_GPB_base_cmp)
+            CPPUNIT_TEST(split_st_RCU_GPB_base_less)
+            CPPUNIT_TEST(split_st_RCU_GPB_base_cmpmix)
+            CPPUNIT_TEST(split_st_RCU_GPB_member_cmp)
+            CPPUNIT_TEST(split_st_RCU_GPB_member_less)
+            CPPUNIT_TEST(split_st_RCU_GPB_member_cmpmix)
+
+            CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmp)
+            CPPUNIT_TEST(split_dyn_RCU_GPT_base_less)
+            CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmpmix)
+            CPPUNIT_TEST(split_dyn_RCU_GPT_member_cmp)
+            CPPUNIT_TEST(split_dyn_RCU_GPT_member_less)
+            CPPUNIT_TEST(split_dyn_RCU_GPT_member_cmpmix)
+            CPPUNIT_TEST(split_st_RCU_GPT_base_cmp)
+            CPPUNIT_TEST(split_st_RCU_GPT_base_less)
+            CPPUNIT_TEST(split_st_RCU_GPT_base_cmpmix)
+            CPPUNIT_TEST(split_st_RCU_GPT_member_cmp)
+            CPPUNIT_TEST(split_st_RCU_GPT_member_less)
+            CPPUNIT_TEST(split_st_RCU_GPT_member_cmpmix)
+
+            CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmp)
+            CPPUNIT_TEST(split_dyn_RCU_SHB_base_less)
+            CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmpmix)
+            CPPUNIT_TEST(split_dyn_RCU_SHB_member_cmp)
+            CPPUNIT_TEST(split_dyn_RCU_SHB_member_less)
+            CPPUNIT_TEST(split_dyn_RCU_SHB_member_cmpmix)
+            CPPUNIT_TEST(split_st_RCU_SHB_base_cmp)
+            CPPUNIT_TEST(split_st_RCU_SHB_base_less)
+            CPPUNIT_TEST(split_st_RCU_SHB_base_cmpmix)
+            CPPUNIT_TEST(split_st_RCU_SHB_member_cmp)
+            CPPUNIT_TEST(split_st_RCU_SHB_member_less)
+            CPPUNIT_TEST(split_st_RCU_SHB_member_cmpmix)
+
+            CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmp)
+            CPPUNIT_TEST(split_dyn_RCU_SHT_base_less)
+            CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmpmix)
+            CPPUNIT_TEST(split_dyn_RCU_SHT_member_cmp)
+            CPPUNIT_TEST(split_dyn_RCU_SHT_member_less)
+            CPPUNIT_TEST(split_dyn_RCU_SHT_member_cmpmix)
+            CPPUNIT_TEST(split_st_RCU_SHT_base_cmp)
+            CPPUNIT_TEST(split_st_RCU_SHT_base_less)
+            CPPUNIT_TEST(split_st_RCU_SHT_base_cmpmix)
+            CPPUNIT_TEST(split_st_RCU_SHT_member_cmp)
+            CPPUNIT_TEST(split_st_RCU_SHT_member_less)
+            CPPUNIT_TEST(split_st_RCU_SHT_member_cmpmix)
+
+            CPPUNIT_TEST(split_dyn_nogc_base_cmp)
+            CPPUNIT_TEST(split_dyn_nogc_base_less)
+            CPPUNIT_TEST(split_dyn_nogc_base_cmpmix)
+            CPPUNIT_TEST(split_dyn_nogc_member_cmp)
+            CPPUNIT_TEST(split_dyn_nogc_member_less)
+            CPPUNIT_TEST(split_dyn_nogc_member_cmpmix)
+            CPPUNIT_TEST(split_st_nogc_base_cmp)
+            CPPUNIT_TEST(split_st_nogc_base_less)
+            CPPUNIT_TEST(split_st_nogc_base_cmpmix)
+            CPPUNIT_TEST(split_st_nogc_member_cmp)
+            CPPUNIT_TEST(split_st_nogc_member_less)
+            CPPUNIT_TEST(split_st_nogc_member_cmpmix)
+
+
+            CPPUNIT_TEST(split_dyn_HP_base_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_HP_base_less_lazy)
+            CPPUNIT_TEST(split_dyn_HP_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_dyn_HP_member_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_HP_member_less_lazy)
+            CPPUNIT_TEST(split_dyn_HP_member_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_HP_base_cmp_lazy)
+            CPPUNIT_TEST(split_st_HP_base_less_lazy)
+            CPPUNIT_TEST(split_st_HP_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_HP_member_cmp_lazy)
+            CPPUNIT_TEST(split_st_HP_member_less_lazy)
+            CPPUNIT_TEST(split_st_HP_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(split_dyn_PTB_base_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_PTB_base_less_lazy)
+            CPPUNIT_TEST(split_dyn_PTB_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_dyn_PTB_member_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_PTB_member_less_lazy)
+            CPPUNIT_TEST(split_dyn_PTB_member_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_PTB_base_cmp_lazy)
+            CPPUNIT_TEST(split_st_PTB_base_less_lazy)
+            CPPUNIT_TEST(split_st_PTB_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_PTB_member_cmp_lazy)
+            CPPUNIT_TEST(split_st_PTB_member_less_lazy)
+            CPPUNIT_TEST(split_st_PTB_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(split_dyn_HRC_base_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_HRC_base_less_lazy)
+            CPPUNIT_TEST(split_dyn_HRC_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_HRC_base_cmp_lazy)
+            CPPUNIT_TEST(split_st_HRC_base_less_lazy)
+            CPPUNIT_TEST(split_st_HRC_base_cmpmix_lazy)
+
+            CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPI_base_less_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPI_member_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPI_member_less_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPI_member_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPI_base_cmp_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPI_base_less_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPI_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPI_member_cmp_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPI_member_less_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPI_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(split_dyn_RCU_GPB_base_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPB_base_less_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPB_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPB_member_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPB_member_less_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPB_member_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPB_base_cmp_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPB_base_less_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPB_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPB_member_cmp_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPB_member_less_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPB_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPT_base_less_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPT_member_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPT_member_less_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_GPT_member_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPT_base_cmp_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPT_base_less_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPT_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPT_member_cmp_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPT_member_less_lazy)
+            CPPUNIT_TEST(split_st_RCU_GPT_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_SHB_base_less_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_SHB_member_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_SHB_member_less_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_SHB_member_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHB_base_cmp_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHB_base_less_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHB_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHB_member_cmp_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHB_member_less_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHB_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_SHT_base_less_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_SHT_member_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_SHT_member_less_lazy)
+            CPPUNIT_TEST(split_dyn_RCU_SHT_member_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHT_base_cmp_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHT_base_less_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHT_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHT_member_cmp_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHT_member_less_lazy)
+            CPPUNIT_TEST(split_st_RCU_SHT_member_cmpmix_lazy)
+
+            CPPUNIT_TEST(split_dyn_nogc_base_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_nogc_base_less_lazy)
+            CPPUNIT_TEST(split_dyn_nogc_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_dyn_nogc_member_cmp_lazy)
+            CPPUNIT_TEST(split_dyn_nogc_member_less_lazy)
+            CPPUNIT_TEST(split_dyn_nogc_member_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_nogc_base_cmp_lazy)
+            CPPUNIT_TEST(split_st_nogc_base_less_lazy)
+            CPPUNIT_TEST(split_st_nogc_base_cmpmix_lazy)
+            CPPUNIT_TEST(split_st_nogc_member_cmp_lazy)
+            CPPUNIT_TEST(split_st_nogc_member_less_lazy)
+            CPPUNIT_TEST(split_st_nogc_member_cmpmix_lazy)
+
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_hp.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_hp.cpp
new file mode 100644 (file)
index 0000000..5919a65
--- /dev/null
@@ -0,0 +1,329 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set.h"
+
+#include <cds/intrusive/skip_list_hp.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+
+    void IntrusiveSkipListSet::skiplist_hp_base_cmp()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_less()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_cmpmix()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_cmp_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_less_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_cmp_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_less_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_cmpmix_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_hp_base_cmp_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_less_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_cmpmix_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    //*********
+    void IntrusiveSkipListSet::skiplist_hp_base_cmp_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_less_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_cmpmix_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_hp_base_cmp_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_less_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_base_cmpmix_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+}   // namespace set
+
+CPPUNIT_TEST_SUITE_REGISTRATION(set::IntrusiveSkipListSet);
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_hp_member.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_hp_member.cpp
new file mode 100644 (file)
index 0000000..5632472
--- /dev/null
@@ -0,0 +1,325 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set.h"
+
+#include <cds/intrusive/skip_list_hp.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+        void IntrusiveSkipListSet::skiplist_hp_member_cmp()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_less()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_cmpmix()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_cmp_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_less_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_cmp_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_less_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_cmpmix_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_hp_member_cmp_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_less_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_cmpmix_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    void IntrusiveSkipListSet::skiplist_hp_member_cmp_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_less_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_cmpmix_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_hp_member_cmp_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_less_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hp_member_cmpmix_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::HP> > item;
+
+        typedef ci::SkipListSet< cds::gc::HP, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_hrc.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_hrc.cpp
new file mode 100644 (file)
index 0000000..85baebe
--- /dev/null
@@ -0,0 +1,327 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set.h"
+
+#include <cds/intrusive/skip_list_hrc.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_cmp()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_less()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_cmpmix()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_cmp_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_less_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_cmp_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_less_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_cmpmix_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_hrc_base_cmp_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_less_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_cmpmix_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    //*********
+    void IntrusiveSkipListSet::skiplist_hrc_base_cmp_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_less_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_cmpmix_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_hrc_base_cmp_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_less_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_hrc_base_cmpmix_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::HRC> > item;
+
+        typedef ci::SkipListSet< cds::gc::HRC, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_nogc.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_nogc.cpp
new file mode 100644 (file)
index 0000000..34c13e3
--- /dev/null
@@ -0,0 +1,309 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set.h"
+
+#include <cds/intrusive/skip_list_nogc.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_cmp()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_less()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_cmpmix()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< cmp<item> >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_cmp_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_less_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_cmp_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_less_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_cmpmix_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_nogc_base_cmp_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_less_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_cmpmix_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    //*********
+    void IntrusiveSkipListSet::skiplist_nogc_base_cmp_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_less_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_cmpmix_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_nogc_base_cmp_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_less_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_base_cmpmix_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_nogc_member.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_nogc_member.cpp
new file mode 100644 (file)
index 0000000..a7cd09e
--- /dev/null
@@ -0,0 +1,309 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set.h"
+
+#include <cds/intrusive/skip_list_nogc.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_cmp()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_less()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_cmpmix()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< cmp<item> >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_cmp_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_less_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_cmp_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_less_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_cmpmix_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_nogc_member_cmp_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_less_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_cmpmix_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    //*********
+    void IntrusiveSkipListSet::skiplist_nogc_member_cmp_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_less_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_cmpmix_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_nogc_member_cmp_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_less_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_nogc_member_cmpmix_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::nogc> > item;
+
+        typedef ci::SkipListSet< cds::gc::nogc, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist_nogc<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_ptb.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_ptb.cpp
new file mode 100644 (file)
index 0000000..3b87ace
--- /dev/null
@@ -0,0 +1,327 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set.h"
+
+#include <cds/intrusive/skip_list_ptb.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_cmp()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_less()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_cmpmix()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< cmp<item> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_cmp_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_less_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_cmp_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_less_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_cmpmix_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_ptb_base_cmp_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_less_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_cmpmix_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    //*********
+    void IntrusiveSkipListSet::skiplist_ptb_base_cmp_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_less_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_cmpmix_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_ptb_base_cmp_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_less_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_base_cmpmix_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_ptb_member.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_ptb_member.cpp
new file mode 100644 (file)
index 0000000..c812696
--- /dev/null
@@ -0,0 +1,325 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set.h"
+
+#include <cds/intrusive/skip_list_ptb.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+        void IntrusiveSkipListSet::skiplist_ptb_member_cmp()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_less()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_cmpmix()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_cmp_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_less_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_cmp_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_less_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_cmpmix_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_ptb_member_cmp_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_less_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_cmpmix_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_cmp_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_less_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_cmpmix_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSet::skiplist_ptb_member_cmp_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_less_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSet::skiplist_ptb_member_cmpmix_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< cds::gc::PTB> > item;
+
+        typedef ci::SkipListSet< cds::gc::PTB, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpb.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..49e0fef
--- /dev/null
@@ -0,0 +1,333 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set_rcu.h"
+
+#include <cds/urcu/general_buffered.h>
+#include <cds/intrusive/skip_list_rcu.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmp()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_less()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmpmix()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< cmp<item> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmp_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_less_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmp_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_less_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmpmix_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmp_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_less_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmpmix_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    //*********
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmp_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_less_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmpmix_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmp_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_less_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_base_cmpmix_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+}   // namespace set
+
+CPPUNIT_TEST_SUITE_REGISTRATION(set::IntrusiveSkipListSetRCU);
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpb_member.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpb_member.cpp
new file mode 100644 (file)
index 0000000..7f1a4d2
--- /dev/null
@@ -0,0 +1,330 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set_rcu.h"
+
+#include <cds/urcu/general_buffered.h>
+#include <cds/intrusive/skip_list_rcu.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmp()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_less()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmpmix()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmp_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_less_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmp_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_less_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmpmix_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmp_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_less_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmpmix_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmp_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_less_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmpmix_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmp_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_less_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpb_member_cmpmix_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpi.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..7c13142
--- /dev/null
@@ -0,0 +1,331 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set_rcu.h"
+
+#include <cds/urcu/general_instant.h>
+#include <cds/intrusive/skip_list_rcu.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmp()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_less()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmpmix()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< cmp<item> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmp_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_less_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmp_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_less_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmpmix_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmp_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_less_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmpmix_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    //*********
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmp_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_less_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmpmix_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmp_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_less_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_base_cmpmix_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpi_member.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpi_member.cpp
new file mode 100644 (file)
index 0000000..5ad6050
--- /dev/null
@@ -0,0 +1,330 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set_rcu.h"
+
+#include <cds/urcu/general_instant.h>
+#include <cds/intrusive/skip_list_rcu.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpt.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..6933819
--- /dev/null
@@ -0,0 +1,331 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set_rcu.h"
+
+#include <cds/urcu/general_threaded.h>
+#include <cds/intrusive/skip_list_rcu.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmp()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_less()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmpmix()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< cmp<item> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmp_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_less_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmp_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_less_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmpmix_xorshift()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmp_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_less_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmpmix_xorshift_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    //*********
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmp_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_less_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmpmix_pascal()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmp_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_less_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_base_cmpmix_pascal_stat()
+    {
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpt_member.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_gpt_member.cpp
new file mode 100644 (file)
index 0000000..ca62b52
--- /dev/null
@@ -0,0 +1,330 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set_rcu.h"
+
+#include <cds/urcu/general_threaded.h>
+#include <cds/intrusive/skip_list_rcu.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmp()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_less()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmpmix()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmp_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_less_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmp_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_less_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmpmix_xorshift()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmp_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_less_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmpmix_xorshift_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmp_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_less_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmpmix_pascal()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmp_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_less_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_gpt_member_cmpmix_pascal_stat()
+    {
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_shb.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..cabe86a
--- /dev/null
@@ -0,0 +1,372 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set_rcu.h"
+
+#include <cds/urcu/signal_buffered.h>
+#include <cds/intrusive/skip_list_rcu.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+    }
+#endif
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< cmp<item> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmp_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_less_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmpmix_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmp_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_less_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmpmix_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+
+    //*********
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmp_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_less_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmpmix_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+        void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmp_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_less_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_base_cmpmix_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+}   // namespace set
+
+CPPUNIT_TEST_SUITE_REGISTRATION(set::IntrusiveSkipListSetRCU);
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_shb_member.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_shb_member.cpp
new file mode 100644 (file)
index 0000000..b7b90b0
--- /dev/null
@@ -0,0 +1,368 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set_rcu.h"
+
+#include <cds/urcu/signal_buffered.h>
+#include <cds/intrusive/skip_list_rcu.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+    }
+#endif
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_sht.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..57177c7
--- /dev/null
@@ -0,0 +1,369 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set_rcu.h"
+
+#include <cds/urcu/signal_threaded.h>
+#include <cds/intrusive/skip_list_rcu.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+    }
+#endif
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< cmp<item> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmp_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_less_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmpmix_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmp_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_less_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmpmix_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+
+    //*********
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmp_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_less_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmpmix_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmp_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_less_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_base_cmpmix_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_sht_member.cpp b/tests/test-hdr/set/hdr_intrusive_skiplist_rcu_sht_member.cpp
new file mode 100644 (file)
index 0000000..77d2659
--- /dev/null
@@ -0,0 +1,368 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_skiplist_set_rcu.h"
+
+#include <cds/urcu/signal_threaded.h>
+#include <cds/intrusive/skip_list_rcu.h>
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+    }
+#endif
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmp_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_less_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmpmix_xorshift()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmp_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_less_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmpmix_xorshift_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
+                ,co::stat< ci::skip_list::stat<> >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmp_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_less_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmpmix_pascal()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmp_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_less_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+    void IntrusiveSkipListSetRCU::skiplist_rcu_sht_member_cmpmix_pascal_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::skip_list::node< rcu_type> > item;
+
+        typedef ci::SkipListSet< rcu_type, item,
+            ci::skip_list::make_traits<
+                ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,co::compare< cmp<item> >
+                ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
+                ,co::stat< ci::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        >   set_type;
+
+        test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_set.h b/tests/test-hdr/set/hdr_intrusive_skiplist_set.h
new file mode 100644 (file)
index 0000000..0b43a74
--- /dev/null
@@ -0,0 +1,787 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+
+namespace set {
+
+    class IntrusiveSkipListSet: public IntrusiveHashSetHdrTest
+    {
+        typedef IntrusiveHashSetHdrTest base_class;
+
+        static size_t const c_nArrSize = 1000;
+
+    protected:
+        struct other_key {
+            int nKey;
+
+            other_key()
+            {}
+
+            other_key( int key )
+                : nKey(key)
+            {}
+
+            template <typename Q>
+            other_key& operator=( Q const& src )
+            {
+                nKey = src.nKey;
+                return *this;
+            }
+        };
+
+        template <typename StoredType>
+        struct other_key_less
+        {
+            bool operator ()( StoredType const& n, other_key k ) const
+            {
+                return n.nKey < k.nKey;
+            }
+            bool operator ()( other_key k, StoredType const& n ) const
+            {
+                return k.nKey < n.nKey;
+            }
+        };
+
+        struct copy_other_key
+        {
+            template <typename Q>
+            void operator()( other_key& dest, Q const& src ) const
+            {
+                dest.nKey = src.nKey;
+            }
+        };
+
+    protected:
+        template <class Set, typename PrintStat>
+        void test_skiplist()
+        {
+            {
+                Set s;
+                base_class::test_int_with( s );
+            }
+
+            test_skiplist_<Set, PrintStat >();
+        }
+
+        template <class Set, typename PrintStat>
+        void test_skiplist_()
+        {
+            Set s;
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            typedef typename Set::value_type        value_type;
+            typedef typename Set::iterator          set_iterator;
+            typedef typename Set::const_iterator    const_set_iterator;
+            typedef typename base_class::less<value_type>   less;
+
+            value_type  v[c_nArrSize];
+            int nCount = 0;
+            int nPrevKey = 0;
+
+            // Test iterator - ascending order
+            for ( int i = 0; i < (int) (sizeof(v)/sizeof(v[0])); ++i ) {
+                v[i].nKey = i;
+                v[i].nVal = i * 2;
+
+                CPPUNIT_ASSERT( s.insert( v[i] ));
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            //CPPUNIT_MSG( PrintStat()(s, "Iterator test, ascending insert order") );
+
+            nCount = 0;
+            nPrevKey = 0;
+            for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                CPPUNIT_ASSERT( s.find( it->nKey ));
+                it->nVal = (*it).nKey;
+                ++nCount;
+                if ( it != s.begin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+            nCount = 0;
+            for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                ++nCount;
+                if ( it != s.cbegin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+            for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nKey == v[i].nVal );
+                CPPUNIT_ASSERT( s.find_with( v[i].nKey, less() ));
+            }
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            Set::gc::force_dispose();
+
+            for ( size_t i = 0; i < (int) sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nDisposeCount == 1 );
+            }
+
+            // Test iterator - descending order
+            for ( int i = (int) sizeof(v)/sizeof(v[0]) - 1; i >= 0; --i ) {
+                v[i].nKey = i;
+                v[i].nVal = i * 2;
+
+                CPPUNIT_ASSERT( s.insert( v[i] ));
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+
+            //CPPUNIT_MSG( PrintStat()(s, "Iterator test, descending insert order") );
+
+            nCount = 0;
+            for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                it->nVal = (*it).nKey;
+                ++nCount;
+                if ( it != s.begin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+            nCount = 0;
+            for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                ++nCount;
+                if ( it != s.cbegin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+            for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nKey == v[i].nVal );
+            }
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            Set::gc::force_dispose();
+
+            for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nDisposeCount == 2 );
+            }
+
+            // Test iterator - random order
+            fill_skiplist( s, v );
+            //CPPUNIT_MSG( PrintStat()(s, "Iterator test, random insert order") );
+
+            nCount = 0;
+            for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                it->nVal = (*it).nKey;
+                ++nCount;
+                if ( it != s.begin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+            nCount = 0;
+            for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                ++nCount;
+                if ( it != s.cbegin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+            for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nKey == v[i].nVal );
+            }
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            Set::gc::force_dispose();
+
+            for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nDisposeCount == 3 );
+            }
+
+            CPPUNIT_MSG( "extract test" );
+            // extract/get test
+            {
+                typename Set::guarded_ptr gp;
+
+                // extract
+                fill_skiplist( s, v );
+                for ( int i = c_nArrSize - 1; i >= 0; i -= 1 ) {
+                    CPPUNIT_CHECK( s.get(gp, i));
+                    CPPUNIT_CHECK( gp->nKey == i );
+                    CPPUNIT_CHECK( gp->nVal == i * 2 );
+                    gp->nVal *= 2;
+                    gp.release();
+
+                    CPPUNIT_CHECK( s.extract( gp, i ));
+                    CPPUNIT_CHECK_EX( gp->nKey == i, "i=" << i << ", gp->nKey=" << gp->nKey);
+                    CPPUNIT_CHECK_EX( (*gp).nVal == i * 4, "i=" << i << ", gp->nVal=" << gp->nVal );
+                    CPPUNIT_CHECK( !s.extract( gp, i ));
+                    CPPUNIT_CHECK( !s.get( gp, i ));
+                }
+                gp.release();
+                CPPUNIT_CHECK( s.empty() );
+                Set::gc::force_dispose();
+
+                // extract_with
+                fill_skiplist( s, v );
+                for ( int i = c_nArrSize - 1; i >= 0; i -= 1 ) {
+                    CPPUNIT_CHECK( s.get_with( gp, other_key(i), other_key_less<typename Set::value_type>() ));
+                    CPPUNIT_CHECK( gp->nKey == i );
+                    CPPUNIT_CHECK( (*gp).nVal == i * 2 );
+                    gp->nVal *= 2;
+                    gp.release();
+
+                    CPPUNIT_CHECK( s.extract_with( gp, other_key(i), other_key_less<typename Set::value_type>() ));
+                    CPPUNIT_CHECK_EX( gp->nKey == i, "i=" << i << ", gp->nKey=" << gp->nKey);
+                    CPPUNIT_CHECK_EX( (*gp).nVal == i * 4, "i=" << i << ", gp->nVal=" << gp->nVal );
+                    CPPUNIT_CHECK( !s.extract_with( gp, other_key(i), other_key_less<typename Set::value_type>() ));
+                    CPPUNIT_CHECK( !s.get_with( gp, other_key(i), other_key_less<typename Set::value_type>() ));
+                }
+                gp.release();
+                CPPUNIT_CHECK( s.empty() );
+                Set::gc::force_dispose();
+
+                // extract_min
+                {
+                    fill_skiplist( s, v );
+                    int nPrevKey;
+                    CPPUNIT_ASSERT( s.extract_min( gp ));
+                    nPrevKey = gp->nKey;
+                    while ( !s.empty() ) {
+                        CPPUNIT_CHECK( s.extract_min( gp ));
+                        CPPUNIT_ASSERT( !gp.empty());
+                        CPPUNIT_CHECK( gp->nKey == nPrevKey + 1 );
+                        CPPUNIT_CHECK( (*gp).nVal == (nPrevKey + 1) * 2 );
+                        nPrevKey = gp->nKey;
+                        gp.release();
+                    }
+                    gp.release();
+                    CPPUNIT_CHECK( !s.extract_min(gp));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                Set::gc::force_dispose();
+
+                // extract_max
+                {
+                    fill_skiplist( s, v );
+                    int nPrevKey;
+                    CPPUNIT_ASSERT( s.extract_max( gp ));
+                    nPrevKey = gp->nKey;
+                    while ( !s.empty() ) {
+
+                        CPPUNIT_CHECK( s.extract_max( gp ));
+                        CPPUNIT_ASSERT( !gp.empty() );
+                        CPPUNIT_CHECK( gp->nKey == nPrevKey - 1 );
+                        CPPUNIT_CHECK( (*gp).nVal == (nPrevKey - 1) * 2 );
+                        nPrevKey = gp->nKey;
+                        gp.release();
+                    }
+                    gp.release();
+                    CPPUNIT_CHECK( !s.extract_min(gp));
+                    CPPUNIT_CHECK( gp.empty());
+
+                    CPPUNIT_CHECK( !s.extract_max(gp));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                Set::gc::force_dispose();
+            }
+
+            CPPUNIT_MSG( PrintStat()( s, NULL ));
+        }
+
+        template <typename Set>
+        void fill_skiplist( Set& s, typename Set::value_type * pArr )
+        {
+            int nRand[c_nArrSize];
+            for ( int i = 0; i < (int) c_nArrSize; ++i ) {
+                nRand[i] = i;
+            }
+            std::random_shuffle( nRand, nRand + c_nArrSize );
+
+            for ( int i = 0; i < (int) c_nArrSize; ++i ) {
+                pArr[i].nKey = nRand[i];
+                pArr[i].nVal = nRand[i] * 2;
+                CPPUNIT_ASSERT( s.insert( pArr[i] ));
+            }
+            CPPUNIT_CHECK( check_size( s, c_nArrSize ));
+        }
+
+        template <class Set, typename PrintStat>
+        void test_skiplist_nogc()
+        {
+            typedef typename Set::value_type    value_type;
+            typedef typename Set::iterator set_iterator;
+            typedef typename Set::iterator const_set_iterator;
+            typedef typename base_class::less<value_type>   less;
+
+            value_type v1( 10, 50 );
+            value_type v2( 5, 25  );
+            value_type v3( 20, 100 );
+            int key;
+
+            Set s;
+
+            // insert test
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            // insert/find test
+            CPPUNIT_ASSERT( s.find( v1.key() ) == NULL );
+            CPPUNIT_ASSERT( s.insert( v1 ));
+            CPPUNIT_ASSERT( s.find( v1.key() ) == &v1 );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            CPPUNIT_ASSERT( s.find_with( v2.key(), less() ) == NULL );
+            CPPUNIT_ASSERT( s.insert( v2 ));
+            CPPUNIT_ASSERT( v2.nFindCount == 0 );
+            CPPUNIT_ASSERT( s.find_with( key = v2.key(), less(), find_functor() ));
+            CPPUNIT_ASSERT( v2.nFindCount == 1 );
+            v2.nFindCount = 0;
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.empty() );
+
+            {
+                find_functor    ff;
+                CPPUNIT_ASSERT( s.find( v3 ) == NULL );
+                CPPUNIT_ASSERT( s.insert( v3 ));
+                CPPUNIT_ASSERT( v3.nFindCount == 0 );
+                CPPUNIT_ASSERT( s.find( v3, cds::ref(ff) ));
+                CPPUNIT_ASSERT( v3.nFindCount == 1 );
+                v3.nFindCount = 0;
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+                CPPUNIT_ASSERT( !s.empty() );
+            }
+
+            CPPUNIT_ASSERT( !s.empty() );
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            //CPPUNIT_MSG( PrintStat()(s, "Insert test") );
+
+            ensure_functor f;
+            std::pair<bool, bool> ret = s.ensure( v1, f );
+            CPPUNIT_ASSERT( ret.first );
+            CPPUNIT_ASSERT( ret.second );
+            CPPUNIT_ASSERT( v1.nEnsureNewCount == 1 );
+            CPPUNIT_ASSERT( v1.nEnsureCount == 0 );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            ret = s.ensure( v2, f );
+            CPPUNIT_ASSERT( ret.first );
+            CPPUNIT_ASSERT( ret.second );
+            CPPUNIT_ASSERT( v2.nEnsureNewCount == 1 );
+            CPPUNIT_ASSERT( v2.nEnsureCount == 0 );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            ret = s.ensure( v3, f );
+            CPPUNIT_ASSERT( ret.first );
+            CPPUNIT_ASSERT( ret.second );
+            CPPUNIT_ASSERT( v3.nEnsureNewCount == 1 );
+            CPPUNIT_ASSERT( v3.nEnsureCount == 0 );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find( v1 ) == &v1 );
+            CPPUNIT_ASSERT( s.find_with( v2, base_class::less<value_type>() ) == &v2 );
+            CPPUNIT_ASSERT( s.find( v3 ) == &v3 );
+
+            ret = s.ensure( v1, f );
+            CPPUNIT_ASSERT( ret.first );
+            CPPUNIT_ASSERT( !ret.second );
+            CPPUNIT_ASSERT( v1.nEnsureNewCount == 1 );
+            CPPUNIT_ASSERT( v1.nEnsureCount == 1 );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            ret = s.ensure( v2, f );
+            CPPUNIT_ASSERT( ret.first );
+            CPPUNIT_ASSERT( !ret.second );
+            CPPUNIT_ASSERT( v2.nEnsureNewCount == 1 );
+            CPPUNIT_ASSERT( v2.nEnsureCount == 1 );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            ret = s.ensure( v3, f );
+            CPPUNIT_ASSERT( ret.first );
+            CPPUNIT_ASSERT( !ret.second );
+            CPPUNIT_ASSERT( v3.nEnsureNewCount == 1 );
+            CPPUNIT_ASSERT( v3.nEnsureCount == 1 );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find( v1 ) == &v1 );
+            CPPUNIT_ASSERT( s.find( v2 ) == &v2 );
+            CPPUNIT_ASSERT( s.find( v3 ) == &v3 );
+
+            CPPUNIT_ASSERT( !s.empty() );
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            //CPPUNIT_MSG( PrintStat()(s, "Ensure test") );
+
+            // get_min test
+            CPPUNIT_CHECK( s.get_min() == NULL );
+            CPPUNIT_CHECK( s.get_max() == NULL );
+
+            {
+                value_type  v[1000];
+                for ( int i = 999; i >= 0; --i ) {
+                    v[i].nKey = i;
+                    v[i].nVal = i * 2;
+
+                    CPPUNIT_ASSERT( s.insert( v[i] ));
+                    value_type * pVal = s.get_min();
+                    CPPUNIT_ASSERT( pVal != NULL );
+                    CPPUNIT_CHECK( pVal->nKey == i );
+                    CPPUNIT_CHECK( pVal->nVal == i * 2 );
+                }
+
+                CPPUNIT_ASSERT( !s.empty() );
+                s.clear();
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 0 ));
+            }
+
+            // Iterator test
+            {
+                value_type  v[500];
+
+                for ( int i = 0; unsigned(i) < sizeof(v)/sizeof(v[0]); ++i ) {
+                    v[i].nKey = i;
+                    v[i].nVal = i * 2;
+
+                    CPPUNIT_ASSERT( s.insert( v[i] ));
+
+                    value_type * pVal = s.get_max();
+                    CPPUNIT_ASSERT( pVal != NULL );
+                    CPPUNIT_CHECK( pVal->nKey == i );
+                    CPPUNIT_CHECK( pVal->nVal == i * 2 );
+                }
+
+                int nCount = 0;
+                for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                    it->nVal = (*it).nKey;
+                    ++nCount;
+                }
+                CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+                nCount = 0;
+                for ( const_set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                    ++nCount;
+                }
+                CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+                for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                    CPPUNIT_ASSERT( v[i].nKey == v[i].nVal );
+                }
+
+                //CPPUNIT_MSG( PrintStat()(s, "Iterator test") );
+                s.clear();
+            }
+
+            // Test empty set
+            CPPUNIT_ASSERT( s.begin() == s.end() );
+            CPPUNIT_ASSERT( s.cbegin() == s.cend() );
+
+            CPPUNIT_MSG( PrintStat()(s, NULL) );
+        }
+
+    public:
+        // Skip-list - gc::HP
+        void skiplist_hp_base_cmp();
+        void skiplist_hp_base_less();
+        void skiplist_hp_base_cmpmix();
+        void skiplist_hp_base_cmp_stat();
+        void skiplist_hp_base_less_stat();
+        void skiplist_hp_base_cmpmix_stat();
+        void skiplist_hp_base_cmp_xorshift();
+        void skiplist_hp_base_less_xorshift();
+        void skiplist_hp_base_cmpmix_xorshift();
+        void skiplist_hp_base_cmp_xorshift_stat();
+        void skiplist_hp_base_less_xorshift_stat();
+        void skiplist_hp_base_cmpmix_xorshift_stat();
+        void skiplist_hp_base_cmp_pascal();
+        void skiplist_hp_base_less_pascal();
+        void skiplist_hp_base_cmpmix_pascal();
+        void skiplist_hp_base_cmp_pascal_stat();
+        void skiplist_hp_base_less_pascal_stat();
+        void skiplist_hp_base_cmpmix_pascal_stat();
+
+        void skiplist_hp_member_cmp();
+        void skiplist_hp_member_less();
+        void skiplist_hp_member_cmpmix();
+        void skiplist_hp_member_cmp_stat();
+        void skiplist_hp_member_less_stat();
+        void skiplist_hp_member_cmpmix_stat();
+        void skiplist_hp_member_cmp_xorshift();
+        void skiplist_hp_member_less_xorshift();
+        void skiplist_hp_member_cmpmix_xorshift();
+        void skiplist_hp_member_cmp_xorshift_stat();
+        void skiplist_hp_member_less_xorshift_stat();
+        void skiplist_hp_member_cmpmix_xorshift_stat();
+        void skiplist_hp_member_cmp_pascal();
+        void skiplist_hp_member_less_pascal();
+        void skiplist_hp_member_cmpmix_pascal();
+        void skiplist_hp_member_cmp_pascal_stat();
+        void skiplist_hp_member_less_pascal_stat();
+        void skiplist_hp_member_cmpmix_pascal_stat();
+
+        // Skip-list - gc::HRC
+        void skiplist_hrc_base_cmp();
+        void skiplist_hrc_base_less();
+        void skiplist_hrc_base_cmpmix();
+        void skiplist_hrc_base_cmp_stat();
+        void skiplist_hrc_base_less_stat();
+        void skiplist_hrc_base_cmpmix_stat();
+        void skiplist_hrc_base_cmp_xorshift();
+        void skiplist_hrc_base_less_xorshift();
+        void skiplist_hrc_base_cmpmix_xorshift();
+        void skiplist_hrc_base_cmp_xorshift_stat();
+        void skiplist_hrc_base_less_xorshift_stat();
+        void skiplist_hrc_base_cmpmix_xorshift_stat();
+        void skiplist_hrc_base_cmp_pascal();
+        void skiplist_hrc_base_less_pascal();
+        void skiplist_hrc_base_cmpmix_pascal();
+        void skiplist_hrc_base_cmp_pascal_stat();
+        void skiplist_hrc_base_less_pascal_stat();
+        void skiplist_hrc_base_cmpmix_pascal_stat();
+
+        // Skip-list - gc::PTB
+        void skiplist_ptb_base_cmp();
+        void skiplist_ptb_base_less();
+        void skiplist_ptb_base_cmpmix();
+        void skiplist_ptb_base_cmp_stat();
+        void skiplist_ptb_base_less_stat();
+        void skiplist_ptb_base_cmpmix_stat();
+        void skiplist_ptb_base_cmp_xorshift();
+        void skiplist_ptb_base_less_xorshift();
+        void skiplist_ptb_base_cmpmix_xorshift();
+        void skiplist_ptb_base_cmp_xorshift_stat();
+        void skiplist_ptb_base_less_xorshift_stat();
+        void skiplist_ptb_base_cmpmix_xorshift_stat();
+        void skiplist_ptb_base_cmp_pascal();
+        void skiplist_ptb_base_less_pascal();
+        void skiplist_ptb_base_cmpmix_pascal();
+        void skiplist_ptb_base_cmp_pascal_stat();
+        void skiplist_ptb_base_less_pascal_stat();
+        void skiplist_ptb_base_cmpmix_pascal_stat();
+
+        void skiplist_ptb_member_cmp();
+        void skiplist_ptb_member_less();
+        void skiplist_ptb_member_cmpmix();
+        void skiplist_ptb_member_cmp_stat();
+        void skiplist_ptb_member_less_stat();
+        void skiplist_ptb_member_cmpmix_stat();
+        void skiplist_ptb_member_cmp_xorshift();
+        void skiplist_ptb_member_less_xorshift();
+        void skiplist_ptb_member_cmpmix_xorshift();
+        void skiplist_ptb_member_cmp_xorshift_stat();
+        void skiplist_ptb_member_less_xorshift_stat();
+        void skiplist_ptb_member_cmpmix_xorshift_stat();
+        void skiplist_ptb_member_cmp_pascal();
+        void skiplist_ptb_member_less_pascal();
+        void skiplist_ptb_member_cmpmix_pascal();
+        void skiplist_ptb_member_cmp_pascal_stat();
+        void skiplist_ptb_member_less_pascal_stat();
+        void skiplist_ptb_member_cmpmix_pascal_stat();
+
+        // Skip-list - gc::nogc
+        void skiplist_nogc_base_cmp();
+        void skiplist_nogc_base_less();
+        void skiplist_nogc_base_cmpmix();
+        void skiplist_nogc_base_cmp_stat();
+        void skiplist_nogc_base_less_stat();
+        void skiplist_nogc_base_cmpmix_stat();
+        void skiplist_nogc_base_cmp_xorshift();
+        void skiplist_nogc_base_less_xorshift();
+        void skiplist_nogc_base_cmpmix_xorshift();
+        void skiplist_nogc_base_cmp_xorshift_stat();
+        void skiplist_nogc_base_less_xorshift_stat();
+        void skiplist_nogc_base_cmpmix_xorshift_stat();
+        void skiplist_nogc_base_cmp_pascal();
+        void skiplist_nogc_base_less_pascal();
+        void skiplist_nogc_base_cmpmix_pascal();
+        void skiplist_nogc_base_cmp_pascal_stat();
+        void skiplist_nogc_base_less_pascal_stat();
+        void skiplist_nogc_base_cmpmix_pascal_stat();
+
+        void skiplist_nogc_member_cmp();
+        void skiplist_nogc_member_less();
+        void skiplist_nogc_member_cmpmix();
+        void skiplist_nogc_member_cmp_stat();
+        void skiplist_nogc_member_less_stat();
+        void skiplist_nogc_member_cmpmix_stat();
+        void skiplist_nogc_member_cmp_xorshift();
+        void skiplist_nogc_member_less_xorshift();
+        void skiplist_nogc_member_cmpmix_xorshift();
+        void skiplist_nogc_member_cmp_xorshift_stat();
+        void skiplist_nogc_member_less_xorshift_stat();
+        void skiplist_nogc_member_cmpmix_xorshift_stat();
+        void skiplist_nogc_member_cmp_pascal();
+        void skiplist_nogc_member_less_pascal();
+        void skiplist_nogc_member_cmpmix_pascal();
+        void skiplist_nogc_member_cmp_pascal_stat();
+        void skiplist_nogc_member_less_pascal_stat();
+        void skiplist_nogc_member_cmpmix_pascal_stat();
+
+        CPPUNIT_TEST_SUITE(IntrusiveSkipListSet)
+            CPPUNIT_TEST(skiplist_hp_base_cmp)
+            CPPUNIT_TEST(skiplist_hp_base_less)
+            CPPUNIT_TEST(skiplist_hp_base_cmpmix)
+            CPPUNIT_TEST(skiplist_hp_base_cmp_stat)
+            CPPUNIT_TEST(skiplist_hp_base_less_stat)
+            CPPUNIT_TEST(skiplist_hp_base_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_hp_base_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_hp_base_less_xorshift)
+            CPPUNIT_TEST(skiplist_hp_base_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_hp_base_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_hp_base_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_hp_base_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_hp_base_cmp_pascal)
+            CPPUNIT_TEST(skiplist_hp_base_less_pascal)
+            CPPUNIT_TEST(skiplist_hp_base_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_hp_base_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_hp_base_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_hp_base_cmpmix_pascal_stat)
+
+            CPPUNIT_TEST(skiplist_hp_member_cmp)
+            CPPUNIT_TEST(skiplist_hp_member_less)
+            CPPUNIT_TEST(skiplist_hp_member_cmpmix)
+            CPPUNIT_TEST(skiplist_hp_member_cmp_stat)
+            CPPUNIT_TEST(skiplist_hp_member_less_stat)
+            CPPUNIT_TEST(skiplist_hp_member_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_hp_member_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_hp_member_less_xorshift)
+            CPPUNIT_TEST(skiplist_hp_member_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_hp_member_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_hp_member_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_hp_member_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_hp_member_cmp_pascal)
+            CPPUNIT_TEST(skiplist_hp_member_less_pascal)
+            CPPUNIT_TEST(skiplist_hp_member_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_hp_member_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_hp_member_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_hp_member_cmpmix_pascal_stat)
+
+            CPPUNIT_TEST(skiplist_hrc_base_cmp)
+            CPPUNIT_TEST(skiplist_hrc_base_less)
+            CPPUNIT_TEST(skiplist_hrc_base_cmpmix)
+            CPPUNIT_TEST(skiplist_hrc_base_cmp_stat)
+            CPPUNIT_TEST(skiplist_hrc_base_less_stat)
+            CPPUNIT_TEST(skiplist_hrc_base_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_hrc_base_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_hrc_base_less_xorshift)
+            CPPUNIT_TEST(skiplist_hrc_base_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_hrc_base_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_hrc_base_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_hrc_base_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_hrc_base_cmp_pascal)
+            CPPUNIT_TEST(skiplist_hrc_base_less_pascal)
+            CPPUNIT_TEST(skiplist_hrc_base_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_hrc_base_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_hrc_base_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_hrc_base_cmpmix_pascal_stat)
+
+            CPPUNIT_TEST(skiplist_ptb_base_cmp)
+            CPPUNIT_TEST(skiplist_ptb_base_less)
+            CPPUNIT_TEST(skiplist_ptb_base_cmpmix)
+            CPPUNIT_TEST(skiplist_ptb_base_cmp_stat)
+            CPPUNIT_TEST(skiplist_ptb_base_less_stat)
+            CPPUNIT_TEST(skiplist_ptb_base_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_ptb_base_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_ptb_base_less_xorshift)
+            CPPUNIT_TEST(skiplist_ptb_base_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_ptb_base_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_ptb_base_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_ptb_base_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_ptb_base_cmp_pascal)
+            CPPUNIT_TEST(skiplist_ptb_base_less_pascal)
+            CPPUNIT_TEST(skiplist_ptb_base_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_ptb_base_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_ptb_base_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_ptb_base_cmpmix_pascal_stat)
+
+            CPPUNIT_TEST(skiplist_ptb_member_cmp)
+            CPPUNIT_TEST(skiplist_ptb_member_less)
+            CPPUNIT_TEST(skiplist_ptb_member_cmpmix)
+            CPPUNIT_TEST(skiplist_ptb_member_cmp_stat)
+            CPPUNIT_TEST(skiplist_ptb_member_less_stat)
+            CPPUNIT_TEST(skiplist_ptb_member_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_ptb_member_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_ptb_member_less_xorshift)
+            CPPUNIT_TEST(skiplist_ptb_member_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_ptb_member_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_ptb_member_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_ptb_member_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_ptb_member_cmp_pascal)
+            CPPUNIT_TEST(skiplist_ptb_member_less_pascal)
+            CPPUNIT_TEST(skiplist_ptb_member_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_ptb_member_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_ptb_member_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_ptb_member_cmpmix_pascal_stat)
+
+            CPPUNIT_TEST(skiplist_nogc_base_cmp)
+            CPPUNIT_TEST(skiplist_nogc_base_less)
+            CPPUNIT_TEST(skiplist_nogc_base_cmpmix)
+            CPPUNIT_TEST(skiplist_nogc_base_cmp_stat)
+            CPPUNIT_TEST(skiplist_nogc_base_less_stat)
+            CPPUNIT_TEST(skiplist_nogc_base_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_nogc_base_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_nogc_base_less_xorshift)
+            CPPUNIT_TEST(skiplist_nogc_base_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_nogc_base_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_nogc_base_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_nogc_base_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_nogc_base_cmp_pascal)
+            CPPUNIT_TEST(skiplist_nogc_base_less_pascal)
+            CPPUNIT_TEST(skiplist_nogc_base_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_nogc_base_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_nogc_base_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_nogc_base_cmpmix_pascal_stat)
+
+            CPPUNIT_TEST(skiplist_nogc_member_cmp)
+            CPPUNIT_TEST(skiplist_nogc_member_less)
+            CPPUNIT_TEST(skiplist_nogc_member_cmpmix)
+            CPPUNIT_TEST(skiplist_nogc_member_cmp_stat)
+            CPPUNIT_TEST(skiplist_nogc_member_less_stat)
+            CPPUNIT_TEST(skiplist_nogc_member_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_nogc_member_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_nogc_member_less_xorshift)
+            CPPUNIT_TEST(skiplist_nogc_member_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_nogc_member_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_nogc_member_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_nogc_member_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_nogc_member_cmp_pascal)
+            CPPUNIT_TEST(skiplist_nogc_member_less_pascal)
+            CPPUNIT_TEST(skiplist_nogc_member_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_nogc_member_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_nogc_member_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_nogc_member_cmpmix_pascal_stat)
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_skiplist_set_rcu.h b/tests/test-hdr/set/hdr_intrusive_skiplist_set_rcu.h
new file mode 100644 (file)
index 0000000..bc65e86
--- /dev/null
@@ -0,0 +1,778 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+
+namespace set {
+
+    class IntrusiveSkipListSetRCU: public IntrusiveHashSetHdrTest
+    {
+        typedef IntrusiveHashSetHdrTest base_class;
+
+        static size_t const c_nArrSize = 1000;
+
+        template <typename Set>
+        struct extract_disposer {
+            void operator()( typename Set::value_type * pVal ) const
+            {
+                pVal->nVal = 0;
+            }
+        };
+
+    protected:
+        struct other_key {
+            int nKey;
+
+            other_key()
+            {}
+
+            other_key( int key )
+                : nKey(key)
+            {}
+
+            template <typename Q>
+            other_key& operator=( Q const& src )
+            {
+                nKey = src.nKey;
+                return *this;
+            }
+        };
+
+        template <typename StoredType>
+        struct other_key_less
+        {
+            bool operator ()( StoredType const& n, other_key k ) const
+            {
+                return n.nKey < k.nKey;
+            }
+            bool operator ()( other_key k, StoredType const& n ) const
+            {
+                return k.nKey < n.nKey;
+            }
+        };
+
+        struct copy_other_key
+        {
+            template <typename Q>
+            void operator()( other_key& dest, Q const& src ) const
+            {
+                dest.nKey = src.nKey;
+            }
+        };
+
+    protected:
+
+        template <class Set, typename PrintStat>
+        void test_skiplist()
+        {
+            {
+                Set s;
+                base_class::test_int_with( s );
+            }
+
+            test_skiplist_<Set, PrintStat >();
+        }
+
+        template <class Set, typename PrintStat>
+        void test_skiplist_()
+        {
+            Set s;
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            typedef typename Set::gc::scoped_lock   rcu_lock;
+            typedef typename Set::value_type        value_type;
+            typedef typename Set::iterator          set_iterator;
+            typedef typename Set::const_iterator    const_set_iterator;
+
+            value_type  v[c_nArrSize];
+            int nCount = 0;
+            int nPrevKey = 0;
+
+            // Test iterator - ascending order
+            for ( int i = 0; i < (int) (sizeof(v)/sizeof(v[0])); ++i ) {
+                v[i].nKey = i;
+                v[i].nVal = i * 2;
+
+                CPPUNIT_ASSERT( s.insert( v[i] ));
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+
+            //CPPUNIT_MSG( PrintStat()(s, "Iterator test, ascending insert order") );
+
+            nCount = 0;
+            nPrevKey = 0;
+            {
+                rcu_lock l;
+                for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                    CPPUNIT_ASSERT( s.find( it->nKey ));
+                    it->nVal = (*it).nKey;
+                    ++nCount;
+                    if ( it != s.begin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+            nCount = 0;
+            {
+                rcu_lock l;
+                for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                    ++nCount;
+                    if ( it != s.cbegin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_CHECK( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_CHECK( nCount == sizeof(v)/sizeof(v[0]));
+
+            for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nKey == v[i].nVal );
+                CPPUNIT_ASSERT( s.find( v[i].nKey ));
+            }
+
+            s.clear();
+            CPPUNIT_CHECK( s.empty() );
+            CPPUNIT_CHECK( check_size( s, 0));
+            Set::gc::force_dispose();
+
+            for ( size_t i = 0; i < (int) sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_CHECK( v[i].nDisposeCount == 1 );
+            }
+
+            // Test iterator - descending order
+            for ( int i = (int) sizeof(v)/sizeof(v[0]) - 1; i >= 0; --i ) {
+                v[i].nKey = i;
+                v[i].nVal = i * 2;
+
+                CPPUNIT_ASSERT( s.insert( v[i] ));
+            }
+            CPPUNIT_CHECK( check_size( s, sizeof(v)/sizeof(v[0]) ));
+
+            //CPPUNIT_MSG( PrintStat()(s, "Iterator test, descending insert order") );
+
+            nCount = 0;
+            {
+                rcu_lock l;
+                for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                    it->nVal = (*it).nKey;
+                    ++nCount;
+                    if ( it != s.begin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+            nCount = 0;
+            {
+                rcu_lock l;
+                for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                    ++nCount;
+                    if ( it != s.cbegin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+            for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nKey == v[i].nVal );
+            }
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            Set::gc::force_dispose();
+
+            for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nDisposeCount == 2 );
+            }
+
+            // Test iterator - random order
+            fill_skiplist( s, v );
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            //CPPUNIT_MSG( PrintStat()(s, "Iterator test, random insert order") );
+
+            nCount = 0;
+            {
+                rcu_lock l;
+                for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                    it->nVal = (*it).nKey;
+                    ++nCount;
+                    if ( it != s.begin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+            nCount = 0;
+            {
+                rcu_lock l;
+                for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                    ++nCount;
+                    if ( it != s.cbegin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
+            CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
+
+            for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nKey == v[i].nVal );
+            }
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+            Set::gc::force_dispose();
+
+            for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
+                CPPUNIT_ASSERT( v[i].nDisposeCount == 3 );
+            }
+
+            // extract/get test
+            {
+                typename Set::exempt_ptr ep;
+                // extract
+                {
+                    fill_skiplist( s, v );
+                    value_type * pVal;
+                    for ( int i = c_nArrSize - 1; i >= 0; i -= 1 ) {
+                        {
+                            rcu_lock l;
+                            pVal = s.get( i );
+                            CPPUNIT_ASSERT( pVal != NULL );
+                            CPPUNIT_CHECK( pVal->nKey == i );
+                            CPPUNIT_CHECK( pVal->nVal == i * 2 );
+                            pVal->nVal *= 2;
+                        }
+
+                        CPPUNIT_ASSERT( s.extract( ep, i ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->nKey == i );
+                        CPPUNIT_CHECK( ep->nVal == i * 4 );
+                        ep.release();
+
+                        {
+                            rcu_lock l;
+                            CPPUNIT_CHECK( s.get( i ) == NULL );
+                        }
+                        CPPUNIT_CHECK( !s.extract( ep, i ) );
+                        CPPUNIT_ASSERT( ep.empty() );
+                    }
+                    CPPUNIT_CHECK( s.empty() );
+                }
+                Set::gc::force_dispose();
+
+                // extract_with
+                {
+                    fill_skiplist( s, v );
+                    for ( int i = c_nArrSize - 1; i >= 0; i -= 1 ) {
+                        {
+                            rcu_lock l;
+                            value_type * pVal = s.get_with( other_key(i), other_key_less<typename Set::value_type>() );
+                            CPPUNIT_ASSERT( pVal != NULL );
+                            CPPUNIT_CHECK( pVal->nKey == i );
+                            CPPUNIT_CHECK( pVal->nVal == i * 2 );
+                            pVal->nVal *= 2;
+                        }
+
+                        CPPUNIT_ASSERT( s.extract_with( ep, other_key(i), other_key_less<typename Set::value_type>() ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( ep->nKey == i );
+                        CPPUNIT_CHECK( ep->nVal == i * 4 );
+                        ep.release();
+
+                        {
+                            rcu_lock l;
+                            CPPUNIT_CHECK( s.get_with( other_key(i), other_key_less<typename Set::value_type>() ) == NULL );
+                        }
+                        CPPUNIT_CHECK( !s.extract_with( ep, other_key(i), other_key_less<typename Set::value_type>() ));
+                    }
+                    CPPUNIT_CHECK( s.empty() );
+                }
+                Set::gc::force_dispose();
+
+                // extract_min
+                {
+                    fill_skiplist( s, v );
+                    int nPrevKey;
+
+                    CPPUNIT_ASSERT( s.extract_min(ep));
+                    CPPUNIT_ASSERT( !ep.empty());
+                    nPrevKey = ep->nKey;
+                    ep.release();
+
+                    while ( !s.empty() ) {
+                        CPPUNIT_ASSERT( s.extract_min(ep) );
+                        CPPUNIT_ASSERT( !ep.empty());
+                        CPPUNIT_CHECK( ep->nKey == nPrevKey + 1 );
+                        CPPUNIT_CHECK( ep->nVal == (nPrevKey + 1) * 2 );
+                        nPrevKey = ep->nKey;
+                        ep.release();
+                    }
+                    CPPUNIT_CHECK( !s.extract_min(ep) );
+                    CPPUNIT_CHECK( !s.extract_max(ep) );
+                }
+                Set::gc::force_dispose();
+
+                // extract_max
+                {
+                    fill_skiplist( s, v );
+                    int nPrevKey;
+
+                    CPPUNIT_ASSERT( s.extract_max(ep));
+                    CPPUNIT_ASSERT( !ep.empty());
+                    nPrevKey = ep->nKey;
+                    ep.release();
+
+                    while ( !s.empty() ) {
+                        CPPUNIT_ASSERT( s.extract_max(ep));
+                        CPPUNIT_ASSERT( !ep.empty());
+                        CPPUNIT_CHECK( ep->nKey == nPrevKey - 1 );
+                        CPPUNIT_CHECK( ep->nVal == (nPrevKey - 1) * 2 );
+                        nPrevKey = ep->nKey;
+                        ep.release();
+                    }
+                }
+                Set::gc::force_dispose();
+                CPPUNIT_CHECK( !s.extract_min(ep) );
+                CPPUNIT_CHECK( !s.extract_max(ep) );
+            }
+
+            CPPUNIT_MSG( PrintStat()(s, NULL) );
+        }
+
+        template <typename Set>
+        void fill_skiplist( Set& s, typename Set::value_type * pArr )
+        {
+            int nRand[c_nArrSize];
+            for ( int i = 0; i < (int) c_nArrSize; ++i ) {
+                nRand[i] = i;
+            }
+            std::random_shuffle( nRand, nRand + c_nArrSize );
+
+            for ( int i = 0; i < (int) c_nArrSize; ++i ) {
+                pArr[i].nKey = nRand[i];
+                pArr[i].nVal = nRand[i] * 2;
+                CPPUNIT_ASSERT( s.insert( pArr[i] ));
+            }
+            CPPUNIT_CHECK( check_size( s, c_nArrSize ));
+        }
+
+    public:
+
+        // Skip-list RCU
+        void skiplist_rcu_gpi_base_cmp();
+        void skiplist_rcu_gpi_base_less();
+        void skiplist_rcu_gpi_base_cmpmix();
+        void skiplist_rcu_gpi_base_cmp_stat();
+        void skiplist_rcu_gpi_base_less_stat();
+        void skiplist_rcu_gpi_base_cmpmix_stat();
+        void skiplist_rcu_gpi_base_cmp_xorshift();
+        void skiplist_rcu_gpi_base_less_xorshift();
+        void skiplist_rcu_gpi_base_cmpmix_xorshift();
+        void skiplist_rcu_gpi_base_cmp_xorshift_stat();
+        void skiplist_rcu_gpi_base_less_xorshift_stat();
+        void skiplist_rcu_gpi_base_cmpmix_xorshift_stat();
+        void skiplist_rcu_gpi_base_cmp_pascal();
+        void skiplist_rcu_gpi_base_less_pascal();
+        void skiplist_rcu_gpi_base_cmpmix_pascal();
+        void skiplist_rcu_gpi_base_cmp_pascal_stat();
+        void skiplist_rcu_gpi_base_less_pascal_stat();
+        void skiplist_rcu_gpi_base_cmpmix_pascal_stat();
+
+        void skiplist_rcu_gpi_member_cmp();
+        void skiplist_rcu_gpi_member_less();
+        void skiplist_rcu_gpi_member_cmpmix();
+        void skiplist_rcu_gpi_member_cmp_stat();
+        void skiplist_rcu_gpi_member_less_stat();
+        void skiplist_rcu_gpi_member_cmpmix_stat();
+        void skiplist_rcu_gpi_member_cmp_xorshift();
+        void skiplist_rcu_gpi_member_less_xorshift();
+        void skiplist_rcu_gpi_member_cmpmix_xorshift();
+        void skiplist_rcu_gpi_member_cmp_xorshift_stat();
+        void skiplist_rcu_gpi_member_less_xorshift_stat();
+        void skiplist_rcu_gpi_member_cmpmix_xorshift_stat();
+        void skiplist_rcu_gpi_member_cmp_pascal();
+        void skiplist_rcu_gpi_member_less_pascal();
+        void skiplist_rcu_gpi_member_cmpmix_pascal();
+        void skiplist_rcu_gpi_member_cmp_pascal_stat();
+        void skiplist_rcu_gpi_member_less_pascal_stat();
+        void skiplist_rcu_gpi_member_cmpmix_pascal_stat();
+
+        // general_buffered
+        void skiplist_rcu_gpb_base_cmp();
+        void skiplist_rcu_gpb_base_less();
+        void skiplist_rcu_gpb_base_cmpmix();
+        void skiplist_rcu_gpb_base_cmp_stat();
+        void skiplist_rcu_gpb_base_less_stat();
+        void skiplist_rcu_gpb_base_cmpmix_stat();
+        void skiplist_rcu_gpb_base_cmp_xorshift();
+        void skiplist_rcu_gpb_base_less_xorshift();
+        void skiplist_rcu_gpb_base_cmpmix_xorshift();
+        void skiplist_rcu_gpb_base_cmp_xorshift_stat();
+        void skiplist_rcu_gpb_base_less_xorshift_stat();
+        void skiplist_rcu_gpb_base_cmpmix_xorshift_stat();
+        void skiplist_rcu_gpb_base_cmp_pascal();
+        void skiplist_rcu_gpb_base_less_pascal();
+        void skiplist_rcu_gpb_base_cmpmix_pascal();
+        void skiplist_rcu_gpb_base_cmp_pascal_stat();
+        void skiplist_rcu_gpb_base_less_pascal_stat();
+        void skiplist_rcu_gpb_base_cmpmix_pascal_stat();
+
+        void skiplist_rcu_gpb_member_cmp();
+        void skiplist_rcu_gpb_member_less();
+        void skiplist_rcu_gpb_member_cmpmix();
+        void skiplist_rcu_gpb_member_cmp_stat();
+        void skiplist_rcu_gpb_member_less_stat();
+        void skiplist_rcu_gpb_member_cmpmix_stat();
+        void skiplist_rcu_gpb_member_cmp_xorshift();
+        void skiplist_rcu_gpb_member_less_xorshift();
+        void skiplist_rcu_gpb_member_cmpmix_xorshift();
+        void skiplist_rcu_gpb_member_cmp_xorshift_stat();
+        void skiplist_rcu_gpb_member_less_xorshift_stat();
+        void skiplist_rcu_gpb_member_cmpmix_xorshift_stat();
+        void skiplist_rcu_gpb_member_cmp_pascal();
+        void skiplist_rcu_gpb_member_less_pascal();
+        void skiplist_rcu_gpb_member_cmpmix_pascal();
+        void skiplist_rcu_gpb_member_cmp_pascal_stat();
+        void skiplist_rcu_gpb_member_less_pascal_stat();
+        void skiplist_rcu_gpb_member_cmpmix_pascal_stat();
+
+        // general_threaded
+        void skiplist_rcu_gpt_base_cmp();
+        void skiplist_rcu_gpt_base_less();
+        void skiplist_rcu_gpt_base_cmpmix();
+        void skiplist_rcu_gpt_base_cmp_stat();
+        void skiplist_rcu_gpt_base_less_stat();
+        void skiplist_rcu_gpt_base_cmpmix_stat();
+        void skiplist_rcu_gpt_base_cmp_xorshift();
+        void skiplist_rcu_gpt_base_less_xorshift();
+        void skiplist_rcu_gpt_base_cmpmix_xorshift();
+        void skiplist_rcu_gpt_base_cmp_xorshift_stat();
+        void skiplist_rcu_gpt_base_less_xorshift_stat();
+        void skiplist_rcu_gpt_base_cmpmix_xorshift_stat();
+        void skiplist_rcu_gpt_base_cmp_pascal();
+        void skiplist_rcu_gpt_base_less_pascal();
+        void skiplist_rcu_gpt_base_cmpmix_pascal();
+        void skiplist_rcu_gpt_base_cmp_pascal_stat();
+        void skiplist_rcu_gpt_base_less_pascal_stat();
+        void skiplist_rcu_gpt_base_cmpmix_pascal_stat();
+
+        void skiplist_rcu_gpt_member_cmp();
+        void skiplist_rcu_gpt_member_less();
+        void skiplist_rcu_gpt_member_cmpmix();
+        void skiplist_rcu_gpt_member_cmp_stat();
+        void skiplist_rcu_gpt_member_less_stat();
+        void skiplist_rcu_gpt_member_cmpmix_stat();
+        void skiplist_rcu_gpt_member_cmp_xorshift();
+        void skiplist_rcu_gpt_member_less_xorshift();
+        void skiplist_rcu_gpt_member_cmpmix_xorshift();
+        void skiplist_rcu_gpt_member_cmp_xorshift_stat();
+        void skiplist_rcu_gpt_member_less_xorshift_stat();
+        void skiplist_rcu_gpt_member_cmpmix_xorshift_stat();
+        void skiplist_rcu_gpt_member_cmp_pascal();
+        void skiplist_rcu_gpt_member_less_pascal();
+        void skiplist_rcu_gpt_member_cmpmix_pascal();
+        void skiplist_rcu_gpt_member_cmp_pascal_stat();
+        void skiplist_rcu_gpt_member_less_pascal_stat();
+        void skiplist_rcu_gpt_member_cmpmix_pascal_stat();
+
+        // signal_buffered
+        void skiplist_rcu_shb_base_cmp();
+        void skiplist_rcu_shb_base_less();
+        void skiplist_rcu_shb_base_cmpmix();
+        void skiplist_rcu_shb_base_cmp_stat();
+        void skiplist_rcu_shb_base_less_stat();
+        void skiplist_rcu_shb_base_cmpmix_stat();
+        void skiplist_rcu_shb_base_cmp_xorshift();
+        void skiplist_rcu_shb_base_less_xorshift();
+        void skiplist_rcu_shb_base_cmpmix_xorshift();
+        void skiplist_rcu_shb_base_cmp_xorshift_stat();
+        void skiplist_rcu_shb_base_less_xorshift_stat();
+        void skiplist_rcu_shb_base_cmpmix_xorshift_stat();
+        void skiplist_rcu_shb_base_cmp_pascal();
+        void skiplist_rcu_shb_base_less_pascal();
+        void skiplist_rcu_shb_base_cmpmix_pascal();
+        void skiplist_rcu_shb_base_cmp_pascal_stat();
+        void skiplist_rcu_shb_base_less_pascal_stat();
+        void skiplist_rcu_shb_base_cmpmix_pascal_stat();
+
+        void skiplist_rcu_shb_member_cmp();
+        void skiplist_rcu_shb_member_less();
+        void skiplist_rcu_shb_member_cmpmix();
+        void skiplist_rcu_shb_member_cmp_stat();
+        void skiplist_rcu_shb_member_less_stat();
+        void skiplist_rcu_shb_member_cmpmix_stat();
+        void skiplist_rcu_shb_member_cmp_xorshift();
+        void skiplist_rcu_shb_member_less_xorshift();
+        void skiplist_rcu_shb_member_cmpmix_xorshift();
+        void skiplist_rcu_shb_member_cmp_xorshift_stat();
+        void skiplist_rcu_shb_member_less_xorshift_stat();
+        void skiplist_rcu_shb_member_cmpmix_xorshift_stat();
+        void skiplist_rcu_shb_member_cmp_pascal();
+        void skiplist_rcu_shb_member_less_pascal();
+        void skiplist_rcu_shb_member_cmpmix_pascal();
+        void skiplist_rcu_shb_member_cmp_pascal_stat();
+        void skiplist_rcu_shb_member_less_pascal_stat();
+        void skiplist_rcu_shb_member_cmpmix_pascal_stat();
+
+        // signal_threaded
+        void skiplist_rcu_sht_base_cmp();
+        void skiplist_rcu_sht_base_less();
+        void skiplist_rcu_sht_base_cmpmix();
+        void skiplist_rcu_sht_base_cmp_stat();
+        void skiplist_rcu_sht_base_less_stat();
+        void skiplist_rcu_sht_base_cmpmix_stat();
+        void skiplist_rcu_sht_base_cmp_xorshift();
+        void skiplist_rcu_sht_base_less_xorshift();
+        void skiplist_rcu_sht_base_cmpmix_xorshift();
+        void skiplist_rcu_sht_base_cmp_xorshift_stat();
+        void skiplist_rcu_sht_base_less_xorshift_stat();
+        void skiplist_rcu_sht_base_cmpmix_xorshift_stat();
+        void skiplist_rcu_sht_base_cmp_pascal();
+        void skiplist_rcu_sht_base_less_pascal();
+        void skiplist_rcu_sht_base_cmpmix_pascal();
+        void skiplist_rcu_sht_base_cmp_pascal_stat();
+        void skiplist_rcu_sht_base_less_pascal_stat();
+        void skiplist_rcu_sht_base_cmpmix_pascal_stat();
+
+        void skiplist_rcu_sht_member_cmp();
+        void skiplist_rcu_sht_member_less();
+        void skiplist_rcu_sht_member_cmpmix();
+        void skiplist_rcu_sht_member_cmp_stat();
+        void skiplist_rcu_sht_member_less_stat();
+        void skiplist_rcu_sht_member_cmpmix_stat();
+        void skiplist_rcu_sht_member_cmp_xorshift();
+        void skiplist_rcu_sht_member_less_xorshift();
+        void skiplist_rcu_sht_member_cmpmix_xorshift();
+        void skiplist_rcu_sht_member_cmp_xorshift_stat();
+        void skiplist_rcu_sht_member_less_xorshift_stat();
+        void skiplist_rcu_sht_member_cmpmix_xorshift_stat();
+        void skiplist_rcu_sht_member_cmp_pascal();
+        void skiplist_rcu_sht_member_less_pascal();
+        void skiplist_rcu_sht_member_cmpmix_pascal();
+        void skiplist_rcu_sht_member_cmp_pascal_stat();
+        void skiplist_rcu_sht_member_less_pascal_stat();
+        void skiplist_rcu_sht_member_cmpmix_pascal_stat();
+
+        CPPUNIT_TEST_SUITE(IntrusiveSkipListSetRCU)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_less)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_less_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_less_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_less_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_pascal_stat)
+
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_less)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_less_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_less_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_less_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_pascal_stat)
+
+            //
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_less)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_less_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_less_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_less_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_pascal_stat)
+
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_less)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_less_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_less_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_less_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_pascal_stat)
+
+            //
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_less)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_less_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_less_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_less_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_pascal_stat)
+
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_less)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_less_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_less_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_less_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_pascal_stat)
+
+            //
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmp)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_less)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_less_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_less_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_pascal)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_less_pascal)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_pascal_stat)
+
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmp)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_less)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_less_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_less_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_pascal)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_less_pascal)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_pascal_stat)
+
+            //
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmp)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_less)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_less_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_less_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_pascal)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_less_pascal)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_pascal_stat)
+
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmp)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_less)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_less_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_less_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_xorshift)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_less_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_xorshift_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_pascal)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_less_pascal)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_pascal)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_less_pascal_stat)
+            CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_pascal_stat)
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_hp.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_hp.cpp
new file mode 100644 (file)
index 0000000..b859a4b
--- /dev/null
@@ -0,0 +1,318 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/michael_list_hp.h>
+#include <cds/intrusive/split_list.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_HP_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HP_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HP_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HP_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HP_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HP_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HP> > > item;
+        typedef ci::MichaelList< cds::gc::HP
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_hp_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_hp_lazy.cpp
new file mode 100644 (file)
index 0000000..477f4a9
--- /dev/null
@@ -0,0 +1,319 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/lazy_list_hp.h>
+#include <cds/intrusive/split_list.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::opt::back_off< cds::backoff::empty >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HP_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_HP_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HP_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HP_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HP_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HP_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HP_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
+        typedef ci::LazyList< cds::gc::HP
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::HP>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HP, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_hrc.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_hrc.cpp
new file mode 100644 (file)
index 0000000..f02b169
--- /dev/null
@@ -0,0 +1,155 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/michael_list_hrc.h>
+#include <cds/intrusive/split_list.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::split_dyn_HRC_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HRC> > > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HRC_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HRC> > > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HRC_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<cds::gc::HRC> > > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_HRC_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HRC> > > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HRC_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::HRC> > > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HRC_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<cds::gc::HRC> > > item;
+        typedef ci::MichaelList< cds::gc::HRC
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_hrc_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_hrc_lazy.cpp
new file mode 100644 (file)
index 0000000..7b2c317
--- /dev/null
@@ -0,0 +1,155 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/lazy_list_hrc.h>
+#include <cds/intrusive/split_list.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::split_dyn_HRC_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HRC> > > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HRC_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HRC> > > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_HRC_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::HRC> > > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_HRC_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HRC> > > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HRC_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HRC> > > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_HRC_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::HRC> > > item;
+        typedef ci::LazyList< cds::gc::HRC
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HRC> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::HRC, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_nogc.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_nogc.cpp
new file mode 100644 (file)
index 0000000..95e4b5a
--- /dev/null
@@ -0,0 +1,309 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/michael_list_nogc.h>
+#include <cds/intrusive/split_list_nogc.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_nogc_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_nogc_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_nogc_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_nogc_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_nogc_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_nogc_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::nogc> > > item;
+        typedef ci::MichaelList< cds::gc::nogc
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_nogc_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_nogc_lazy.cpp
new file mode 100644 (file)
index 0000000..4a80ab8
--- /dev/null
@@ -0,0 +1,310 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/lazy_list_nogc.h>
+#include <cds/intrusive/split_list_nogc.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+                ,ci::opt::back_off< cds::backoff::empty >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_nogc_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_nogc_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_nogc_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_nogc_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::nogc> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_nogc_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_nogc_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_nogc_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::nogc> > > item;
+        typedef ci::LazyList< cds::gc::nogc
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::nogc>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    bucket_type;
+
+        typedef ci::SplitListSet< cds::gc::nogc, bucket_type,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+
+        test_int_nogc<set>();
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_ptb.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_ptb.cpp
new file mode 100644 (file)
index 0000000..f9c30ed
--- /dev/null
@@ -0,0 +1,318 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/michael_list_ptb.h>
+#include <cds/intrusive/split_list.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_PTB_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_PTB_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_PTB_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_PTB_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_PTB_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_PTB_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<cds::gc::PTB> > > item;
+        typedef ci::MichaelList< cds::gc::PTB
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_ptb_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_ptb_lazy.cpp
new file mode 100644 (file)
index 0000000..5710a89
--- /dev/null
@@ -0,0 +1,318 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/intrusive/lazy_list_ptb.h>
+#include <cds/intrusive/split_list.h>
+
+namespace set {
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_PTB_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_int<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_PTB_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_PTB_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_PTB_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::PTB> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_PTB_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_PTB_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_PTB_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::PTB> > > item;
+        typedef ci::LazyList< cds::gc::PTB
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<cds::gc::PTB>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< cds::gc::PTB, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpb.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..25a46ea
--- /dev/null
@@ -0,0 +1,322 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/intrusive/split_list_rcu.h>
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp
new file mode 100644 (file)
index 0000000..76de301
--- /dev/null
@@ -0,0 +1,322 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/intrusive/split_list_rcu.h>
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpi.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..5de7a4d
--- /dev/null
@@ -0,0 +1,322 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/intrusive/split_list_rcu.h>
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp
new file mode 100644 (file)
index 0000000..d3641a2
--- /dev/null
@@ -0,0 +1,322 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/intrusive/split_list_rcu.h>
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpt.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..28b5803
--- /dev/null
@@ -0,0 +1,322 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/intrusive/split_list_rcu.h>
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_base_cmp()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_base_less()
+    {
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_base_cmpmix()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_member_cmp()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_member_less()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_member_cmpmix()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp
new file mode 100644 (file)
index 0000000..c26f7a5
--- /dev/null
@@ -0,0 +1,322 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/intrusive/split_list_rcu.h>
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_base_cmp_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_base_less_lazy()
+    {
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_base_cmpmix_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_member_cmp_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_member_less_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_member_cmpmix_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_shb.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..1731368
--- /dev/null
@@ -0,0 +1,348 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/intrusive/split_list_rcu.h>
+
+namespace set {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+    }
+#endif
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp
new file mode 100644 (file)
index 0000000..cc1f22a
--- /dev/null
@@ -0,0 +1,348 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/intrusive/split_list_rcu.h>
+
+namespace set {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+    }
+#endif
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_sht.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..a82dc51
--- /dev/null
@@ -0,0 +1,348 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/intrusive/michael_list_rcu.h>
+#include <cds/intrusive/split_list_rcu.h>
+
+namespace set {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+    }
+#endif
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp b/tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp
new file mode 100644 (file)
index 0000000..088607f
--- /dev/null
@@ -0,0 +1,347 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_set.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/intrusive/lazy_list_rcu.h>
+#include <cds/intrusive/split_list_rcu.h>
+
+namespace set {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+    }
+#endif
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<true>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<true>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+
+    // Static bucket table
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_cmp_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::memory_model<co::v::relaxed_ordering>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_less_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                ci::split_list::dynamic_bucket_table<false>
+                ,co::hash< hash_int >
+                ,co::memory_model<co::v::sequential_consistent>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_cmpmix_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+            >::type
+        > set;
+        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_intrusive_striped_hashset_avlset.cpp b/tests/test-hdr/set/hdr_intrusive_striped_hashset_avlset.cpp
new file mode 100644 (file)
index 0000000..ee40897
--- /dev/null
@@ -0,0 +1,96 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_avl_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::avl_set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::avl_set_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_avl_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::mutex_policy< ci::striped_set::striping<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_avl_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<64> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_avl_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_avl_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::avl_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_avl_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::avl_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_avl_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::avl_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::avl_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_striped_hashset_list.cpp b/tests/test-hdr/set/hdr_intrusive_striped_hashset_list.cpp
new file mode 100644 (file)
index 0000000..c4866bd
--- /dev/null
@@ -0,0 +1,187 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_list.h>
+#include <cds/intrusive/striped_set.h>
+
+#include <cds/details/std/type_traits.h>    // std::is_same
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::list_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::list_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_list_basehook_cmp()
+    {
+        typedef ci::StripedSet<
+            bi::list<base_item_type>
+            ,co::mutex_policy< ci::striped_set::striping<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_list_basehook_less()
+    {
+        typedef ci::StripedSet<
+            bi::list<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_list_basehook_cmpmix()
+    {
+        typedef ci::StripedSet<
+            bi::list<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_list_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::list<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<8> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_list_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::list<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        set_type s( 128, ci::striped_set::single_bucket_size_threshold<0>(4) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_list_memberhook_cmp()
+    {
+        typedef ci::StripedSet<
+            bi::list<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::list_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_list_memberhook_less()
+    {
+        typedef ci::StripedSet<
+            bi::list<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::list_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_list_memberhook_cmpmix()
+    {
+        typedef ci::StripedSet<
+            bi::list<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::list_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_list_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::list<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::list_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<8> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<member_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_list_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::list<
+            member_item_type
+            , bi::member_hook< member_item_type, bi::list_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<member_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        set_type s( 128, ci::striped_set::single_bucket_size_threshold<0>(4) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_striped_hashset_set.cpp b/tests/test-hdr/set/hdr_intrusive_striped_hashset_set.cpp
new file mode 100644 (file)
index 0000000..c97a89c
--- /dev/null
@@ -0,0 +1,96 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::set_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::mutex_policy< ci::striped_set::striping<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<64> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_striped_hashset_sgset.cpp b/tests/test-hdr/set/hdr_intrusive_striped_hashset_sgset.cpp
new file mode 100644 (file)
index 0000000..dddd88a
--- /dev/null
@@ -0,0 +1,96 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_sg_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::bs_set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::bs_set_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_sg_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::mutex_policy< ci::striped_set::striping<> >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_sg_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<64> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_sg_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_sg_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_sg_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_sg_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::sg_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_striped_hashset_slist.cpp b/tests/test-hdr/set/hdr_intrusive_striped_hashset_slist.cpp
new file mode 100644 (file)
index 0000000..cb431ef
--- /dev/null
@@ -0,0 +1,187 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_slist.h>
+#include <cds/intrusive/striped_set.h>
+
+#include <cds/details/std/type_traits.h>    // std::is_same
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::slist_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::slist_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_slist_basehook_cmp()
+    {
+        typedef ci::StripedSet<
+            bi::slist<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::mutex_policy< ci::striped_set::striping<> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_slist_basehook_less()
+    {
+        typedef ci::StripedSet<
+            bi::slist<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_slist_basehook_cmpmix()
+    {
+        typedef ci::StripedSet<
+            bi::slist<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_slist_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::slist<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<8> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_slist_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::slist<base_item_type>
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<base_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<base_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<base_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        set_type s( 128, ci::striped_set::single_bucket_size_threshold<0>(4) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_slist_memberhook_cmp()
+    {
+        typedef ci::StripedSet<
+            bi::slist<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::slist_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_slist_memberhook_less()
+    {
+        typedef ci::StripedSet<
+            bi::slist<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::slist_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_slist_memberhook_cmpmix()
+    {
+        typedef ci::StripedSet<
+            bi::slist<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::slist_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_slist_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::slist<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::slist_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<8> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<member_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_slist_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::slist<
+            member_item_type
+            , bi::member_hook< member_item_type, bi::slist_member_hook<>, &member_item_type::hMember>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::less< IntrusiveStripedSetHdrTest::less<member_item_type> >
+            ,co::compare< IntrusiveStripedSetHdrTest::cmp<member_item_type> >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        static_assert( (std::is_same<
+            IntrusiveStripedSetHdrTest::cmp<member_item_type>
+            ,set_type::bucket_type::key_comparator
+        >::value), "Key compare function selection error" );
+
+        set_type s( 128, ci::striped_set::single_bucket_size_threshold<0>(4) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_striped_hashset_splayset.cpp b/tests/test-hdr/set/hdr_intrusive_striped_hashset_splayset.cpp
new file mode 100644 (file)
index 0000000..1082ddf
--- /dev/null
@@ -0,0 +1,96 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_splay_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::splay_set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::splay_set_member_hook<> > member_item_type;
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_splay_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::mutex_policy< ci::striped_set::striping<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_splay_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<64> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_splay_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_splay_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::splay_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_splay_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::splay_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_splay_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::splay_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::splay_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_striped_hashset_treapset.cpp b/tests/test-hdr/set/hdr_intrusive_striped_hashset_treapset.cpp
new file mode 100644 (file)
index 0000000..cfda70f
--- /dev/null
@@ -0,0 +1,111 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_treap_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::bs_set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::bs_set_member_hook<> > member_item_type;
+
+        template <typename T>
+        struct priority_cmp: private IntrusiveStripedSetHdrTest::less<T>
+        {
+            typedef IntrusiveStripedSetHdrTest::less<T> base_class;
+
+            template <typename A, typename B>
+            bool operator()( A const& a, B const& b ) const
+            {
+                return base_class::operator()( b, a );
+            }
+        };
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_treap_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> >, bi::priority<priority_cmp<base_item_type> >  >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::mutex_policy< ci::striped_set::striping<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_treap_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> >, bi::priority<priority_cmp<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<64> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_treap_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<base_item_type, bi::compare<IntrusiveStripedSetHdrTest::less<base_item_type> >, bi::priority<priority_cmp<base_item_type> > >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_treap_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+                , bi::priority<priority_cmp<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_treap_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+                , bi::priority<priority_cmp<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_treap_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::treap_set<
+                member_item_type
+                , bi::member_hook< member_item_type, bi::bs_set_member_hook<>, &member_item_type::hMember>
+                , bi::compare<IntrusiveStripedSetHdrTest::less<member_item_type> >
+                , bi::priority<priority_cmp<member_item_type> >
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_striped_hashset_uset.cpp b/tests/test-hdr/set/hdr_intrusive_striped_hashset_uset.cpp
new file mode 100644 (file)
index 0000000..1bb1fa7
--- /dev/null
@@ -0,0 +1,178 @@
+//$$CDS-header$$
+
+#include "set/hdr_intrusive_striped_set.h"
+#include <cds/intrusive/striped_set/boost_unordered_set.h>
+#include <cds/intrusive/striped_set.h>
+
+namespace set {
+    namespace bi = boost::intrusive;
+
+    namespace {
+        typedef IntrusiveStripedSetHdrTest::base_item< bi::unordered_set_base_hook<> > base_item_type;
+        typedef IntrusiveStripedSetHdrTest::member_item< bi::unordered_set_member_hook<> > member_item_type;
+
+        struct hasher: private IntrusiveStripedSetHdrTest::hash_int
+        {
+            typedef IntrusiveStripedSetHdrTest::hash_int base_class;
+
+            size_t operator()( int i ) const
+            {
+                return ~( base_class::operator()(i));
+            }
+            template <typename Item>
+            size_t operator()( const Item& i ) const
+            {
+                return ~( base_class::operator()(i));
+            }
+            size_t operator()( IntrusiveStripedSetHdrTest::find_key const& i) const
+            {
+                return ~( base_class::operator()(i));
+            }
+        };
+
+        template <typename T>
+        struct is_equal: private IntrusiveStripedSetHdrTest::cmp<T>
+        {
+            typedef IntrusiveStripedSetHdrTest::cmp<T> base_class;
+
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return base_class::operator()( v1, v2 ) == 0;
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return base_class::operator()( v1, v2 ) == 0;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return base_class::operator()( v1, v2 ) == 0;
+            }
+        };
+
+        template <size_t Capacity, typename T, class Alloc = CDS_DEFAULT_ALLOCATOR>
+        struct dyn_buffer: public co::v::dynamic_buffer< T, Alloc >
+        {
+            typedef co::v::dynamic_buffer< T, Alloc >   base_class;
+        public:
+            template <typename Q>
+            struct rebind {
+                typedef dyn_buffer<Capacity, Q, Alloc> other   ;  ///< Rebinding result type
+            };
+
+            dyn_buffer()
+                : base_class( Capacity )
+            {}
+        };
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_unordered_set_basehook()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<base_item_type
+                , bi::hash< hasher >
+                , bi::equal< is_equal<base_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_unordered_set_basehook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<base_item_type
+                , bi::hash< hasher >
+                , bi::equal< is_equal<base_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::buffer< co::v::static_buffer< cds::any_type, 64 > >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_unordered_set_basehook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<base_item_type
+                , bi::hash< hasher >
+                , bi::equal< is_equal<base_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::buffer< dyn_buffer< 256, cds::any_type, std::allocator<int> > >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(512) );
+        test_with( s );
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_unordered_set_memberhook()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<member_item_type
+                , bi::member_hook< member_item_type, bi::unordered_set_member_hook<>, &member_item_type::hMember>
+                , bi::hash< hasher >
+                , bi::equal< is_equal<member_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_unordered_set_memberhook_bucket_threshold()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<member_item_type
+                , bi::member_hook< member_item_type, bi::unordered_set_member_hook<>, &member_item_type::hMember>
+                , bi::hash< hasher >
+                , bi::equal< is_equal<member_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::buffer< dyn_buffer< 64, cds::any_type, std::allocator<int> > >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<256> >
+            ,co::mutex_policy< ci::striped_set::striping<> >
+        > set_type;
+
+        test<set_type>();
+    }
+
+    void IntrusiveStripedSetHdrTest::Striped_unordered_set_memberhook_bucket_threshold_rt()
+    {
+        typedef ci::StripedSet<
+            bi::unordered_set<member_item_type
+                , bi::member_hook< member_item_type, bi::unordered_set_member_hook<>, &member_item_type::hMember>
+                , bi::hash< hasher >
+                , bi::equal< is_equal<member_item_type> >
+                , bi::power_2_buckets<true>
+                , bi::incremental<true>
+            >
+            ,co::hash< IntrusiveStripedSetHdrTest::hash_int >
+            ,co::buffer< co::v::static_buffer< cds::any_type, 128 > >
+            ,co::resizing_policy< ci::striped_set::single_bucket_size_threshold<0> >
+        > set_type;
+
+        set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>(256) );
+        test_with( s );
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_intrusive_striped_set.cpp b/tests/test-hdr/set/hdr_intrusive_striped_set.cpp
new file mode 100644 (file)
index 0000000..f40d5f9
--- /dev/null
@@ -0,0 +1,3 @@
+//$$CDS-header$$
+#include "set/hdr_intrusive_striped_set.h"
+CPPUNIT_TEST_SUITE_REGISTRATION(set::IntrusiveStripedSetHdrTest);
diff --git a/tests/test-hdr/set/hdr_intrusive_striped_set.h b/tests/test-hdr/set/hdr_intrusive_striped_set.h
new file mode 100644 (file)
index 0000000..b6e36e7
--- /dev/null
@@ -0,0 +1,734 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/opt/hash.h>
+
+// cds::intrusive namespace forward declaration
+namespace cds { namespace intrusive {}}
+
+namespace set {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+
+    // MichaelHashSet
+    class IntrusiveStripedSetHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        struct stat
+        {
+            unsigned int nDisposeCount  ;   // count of disposer calling
+            unsigned int nFindCount     ;   // count of find-functor calling
+            unsigned int nFindArgCount;
+            unsigned int nInsertCount;
+            unsigned int nEnsureNewCount;
+            unsigned int nEnsureCount;
+            unsigned int nEraseCount;
+
+            stat()
+            {
+                memset( this, 0, sizeof(*this));
+            }
+
+            stat& operator=( stat const& s)
+            {
+                memcpy( this, &s, sizeof(*this));
+                return *this;
+            }
+        };
+
+        struct item
+        {
+            int nKey;
+            int nVal;
+
+            item()
+            {}
+
+            item(int key, int val)
+                : nKey( key )
+                , nVal(val)
+            {}
+
+            item(const item& v )
+                : nKey( v.nKey )
+                , nVal( v.nVal )
+            {}
+
+            int key() const
+            {
+                return nKey;
+            }
+
+            int val() const
+            {
+                return nVal;
+            }
+        };
+
+        template <typename Hook>
+        struct base_item
+            : public item
+            , public Hook
+            , public stat
+
+        {
+            base_item()
+            {}
+
+            base_item(int key, int val)
+                : item( key, val )
+            {}
+
+            base_item(const base_item& v )
+                : item( static_cast<item const&>(v) )
+                , stat()
+            {}
+        };
+
+        template <typename Hook>
+        struct member_item
+            : public item
+            , public stat
+        {
+            Hook hMember;
+
+            member_item()
+            {}
+
+            member_item(int key, int val)
+                : item( key, val )
+            {}
+
+            member_item(const member_item& v )
+                : item( static_cast<item const&>(v))
+                , stat()
+            {}
+        };
+
+        struct find_key {
+            int nKey;
+
+            find_key( int key )
+                : nKey(key)
+            {}
+        };
+
+        struct hash_int {
+            size_t operator()( int i ) const
+            {
+                return co::v::hash<int>()( i );
+            }
+            template <typename Item>
+            size_t operator()( const Item& i ) const
+            {
+                return (*this)( i.key() );
+            }
+            size_t operator()( find_key const& i) const
+            {
+                return co::v::hash<int>()( i.nKey );
+            }
+        };
+
+        template <typename T>
+        struct less
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() < v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() < v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 < v2.key();
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1.key() < v2.key() )
+                    return -1;
+                return v1.key() > v2.key() ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const T& v1, const Q& v2 ) const
+            {
+                if ( v1.key() < v2 )
+                    return -1;
+                return v1.key() > v2 ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const Q& v1, const T& v2 ) const
+            {
+                if ( v1 < v2.key() )
+                    return -1;
+                return v1 > v2.key() ? 1 : 0;
+            }
+        };
+
+        struct faked_disposer
+        {
+            template <typename T>
+            void operator ()( T * p )
+            {
+                ++p->nDisposeCount;
+            }
+        };
+
+        struct insert_functor {
+            template <typename Item>
+            void operator()( Item& e)
+            {
+                ++e.nInsertCount;
+            }
+        };
+
+        struct ensure_functor {
+            template <typename Item>
+            void operator()( bool bNew, Item& e, Item& arg )
+            {
+                if ( bNew ) {
+                    ++e.nEnsureNewCount;
+                    CPPUNIT_ASSERT_CURRENT( &e == &arg );
+                }
+                else
+                    ++e.nEnsureCount;
+            }
+        };
+
+        struct erase_functor {
+            template< typename Item >
+            void operator()( Item& e )
+            {
+                ++e.nEraseCount;
+            }
+        };
+
+        struct find_functor {
+            template <typename Item, typename What>
+            void operator()( Item& e, What& )
+            {
+                ++e.nFindCount;
+            }
+
+            template <typename Item>
+            void operator()( Item& e, Item& w )
+            {
+                ++e.nFindCount;
+                ++w.nFindArgCount;
+            }
+        };
+
+        struct less2 {
+            template <typename Item>
+            bool operator()( Item const& e, find_key const& k ) const
+            {
+                return e.key() < k.nKey;
+            }
+            template <typename Item>
+            bool operator()( find_key const& k, Item const& e ) const
+            {
+                return k.nKey < e.key();
+            }
+            template <typename Item>
+            bool operator()( Item const& e, int k ) const
+            {
+                return e.key() < k;
+            }
+            template <typename Item>
+            bool operator()( int k, Item const& e ) const
+            {
+                return k < e.key();
+            }
+        };
+
+        template <typename T>
+        struct auto_dispose {
+            T * m_pArr;
+            auto_dispose( T * pArr ): m_pArr( pArr ) {}
+            ~auto_dispose() { delete[] m_pArr; }
+        };
+
+        template <class Set>
+        void test_with(Set& s)
+        {
+            typedef typename Set::value_type    value_type;
+
+            int const k1 = 10;
+            int const k2 = 25;
+            int const k3 = 51;
+
+            int const v1 = 25;
+            int const v2 = 56;
+            int const v3 = 23;
+
+            value_type e1( k1, v1 );
+            value_type e2( k2, v2 );
+            value_type e3( k3, v3);
+
+            stat s1 = e1;
+            stat s2 = e2;
+            stat s3 = e3;
+
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( s.size() == 0 );
+
+            CPPUNIT_ASSERT( !s.find(k1));
+            CPPUNIT_ASSERT( !s.find(k2));
+            CPPUNIT_ASSERT( !s.find(k3));
+
+            CPPUNIT_ASSERT( s.insert(e1));
+            CPPUNIT_ASSERT( s.find(e1));
+            CPPUNIT_ASSERT( s.find(k1));
+            CPPUNIT_ASSERT( !s.find(e2));
+            CPPUNIT_ASSERT( !s.find(e3));
+
+            CPPUNIT_ASSERT( e2.nInsertCount == 0 );
+            CPPUNIT_ASSERT( s.insert(e2, insert_functor() ));
+            CPPUNIT_ASSERT( e2.nInsertCount == 1 );
+            CPPUNIT_ASSERT( s.find(e1, find_functor() ));
+            CPPUNIT_ASSERT( e1.nFindCount == 1 );
+            CPPUNIT_ASSERT( e1.nFindArgCount == 1 );
+            CPPUNIT_ASSERT( s.find(k1, find_functor() ));
+            CPPUNIT_ASSERT( e1.nFindCount == 2 );
+            CPPUNIT_ASSERT( e1.nFindArgCount == 1 );
+            CPPUNIT_ASSERT( s.find(k2, find_functor() ));
+            CPPUNIT_ASSERT( e2.nFindCount == 1 );
+            CPPUNIT_ASSERT( e2.nFindArgCount == 0 );
+            CPPUNIT_ASSERT( s.find(e2, find_functor() ));
+            CPPUNIT_ASSERT( e2.nFindCount == 2 );
+            CPPUNIT_ASSERT( e2.nFindArgCount == 1 );
+            CPPUNIT_ASSERT( !s.find(k3, find_functor()));
+            CPPUNIT_ASSERT( e3.nFindCount == 0 );
+            CPPUNIT_ASSERT( e3.nFindArgCount == 0 );
+            CPPUNIT_ASSERT( !s.find(e3, find_functor()));
+            CPPUNIT_ASSERT( e3.nFindCount == 0 );
+            CPPUNIT_ASSERT( e3.nFindArgCount == 0 );
+
+            s1 = e1 ; s2 = e2 ; s3 = e3;
+
+            CPPUNIT_ASSERT( e3.nEnsureNewCount == 0 );
+            CPPUNIT_ASSERT( e3.nEnsureCount == 0 );
+            CPPUNIT_ASSERT( s.ensure( e3, ensure_functor() ) == std::make_pair(true, true));
+            CPPUNIT_ASSERT( e3.nEnsureNewCount == 1 );
+            CPPUNIT_ASSERT( e3.nEnsureCount == 0 );
+            CPPUNIT_ASSERT( s.find_with(find_key(k1), less2(), find_functor() ));
+            CPPUNIT_ASSERT( e1.nFindCount == s1.nFindCount + 1 );
+            CPPUNIT_ASSERT( e1.nFindArgCount == s1.nFindArgCount );
+            CPPUNIT_ASSERT( s.find_with(k1, less2(), find_functor() ));
+            CPPUNIT_ASSERT( e1.nFindCount == s1.nFindCount + 2 );
+            CPPUNIT_ASSERT( e1.nFindArgCount == s1.nFindArgCount );
+            CPPUNIT_ASSERT( s.find_with(k2, less2(), find_functor() ));
+            CPPUNIT_ASSERT( e2.nFindCount == s2.nFindCount + 1 );
+            CPPUNIT_ASSERT( e2.nFindArgCount == s2.nFindArgCount );
+            CPPUNIT_ASSERT( s.find_with(find_key(k2), less2() ));
+            CPPUNIT_ASSERT( e2.nFindCount == s2.nFindCount + 1 )        ;   // unchanged, no find_functor
+            CPPUNIT_ASSERT( e2.nFindArgCount == s2.nFindArgCount );
+            CPPUNIT_ASSERT( s.find_with(k3, less2() ));
+            CPPUNIT_ASSERT( e3.nFindCount == s3.nFindCount )            ;   // unchanged, no find_functor
+            CPPUNIT_ASSERT( e3.nFindArgCount == s3.nFindArgCount );
+            CPPUNIT_ASSERT( s.find_with(find_key(k3), less2(), find_functor() ));
+            CPPUNIT_ASSERT( e3.nFindCount == s3.nFindCount + 1 );
+            CPPUNIT_ASSERT( e3.nFindArgCount == s3.nFindArgCount );
+
+            s1 = e1 ; s2 = e2 ; s3 = e3;
+
+            // insert existing elements
+            {
+                value_type eu( k2, 1000 );
+                CPPUNIT_ASSERT( !s.insert( eu ));
+                CPPUNIT_ASSERT( !s.insert( eu, insert_functor() ));
+                CPPUNIT_ASSERT( e2.nInsertCount == s2.nInsertCount );
+
+                CPPUNIT_ASSERT( s.ensure( eu, ensure_functor()) == std::make_pair(true, false));
+                CPPUNIT_ASSERT( e2.nInsertCount == s2.nInsertCount );
+                CPPUNIT_ASSERT( e2.nEnsureCount == s2.nEnsureCount + 1 );
+                CPPUNIT_ASSERT( e2.nEnsureNewCount == s2.nEnsureNewCount  );
+            }
+
+            s1 = e1 ; s2 = e2 ; s3 = e3;
+
+            // unlink & erase test
+            {
+                value_type eu( k2, 10 );
+                CPPUNIT_ASSERT( !s.unlink(eu));
+            }
+
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( s.size() == 3 );
+
+            CPPUNIT_ASSERT( s.unlink( e1 ) );
+            CPPUNIT_ASSERT( s.erase_with( k2, less2() ) == &e2 );
+            CPPUNIT_ASSERT( s.erase( e2 ) == NULL );
+            CPPUNIT_ASSERT( e3.nEraseCount == 0 );
+            CPPUNIT_ASSERT( s.erase_with( k3, less2(), erase_functor()) == &e3 );
+            CPPUNIT_ASSERT( e3.nEraseCount == 1 );
+            CPPUNIT_ASSERT( s.erase( k3, erase_functor()) == NULL );
+            CPPUNIT_ASSERT( e3.nEraseCount == 1 );
+
+            CPPUNIT_ASSERT( s.insert( e3 ) );
+            CPPUNIT_ASSERT( s.erase( e3 ) == &e3 );
+            CPPUNIT_ASSERT( e3.nEraseCount == 1 );
+
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( s.size() == 0 );
+
+            s1 = e1 ; s2 = e2 ; s3 = e3;
+
+            // clear & clear_and_dispose test
+            CPPUNIT_ASSERT( s.insert(e1));
+            CPPUNIT_ASSERT( s.insert(e2));
+            CPPUNIT_ASSERT( s.insert(e3));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( s.size() == 3 );
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( s.size() == 0 );
+
+            CPPUNIT_ASSERT( s.insert(e1));
+            CPPUNIT_ASSERT( s.insert(e2));
+            CPPUNIT_ASSERT( s.insert(e3));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( s.size() == 3 );
+
+            CPPUNIT_ASSERT( e1.nDisposeCount == 0 );
+            CPPUNIT_ASSERT( e2.nDisposeCount == 0 );
+            CPPUNIT_ASSERT( e3.nDisposeCount == 0 );
+            s.clear_and_dispose( faked_disposer() );
+            CPPUNIT_ASSERT( e1.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( e2.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( e3.nDisposeCount == 1 );
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( s.size() == 0 );
+
+            // resize test (up to 64K elements)
+            size_t const nSize = 64 * 1024;
+            value_type * arr = new value_type[nSize];
+            auto_dispose<value_type> ad(arr);
+            for ( size_t i = 0; i < nSize; ++i ) {
+                value_type * p = new (arr + i) value_type( (int) i, (int) i * 2 );
+                CPPUNIT_ASSERT_EX( s.insert( *p, insert_functor() ), "i=" << i );
+                CPPUNIT_ASSERT_EX( p->nInsertCount == 1, "i=" << i );
+                //for ( size_t j = 0; j <= i; ++j ) {
+                //    if ( !s.find((int) j) ) {
+                //        CPPUNIT_MSG( "Key " << j << " is not found after inserting key " << i );
+                //    }
+                //}
+            }
+
+            for ( size_t i = 0; i < nSize; ++i )
+                CPPUNIT_ASSERT_EX( s.find((int) i), "Key " << i << " is not found" );
+
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( s.size() == nSize );
+            s.clear_and_dispose( faked_disposer() );
+            for ( size_t i = 0; i < nSize; ++i ) {
+                CPPUNIT_ASSERT_EX( arr[i].nDisposeCount == 1, "i=" << i );
+            }
+        }
+
+        template <class Set>
+        void test()
+        {
+            // default ctor
+            {
+                Set s;
+                test_with(s);
+            }
+
+            // ctor with explicit initial capacity
+            {
+                Set s(256);
+                test_with(s);
+            }
+        }
+
+        template <class Set>
+        void test_cuckoo()
+        {
+            unsigned int nProbesetSize = Set::node_type::probeset_size ? Set::node_type::probeset_size : 4;
+            Set s( 256, nProbesetSize, nProbesetSize / 2 );
+            test_with( s );
+        }
+
+        // ***********************************************************
+        // Striped set
+
+        void Striped_list_basehook_cmp();
+        void Striped_list_basehook_less();
+        void Striped_list_basehook_cmpmix();
+        void Striped_list_basehook_bucket_threshold();
+        void Striped_list_basehook_bucket_threshold_rt();
+        void Striped_list_memberhook_cmp();
+        void Striped_list_memberhook_less();
+        void Striped_list_memberhook_cmpmix();
+        void Striped_list_memberhook_bucket_threshold();
+        void Striped_list_memberhook_bucket_threshold_rt();
+
+        void Striped_slist_basehook_cmp();
+        void Striped_slist_basehook_less();
+        void Striped_slist_basehook_cmpmix();
+        void Striped_slist_basehook_bucket_threshold();
+        void Striped_slist_basehook_bucket_threshold_rt();
+        void Striped_slist_memberhook_cmp();
+        void Striped_slist_memberhook_less();
+        void Striped_slist_memberhook_cmpmix();
+        void Striped_slist_memberhook_bucket_threshold();
+        void Striped_slist_memberhook_bucket_threshold_rt();
+
+        void Striped_set_basehook();
+        void Striped_set_basehook_bucket_threshold();
+        void Striped_set_basehook_bucket_threshold_rt();
+        void Striped_set_memberhook();
+        void Striped_set_memberhook_bucket_threshold();
+        void Striped_set_memberhook_bucket_threshold_rt();
+
+        void Striped_unordered_set_basehook();
+        void Striped_unordered_set_basehook_bucket_threshold();
+        void Striped_unordered_set_basehook_bucket_threshold_rt();
+        void Striped_unordered_set_memberhook();
+        void Striped_unordered_set_memberhook_bucket_threshold();
+        void Striped_unordered_set_memberhook_bucket_threshold_rt();
+
+        void Striped_avl_set_basehook();
+        void Striped_avl_set_basehook_bucket_threshold();
+        void Striped_avl_set_basehook_bucket_threshold_rt();
+        void Striped_avl_set_memberhook();
+        void Striped_avl_set_memberhook_bucket_threshold();
+        void Striped_avl_set_memberhook_bucket_threshold_rt();
+
+        void Striped_sg_set_basehook();
+        void Striped_sg_set_basehook_bucket_threshold();
+        void Striped_sg_set_basehook_bucket_threshold_rt();
+        void Striped_sg_set_memberhook();
+        void Striped_sg_set_memberhook_bucket_threshold();
+        void Striped_sg_set_memberhook_bucket_threshold_rt();
+
+        void Striped_splay_set_basehook();
+        void Striped_splay_set_basehook_bucket_threshold();
+        void Striped_splay_set_basehook_bucket_threshold_rt();
+        void Striped_splay_set_memberhook();
+        void Striped_splay_set_memberhook_bucket_threshold();
+        void Striped_splay_set_memberhook_bucket_threshold_rt();
+
+        void Striped_treap_set_basehook();
+        void Striped_treap_set_basehook_bucket_threshold();
+        void Striped_treap_set_basehook_bucket_threshold_rt();
+        void Striped_treap_set_memberhook();
+        void Striped_treap_set_memberhook_bucket_threshold();
+        void Striped_treap_set_memberhook_bucket_threshold_rt();
+
+        // ***********************************************************
+        // Refinable set
+
+        void Refinable_list_basehook_cmp();
+        void Refinable_list_basehook_less();
+        void Refinable_list_basehook_cmpmix();
+        void Refinable_list_basehook_bucket_threshold();
+        void Refinable_list_basehook_bucket_threshold_rt();
+        void Refinable_list_memberhook_cmp();
+        void Refinable_list_memberhook_less();
+        void Refinable_list_memberhook_cmpmix();
+        void Refinable_list_memberhook_bucket_threshold();
+        void Refinable_list_memberhook_bucket_threshold_rt();
+
+        void Refinable_slist_basehook_cmp();
+        void Refinable_slist_basehook_less();
+        void Refinable_slist_basehook_cmpmix();
+        void Refinable_slist_basehook_bucket_threshold();
+        void Refinable_slist_basehook_bucket_threshold_rt();
+        void Refinable_slist_memberhook_cmp();
+        void Refinable_slist_memberhook_less();
+        void Refinable_slist_memberhook_cmpmix();
+        void Refinable_slist_memberhook_bucket_threshold();
+        void Refinable_slist_memberhook_bucket_threshold_rt();
+
+        void Refinable_set_basehook();
+        void Refinable_set_basehook_bucket_threshold();
+        void Refinable_set_basehook_bucket_threshold_rt();
+        void Refinable_set_memberhook();
+        void Refinable_set_memberhook_bucket_threshold();
+        void Refinable_set_memberhook_bucket_threshold_rt();
+
+        void Refinable_unordered_set_basehook();
+        void Refinable_unordered_set_basehook_bucket_threshold();
+        void Refinable_unordered_set_basehook_bucket_threshold_rt();
+        void Refinable_unordered_set_memberhook();
+        void Refinable_unordered_set_memberhook_bucket_threshold();
+        void Refinable_unordered_set_memberhook_bucket_threshold_rt();
+
+        void Refinable_avl_set_basehook();
+        void Refinable_avl_set_basehook_bucket_threshold();
+        void Refinable_avl_set_basehook_bucket_threshold_rt();
+        void Refinable_avl_set_memberhook();
+        void Refinable_avl_set_memberhook_bucket_threshold();
+        void Refinable_avl_set_memberhook_bucket_threshold_rt();
+
+        void Refinable_sg_set_basehook();
+        void Refinable_sg_set_basehook_bucket_threshold();
+        void Refinable_sg_set_basehook_bucket_threshold_rt();
+        void Refinable_sg_set_memberhook();
+        void Refinable_sg_set_memberhook_bucket_threshold();
+        void Refinable_sg_set_memberhook_bucket_threshold_rt();
+
+        void Refinable_splay_set_basehook();
+        void Refinable_splay_set_basehook_bucket_threshold();
+        void Refinable_splay_set_basehook_bucket_threshold_rt();
+        void Refinable_splay_set_memberhook();
+        void Refinable_splay_set_memberhook_bucket_threshold();
+        void Refinable_splay_set_memberhook_bucket_threshold_rt();
+
+        void Refinable_treap_set_basehook();
+        void Refinable_treap_set_basehook_bucket_threshold();
+        void Refinable_treap_set_basehook_bucket_threshold_rt();
+        void Refinable_treap_set_memberhook();
+        void Refinable_treap_set_memberhook_bucket_threshold();
+        void Refinable_treap_set_memberhook_bucket_threshold_rt();
+
+        CPPUNIT_TEST_SUITE(IntrusiveStripedSetHdrTest)
+            // ***********************************************************
+            // Striped set
+
+            CPPUNIT_TEST( Striped_list_basehook_cmp)
+            CPPUNIT_TEST( Striped_list_basehook_less)
+            CPPUNIT_TEST( Striped_list_basehook_cmpmix)
+            CPPUNIT_TEST( Striped_list_basehook_bucket_threshold)
+            CPPUNIT_TEST( Striped_list_basehook_bucket_threshold_rt)
+            CPPUNIT_TEST( Striped_list_memberhook_cmp)
+            CPPUNIT_TEST( Striped_list_memberhook_less)
+            CPPUNIT_TEST( Striped_list_memberhook_cmpmix)
+            CPPUNIT_TEST( Striped_list_memberhook_bucket_threshold)
+            CPPUNIT_TEST( Striped_list_memberhook_bucket_threshold_rt)
+
+            CPPUNIT_TEST( Striped_slist_basehook_cmp)
+            CPPUNIT_TEST( Striped_slist_basehook_less)
+            CPPUNIT_TEST( Striped_slist_basehook_cmpmix)
+            CPPUNIT_TEST( Striped_slist_basehook_bucket_threshold)
+            CPPUNIT_TEST( Striped_slist_basehook_bucket_threshold_rt)
+            CPPUNIT_TEST( Striped_slist_memberhook_cmp)
+            CPPUNIT_TEST( Striped_slist_memberhook_less)
+            CPPUNIT_TEST( Striped_slist_memberhook_cmpmix)
+            CPPUNIT_TEST( Striped_slist_memberhook_bucket_threshold)
+            CPPUNIT_TEST( Striped_slist_memberhook_bucket_threshold_rt)
+
+            CPPUNIT_TEST( Striped_set_basehook )
+            CPPUNIT_TEST( Striped_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Striped_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Striped_set_memberhook)
+            CPPUNIT_TEST( Striped_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Striped_set_memberhook_bucket_threshold_rt )
+
+            CPPUNIT_TEST( Striped_unordered_set_basehook )
+            CPPUNIT_TEST( Striped_unordered_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Striped_unordered_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Striped_unordered_set_memberhook)
+            CPPUNIT_TEST( Striped_unordered_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Striped_unordered_set_memberhook_bucket_threshold_rt )
+
+            CPPUNIT_TEST( Striped_avl_set_basehook )
+            CPPUNIT_TEST( Striped_avl_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Striped_avl_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Striped_avl_set_memberhook)
+            CPPUNIT_TEST( Striped_avl_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Striped_avl_set_memberhook_bucket_threshold_rt )
+
+            CPPUNIT_TEST( Striped_sg_set_basehook )
+            CPPUNIT_TEST( Striped_sg_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Striped_sg_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Striped_sg_set_memberhook)
+            CPPUNIT_TEST( Striped_sg_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Striped_sg_set_memberhook_bucket_threshold_rt )
+
+            CPPUNIT_TEST( Striped_splay_set_basehook )
+            CPPUNIT_TEST( Striped_splay_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Striped_splay_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Striped_splay_set_memberhook)
+            CPPUNIT_TEST( Striped_splay_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Striped_splay_set_memberhook_bucket_threshold_rt )
+
+            CPPUNIT_TEST( Striped_treap_set_basehook )
+            CPPUNIT_TEST( Striped_treap_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Striped_treap_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Striped_treap_set_memberhook)
+            CPPUNIT_TEST( Striped_treap_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Striped_treap_set_memberhook_bucket_threshold_rt )
+
+            // ***********************************************************
+            // Refinable set
+
+            CPPUNIT_TEST( Refinable_list_basehook_cmp)
+            CPPUNIT_TEST( Refinable_list_basehook_less)
+            CPPUNIT_TEST( Refinable_list_basehook_cmpmix)
+            CPPUNIT_TEST( Refinable_list_basehook_bucket_threshold)
+            CPPUNIT_TEST( Refinable_list_basehook_bucket_threshold_rt)
+            CPPUNIT_TEST( Refinable_list_memberhook_cmp)
+            CPPUNIT_TEST( Refinable_list_memberhook_less)
+            CPPUNIT_TEST( Refinable_list_memberhook_cmpmix)
+            CPPUNIT_TEST( Refinable_list_memberhook_bucket_threshold)
+            CPPUNIT_TEST( Refinable_list_memberhook_bucket_threshold_rt)
+
+            CPPUNIT_TEST( Refinable_slist_basehook_cmp)
+            CPPUNIT_TEST( Refinable_slist_basehook_less)
+            CPPUNIT_TEST( Refinable_slist_basehook_cmpmix)
+            CPPUNIT_TEST( Refinable_slist_basehook_bucket_threshold)
+            CPPUNIT_TEST( Refinable_slist_basehook_bucket_threshold_rt)
+            CPPUNIT_TEST( Refinable_slist_memberhook_cmp)
+            CPPUNIT_TEST( Refinable_slist_memberhook_less)
+            CPPUNIT_TEST( Refinable_slist_memberhook_cmpmix)
+            CPPUNIT_TEST( Refinable_slist_memberhook_bucket_threshold)
+            CPPUNIT_TEST( Refinable_slist_memberhook_bucket_threshold_rt)
+
+            CPPUNIT_TEST( Refinable_set_basehook )
+            CPPUNIT_TEST( Refinable_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Refinable_set_memberhook)
+            CPPUNIT_TEST( Refinable_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_set_memberhook_bucket_threshold_rt )
+
+            CPPUNIT_TEST( Refinable_unordered_set_basehook )
+            CPPUNIT_TEST( Refinable_unordered_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_unordered_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Refinable_unordered_set_memberhook)
+            CPPUNIT_TEST( Refinable_unordered_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_unordered_set_memberhook_bucket_threshold_rt )
+
+            CPPUNIT_TEST( Refinable_avl_set_basehook )
+            CPPUNIT_TEST( Refinable_avl_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_avl_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Refinable_avl_set_memberhook)
+            CPPUNIT_TEST( Refinable_avl_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_avl_set_memberhook_bucket_threshold_rt )
+
+            CPPUNIT_TEST( Refinable_sg_set_basehook )
+            CPPUNIT_TEST( Refinable_sg_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_sg_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Refinable_sg_set_memberhook)
+            CPPUNIT_TEST( Refinable_sg_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_sg_set_memberhook_bucket_threshold_rt )
+
+            CPPUNIT_TEST( Refinable_splay_set_basehook )
+            CPPUNIT_TEST( Refinable_splay_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_splay_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Refinable_splay_set_memberhook)
+            CPPUNIT_TEST( Refinable_splay_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_splay_set_memberhook_bucket_threshold_rt )
+
+            CPPUNIT_TEST( Refinable_treap_set_basehook )
+            CPPUNIT_TEST( Refinable_treap_set_basehook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_treap_set_basehook_bucket_threshold_rt )
+            CPPUNIT_TEST( Refinable_treap_set_memberhook)
+            CPPUNIT_TEST( Refinable_treap_set_memberhook_bucket_threshold )
+            CPPUNIT_TEST( Refinable_treap_set_memberhook_bucket_threshold_rt )
+        CPPUNIT_TEST_SUITE_END()
+    };
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_hp.cpp b/tests/test-hdr/set/hdr_michael_set_hp.cpp
new file mode 100644 (file)
index 0000000..db54bd2
--- /dev/null
@@ -0,0 +1,91 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/michael_list_hp.h>
+#include <cds/container/michael_set.h>
+
+namespace set {
+
+    namespace {
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct HP_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct HP_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct HP_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Michael_HP_cmp()
+    {
+        typedef cc::MichaelList< cds::gc::HP, item, HP_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_HP_less()
+    {
+        typedef cc::MichaelList< cds::gc::HP, item, HP_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_HP_cmpmix()
+    {
+        typedef cc::MichaelList< cds::gc::HP, item, HP_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
+
+CPPUNIT_TEST_SUITE_REGISTRATION(set::HashSetHdrTest);
+
diff --git a/tests/test-hdr/set/hdr_michael_set_hrc.cpp b/tests/test-hdr/set/hdr_michael_set_hrc.cpp
new file mode 100644 (file)
index 0000000..4a52c0f
--- /dev/null
@@ -0,0 +1,88 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/michael_list_hrc.h>
+#include <cds/container/michael_set.h>
+
+namespace set {
+
+    namespace {
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct HRC_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct HRC_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct HRC_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Michael_HRC_cmp()
+    {
+        typedef cc::MichaelList< cds::gc::HRC, item, HRC_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_HRC_less()
+    {
+        typedef cc::MichaelList< cds::gc::HRC, item, HRC_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_HRC_cmpmix()
+    {
+        typedef cc::MichaelList< cds::gc::HRC, item, HRC_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_lazy_hp.cpp b/tests/test-hdr/set/hdr_michael_set_lazy_hp.cpp
new file mode 100644 (file)
index 0000000..c8fa8dc
--- /dev/null
@@ -0,0 +1,89 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/lazy_list_hp.h>
+#include <cds/container/michael_set.h>
+
+namespace set {
+
+    namespace {
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct HP_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct HP_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct HP_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Lazy_HP_cmp()
+    {
+        typedef cc::LazyList< cds::gc::HP, item, HP_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_HP_less()
+    {
+        typedef cc::LazyList< cds::gc::HP, item, HP_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_HP_cmpmix()
+    {
+        typedef cc::LazyList< cds::gc::HP, item, HP_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HP, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
+
diff --git a/tests/test-hdr/set/hdr_michael_set_lazy_hrc.cpp b/tests/test-hdr/set/hdr_michael_set_lazy_hrc.cpp
new file mode 100644 (file)
index 0000000..a7e35eb
--- /dev/null
@@ -0,0 +1,88 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/lazy_list_hrc.h>
+#include <cds/container/michael_set.h>
+
+namespace set {
+
+    namespace {
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct HRC_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct HRC_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct HRC_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Lazy_HRC_cmp()
+    {
+        typedef cc::LazyList< cds::gc::HRC, item, HRC_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_HRC_less()
+    {
+        typedef cc::LazyList< cds::gc::HRC, item, HRC_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_HRC_cmpmix()
+    {
+        typedef cc::LazyList< cds::gc::HRC, item, HRC_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::HRC, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_lazy_nogc.cpp b/tests/test-hdr/set/hdr_michael_set_lazy_nogc.cpp
new file mode 100644 (file)
index 0000000..7d424a0
--- /dev/null
@@ -0,0 +1,88 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/lazy_list_nogc.h>
+#include <cds/container/michael_set_nogc.h>
+
+namespace set {
+
+    namespace {
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct nogc_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct nogc_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct nogc_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Lazy_nogc_cmp()
+    {
+        typedef cc::LazyList< cds::gc::nogc, item, nogc_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list, set_traits > set;
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_nogc_less()
+    {
+        typedef cc::LazyList< cds::gc::nogc, item, nogc_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list, set_traits > set;
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_nogc_cmpmix()
+    {
+        typedef cc::LazyList< cds::gc::nogc, item, nogc_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list, set_traits > set;
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_lazy_ptb.cpp b/tests/test-hdr/set/hdr_michael_set_lazy_ptb.cpp
new file mode 100644 (file)
index 0000000..4d818ba
--- /dev/null
@@ -0,0 +1,88 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/lazy_list_ptb.h>
+#include <cds/container/michael_set.h>
+
+namespace set {
+
+    namespace {
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct PTB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct PTB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct PTB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Lazy_PTB_cmp()
+    {
+        typedef cc::LazyList< cds::gc::PTB, item, PTB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_PTB_less()
+    {
+        typedef cc::LazyList< cds::gc::PTB, item, PTB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_PTB_cmpmix()
+    {
+        typedef cc::LazyList< cds::gc::PTB, item, PTB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpb.cpp b/tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..82238d5
--- /dev/null
@@ -0,0 +1,91 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/michael_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct RCU_GPB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct RCU_GPB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct RCU_GPB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Lazy_RCU_GPB_cmp()
+    {
+        typedef cc::LazyList< rcu_type, item, RCU_GPB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_RCU_GPB_less()
+    {
+        typedef cc::LazyList< rcu_type, item, RCU_GPB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_RCU_GPB_cmpmix()
+    {
+        typedef cc::LazyList< rcu_type, item, RCU_GPB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpi.cpp b/tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..1ea98e8
--- /dev/null
@@ -0,0 +1,91 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/michael_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct RCU_GPI_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct RCU_GPI_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct RCU_GPI_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Lazy_RCU_GPI_cmp()
+    {
+        typedef cc::LazyList< rcu_type, item, RCU_GPI_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_RCU_GPI_less()
+    {
+        typedef cc::LazyList< rcu_type, item, RCU_GPI_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_RCU_GPI_cmpmix()
+    {
+        typedef cc::LazyList< rcu_type, item, RCU_GPI_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpt.cpp b/tests/test-hdr/set/hdr_michael_set_lazy_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..20841a4
--- /dev/null
@@ -0,0 +1,91 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/michael_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct RCU_GPT_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct RCU_GPT_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct RCU_GPT_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Lazy_RCU_GPT_cmp()
+    {
+        typedef cc::LazyList< rcu_type, item, RCU_GPT_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_RCU_GPT_less()
+    {
+        typedef cc::LazyList< rcu_type, item, RCU_GPT_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Lazy_RCU_GPT_cmpmix()
+    {
+        typedef cc::LazyList< rcu_type, item, RCU_GPT_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_lazy_rcu_shb.cpp b/tests/test-hdr/set/hdr_michael_set_lazy_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..823a332
--- /dev/null
@@ -0,0 +1,98 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/michael_set_rcu.h>
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct RCU_SHB_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct RCU_SHB_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct RCU_SHB_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+#endif
+
+    void HashSetHdrTest::Lazy_RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_type, item, RCU_SHB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Lazy_RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_type, item, RCU_SHB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Lazy_RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_type, item, RCU_SHB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_lazy_rcu_sht.cpp b/tests/test-hdr/set/hdr_michael_set_lazy_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..13c7f59
--- /dev/null
@@ -0,0 +1,98 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/michael_set_rcu.h>
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct RCU_SHT_cmp_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct RCU_SHT_less_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct RCU_SHT_cmpmix_traits: public cc::lazy_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+#endif
+
+    void HashSetHdrTest::Lazy_RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_type, item, RCU_SHT_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Lazy_RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_type, item, RCU_SHT_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Lazy_RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_type, item, RCU_SHT_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_nogc.cpp b/tests/test-hdr/set/hdr_michael_set_nogc.cpp
new file mode 100644 (file)
index 0000000..032114d
--- /dev/null
@@ -0,0 +1,88 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/michael_list_nogc.h>
+#include <cds/container/michael_set_nogc.h>
+
+namespace set {
+
+    namespace {
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct nogc_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct nogc_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct nogc_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Michael_nogc_cmp()
+    {
+        typedef cc::MichaelList< cds::gc::nogc, item, nogc_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list, set_traits > set;
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_nogc_less()
+    {
+        typedef cc::MichaelList< cds::gc::nogc, item, nogc_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list, set_traits > set;
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_nogc_cmpmix()
+    {
+        typedef cc::MichaelList< cds::gc::nogc, item, nogc_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list, set_traits > set;
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::nogc, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_ptb.cpp b/tests/test-hdr/set/hdr_michael_set_ptb.cpp
new file mode 100644 (file)
index 0000000..0b292ec
--- /dev/null
@@ -0,0 +1,88 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/michael_list_ptb.h>
+#include <cds/container/michael_set.h>
+
+namespace set {
+
+    namespace {
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct PTB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct PTB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct PTB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Michael_PTB_cmp()
+    {
+        typedef cc::MichaelList< cds::gc::PTB, item, PTB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_PTB_less()
+    {
+        typedef cc::MichaelList< cds::gc::PTB, item, PTB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_PTB_cmpmix()
+    {
+        typedef cc::MichaelList< cds::gc::PTB, item, PTB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list, set_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< cds::gc::PTB, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_rcu_gpb.cpp b/tests/test-hdr/set/hdr_michael_set_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..215abc8
--- /dev/null
@@ -0,0 +1,91 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/michael_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct RCU_GPB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct RCU_GPB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct RCU_GPB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Michael_RCU_GPB_cmp()
+    {
+        typedef cc::MichaelList< rcu_type, item, RCU_GPB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_RCU_GPB_less()
+    {
+        typedef cc::MichaelList< rcu_type, item, RCU_GPB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_RCU_GPB_cmpmix()
+    {
+        typedef cc::MichaelList< rcu_type, item, RCU_GPB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_rcu_gpi.cpp b/tests/test-hdr/set/hdr_michael_set_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..5d6ca35
--- /dev/null
@@ -0,0 +1,91 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/michael_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct RCU_GPI_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct RCU_GPI_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct RCU_GPI_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Michael_RCU_GPI_cmp()
+    {
+        typedef cc::MichaelList< rcu_type, item, RCU_GPI_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_RCU_GPI_less()
+    {
+        typedef cc::MichaelList< rcu_type, item, RCU_GPI_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_RCU_GPI_cmpmix()
+    {
+        typedef cc::MichaelList< rcu_type, item, RCU_GPI_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_rcu_gpt.cpp b/tests/test-hdr/set/hdr_michael_set_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..056514b
--- /dev/null
@@ -0,0 +1,91 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/michael_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct RCU_GPT_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct RCU_GPT_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct RCU_GPT_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+
+    void HashSetHdrTest::Michael_RCU_GPT_cmp()
+    {
+        typedef cc::MichaelList< rcu_type, item, RCU_GPT_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_RCU_GPT_less()
+    {
+        typedef cc::MichaelList< rcu_type, item, RCU_GPT_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Michael_RCU_GPT_cmpmix()
+    {
+        typedef cc::MichaelList< rcu_type, item, RCU_GPT_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_rcu_shb.cpp b/tests/test-hdr/set/hdr_michael_set_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..d06cfea
--- /dev/null
@@ -0,0 +1,98 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/michael_set_rcu.h>
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct RCU_SHB_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct RCU_SHB_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct RCU_SHB_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+#endif
+
+    void HashSetHdrTest::Michael_RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_type, item, RCU_SHB_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Michael_RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_type, item, RCU_SHB_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Michael_RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_type, item, RCU_SHB_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_michael_set_rcu_sht.cpp b/tests/test-hdr/set/hdr_michael_set_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..81534a9
--- /dev/null
@@ -0,0 +1,98 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/michael_set_rcu.h>
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+
+        struct set_traits: public cc::michael_set::type_traits
+        {
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+        };
+
+        struct RCU_SHT_cmp_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+        };
+
+        struct RCU_SHT_less_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+
+        struct RCU_SHT_cmpmix_traits: public cc::michael_list::type_traits
+        {
+            typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+        };
+    }
+#endif
+
+    void HashSetHdrTest::Michael_RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_type, item, RCU_SHT_cmp_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Michael_RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_type, item, RCU_SHT_less_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Michael_RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_type, item, RCU_SHT_cmpmix_traits > list;
+
+        // traits-based version
+        typedef cc::MichaelHashSet< rcu_type, list, set_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::MichaelHashSet< rcu_type, list,
+            cc::michael_set::make_traits<
+                cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_boost_flat_set.cpp b/tests/test-hdr/set/hdr_refinable_hashset_boost_flat_set.cpp
new file mode 100644 (file)
index 0000000..4fa1ddb
--- /dev/null
@@ -0,0 +1,169 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Refinable_boost_flat_set()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for Microsoft Visual C++ 2013 and boost::container::flat_set you should use boost version 1.56 or above" );
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_set/boost_flat_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        typedef boost::container::flat_set< StripedSetHdrTest::item, StripedSetHdrTest::less<StripedSetHdrTest::item> > set_t;
+
+        struct my_copy_policy {
+            typedef set_t::iterator iterator;
+
+            void operator()( set_t& set, iterator itWhat )
+            {
+                set.insert( *itWhat );
+            }
+        };
+    }
+
+    void StripedSetHdrTest::Refinable_boost_flat_set()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(1024) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+
+    }
+
+}   // namespace set
+
+#else // BOOST_VERSION < 104800
+
+namespace set {
+    void StripedSetHdrTest::Refinable_boost_flat_set()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::flat_set you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_boost_list.cpp b/tests/test-hdr/set/hdr_refinable_hashset_boost_list.cpp
new file mode 100644 (file)
index 0000000..f001281
--- /dev/null
@@ -0,0 +1,165 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Refinable_boost_list()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::list you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_set/boost_list.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef boost::container::list<StripedSetHdrTest::item> list_type;
+            typedef list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+
+        typedef boost::container::list<StripedSetHdrTest::item> sequence_t;
+    }
+
+    void StripedSetHdrTest::Refinable_boost_list()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt16;
+        test_striped2< set_less_resizing_sbt16 >();
+
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy policy");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace set
+
+#else // BOOST_VERSION < 104800
+
+namespace set {
+    void StripedSetHdrTest::Refinable_boost_list()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::list you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_boost_set.cpp b/tests/test-hdr/set/hdr_refinable_hashset_boost_set.cpp
new file mode 100644 (file)
index 0000000..b0cb729
--- /dev/null
@@ -0,0 +1,167 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Refinable_boost_set()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::set you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_set/boost_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        typedef boost::container::set< StripedSetHdrTest::item, StripedSetHdrTest::less<StripedSetHdrTest::item> > set_t;
+
+        struct my_copy_policy {
+            typedef set_t::iterator iterator;
+
+            void operator()( set_t& set, iterator itWhat )
+            {
+                set.insert( *itWhat );
+            }
+        };
+    }
+
+    void StripedSetHdrTest::Refinable_boost_set()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(1024) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace set
+
+#else // BOOST_VERSION < 104800
+
+namespace set {
+    void StripedSetHdrTest::Refinable_boost_set()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::set you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_boost_stable_vector.cpp b/tests/test-hdr/set/hdr_refinable_hashset_boost_stable_vector.cpp
new file mode 100644 (file)
index 0000000..c6dfd90
--- /dev/null
@@ -0,0 +1,166 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Refinable_boost_stable_vector()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::stable_vector you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/details/defs.h>
+#include <cds/container/striped_set/boost_stable_vector.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef boost::container::stable_vector<StripedSetHdrTest::item> vector_type;
+            typedef vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, *itWhat );
+            }
+        };
+
+        typedef boost::container::stable_vector<StripedSetHdrTest::item> sequence_t;
+    }
+
+    void StripedSetHdrTest::Refinable_boost_stable_vector()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt16;
+        test_striped2< set_less_resizing_sbt16 >();
+
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy policy");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace set
+
+#else // BOOST_VERSION < 104800
+
+namespace set {
+    void StripedSetHdrTest::Refinable_boost_stable_vector()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::stable_vector you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_boost_unordered_set.cpp b/tests/test-hdr/set/hdr_refinable_hashset_boost_unordered_set.cpp
new file mode 100644 (file)
index 0000000..42713b9
--- /dev/null
@@ -0,0 +1,154 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/boost_unordered_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct equal_item
+        {
+            template <typename T>
+            bool operator ()( T const& i1, T const& i2) const
+            {
+                return i1.key() == i2.key();
+            }
+        };
+
+        typedef boost::unordered_set< StripedSetHdrTest::item, StripedSetHdrTest::hash_int, equal_item > set_t;
+
+        struct my_copy_policy {
+            typedef set_t::iterator iterator;
+
+            void operator()( set_t& set, iterator itWhat )
+            {
+                set.insert( std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+    }
+
+    void StripedSetHdrTest::Refinable_boost_unordered_set()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(1024) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_boost_vector.cpp b/tests/test-hdr/set/hdr_refinable_hashset_boost_vector.cpp
new file mode 100644 (file)
index 0000000..e006c73
--- /dev/null
@@ -0,0 +1,167 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Refinable_boost_vector()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::vector you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/details/defs.h>
+
+#include <cds/container/striped_set/boost_vector.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef boost::container::vector<StripedSetHdrTest::item> vector_type;
+            typedef vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+
+        typedef boost::container::vector<StripedSetHdrTest::item>  sequence_t;
+    }
+
+    void StripedSetHdrTest::Refinable_boost_vector()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt16;
+        test_striped2< set_less_resizing_sbt16 >();
+
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy policy");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace set
+
+#else // BOOST_VERSION < 104800
+
+namespace set {
+    void StripedSetHdrTest::Refinable_boost_vector()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::vector you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_hashset_std.cpp b/tests/test-hdr/set/hdr_refinable_hashset_hashset_std.cpp
new file mode 100644 (file)
index 0000000..769d499
--- /dev/null
@@ -0,0 +1,156 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/std_hash_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+#if !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600)
+
+namespace set {
+
+    namespace {
+        struct equal_item
+        {
+            template <typename T>
+            bool operator ()( T const& i1, T const& i2) const
+            {
+                return i1.key() == i2.key();
+            }
+        };
+
+        typedef std::unordered_set< StripedSetHdrTest::item, StripedSetHdrTest::hash_int, equal_item > set_t;
+
+        struct my_copy_policy {
+            typedef set_t::iterator iterator;
+
+            void operator()( set_t& set, iterator itWhat )
+            {
+                set.insert( std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+    }
+
+    void StripedSetHdrTest::Refinable_hashset()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(1024) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace set
+#endif // #if !(CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION < 1600)
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_hashset_vc.cpp b/tests/test-hdr/set/hdr_refinable_hashset_hashset_vc.cpp
new file mode 100644 (file)
index 0000000..902f2d1
--- /dev/null
@@ -0,0 +1,156 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/std_hash_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600
+
+namespace stdext {
+    inline size_t hash_value(set::StripedSetHdrTest::item const& _Keyval)
+    {
+        return set::StripedSetHdrTest::hash_int()( _Keyval );
+    }
+}
+
+namespace set {
+
+    namespace {
+        typedef stdext::hash_compare<StripedSetHdrTest::item, StripedSetHdrTest::less<StripedSetHdrTest::item> >    hash_set_t;
+
+        struct my_copy_policy {
+            typedef stdext::hash_set< StripedSetHdrTest::item, hash_set_t > set_type;
+            typedef set_type::iterator iterator;
+
+            void operator()( set_type& set, iterator itWhat )
+            {
+                set.insert( std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+
+        typedef stdext::hash_set<StripedSetHdrTest::item, hash_set_t > set_t;
+    }
+
+    void StripedSetHdrTest::Refinable_hashset()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(1024) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+}   // namespace set
+#endif // #if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION < 1600
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_list.cpp b/tests/test-hdr/set/hdr_refinable_hashset_list.cpp
new file mode 100644 (file)
index 0000000..cdba942
--- /dev/null
@@ -0,0 +1,142 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/std_list.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef std::list<StripedSetHdrTest::item> list_type;
+            typedef list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+
+        typedef std::list<StripedSetHdrTest::item> sequence_t;
+    }
+
+    void StripedSetHdrTest::Refinable_list()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt16;
+        test_striped2< set_less_resizing_sbt16 >();
+
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy policy");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_set.cpp b/tests/test-hdr/set/hdr_refinable_hashset_set.cpp
new file mode 100644 (file)
index 0000000..7acf7ad
--- /dev/null
@@ -0,0 +1,144 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/std_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef std::set<StripedSetHdrTest::item, StripedSetHdrTest::less<StripedSetHdrTest::item> > set_type;
+            typedef set_type::iterator iterator;
+
+            void operator()( set_type& set, iterator itWhat )
+            {
+                set.insert( std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+
+        typedef std::set<StripedSetHdrTest::item, StripedSetHdrTest::less<StripedSetHdrTest::item> > set_t;
+    }
+
+    void StripedSetHdrTest::Refinable_set()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(1024));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(1024) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_item");
+        typedef cc::StripedSet< set_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_slist.cpp b/tests/test-hdr/set/hdr_refinable_hashset_slist.cpp
new file mode 100644 (file)
index 0000000..23499c8
--- /dev/null
@@ -0,0 +1,165 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Refinable_slist()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::slist you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_set/boost_slist.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef boost::container::slist<StripedSetHdrTest::item> list_type;
+            typedef list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert_after( itInsert, StripedSetHdrTest::item(std::make_pair(itWhat->key(), itWhat->val())) );
+            }
+        };
+
+        typedef boost::container::slist<StripedSetHdrTest::item> sequence_t;
+    }
+
+    void StripedSetHdrTest::Refinable_slist()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt16;
+        test_striped2< set_less_resizing_sbt16 >();
+
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy policy");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace set
+
+#else
+
+namespace set {
+    void StripedSetHdrTest::Refinable_slist()
+    {
+        CPPUNIT_MESSAGE("Skipped; for boost::container::slist you should use boost version 1.48 or above");
+    }
+} // namespace set
+
+#endif
diff --git a/tests/test-hdr/set/hdr_refinable_hashset_vector.cpp b/tests/test-hdr/set/hdr_refinable_hashset_vector.cpp
new file mode 100644 (file)
index 0000000..bd91299
--- /dev/null
@@ -0,0 +1,142 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/std_vector.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef std::vector<StripedSetHdrTest::item> vector_type;
+            typedef vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+
+        typedef std::vector<StripedSetHdrTest::item> sequence_t;
+    }
+
+    void StripedSetHdrTest::Refinable_vector()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<cds::lock::ReentrantSpin> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt16;
+        test_striped2< set_less_resizing_sbt16 >();
+
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy policy");
+        typedef cc::StripedSet< sequence_t
+            ,co::mutex_policy< cc::striped_set::refinable<> >
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_set.h b/tests/test-hdr/set/hdr_set.h
new file mode 100644 (file)
index 0000000..b449613
--- /dev/null
@@ -0,0 +1,1127 @@
+//$$CDS-header$$
+
+#ifndef __CDSTEST_HDR_SET_H
+#define __CDSTEST_HDR_SET_H
+
+#include "cppunit/cppunit_proxy.h"
+#include "size_check.h"
+
+#include <cds/opt/hash.h>
+#include <cds/os/timer.h>
+#include <cds/ref.h>
+#include <algorithm>    // random_shuffle
+
+// forward namespace declaration
+namespace cds {
+    namespace container {}
+    namespace opt {}
+}
+
+namespace set {
+    using misc::check_size;
+
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+
+    class HashSetHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        struct stat
+        {
+            unsigned int nFindCount     ;   // count of find-functor calling
+            unsigned int nEnsureNewCount;
+            unsigned int nEnsureCount;
+
+            stat()
+            {
+                memset( this, 0, sizeof(*this));
+            }
+
+            void copy( stat const& s )
+            {
+                nFindCount = s.nFindCount;
+                nEnsureCount = s.nEnsureCount;
+                nEnsureNewCount = s.nEnsureNewCount;
+            }
+        };
+
+        struct item: public stat
+        {
+            int nKey;
+            int nVal;
+
+            item()
+            {}
+
+            item( int key )
+                : nKey( key )
+                , nVal( key )
+            {}
+
+            item (int key, int val )
+                : nKey(key)
+                , nVal( val )
+            {}
+
+            item( std::pair<int,int> const& p )
+                : nKey( p.first )
+                , nVal( p.second )
+            {}
+
+            item( item const& i )
+                : nKey( i.nKey )
+                , nVal( i.nVal )
+            {}
+
+            item& operator=(item const& i)
+            {
+                nKey = i.nKey;
+                nVal = i.nVal;
+                stat::copy(i);
+
+                return *this;
+            }
+
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            item( item&& i )
+                : nKey( i.nKey )
+                , nVal( i.nVal )
+            {}
+
+            //item& operator=(item&& i)
+            //{
+            //    nKey = i.nKey;
+            //    nVal = i.nVal;
+            //    return *this;
+            //}
+#endif
+
+            int key() const
+            {
+                return nKey;
+            }
+
+            int val() const
+            {
+                return nVal;
+            }
+        };
+
+        struct hash_int {
+            size_t operator()( int i ) const
+            {
+                return co::v::hash<int>()( i );
+            }
+
+            size_t operator()( std::pair<int,int> const& i ) const
+            {
+                return co::v::hash<int>()( i.first );
+            }
+
+            template <typename Item>
+            size_t operator()( Item const& i ) const
+            {
+                return (*this)( i.key() );
+            }
+        };
+
+        struct simple_item_counter {
+            size_t  m_nCount;
+
+            simple_item_counter()
+                : m_nCount(0)
+            {}
+
+            size_t operator ++()
+            {
+                return ++m_nCount;
+            }
+
+            size_t operator --()
+            {
+                return --m_nCount;
+            }
+
+            void reset()
+            {
+                m_nCount = 0;
+            }
+
+            operator size_t() const
+            {
+                return m_nCount;
+            }
+        };
+
+        template <typename T>
+        struct less
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() < v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() < v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 < v2.key();
+            }
+
+            bool operator ()( std::pair<int, int> const& v1, const T& v2 ) const
+            {
+                return v1.first < v2.key();
+            }
+
+            bool operator ()(const T& v1, std::pair<int, int> const& v2 ) const
+            {
+                return v1.key() < v2.first;
+            }
+        };
+
+        struct other_item {
+            int nKey;
+
+            other_item( int key )
+                : nKey(key)
+            {}
+
+            int key() const
+            {
+                return nKey;
+            }
+        };
+
+        struct other_less
+        {
+            template <typename T>
+            bool operator ()(T const& v1, other_item const& v2 ) const
+            {
+                return v1.key() < v2.nKey;
+            }
+            template <typename T>
+            bool operator ()(other_item const& v1, T const& v2 ) const
+            {
+                return v1.nKey < v2.key();
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1.key() < v2.key() )
+                    return -1;
+                return v1.key() > v2.key() ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const T& v1, const Q& v2 ) const
+            {
+                if ( v1.key() < v2 )
+                    return -1;
+                return v1.key() > v2 ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const Q& v1, const T& v2 ) const
+            {
+                if ( v1 < v2.key() )
+                    return -1;
+                return v1 > v2.key() ? 1 : 0;
+            }
+
+            int operator()( std::pair<int,int> const& v1, T const& v2 ) const
+            {
+                if ( v1.first < v2.key() )
+                    return -1;
+                return v1.first > v2.key() ? 1 : 0;
+            }
+
+            int operator()( T const& v1, std::pair<int,int> const& v2 ) const
+            {
+                if ( v1.key() < v2.first )
+                    return -1;
+                return v1.key() > v2.first ? 1 : 0;
+            }
+        };
+
+        template <typename T>
+        struct equal
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() == v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() == v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 == v2.key();
+            }
+
+            bool operator ()( std::pair<int, int> const& v1, const T& v2 ) const
+            {
+                return v1.first == v2.key();
+            }
+
+            bool operator ()(const T& v1, std::pair<int, int> const& v2 ) const
+            {
+                return v1.key() == v2.first;
+            }
+        };
+
+        struct find_functor
+        {
+            template <typename Item, typename T>
+            void operator()( Item& i, T& val )
+            {
+                ++i.nFindCount;
+            }
+            template <typename Item, typename T>
+            void operator()( Item& i, T const& val )
+            {
+                ++i.nFindCount;
+            }
+        };
+
+        template <typename Item>
+        struct copy_found
+        {
+            Item    m_found;
+
+            template <typename T>
+            void operator()( Item& i, T& /*val*/ )
+            {
+                m_found = i;
+            }
+
+            void operator()( Item const& i )
+            {
+                m_found = i;
+            }
+        };
+
+        struct insert_functor
+        {
+            template <typename Item>
+            void operator()(Item& i )
+            {
+                i.nVal = i.nKey * 100;
+            }
+        };
+
+        template <typename Item, typename Q>
+        static void ensure_func( bool bNew, Item& i, Q& /*val*/ )
+        {
+            if ( bNew )
+                ++i.nEnsureNewCount;
+            else
+                ++i.nEnsureCount;
+        }
+
+        struct ensure_functor
+        {
+            template <typename Item, typename Q>
+            void operator()( bool bNew, Item& i, Q& val )
+            {
+                ensure_func( bNew, i, val );
+            }
+        };
+
+        template <class Set>
+        void test_int()
+        {
+            Set s( 100, 4 );
+            test_int_with( s );
+
+            // extract/get test
+            CPPUNIT_ASSERT( s.empty() );
+            {
+                const int nLimit = 100;
+                typename Set::guarded_ptr gp;
+                int arrRandom[nLimit];
+                for ( int i = 0; i < nLimit; ++i )
+                    arrRandom[i] = i;
+                std::random_shuffle( arrRandom, arrRandom + nLimit );
+
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arrRandom[i] ));
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrRandom[i];
+                    CPPUNIT_ASSERT( s.get(gp, nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey );
+
+                    CPPUNIT_ASSERT( s.extract(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey );
+                    CPPUNIT_CHECK( !s.get(gp, nKey));
+                    gp.release();
+
+                    CPPUNIT_CHECK( !s.extract(gp, nKey));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( s.empty() );
+
+
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arrRandom[i] ));
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrRandom[i];
+                    CPPUNIT_ASSERT( s.get_with(gp, other_item(nKey), other_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey );
+
+                    CPPUNIT_ASSERT( s.extract_with(gp, other_item(nKey), other_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey );
+                    CPPUNIT_CHECK( !s.get_with(gp, other_item(nKey), other_less() ));
+                    gp.release();
+
+                    CPPUNIT_CHECK( !s.extract_with(gp, other_item(nKey), other_less() ));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( s.empty() );
+            }
+
+            // iterator test
+            test_iter<Set>();
+        }
+
+        template <class Set>
+        void test_int_rcu()
+        {
+            Set s( 100, 4 );
+            test_int_with( s );
+
+            // extract/get test
+            {
+                typedef typename Set::gc    rcu;
+                typedef typename Set::rcu_lock rcu_lock;
+                typedef typename Set::value_type value_type;
+                typename Set::exempt_ptr ep;
+
+                static size_t const nLimit = 100;
+                int arr[nLimit];
+                for ( size_t i = 0; i < nLimit; ++i )
+                    arr[i] = (int) i;
+                std::random_shuffle( arr, arr + nLimit );
+
+                for ( size_t i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arr[i] ));
+
+                for ( size_t i = 0; i < nLimit; i += 2 ) {
+                    value_type * pVal;
+                    int nKey = arr[i];
+                    {
+                        rcu_lock l;
+                        pVal = s.get( nKey );
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->nKey == nKey );
+                        CPPUNIT_CHECK( pVal->nVal == nKey );
+
+                        CPPUNIT_ASSERT( s.extract( ep, nKey ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( pVal->nKey == ep->nKey );
+                        CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock l;
+                        CPPUNIT_CHECK( s.get( nKey ) == NULL );
+                        CPPUNIT_CHECK( !s.extract( ep, nKey ));
+                        CPPUNIT_CHECK( ep.empty() );
+
+                        nKey = arr[i+1];
+                        pVal = s.get_with( other_item(nKey), other_less() );
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->nKey == nKey );
+                        CPPUNIT_CHECK( pVal->nVal == nKey );
+
+                        CPPUNIT_ASSERT( s.extract_with( ep, other_item(nKey), other_less() ));
+                        CPPUNIT_ASSERT( !ep.empty() );
+                        CPPUNIT_CHECK( pVal->nKey == ep->nKey );
+                        CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
+                    }
+                    ep.release();
+                    {
+                        rcu_lock l;
+                        CPPUNIT_CHECK( s.get_with( other_item(nKey), other_less() ) == NULL );
+                        CPPUNIT_CHECK( !s.extract_with( ep, other_item(nKey), other_less() ));
+                        CPPUNIT_CHECK( ep.empty() );
+                    }
+                }
+                CPPUNIT_CHECK( s.empty() );
+                CPPUNIT_CHECK( check_size( s, 0 ));
+                {
+                    rcu_lock l;
+                    CPPUNIT_CHECK( s.get( int(nLimit / 2) ) == NULL );
+                    CPPUNIT_CHECK( !s.extract( ep, int(nLimit / 2) ));
+                    CPPUNIT_CHECK( ep.empty() );
+                }
+            }
+
+            // iterator test
+            test_iter<Set>();
+        }
+
+        template <class Set>
+        void test_int_with( Set& s)
+        {
+            typedef typename Set::value_type    value_type;
+
+            item itm;
+            int key;
+
+            // insert/find test
+            CPPUNIT_ASSERT( !s.find( 10 ) );
+            CPPUNIT_ASSERT( s.insert( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( s.find( 10 ) );
+
+            CPPUNIT_ASSERT( !s.insert( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            CPPUNIT_ASSERT( !s.find_with( 20, less<value_type>() ) );
+            CPPUNIT_ASSERT( s.insert( std::make_pair(20, 25) ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( s.find_with( 10, less<value_type>() ) );
+            CPPUNIT_ASSERT( s.find( key = 20 ) );
+            CPPUNIT_ASSERT( s.find_with( key, less<value_type>(), find_functor() ) );
+            {
+                copy_found<item> f;
+                key = 20;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+                CPPUNIT_ASSERT( f.m_found.nFindCount == 1 );
+            }
+            CPPUNIT_ASSERT( s.find( key, find_functor() ) );
+            {
+                copy_found<item> f;
+                key = 20;
+                CPPUNIT_ASSERT( s.find_with( key, less<value_type>(), boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+                CPPUNIT_ASSERT( f.m_found.nFindCount == 2 );
+            }
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( !s.find( 25 ) );
+            CPPUNIT_ASSERT( s.insert( std::make_pair(25, -1), insert_functor() ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            {
+                copy_found<item> f;
+                key = 25;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 25 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 2500 );
+            }
+
+            // ensure test
+            key = 10;
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 10 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 10 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 0 );
+            }
+            std::pair<bool, bool> ensureResult = s.ensure( key, ensure_functor() );
+            CPPUNIT_ASSERT( ensureResult.first && !ensureResult.second );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 10 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 10 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 1 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 0 );
+            }
+
+            ensureResult = s.ensure( std::make_pair(13, 1300), ensure_functor() );
+            CPPUNIT_ASSERT( ensureResult.first && ensureResult.second );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 4 ));
+            {
+                copy_found<item> f;
+                key = 13;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 13 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 1300 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 1 );
+            }
+
+            // erase test
+            CPPUNIT_ASSERT( s.erase(13) );
+            CPPUNIT_ASSERT( !s.find( 13 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            CPPUNIT_ASSERT( !s.erase(13) );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find( 10 ));
+            CPPUNIT_ASSERT( s.erase_with( 10, less<value_type>() ));
+            CPPUNIT_ASSERT( !s.find( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.erase_with(10, less<value_type>()) );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( s.find(20) );
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.erase( 20, boost::ref(f) ));
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+
+                CPPUNIT_ASSERT( s.insert(235))
+                CPPUNIT_ASSERT( s.erase_with( 235, less<value_type>(), boost::ref(f) ));
+                CPPUNIT_ASSERT( f.m_found.nKey == 235 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 235 );
+            }
+            CPPUNIT_ASSERT( !s.find( 20 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            CPPUNIT_ASSERT( s.emplace( 151 )) ;  // key = 151,  val = 151
+            CPPUNIT_ASSERT( s.emplace( 174, 471 )) ;    // key = 174, val = 471
+            CPPUNIT_ASSERT( s.emplace( std::make_pair( 190, 91 ) )) ; // key == 190, val = 91
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find(151));
+            CPPUNIT_ASSERT( s.find_with(174, less<value_type>()));
+            CPPUNIT_ASSERT( s.find(190));
+
+            {
+                copy_found<item> f;
+                key = 151;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 151 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 151 );
+
+                key = 174;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 174 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 471 );
+
+                key = 190;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 190 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 91 );
+            }
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+#       endif
+        }
+
+
+        template <class Set>
+        void test_int_nogc()
+        {
+            typedef typename Set::value_type        value_type;
+            typedef typename Set::iterator          iterator;
+            typedef typename Set::const_iterator    const_iterator;
+
+            {
+                Set s( 52, 4 );
+                iterator it;
+
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 0 ));
+
+                // insert
+                it = s.insert( 10 );
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 10 );
+                CPPUNIT_ASSERT( it->val() == 10 );
+                CPPUNIT_ASSERT( !s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 1 ));
+                CPPUNIT_ASSERT( s.insert( 10 ) == s.end() );
+
+                it = s.insert( std::make_pair( 50, 25 ));
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 50 );
+                CPPUNIT_ASSERT( it->val() == 25 );
+                CPPUNIT_ASSERT( !s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 2 ));
+                CPPUNIT_ASSERT( s.insert( 50 ) == s.end() );
+
+                // ensure
+                std::pair< iterator, bool>  ensureResult;
+                ensureResult = s.ensure( 20 );
+                CPPUNIT_ASSERT( ensureResult.first != s.end() );
+                CPPUNIT_ASSERT( ensureResult.second  );
+                CPPUNIT_ASSERT( ensureResult.first->key() == 20 );
+                CPPUNIT_ASSERT( ensureResult.first->val() == 20 );
+                CPPUNIT_ASSERT( !s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+
+                ensureResult = s.ensure( std::make_pair( 20, 200 ));
+                CPPUNIT_ASSERT( ensureResult.first != s.end() );
+                CPPUNIT_ASSERT( !ensureResult.second  );
+                CPPUNIT_ASSERT( ensureResult.first->key() == 20 );
+                CPPUNIT_ASSERT( ensureResult.first->val() == 20 );
+                CPPUNIT_ASSERT( !s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 3 ));
+                ensureResult.first->nVal = 22;
+
+                ensureResult = s.ensure( std::make_pair( 30, 33 ));
+                CPPUNIT_ASSERT( ensureResult.first != s.end() );
+                CPPUNIT_ASSERT( ensureResult.second  );
+                CPPUNIT_ASSERT( ensureResult.first->key() == 30 );
+                CPPUNIT_ASSERT( ensureResult.first->val() == 33 );
+                CPPUNIT_ASSERT( !s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 4 ));
+
+                // find
+                it = s.find( 10 );
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 10 );
+                CPPUNIT_ASSERT( it->val() == 10 );
+
+                it = s.find_with( 20, less<value_type>() );
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 20 );
+                CPPUNIT_ASSERT( it->val() == 22 );
+
+                it = s.find( 30 );
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 30 );
+                CPPUNIT_ASSERT( it->val() == 33 );
+
+                it = s.find( 40 );
+                CPPUNIT_ASSERT( it == s.end() );
+
+                it = s.find( 50 );
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 50 );
+                CPPUNIT_ASSERT( it->val() == 25 );
+
+#       ifdef CDS_EMPLACE_SUPPORT
+                // emplace test
+                it = s.emplace( 151 ) ;  // key = 151,  val = 151
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 151 );
+                CPPUNIT_ASSERT( it->val() == 151 );
+
+                it = s.emplace( 174, 471 ) ; // key == 174, val = 471
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 174 );
+                CPPUNIT_ASSERT( it->val() == 471 );
+
+                it = s.emplace( std::make_pair( 190, 91 )) ; // key == 190, val = 91
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 190 );
+                CPPUNIT_ASSERT( it->val() == 91 );
+
+                it = s.find( 174 );
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 174 );
+                CPPUNIT_ASSERT( it->val() == 471 );
+
+                it = s.find_with( 190, less<value_type>() );
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 190 );
+                CPPUNIT_ASSERT( it->val() == 91 );
+
+                it = s.find( 151 );
+                CPPUNIT_ASSERT( it != s.end() );
+                CPPUNIT_ASSERT( it->key() == 151 );
+                CPPUNIT_ASSERT( it->val() == 151 );
+#       endif
+
+                //s.clear();
+                //CPPUNIT_ASSERT( s.empty() );
+                //CPPUNIT_ASSERT( check_size( s, 0 ));
+            }
+
+            {
+                Set s( 52, 4 );
+
+                // iterator test
+                for ( int i = 0; i < 500; ++i ) {
+                    CPPUNIT_ASSERT( s.insert( std::make_pair( i, i * 2) ) != s.end() );
+                }
+                for ( iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                    it->nVal = (*it).nKey;
+                }
+
+                Set const& refSet = s;
+                for ( const_iterator it = refSet.begin(), itEnd = refSet.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                }
+            }
+        }
+
+        template <class Set>
+        void test_iter()
+        {
+            typedef typename Set::value_type        value_type;
+            typedef typename Set::iterator          iterator;
+            typedef typename Set::const_iterator    const_iterator;
+
+            Set s( 100, 4 );
+
+            const size_t nMaxCount = 500;
+            for ( int i = 0; size_t(i) < nMaxCount; ++i ) {
+                CPPUNIT_ASSERT( s.insert( std::make_pair( i, i * 2) ));
+            }
+            size_t nCount = 0;
+            for ( iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT_EX( (*it).nKey * 2 == it->nVal,
+                    "Step " << nCount << ": Iterator key=" << it->nKey <<  ", value expected=" << it->nKey * 2 << ", value real=" << it->nVal
+                    );
+                it->nVal = (*it).nKey;
+                ++nCount;
+            }
+            CPPUNIT_ASSERT( nCount == nMaxCount );
+
+            nCount = 0;
+            Set const& refSet = s;
+            for ( const_iterator it = refSet.begin(), itEnd = refSet.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT_EX( (*it).nKey == it->nVal,
+                    "Step " << nCount << ": Iterator key=" << it->nKey <<  ", value expected=" << it->nKey << ", value real=" << it->nVal
+                    );
+                ++nCount;
+            }
+            CPPUNIT_ASSERT( nCount == nMaxCount );
+        }
+
+        void Michael_HP_cmp();
+        void Michael_HP_less();
+        void Michael_HP_cmpmix();
+
+        void Michael_PTB_cmp();
+        void Michael_PTB_less();
+        void Michael_PTB_cmpmix();
+
+        void Michael_HRC_cmp();
+        void Michael_HRC_less();
+        void Michael_HRC_cmpmix();
+
+        void Michael_RCU_GPI_cmp();
+        void Michael_RCU_GPI_less();
+        void Michael_RCU_GPI_cmpmix();
+
+        void Michael_RCU_GPT_cmp();
+        void Michael_RCU_GPT_less();
+        void Michael_RCU_GPT_cmpmix();
+
+        void Michael_RCU_GPB_cmp();
+        void Michael_RCU_GPB_less();
+        void Michael_RCU_GPB_cmpmix();
+
+        void Michael_RCU_SHT_cmp();
+        void Michael_RCU_SHT_less();
+        void Michael_RCU_SHT_cmpmix();
+
+        void Michael_RCU_SHB_cmp();
+        void Michael_RCU_SHB_less();
+        void Michael_RCU_SHB_cmpmix();
+
+        void Michael_nogc_cmp();
+        void Michael_nogc_less();
+        void Michael_nogc_cmpmix();
+
+        void Lazy_HP_cmp();
+        void Lazy_HP_less();
+        void Lazy_HP_cmpmix();
+
+        void Lazy_PTB_cmp();
+        void Lazy_PTB_less();
+        void Lazy_PTB_cmpmix();
+
+        void Lazy_HRC_cmp();
+        void Lazy_HRC_less();
+        void Lazy_HRC_cmpmix();
+
+        void Lazy_RCU_GPI_cmp();
+        void Lazy_RCU_GPI_less();
+        void Lazy_RCU_GPI_cmpmix();
+
+        void Lazy_RCU_GPB_cmp();
+        void Lazy_RCU_GPB_less();
+        void Lazy_RCU_GPB_cmpmix();
+
+        void Lazy_RCU_GPT_cmp();
+        void Lazy_RCU_GPT_less();
+        void Lazy_RCU_GPT_cmpmix();
+
+        void Lazy_RCU_SHB_cmp();
+        void Lazy_RCU_SHB_less();
+        void Lazy_RCU_SHB_cmpmix();
+
+        void Lazy_RCU_SHT_cmp();
+        void Lazy_RCU_SHT_less();
+        void Lazy_RCU_SHT_cmpmix();
+
+        void Lazy_nogc_cmp();
+        void Lazy_nogc_less();
+        void Lazy_nogc_cmpmix();
+
+        void Split_HP_cmp();
+        void Split_HP_less();
+        void Split_HP_cmpmix();
+
+        void Split_PTB_cmp();
+        void Split_PTB_less();
+        void Split_PTB_cmpmix();
+
+        void Split_HRC_cmp();
+        void Split_HRC_less();
+        void Split_HRC_cmpmix();
+
+        void Split_RCU_GPI_cmp();
+        void Split_RCU_GPI_less();
+        void Split_RCU_GPI_cmpmix();
+
+        void Split_RCU_GPB_cmp();
+        void Split_RCU_GPB_less();
+        void Split_RCU_GPB_cmpmix();
+
+        void Split_RCU_GPT_cmp();
+        void Split_RCU_GPT_less();
+        void Split_RCU_GPT_cmpmix();
+
+        void Split_RCU_SHB_cmp();
+        void Split_RCU_SHB_less();
+        void Split_RCU_SHB_cmpmix();
+
+        void Split_RCU_SHT_cmp();
+        void Split_RCU_SHT_less();
+        void Split_RCU_SHT_cmpmix();
+
+        void Split_nogc_cmp();
+        void Split_nogc_less();
+        void Split_nogc_cmpmix();
+
+
+        void Split_Lazy_HP_cmp();
+        void Split_Lazy_HP_less();
+        void Split_Lazy_HP_cmpmix();
+
+        void Split_Lazy_PTB_cmp();
+        void Split_Lazy_PTB_less();
+        void Split_Lazy_PTB_cmpmix();
+
+        void Split_Lazy_HRC_cmp();
+        void Split_Lazy_HRC_less();
+        void Split_Lazy_HRC_cmpmix();
+
+        void Split_Lazy_RCU_GPI_cmp();
+        void Split_Lazy_RCU_GPI_less();
+        void Split_Lazy_RCU_GPI_cmpmix();
+
+        void Split_Lazy_RCU_GPB_cmp();
+        void Split_Lazy_RCU_GPB_less();
+        void Split_Lazy_RCU_GPB_cmpmix();
+
+        void Split_Lazy_RCU_GPT_cmp();
+        void Split_Lazy_RCU_GPT_less();
+        void Split_Lazy_RCU_GPT_cmpmix();
+
+        void Split_Lazy_RCU_SHB_cmp();
+        void Split_Lazy_RCU_SHB_less();
+        void Split_Lazy_RCU_SHB_cmpmix();
+
+        void Split_Lazy_RCU_SHT_cmp();
+        void Split_Lazy_RCU_SHT_less();
+        void Split_Lazy_RCU_SHT_cmpmix();
+
+        void Split_Lazy_nogc_cmp();
+        void Split_Lazy_nogc_less();
+        void Split_Lazy_nogc_cmpmix();
+
+        CPPUNIT_TEST_SUITE(HashSetHdrTest)
+            CPPUNIT_TEST(Michael_HP_cmp)
+            CPPUNIT_TEST(Michael_HP_less)
+            CPPUNIT_TEST(Michael_HP_cmpmix)
+
+            CPPUNIT_TEST(Michael_PTB_cmp)
+            CPPUNIT_TEST(Michael_PTB_less)
+            CPPUNIT_TEST(Michael_PTB_cmpmix)
+
+            CPPUNIT_TEST(Michael_HRC_cmp)
+            CPPUNIT_TEST(Michael_HRC_less)
+            CPPUNIT_TEST(Michael_HRC_cmpmix)
+
+            CPPUNIT_TEST(Michael_RCU_GPI_cmp)
+            CPPUNIT_TEST(Michael_RCU_GPI_less)
+            CPPUNIT_TEST(Michael_RCU_GPI_cmpmix)
+
+            CPPUNIT_TEST(Michael_RCU_GPB_cmp)
+            CPPUNIT_TEST(Michael_RCU_GPB_less)
+            CPPUNIT_TEST(Michael_RCU_GPB_cmpmix)
+
+            CPPUNIT_TEST(Michael_RCU_GPT_cmp)
+            CPPUNIT_TEST(Michael_RCU_GPT_less)
+            CPPUNIT_TEST(Michael_RCU_GPT_cmpmix)
+
+            CPPUNIT_TEST(Michael_RCU_SHB_cmp)
+            CPPUNIT_TEST(Michael_RCU_SHB_less)
+            CPPUNIT_TEST(Michael_RCU_SHB_cmpmix)
+
+            CPPUNIT_TEST(Michael_RCU_SHT_cmp)
+            CPPUNIT_TEST(Michael_RCU_SHT_less)
+            CPPUNIT_TEST(Michael_RCU_SHT_cmpmix)
+
+            CPPUNIT_TEST(Michael_nogc_cmp)
+            CPPUNIT_TEST(Michael_nogc_less)
+            CPPUNIT_TEST(Michael_nogc_cmpmix)
+
+            CPPUNIT_TEST(Lazy_HP_cmp)
+            CPPUNIT_TEST(Lazy_HP_less)
+            CPPUNIT_TEST(Lazy_HP_cmpmix)
+
+            CPPUNIT_TEST(Lazy_PTB_cmp)
+            CPPUNIT_TEST(Lazy_PTB_less)
+            CPPUNIT_TEST(Lazy_PTB_cmpmix)
+
+            CPPUNIT_TEST(Lazy_HRC_cmp)
+            CPPUNIT_TEST(Lazy_HRC_less)
+            CPPUNIT_TEST(Lazy_HRC_cmpmix)
+
+            CPPUNIT_TEST(Lazy_RCU_GPI_cmp)
+            CPPUNIT_TEST(Lazy_RCU_GPI_less)
+            CPPUNIT_TEST(Lazy_RCU_GPI_cmpmix)
+
+            CPPUNIT_TEST(Lazy_RCU_GPB_cmp)
+            CPPUNIT_TEST(Lazy_RCU_GPB_less)
+            CPPUNIT_TEST(Lazy_RCU_GPB_cmpmix)
+
+            CPPUNIT_TEST(Lazy_RCU_GPT_cmp)
+            CPPUNIT_TEST(Lazy_RCU_GPT_less)
+            CPPUNIT_TEST(Lazy_RCU_GPT_cmpmix)
+
+            CPPUNIT_TEST(Lazy_RCU_SHB_cmp)
+            CPPUNIT_TEST(Lazy_RCU_SHB_less)
+            CPPUNIT_TEST(Lazy_RCU_SHB_cmpmix)
+
+            CPPUNIT_TEST(Lazy_RCU_SHT_cmp)
+            CPPUNIT_TEST(Lazy_RCU_SHT_less)
+            CPPUNIT_TEST(Lazy_RCU_SHT_cmpmix)
+
+            CPPUNIT_TEST(Lazy_nogc_cmp)
+            CPPUNIT_TEST(Lazy_nogc_less)
+            CPPUNIT_TEST(Lazy_nogc_cmpmix)
+
+            CPPUNIT_TEST(Split_HP_cmp)
+            CPPUNIT_TEST(Split_HP_less)
+            CPPUNIT_TEST(Split_HP_cmpmix)
+
+            CPPUNIT_TEST(Split_PTB_cmp)
+            CPPUNIT_TEST(Split_PTB_less)
+            CPPUNIT_TEST(Split_PTB_cmpmix)
+
+            CPPUNIT_TEST(Split_HRC_cmp)
+            CPPUNIT_TEST(Split_HRC_less)
+            CPPUNIT_TEST(Split_HRC_cmpmix)
+
+            CPPUNIT_TEST(Split_RCU_GPI_cmp)
+            CPPUNIT_TEST(Split_RCU_GPI_less)
+            CPPUNIT_TEST(Split_RCU_GPI_cmpmix)
+
+            CPPUNIT_TEST(Split_RCU_GPB_cmp)
+            CPPUNIT_TEST(Split_RCU_GPB_less)
+            CPPUNIT_TEST(Split_RCU_GPB_cmpmix)
+
+            CPPUNIT_TEST(Split_RCU_GPT_cmp)
+            CPPUNIT_TEST(Split_RCU_GPT_less)
+            CPPUNIT_TEST(Split_RCU_GPT_cmpmix)
+
+            CPPUNIT_TEST(Split_RCU_SHB_cmp)
+            CPPUNIT_TEST(Split_RCU_SHB_less)
+            CPPUNIT_TEST(Split_RCU_SHB_cmpmix)
+
+            CPPUNIT_TEST(Split_RCU_SHT_cmp)
+            CPPUNIT_TEST(Split_RCU_SHT_less)
+            CPPUNIT_TEST(Split_RCU_SHT_cmpmix)
+
+            CPPUNIT_TEST(Split_nogc_cmp)
+            CPPUNIT_TEST(Split_nogc_less)
+            CPPUNIT_TEST(Split_nogc_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_HP_cmp)
+            CPPUNIT_TEST(Split_Lazy_HP_less)
+            CPPUNIT_TEST(Split_Lazy_HP_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_PTB_cmp)
+            CPPUNIT_TEST(Split_Lazy_PTB_less)
+            CPPUNIT_TEST(Split_Lazy_PTB_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_HRC_cmp)
+            CPPUNIT_TEST(Split_Lazy_HRC_less)
+            CPPUNIT_TEST(Split_Lazy_HRC_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_RCU_GPI_cmp)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPI_less)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPI_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_RCU_GPB_cmp)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPB_less)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPB_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_RCU_GPT_cmp)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPT_less)
+            CPPUNIT_TEST(Split_Lazy_RCU_GPT_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_RCU_SHB_cmp)
+            CPPUNIT_TEST(Split_Lazy_RCU_SHB_less)
+            CPPUNIT_TEST(Split_Lazy_RCU_SHB_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_RCU_SHT_cmp)
+            CPPUNIT_TEST(Split_Lazy_RCU_SHT_less)
+            CPPUNIT_TEST(Split_Lazy_RCU_SHT_cmpmix)
+
+            CPPUNIT_TEST(Split_Lazy_nogc_cmp)
+            CPPUNIT_TEST(Split_Lazy_nogc_less)
+            CPPUNIT_TEST(Split_Lazy_nogc_cmpmix)
+
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+
+} // namespace set
+
+#endif // __CDSTEST_HDR_SET_H
diff --git a/tests/test-hdr/set/hdr_skiplist_set.h b/tests/test-hdr/set/hdr_skiplist_set.h
new file mode 100644 (file)
index 0000000..fb06943
--- /dev/null
@@ -0,0 +1,615 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+
+namespace set {
+
+    class SkipListSetHdrTest: public HashSetHdrTest
+    {
+        typedef HashSetHdrTest base_class;
+
+        typedef base_class::other_item  wrapped_item;
+        typedef base_class::other_less  wrapped_less;
+
+        template <class Set, typename PrintStat >
+        void test()
+        {
+            Set s;
+            base_class::test_int_with( s );
+
+            static int const nLimit = 10000;
+            typedef typename Set::iterator          set_iterator;
+            typedef typename Set::const_iterator    const_set_iterator;
+            typedef typename Set::guarded_ptr       guarded_ptr;
+
+            int nCount = 0;
+            int nPrevKey = 0;
+            guarded_ptr gp;
+            int arrRandom[nLimit];
+            for ( int i = 0; i < nLimit; ++i )
+                arrRandom[i] = i;
+            std::random_shuffle( arrRandom, arrRandom + nLimit );
+
+
+            // Test iterator - ascending order
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+
+            for ( int i = 0; i < nLimit; ++i ) {
+                CPPUNIT_CHECK( !s.get(gp, i) );
+                CPPUNIT_CHECK( gp.empty() );
+
+                CPPUNIT_ASSERT( s.insert(i) );
+
+                CPPUNIT_CHECK( s.get(gp, i));
+                CPPUNIT_ASSERT( !gp.empty());
+                CPPUNIT_CHECK( gp->nKey == i );
+                CPPUNIT_CHECK( gp->nVal == i );
+                gp.release();
+            }
+            CPPUNIT_MSG( PrintStat()(s, "Iterator test, ascending insert order") );
+
+            nCount = 0;
+            nPrevKey = 0;
+            for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                CPPUNIT_ASSERT( s.find( it->nKey ));
+                it->nVal = (*it).nKey * 2;
+                ++nCount;
+                if ( it != s.begin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+
+                // get
+                CPPUNIT_CHECK( s.get( gp, it->nKey ));
+                CPPUNIT_ASSERT( !gp.empty() );
+                CPPUNIT_CHECK( gp->nKey == it->nKey );
+                CPPUNIT_CHECK( gp->nVal == it->nKey * 2 );
+                gp.release();
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                ++nCount;
+                if ( it != s.cbegin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            // Test iterator - descending order
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+
+            for ( int i = nLimit; i > 0; --i ) {
+                CPPUNIT_CHECK( !s.get_with(gp, i-1, base_class::less<typename Set::value_type>() ) );
+                CPPUNIT_CHECK( gp.empty() );
+
+                CPPUNIT_ASSERT( s.insert( std::make_pair(i - 1, (i-1) * 2) ));
+
+                // get_with
+                CPPUNIT_CHECK( s.get_with(gp, i-1, base_class::less<typename Set::value_type>() ));
+                CPPUNIT_ASSERT( !gp.empty());
+                CPPUNIT_CHECK( gp->nKey == i-1 );
+                CPPUNIT_CHECK( gp->nVal == (i-1) * 2 );
+                gp.release();
+            }
+            CPPUNIT_MSG( PrintStat()(s, "Iterator test, descending insert order") );
+
+            nCount = 0;
+            nPrevKey = 0;
+            for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                CPPUNIT_ASSERT( s.find( it->nKey ));
+                it->nVal = (*it).nKey;
+                ++nCount;
+                if ( it != s.begin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                ++nCount;
+                if ( it != s.cbegin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            // Test iterator - random order
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            {
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
+                CPPUNIT_MSG( PrintStat()(s, "Iterator test, random insert order") );
+            }
+
+            nCount = 0;
+            nPrevKey = 0;
+            for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                CPPUNIT_ASSERT( s.find( it->nKey ));
+                it->nVal = (*it).nKey * 2;
+                ++nCount;
+                if ( it != s.begin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                ++nCount;
+                if ( it != s.cbegin() ) {
+                    CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                }
+                nPrevKey = it->nKey;
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            // extract test
+            {
+                typedef typename base_class::less<typename Set::value_type> less_predicate;
+                typename Set::guarded_ptr gp;
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrRandom[i];
+                    CPPUNIT_ASSERT( s.get(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey * 2);
+                    gp.release();
+
+                    CPPUNIT_ASSERT( s.extract(gp, nKey));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey * 2);
+                    gp.release();
+
+                    CPPUNIT_CHECK( !s.get(gp, nKey));
+                    CPPUNIT_ASSERT( gp.empty());
+                    CPPUNIT_ASSERT( !s.extract(gp, nKey));
+                    CPPUNIT_ASSERT( gp.empty());
+                }
+                CPPUNIT_ASSERT( s.empty() );
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrRandom[i];
+                    CPPUNIT_ASSERT( s.get_with(gp, wrapped_item(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey );
+                    gp.release();
+
+                    CPPUNIT_ASSERT( s.extract_with(gp, wrapped_item(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+                    CPPUNIT_CHECK( gp->nVal == nKey );
+                    CPPUNIT_CHECK( !s.get_with(gp, wrapped_item(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !s.extract_with(gp, wrapped_item(nKey), wrapped_less() ));
+                    gp.release();
+                }
+                CPPUNIT_ASSERT( s.empty() );
+
+                // extract_min
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( s.extract_min(gp));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == i );
+                    CPPUNIT_CHECK( gp->nVal == i );
+                    CPPUNIT_CHECK( !s.get(gp, i ));
+                    gp.release();
+                }
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_CHECK( !s.extract_min(gp));
+                CPPUNIT_ASSERT( gp.empty() );
+                CPPUNIT_CHECK( !s.extract_max(gp));
+                CPPUNIT_ASSERT( gp.empty() );
+
+                // extract_max
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
+
+                for ( int i = nLimit-1; i >= 0; --i ) {
+                    CPPUNIT_ASSERT( s.extract_max(gp));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == i );
+                    CPPUNIT_CHECK( gp->nVal == i );
+                    CPPUNIT_CHECK( !s.get(gp, i ));
+                    gp.release();
+                }
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_CHECK( !s.extract_min(gp));
+                CPPUNIT_ASSERT( gp.empty() );
+                CPPUNIT_CHECK( !s.extract_max(gp));
+                CPPUNIT_ASSERT( gp.empty() );
+            }
+
+            CPPUNIT_MSG( PrintStat()(s, NULL) );
+        }
+
+        template <class Set, typename PrintStat >
+        void test_nogc()
+        {
+            typedef typename Set::value_type        value_type;
+            typedef typename Set::iterator          iterator;
+            typedef typename Set::const_iterator    const_iterator;
+
+            Set s;
+            iterator it;
+
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            // insert
+            it = s.insert( 10 );
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 10 );
+            CPPUNIT_ASSERT( it->val() == 10 );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( s.insert( 10 ) == s.end() );
+
+            it = s.insert( std::make_pair( 50, 25 ));
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 50 );
+            CPPUNIT_ASSERT( it->val() == 25 );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( s.insert( 50 ) == s.end() );
+
+            // ensure
+            std::pair< iterator, bool>  ensureResult;
+            ensureResult = s.ensure( 20 );
+            CPPUNIT_ASSERT( ensureResult.first != s.end() );
+            CPPUNIT_ASSERT( ensureResult.second  );
+            CPPUNIT_ASSERT( ensureResult.first->key() == 20 );
+            CPPUNIT_ASSERT( ensureResult.first->val() == 20 );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            ensureResult = s.ensure( std::make_pair( 20, 200 ));
+            CPPUNIT_ASSERT( ensureResult.first != s.end() );
+            CPPUNIT_ASSERT( !ensureResult.second  );
+            CPPUNIT_ASSERT( ensureResult.first->key() == 20 );
+            CPPUNIT_ASSERT( ensureResult.first->val() == 20 );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            ensureResult.first->nVal = 22;
+
+            ensureResult = s.ensure( std::make_pair( 30, 33 ));
+            CPPUNIT_ASSERT( ensureResult.first != s.end() );
+            CPPUNIT_ASSERT( ensureResult.second  );
+            CPPUNIT_ASSERT( ensureResult.first->key() == 30 );
+            CPPUNIT_ASSERT( ensureResult.first->val() == 33 );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 4 ));
+
+            // find
+            it = s.find( 10 );
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 10 );
+            CPPUNIT_ASSERT( it->val() == 10 );
+
+            it = s.find( 20 );
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 20 );
+            CPPUNIT_ASSERT( it->val() == 22 );
+
+            it = s.find_with( 30, base_class::less<value_type>() );
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 30 );
+            CPPUNIT_ASSERT( it->val() == 33 );
+
+            it = s.find( 40 );
+            CPPUNIT_ASSERT( it == s.end() );
+
+            it = s.find( 50 );
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 50 );
+            CPPUNIT_ASSERT( it->val() == 25 );
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            it = s.emplace( 151 ) ;  // key = 151,  val = 151
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 151 );
+            CPPUNIT_ASSERT( it->val() == 151 );
+
+            it = s.emplace( 174, 471 ) ; // key == 174, val = 471
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 174 );
+            CPPUNIT_ASSERT( it->val() == 471 );
+
+            it = s.emplace( std::make_pair( 190, 91 )) ; // key == 190, val = 91
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 190 );
+            CPPUNIT_ASSERT( it->val() == 91 );
+
+            it = s.find( 174 );
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 174 );
+            CPPUNIT_ASSERT( it->val() == 471 );
+
+            it = s.find( 190 );
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 190 );
+            CPPUNIT_ASSERT( it->val() == 91 );
+
+            it = s.find( 151 );
+            CPPUNIT_ASSERT( it != s.end() );
+            CPPUNIT_ASSERT( it->key() == 151 );
+            CPPUNIT_ASSERT( it->val() == 151 );
+#       endif
+
+            CPPUNIT_ASSERT( !s.empty() );
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            // get_min test
+            for ( int i = 500; i > 0; --i ) {
+                CPPUNIT_ASSERT( s.insert( std::make_pair( i, i * 2) ) != s.end() );
+
+                typename Set::value_type * pVal = s.get_min();
+                CPPUNIT_ASSERT( pVal != NULL );
+                CPPUNIT_CHECK( pVal->nKey == i );
+                CPPUNIT_CHECK( pVal->nVal ==  i * 2 );
+            }
+            CPPUNIT_ASSERT( !s.empty() );
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            CPPUNIT_CHECK( s.get_min() == NULL );
+            CPPUNIT_CHECK( s.get_max() == NULL );
+
+            // iterator test
+            for ( int i = 0; i < 500; ++i ) {
+                CPPUNIT_ASSERT( s.insert( std::make_pair( i, i * 2) ) != s.end() );
+
+                typename Set::value_type * pVal = s.get_max();
+                CPPUNIT_ASSERT( pVal != NULL );
+                CPPUNIT_CHECK( pVal->nKey == i );
+                CPPUNIT_CHECK( pVal->nVal == i * 2 );
+            }
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 500 ));
+
+            for ( iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                it->nVal = (*it).nKey;
+            }
+
+            Set const& refSet = s;
+            for ( const_iterator it = refSet.begin(), itEnd = refSet.end(); it != itEnd; ++it ) {
+                CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+            }
+        }
+
+    public:
+        void SkipList_HP_less();
+        void SkipList_HP_cmp();
+        void SkipList_HP_cmpless();
+        void SkipList_HP_less_stat();
+        void SkipList_HP_cmp_stat();
+        void SkipList_HP_cmpless_stat();
+        void SkipList_HP_xorshift_less();
+        void SkipList_HP_xorshift_cmp();
+        void SkipList_HP_xorshift_cmpless();
+        void SkipList_HP_xorshift_less_stat();
+        void SkipList_HP_xorshift_cmp_stat();
+        void SkipList_HP_xorshift_cmpless_stat();
+        void SkipList_HP_turbopas_less();
+        void SkipList_HP_turbopas_cmp();
+        void SkipList_HP_turbopas_cmpless();
+        void SkipList_HP_turbopas_less_stat();
+        void SkipList_HP_turbopas_cmp_stat();
+        void SkipList_HP_turbopas_cmpless_stat();
+        void SkipList_HP_michaelalloc_less();
+        void SkipList_HP_michaelalloc_cmp();
+        void SkipList_HP_michaelalloc_cmpless();
+        void SkipList_HP_michaelalloc_less_stat();
+        void SkipList_HP_michaelalloc_cmp_stat();
+        void SkipList_HP_michaelalloc_cmpless_stat();
+
+        void SkipList_HRC_less();
+        void SkipList_HRC_cmp();
+        void SkipList_HRC_cmpless();
+        void SkipList_HRC_less_stat();
+        void SkipList_HRC_cmp_stat();
+        void SkipList_HRC_cmpless_stat();
+        void SkipList_HRC_xorshift_less();
+        void SkipList_HRC_xorshift_cmp();
+        void SkipList_HRC_xorshift_cmpless();
+        void SkipList_HRC_xorshift_less_stat();
+        void SkipList_HRC_xorshift_cmp_stat();
+        void SkipList_HRC_xorshift_cmpless_stat();
+        void SkipList_HRC_turbopas_less();
+        void SkipList_HRC_turbopas_cmp();
+        void SkipList_HRC_turbopas_cmpless();
+        void SkipList_HRC_turbopas_less_stat();
+        void SkipList_HRC_turbopas_cmp_stat();
+        void SkipList_HRC_turbopas_cmpless_stat();
+        void SkipList_HRC_michaelalloc_less();
+        void SkipList_HRC_michaelalloc_cmp();
+        void SkipList_HRC_michaelalloc_cmpless();
+        void SkipList_HRC_michaelalloc_less_stat();
+        void SkipList_HRC_michaelalloc_cmp_stat();
+        void SkipList_HRC_michaelalloc_cmpless_stat();
+
+        void SkipList_PTB_less();
+        void SkipList_PTB_cmp();
+        void SkipList_PTB_cmpless();
+        void SkipList_PTB_less_stat();
+        void SkipList_PTB_cmp_stat();
+        void SkipList_PTB_cmpless_stat();
+        void SkipList_PTB_xorshift_less();
+        void SkipList_PTB_xorshift_cmp();
+        void SkipList_PTB_xorshift_cmpless();
+        void SkipList_PTB_xorshift_less_stat();
+        void SkipList_PTB_xorshift_cmp_stat();
+        void SkipList_PTB_xorshift_cmpless_stat();
+        void SkipList_PTB_turbopas_less();
+        void SkipList_PTB_turbopas_cmp();
+        void SkipList_PTB_turbopas_cmpless();
+        void SkipList_PTB_turbopas_less_stat();
+        void SkipList_PTB_turbopas_cmp_stat();
+        void SkipList_PTB_turbopas_cmpless_stat();
+        void SkipList_PTB_michaelalloc_less();
+        void SkipList_PTB_michaelalloc_cmp();
+        void SkipList_PTB_michaelalloc_cmpless();
+        void SkipList_PTB_michaelalloc_less_stat();
+        void SkipList_PTB_michaelalloc_cmp_stat();
+        void SkipList_PTB_michaelalloc_cmpless_stat();
+
+        void SkipList_NOGC_less();
+        void SkipList_NOGC_cmp();
+        void SkipList_NOGC_cmpless();
+        void SkipList_NOGC_less_stat();
+        void SkipList_NOGC_cmp_stat();
+        void SkipList_NOGC_cmpless_stat();
+        void SkipList_NOGC_xorshift_less();
+        void SkipList_NOGC_xorshift_cmp();
+        void SkipList_NOGC_xorshift_cmpless();
+        void SkipList_NOGC_xorshift_less_stat();
+        void SkipList_NOGC_xorshift_cmp_stat();
+        void SkipList_NOGC_xorshift_cmpless_stat();
+        void SkipList_NOGC_turbopas_less();
+        void SkipList_NOGC_turbopas_cmp();
+        void SkipList_NOGC_turbopas_cmpless();
+        void SkipList_NOGC_turbopas_less_stat();
+        void SkipList_NOGC_turbopas_cmp_stat();
+        void SkipList_NOGC_turbopas_cmpless_stat();
+        void SkipList_NOGC_michaelalloc_less();
+        void SkipList_NOGC_michaelalloc_cmp();
+        void SkipList_NOGC_michaelalloc_cmpless();
+        void SkipList_NOGC_michaelalloc_less_stat();
+        void SkipList_NOGC_michaelalloc_cmp_stat();
+        void SkipList_NOGC_michaelalloc_cmpless_stat();
+
+        CPPUNIT_TEST_SUITE(SkipListSetHdrTest)
+            CPPUNIT_TEST(SkipList_HP_less)
+            CPPUNIT_TEST(SkipList_HP_cmp)
+            CPPUNIT_TEST(SkipList_HP_cmpless)
+            CPPUNIT_TEST(SkipList_HP_less_stat)
+            CPPUNIT_TEST(SkipList_HP_cmp_stat)
+            CPPUNIT_TEST(SkipList_HP_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HP_xorshift_less)
+            CPPUNIT_TEST(SkipList_HP_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_HP_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_HP_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_HP_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_HP_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HP_turbopas_less)
+            CPPUNIT_TEST(SkipList_HP_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_HP_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_HP_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_HP_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_HP_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_HP_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_HRC_less)
+            CPPUNIT_TEST(SkipList_HRC_cmp)
+            CPPUNIT_TEST(SkipList_HRC_cmpless)
+            CPPUNIT_TEST(SkipList_HRC_less_stat)
+            CPPUNIT_TEST(SkipList_HRC_cmp_stat)
+            CPPUNIT_TEST(SkipList_HRC_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_less)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_HRC_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_less)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_HRC_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_HRC_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_PTB_less)
+            CPPUNIT_TEST(SkipList_PTB_cmp)
+            CPPUNIT_TEST(SkipList_PTB_cmpless)
+            CPPUNIT_TEST(SkipList_PTB_less_stat)
+            CPPUNIT_TEST(SkipList_PTB_cmp_stat)
+            CPPUNIT_TEST(SkipList_PTB_cmpless_stat)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_less)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_PTB_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_less)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_PTB_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_PTB_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_NOGC_less)
+            CPPUNIT_TEST(SkipList_NOGC_cmp)
+            CPPUNIT_TEST(SkipList_NOGC_cmpless)
+            CPPUNIT_TEST(SkipList_NOGC_less_stat)
+            CPPUNIT_TEST(SkipList_NOGC_cmp_stat)
+            CPPUNIT_TEST(SkipList_NOGC_cmpless_stat)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_less)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_NOGC_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_less)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_NOGC_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmpless_stat)
+
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+}
diff --git a/tests/test-hdr/set/hdr_skiplist_set_hp.cpp b/tests/test-hdr/set/hdr_skiplist_set_hp.cpp
new file mode 100644 (file)
index 0000000..1f120cf
--- /dev/null
@@ -0,0 +1,313 @@
+//$$CDS-header$$
+
+#include "set/hdr_skiplist_set.h"
+#include <cds/container/skip_list_set_hp.h>
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+
+    void SkipListSetHdrTest::SkipList_HP_less()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+            co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+            co::less< less<item > >
+            ,co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_xorshift_less()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_xorshift_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_xorshift_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_xorshift_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_turbopas_less()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_turbopas_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_turbopas_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_turbopas_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_michaelalloc_less()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_michaelalloc_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HP_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HP, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace set
+
+CPPUNIT_TEST_SUITE_REGISTRATION(set::SkipListSetHdrTest);
diff --git a/tests/test-hdr/set/hdr_skiplist_set_hrc.cpp b/tests/test-hdr/set/hdr_skiplist_set_hrc.cpp
new file mode 100644 (file)
index 0000000..ef14285
--- /dev/null
@@ -0,0 +1,311 @@
+//$$CDS-header$$
+
+#include "set/hdr_skiplist_set.h"
+#include <cds/container/skip_list_set_hrc.h>
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+
+    void SkipListSetHdrTest::SkipList_HRC_less()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+            co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+            co::less< less<item > >
+            ,co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_xorshift_less()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_xorshift_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_xorshift_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_xorshift_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_turbopas_less()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_turbopas_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_turbopas_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_turbopas_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_michaelalloc_less()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_michaelalloc_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_HRC_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::HRC, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_skiplist_set_nogc.cpp b/tests/test-hdr/set/hdr_skiplist_set_nogc.cpp
new file mode 100644 (file)
index 0000000..e80b73c
--- /dev/null
@@ -0,0 +1,311 @@
+//$$CDS-header$$
+
+#include "set/hdr_skiplist_set.h"
+#include <cds/container/skip_list_set_nogc.h>
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+
+    void SkipListSetHdrTest::SkipList_NOGC_less()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+            co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+            co::less< less<item > >
+            ,co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_xorshift_less()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_xorshift_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_xorshift_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_xorshift_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_turbopas_less()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_turbopas_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_turbopas_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_turbopas_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_michaelalloc_less()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_michaelalloc_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_NOGC_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::nogc, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test_nogc< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_skiplist_set_ptb.cpp b/tests/test-hdr/set/hdr_skiplist_set_ptb.cpp
new file mode 100644 (file)
index 0000000..22fea86
--- /dev/null
@@ -0,0 +1,311 @@
+//$$CDS-header$$
+
+#include "set/hdr_skiplist_set.h"
+#include <cds/container/skip_list_set_ptb.h>
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+
+    void SkipListSetHdrTest::SkipList_PTB_less()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+            co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+            co::less< less<item > >
+            ,co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_xorshift_less()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_xorshift_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_xorshift_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_xorshift_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_turbopas_less()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_turbopas_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_turbopas_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_turbopas_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_michaelalloc_less()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_michaelalloc_cmp()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetHdrTest::SkipList_PTB_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListSet< cds::gc::PTB, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_skiplist_set_rcu.h b/tests/test-hdr/set/hdr_skiplist_set_rcu.h
new file mode 100644 (file)
index 0000000..f210d8b
--- /dev/null
@@ -0,0 +1,502 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+
+namespace set {
+
+    class SkipListSetRCUHdrTest: public HashSetHdrTest
+    {
+        typedef HashSetHdrTest base_class;
+
+        typedef base_class::other_item  wrapped_item;
+        typedef base_class::other_less  wrapped_less;
+
+        template <class Set, typename PrintStat >
+        void test()
+        {
+            Set s;
+            base_class::test_int_with( s );
+
+            static int const nLimit = 10000;
+            typedef typename Set::iterator          set_iterator;
+            typedef typename Set::const_iterator    const_set_iterator;
+            typedef typename Set::gc::scoped_lock   rcu_lock;
+
+            int nCount = 0;
+            int nPrevKey = 0;
+
+            int arrRandom[nLimit];
+            for ( int i = 0; i < nLimit; ++i )
+                arrRandom[i] = i;
+            std::random_shuffle( arrRandom, arrRandom + nLimit );
+
+            // Test iterator - ascending order
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+
+            for ( int i = 0; i < nLimit; ++i ) {
+                CPPUNIT_ASSERT( s.insert(i) );
+            }
+            CPPUNIT_MSG( PrintStat()(s, "Iterator test, ascending insert order") );
+
+            nCount = 0;
+            nPrevKey = 0;
+            {
+                rcu_lock l;
+                for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                    CPPUNIT_ASSERT( s.find( it->nKey ));
+                    it->nVal = (*it).nKey * 2;
+                    ++nCount;
+                    if ( it != s.begin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            {
+                rcu_lock l;
+                for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                    ++nCount;
+                    if ( it != s.cbegin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            // Test iterator - descending order
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+
+            for ( int i = nLimit; i > 0; --i ) {
+                CPPUNIT_ASSERT( s.insert( std::make_pair(i - 1, (i-1) * 2) ));
+            }
+            CPPUNIT_MSG( PrintStat()(s, "Iterator test, descending insert order") );
+
+            nCount = 0;
+            nPrevKey = 0;
+            {
+                rcu_lock l;
+                for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                    CPPUNIT_ASSERT( s.find( it->nKey ));
+                    it->nVal = (*it).nKey;
+                    ++nCount;
+                    if ( it != s.begin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            {
+                rcu_lock l;
+                for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                    ++nCount;
+                    if ( it != s.cbegin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            // Test iterator - random order
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            {
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( s.insert( arrRandom[i] ) );
+                }
+                CPPUNIT_MSG( PrintStat()(s, "Iterator test, random insert order") );
+            }
+
+            nCount = 0;
+            nPrevKey = 0;
+            {
+                rcu_lock l;
+                for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey == it->nVal );
+                    CPPUNIT_ASSERT( s.find( it->nKey ));
+                    it->nVal = (*it).nKey * 2;
+                    ++nCount;
+                    if ( it != s.begin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            nCount = 0;
+            {
+                rcu_lock l;
+                for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
+                    CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
+                    ++nCount;
+                    if ( it != s.cbegin() ) {
+                        CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
+                    }
+                    nPrevKey = it->nKey;
+                }
+            }
+            CPPUNIT_ASSERT( nCount == nLimit );
+
+            // extract/get tests
+            {
+                typedef typename base_class::less<typename Set::value_type> less_predicate;
+                typename Set::value_type * pVal;
+                typename Set::exempt_ptr ep;
+
+                // extract/get
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrRandom[i];
+                    {
+                        rcu_lock l;
+                        pVal = s.get( nKey );
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->nKey == nKey );
+                        CPPUNIT_CHECK( pVal->nVal == nKey * 2 );
+                    }
+
+                    CPPUNIT_ASSERT( s.extract( ep, nKey ));
+                    CPPUNIT_ASSERT( !ep.empty() );
+                    CPPUNIT_CHECK( ep->nKey == nKey );
+                    CPPUNIT_CHECK( ep->nVal == nKey * 2 );
+                    ep.release();
+
+                    {
+                        rcu_lock l;
+                        CPPUNIT_CHECK( s.get( nKey ) == NULL );
+                    }
+                    CPPUNIT_CHECK( !s.extract( ep, nKey ));
+                }
+                CPPUNIT_CHECK( s.empty());
+
+                // extract_with/get_with
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    int nKey = arrRandom[i];
+                    {
+                        rcu_lock l;
+                        pVal = s.get_with( wrapped_item(nKey), wrapped_less() );
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->nKey == nKey );
+                        CPPUNIT_CHECK( pVal->nVal == nKey );
+                    }
+
+                    CPPUNIT_ASSERT( s.extract_with( ep, wrapped_item(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !ep.empty() );
+                    CPPUNIT_CHECK( ep->nKey == nKey );
+                    CPPUNIT_CHECK( ep->nVal == nKey );
+                    ep.release();
+
+                    {
+                        rcu_lock l;
+                        CPPUNIT_CHECK( s.get_with( wrapped_item(nKey), wrapped_less() ) == NULL );
+                    }
+                    CPPUNIT_CHECK( !s.extract_with( ep, wrapped_item(nKey), wrapped_less() ));
+                }
+                CPPUNIT_CHECK( s.empty());
+
+                // extract_min
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
+
+                for ( int i = 0; i < nLimit; ++i ) {
+                    CPPUNIT_ASSERT( s.extract_min(ep) );
+                    CPPUNIT_ASSERT( !ep.empty() );
+                    CPPUNIT_CHECK( ep->nKey == i );
+                    CPPUNIT_CHECK( ep->nVal == i );
+                    CPPUNIT_CHECK( !s.find(i) );
+                    ep.release();
+                }
+                CPPUNIT_CHECK( s.empty());
+
+                // extract_max
+                for ( int i = 0; i < nLimit; ++i )
+                    CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
+
+                for ( int i = nLimit-1; i >= 0; --i ) {
+                    CPPUNIT_ASSERT( s.extract_max(ep) );
+                    CPPUNIT_ASSERT( !ep.empty() );
+                    CPPUNIT_CHECK( ep->nKey == i );
+                    CPPUNIT_CHECK( ep->nVal == i );
+                    CPPUNIT_CHECK( !s.find(i) );
+                    ep.release();
+                }
+                CPPUNIT_CHECK( s.empty());
+                CPPUNIT_CHECK( !s.extract_min(ep) );
+                CPPUNIT_CHECK( !s.extract_max(ep) );
+            }
+
+            CPPUNIT_MSG( PrintStat()(s, NULL) );
+        }
+
+    public:
+        void SkipList_RCU_GPI_less();
+        void SkipList_RCU_GPI_cmp();
+        void SkipList_RCU_GPI_cmpless();
+        void SkipList_RCU_GPI_less_stat();
+        void SkipList_RCU_GPI_cmp_stat();
+        void SkipList_RCU_GPI_cmpless_stat();
+        void SkipList_RCU_GPI_xorshift_less();
+        void SkipList_RCU_GPI_xorshift_cmp();
+        void SkipList_RCU_GPI_xorshift_cmpless();
+        void SkipList_RCU_GPI_xorshift_less_stat();
+        void SkipList_RCU_GPI_xorshift_cmp_stat();
+        void SkipList_RCU_GPI_xorshift_cmpless_stat();
+        void SkipList_RCU_GPI_turbopas_less();
+        void SkipList_RCU_GPI_turbopas_cmp();
+        void SkipList_RCU_GPI_turbopas_cmpless();
+        void SkipList_RCU_GPI_turbopas_less_stat();
+        void SkipList_RCU_GPI_turbopas_cmp_stat();
+        void SkipList_RCU_GPI_turbopas_cmpless_stat();
+        void SkipList_RCU_GPI_michaelalloc_less();
+        void SkipList_RCU_GPI_michaelalloc_cmp();
+        void SkipList_RCU_GPI_michaelalloc_cmpless();
+        void SkipList_RCU_GPI_michaelalloc_less_stat();
+        void SkipList_RCU_GPI_michaelalloc_cmp_stat();
+        void SkipList_RCU_GPI_michaelalloc_cmpless_stat();
+
+        void SkipList_RCU_GPB_less();
+        void SkipList_RCU_GPB_cmp();
+        void SkipList_RCU_GPB_cmpless();
+        void SkipList_RCU_GPB_less_stat();
+        void SkipList_RCU_GPB_cmp_stat();
+        void SkipList_RCU_GPB_cmpless_stat();
+        void SkipList_RCU_GPB_xorshift_less();
+        void SkipList_RCU_GPB_xorshift_cmp();
+        void SkipList_RCU_GPB_xorshift_cmpless();
+        void SkipList_RCU_GPB_xorshift_less_stat();
+        void SkipList_RCU_GPB_xorshift_cmp_stat();
+        void SkipList_RCU_GPB_xorshift_cmpless_stat();
+        void SkipList_RCU_GPB_turbopas_less();
+        void SkipList_RCU_GPB_turbopas_cmp();
+        void SkipList_RCU_GPB_turbopas_cmpless();
+        void SkipList_RCU_GPB_turbopas_less_stat();
+        void SkipList_RCU_GPB_turbopas_cmp_stat();
+        void SkipList_RCU_GPB_turbopas_cmpless_stat();
+        void SkipList_RCU_GPB_michaelalloc_less();
+        void SkipList_RCU_GPB_michaelalloc_cmp();
+        void SkipList_RCU_GPB_michaelalloc_cmpless();
+        void SkipList_RCU_GPB_michaelalloc_less_stat();
+        void SkipList_RCU_GPB_michaelalloc_cmp_stat();
+        void SkipList_RCU_GPB_michaelalloc_cmpless_stat();
+
+        void SkipList_RCU_GPT_less();
+        void SkipList_RCU_GPT_cmp();
+        void SkipList_RCU_GPT_cmpless();
+        void SkipList_RCU_GPT_less_stat();
+        void SkipList_RCU_GPT_cmp_stat();
+        void SkipList_RCU_GPT_cmpless_stat();
+        void SkipList_RCU_GPT_xorshift_less();
+        void SkipList_RCU_GPT_xorshift_cmp();
+        void SkipList_RCU_GPT_xorshift_cmpless();
+        void SkipList_RCU_GPT_xorshift_less_stat();
+        void SkipList_RCU_GPT_xorshift_cmp_stat();
+        void SkipList_RCU_GPT_xorshift_cmpless_stat();
+        void SkipList_RCU_GPT_turbopas_less();
+        void SkipList_RCU_GPT_turbopas_cmp();
+        void SkipList_RCU_GPT_turbopas_cmpless();
+        void SkipList_RCU_GPT_turbopas_less_stat();
+        void SkipList_RCU_GPT_turbopas_cmp_stat();
+        void SkipList_RCU_GPT_turbopas_cmpless_stat();
+        void SkipList_RCU_GPT_michaelalloc_less();
+        void SkipList_RCU_GPT_michaelalloc_cmp();
+        void SkipList_RCU_GPT_michaelalloc_cmpless();
+        void SkipList_RCU_GPT_michaelalloc_less_stat();
+        void SkipList_RCU_GPT_michaelalloc_cmp_stat();
+        void SkipList_RCU_GPT_michaelalloc_cmpless_stat();
+
+        void SkipList_RCU_SHB_less();
+        void SkipList_RCU_SHB_cmp();
+        void SkipList_RCU_SHB_cmpless();
+        void SkipList_RCU_SHB_less_stat();
+        void SkipList_RCU_SHB_cmp_stat();
+        void SkipList_RCU_SHB_cmpless_stat();
+        void SkipList_RCU_SHB_xorshift_less();
+        void SkipList_RCU_SHB_xorshift_cmp();
+        void SkipList_RCU_SHB_xorshift_cmpless();
+        void SkipList_RCU_SHB_xorshift_less_stat();
+        void SkipList_RCU_SHB_xorshift_cmp_stat();
+        void SkipList_RCU_SHB_xorshift_cmpless_stat();
+        void SkipList_RCU_SHB_turbopas_less();
+        void SkipList_RCU_SHB_turbopas_cmp();
+        void SkipList_RCU_SHB_turbopas_cmpless();
+        void SkipList_RCU_SHB_turbopas_less_stat();
+        void SkipList_RCU_SHB_turbopas_cmp_stat();
+        void SkipList_RCU_SHB_turbopas_cmpless_stat();
+        void SkipList_RCU_SHB_michaelalloc_less();
+        void SkipList_RCU_SHB_michaelalloc_cmp();
+        void SkipList_RCU_SHB_michaelalloc_cmpless();
+        void SkipList_RCU_SHB_michaelalloc_less_stat();
+        void SkipList_RCU_SHB_michaelalloc_cmp_stat();
+        void SkipList_RCU_SHB_michaelalloc_cmpless_stat();
+
+        void SkipList_RCU_SHT_less();
+        void SkipList_RCU_SHT_cmp();
+        void SkipList_RCU_SHT_cmpless();
+        void SkipList_RCU_SHT_less_stat();
+        void SkipList_RCU_SHT_cmp_stat();
+        void SkipList_RCU_SHT_cmpless_stat();
+        void SkipList_RCU_SHT_xorshift_less();
+        void SkipList_RCU_SHT_xorshift_cmp();
+        void SkipList_RCU_SHT_xorshift_cmpless();
+        void SkipList_RCU_SHT_xorshift_less_stat();
+        void SkipList_RCU_SHT_xorshift_cmp_stat();
+        void SkipList_RCU_SHT_xorshift_cmpless_stat();
+        void SkipList_RCU_SHT_turbopas_less();
+        void SkipList_RCU_SHT_turbopas_cmp();
+        void SkipList_RCU_SHT_turbopas_cmpless();
+        void SkipList_RCU_SHT_turbopas_less_stat();
+        void SkipList_RCU_SHT_turbopas_cmp_stat();
+        void SkipList_RCU_SHT_turbopas_cmpless_stat();
+        void SkipList_RCU_SHT_michaelalloc_less();
+        void SkipList_RCU_SHT_michaelalloc_cmp();
+        void SkipList_RCU_SHT_michaelalloc_cmpless();
+        void SkipList_RCU_SHT_michaelalloc_less_stat();
+        void SkipList_RCU_SHT_michaelalloc_cmp_stat();
+        void SkipList_RCU_SHT_michaelalloc_cmpless_stat();
+
+        CPPUNIT_TEST_SUITE(SkipListSetRCUHdrTest)
+            CPPUNIT_TEST(SkipList_RCU_GPI_less)
+            CPPUNIT_TEST(SkipList_RCU_GPI_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPI_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPI_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_less)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_less)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_RCU_GPB_less)
+            CPPUNIT_TEST(SkipList_RCU_GPB_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPB_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPB_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_less)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_less)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_RCU_GPT_less)
+            CPPUNIT_TEST(SkipList_RCU_GPT_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPT_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPT_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_less)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_less)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_RCU_SHB_less)
+            CPPUNIT_TEST(SkipList_RCU_SHB_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHB_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHB_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_less)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_less)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmpless_stat)
+
+            CPPUNIT_TEST(SkipList_RCU_SHT_less)
+            CPPUNIT_TEST(SkipList_RCU_SHT_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHT_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHT_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_less)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_less)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmpless_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_less)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmp)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmpless)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_less_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmp_stat)
+            CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmpless_stat)
+
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+}
diff --git a/tests/test-hdr/set/hdr_skiplist_set_rcu_gpb.cpp b/tests/test-hdr/set/hdr_skiplist_set_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..fefafa9
--- /dev/null
@@ -0,0 +1,317 @@
+//$$CDS-header$$
+
+#include "set/hdr_skiplist_set_rcu.h"
+
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/skip_list_set_rcu.h>
+
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+            co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+            co::less< less<item > >
+            ,co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_xorshift_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_xorshift_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_xorshift_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_xorshift_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_turbopas_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_turbopas_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_turbopas_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_turbopas_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_michaelalloc_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_michaelalloc_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPB_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_skiplist_set_rcu_gpi.cpp b/tests/test-hdr/set/hdr_skiplist_set_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..a5ab6a6
--- /dev/null
@@ -0,0 +1,319 @@
+//$$CDS-header$$
+
+#include "set/hdr_skiplist_set_rcu.h"
+
+#include <cds/urcu/general_instant.h>
+#include <cds/container/skip_list_set_rcu.h>
+
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+            co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+            co::less< less<item > >
+            ,co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_xorshift_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_xorshift_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_xorshift_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_xorshift_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_turbopas_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_turbopas_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_turbopas_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_turbopas_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_michaelalloc_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_michaelalloc_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPI_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace set
+
+CPPUNIT_TEST_SUITE_REGISTRATION(set::SkipListSetRCUHdrTest);
diff --git a/tests/test-hdr/set/hdr_skiplist_set_rcu_gpt.cpp b/tests/test-hdr/set/hdr_skiplist_set_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..b6fb584
--- /dev/null
@@ -0,0 +1,317 @@
+//$$CDS-header$$
+
+#include "set/hdr_skiplist_set_rcu.h"
+
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/skip_list_set_rcu.h>
+
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+            co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+            co::less< less<item > >
+            ,co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_xorshift_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_xorshift_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_xorshift_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_xorshift_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_xorshift_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_xorshift_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_turbopas_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_turbopas_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_turbopas_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_turbopas_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_turbopas_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_turbopas_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_michaelalloc_less()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_michaelalloc_cmp()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_michaelalloc_cmpless()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_michaelalloc_less_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_michaelalloc_cmp_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_GPT_michaelalloc_cmpless_stat()
+    {
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+    }
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_skiplist_set_rcu_shb.cpp b/tests/test-hdr/set/hdr_skiplist_set_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..f59c7d6
--- /dev/null
@@ -0,0 +1,368 @@
+//$$CDS-header$$
+
+#include "set/hdr_skiplist_set_rcu.h"
+
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/skip_list_set_rcu.h>
+
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+    }
+#endif
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+            co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+            co::less< less<item > >
+            ,co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_xorshift_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_xorshift_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_xorshift_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_xorshift_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_xorshift_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_xorshift_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_turbopas_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_turbopas_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_turbopas_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_turbopas_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_turbopas_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_turbopas_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_michaelalloc_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_michaelalloc_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_michaelalloc_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_michaelalloc_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_michaelalloc_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHB_michaelalloc_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_skiplist_set_rcu_sht.cpp b/tests/test-hdr/set/hdr_skiplist_set_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..71fe170
--- /dev/null
@@ -0,0 +1,368 @@
+//$$CDS-header$$
+
+#include "set/hdr_skiplist_set_rcu.h"
+
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/skip_list_set_rcu.h>
+
+#include "unit/michael_alloc.h"
+#include "map/print_skiplist_stat.h"
+
+namespace set {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+    }
+#endif
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+            co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+            co::less< less<item > >
+            ,co::compare< cmp<item > >
+            ,co::item_counter< simple_item_counter >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_xorshift_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_xorshift_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_xorshift_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_xorshift_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_xorshift_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_xorshift_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_turbopas_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_turbopas_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_turbopas_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_turbopas_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_turbopas_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_turbopas_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_michaelalloc_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_michaelalloc_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_michaelalloc_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_michaelalloc_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_michaelalloc_cmp_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+    void SkipListSetRCUHdrTest::SkipList_RCU_SHT_michaelalloc_cmpless_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_type, item,
+            cc::skip_list::make_traits<
+                co::less< less<item > >
+                ,co::compare< cmp<item > >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > set;
+        test< set, misc::print_skiplist_stat<set::stat> >();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_splitlist_set_hp.cpp b/tests/test-hdr/set/hdr_splitlist_set_hp.cpp
new file mode 100644 (file)
index 0000000..67e8c49
--- /dev/null
@@ -0,0 +1,128 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/michael_list_hp.h>
+#include <cds/container/split_list_set.h>
+
+namespace set {
+
+    namespace {
+        struct HP_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct HP_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct HP_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_HP_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HP, item, HP_cmp_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HP, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_HP_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HP, item, HP_less_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HP, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_HP_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HP, item, HP_cmpmix_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HP, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_hrc.cpp b/tests/test-hdr/set/hdr_splitlist_set_hrc.cpp
new file mode 100644 (file)
index 0000000..35cfc15
--- /dev/null
@@ -0,0 +1,128 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/michael_list_hrc.h>
+#include <cds/container/split_list_set.h>
+
+namespace set {
+
+    namespace {
+        struct HRC_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct HRC_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct HRC_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_HRC_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item, HRC_cmp_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_HRC_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item, HRC_less_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_HRC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item, HRC_cmpmix_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_lazy_hp.cpp b/tests/test-hdr/set/hdr_splitlist_set_lazy_hp.cpp
new file mode 100644 (file)
index 0000000..dfad981
--- /dev/null
@@ -0,0 +1,128 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/lazy_list_hp.h>
+#include <cds/container/split_list_set.h>
+
+namespace set {
+
+    namespace {
+        struct HP_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct HP_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct HP_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_Lazy_HP_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HP, item, HP_cmp_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HP, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_HP_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HP, item, HP_less_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HP, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_HP_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HP, item, HP_cmpmix_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HP, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_lazy_hrc.cpp b/tests/test-hdr/set/hdr_splitlist_set_lazy_hrc.cpp
new file mode 100644 (file)
index 0000000..875fbff
--- /dev/null
@@ -0,0 +1,128 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/lazy_list_hrc.h>
+#include <cds/container/split_list_set.h>
+
+namespace set {
+
+    namespace {
+        struct HRC_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct HRC_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct HRC_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_Lazy_HRC_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item, HRC_cmp_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_HRC_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item, HRC_less_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_HRC_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item, HRC_cmpmix_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::HRC, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_lazy_nogc.cpp b/tests/test-hdr/set/hdr_splitlist_set_lazy_nogc.cpp
new file mode 100644 (file)
index 0000000..ce9fa49
--- /dev/null
@@ -0,0 +1,128 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/lazy_list_nogc.h>
+#include <cds/container/split_list_set_nogc.h>
+
+namespace set {
+
+    namespace {
+        struct nogc_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct nogc_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct nogc_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_Lazy_nogc_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item, nogc_cmp_traits > set;
+
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_nogc_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item, nogc_less_traits > set;
+
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_nogc_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item, nogc_cmpmix_traits > set;
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_lazy_ptb.cpp b/tests/test-hdr/set/hdr_splitlist_set_lazy_ptb.cpp
new file mode 100644 (file)
index 0000000..e765145
--- /dev/null
@@ -0,0 +1,128 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/lazy_list_ptb.h>
+#include <cds/container/split_list_set.h>
+
+namespace set {
+
+    namespace {
+        struct PTB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct PTB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct PTB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_Lazy_PTB_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item, PTB_cmp_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_PTB_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item, PTB_less_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_PTB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item, PTB_cmpmix_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpb.cpp b/tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..ed2c9f1
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/split_list_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        struct RCU_GPB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct RCU_GPB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct RCU_GPB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_GPB_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPB_cmp_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_GPB_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPB_less_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_GPB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPB_cmpmix_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpi.cpp b/tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..e365ae7
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/split_list_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        struct RCU_GPI_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct RCU_GPI_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct RCU_GPI_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_GPI_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPI_cmp_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_GPI_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPI_less_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_GPI_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPI_cmpmix_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpt.cpp b/tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..fd5a475
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/split_list_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+
+        struct RCU_GPT_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct RCU_GPT_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct RCU_GPT_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_GPT_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPT_cmp_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_GPT_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPT_less_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_GPT_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPT_cmpmix_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_shb.cpp b/tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..8b09aaa
--- /dev/null
@@ -0,0 +1,138 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/split_list_set_rcu.h>
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+
+        struct RCU_SHB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct RCU_SHB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct RCU_SHB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+#endif
+
+    void HashSetHdrTest::Split_Lazy_RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHB_cmp_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHB_less_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHB_cmpmix_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_sht.cpp b/tests/test-hdr/set/hdr_splitlist_set_lazy_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..f460a95
--- /dev/null
@@ -0,0 +1,136 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/lazy_list_rcu.h>
+#include <cds/container/split_list_set_rcu.h>
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+
+        struct RCU_SHT_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                   ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct RCU_SHT_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct RCU_SHT_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::lazy_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::lazy_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+#endif
+
+    void HashSetHdrTest::Split_Lazy_RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHT_cmp_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHT_less_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Split_Lazy_RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHT_cmpmix_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::lazy_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_splitlist_set_nogc.cpp b/tests/test-hdr/set/hdr_splitlist_set_nogc.cpp
new file mode 100644 (file)
index 0000000..c03b4a3
--- /dev/null
@@ -0,0 +1,128 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/michael_list_nogc.h>
+#include <cds/container/split_list_set_nogc.h>
+
+namespace set {
+
+    namespace {
+        struct nogc_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct nogc_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent                      memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct nogc_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_nogc_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item, nogc_cmp_traits > set;
+
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_nogc_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item, nogc_less_traits > set;
+
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_nogc_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item, nogc_cmpmix_traits > set;
+        test_int_nogc< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::nogc, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_nogc< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_ptb.cpp b/tests/test-hdr/set/hdr_splitlist_set_ptb.cpp
new file mode 100644 (file)
index 0000000..38e7f7a
--- /dev/null
@@ -0,0 +1,128 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/container/michael_list_ptb.h>
+#include <cds/container/split_list_set.h>
+
+namespace set {
+
+    namespace {
+        struct PTB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct PTB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent   memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct PTB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_PTB_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item, PTB_cmp_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_PTB_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item, PTB_less_traits > set;
+
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_PTB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item, PTB_cmpmix_traits > set;
+        test_int< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< cds::gc::PTB, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_rcu_gpb.cpp b/tests/test-hdr/set/hdr_splitlist_set_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..b3c646e
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/split_list_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        struct RCU_GPB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct RCU_GPB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent   memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct RCU_GPB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_RCU_GPB_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPB_cmp_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_RCU_GPB_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPB_less_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_RCU_GPB_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPB_cmpmix_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_rcu_gpi.cpp b/tests/test-hdr/set/hdr_splitlist_set_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..daa4e38
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/split_list_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        struct RCU_GPI_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct RCU_GPI_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent   memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct RCU_GPI_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_RCU_GPI_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPI_cmp_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_RCU_GPI_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPI_less_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_RCU_GPI_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPI_cmpmix_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_rcu_gpt.cpp b/tests/test-hdr/set/hdr_splitlist_set_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..4bb1c9f
--- /dev/null
@@ -0,0 +1,131 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/split_list_set_rcu.h>
+
+namespace set {
+
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+
+        struct RCU_GPT_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct RCU_GPT_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent   memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct RCU_GPT_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+
+    void HashSetHdrTest::Split_RCU_GPT_cmp()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPT_cmp_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_RCU_GPT_less()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPT_less_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+    void HashSetHdrTest::Split_RCU_GPT_cmpmix()
+    {
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_GPT_cmpmix_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+    }
+
+
+} // namespace set
+
+
diff --git a/tests/test-hdr/set/hdr_splitlist_set_rcu_shb.cpp b/tests/test-hdr/set/hdr_splitlist_set_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..13fa6ac
--- /dev/null
@@ -0,0 +1,136 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/split_list_set_rcu.h>
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+
+        struct RCU_SHB_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct RCU_SHB_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent   memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct RCU_SHB_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+#endif
+
+    void HashSetHdrTest::Split_RCU_SHB_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHB_cmp_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Split_RCU_SHB_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHB_less_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Split_RCU_SHB_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHB_cmpmix_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_splitlist_set_rcu_sht.cpp b/tests/test-hdr/set/hdr_splitlist_set_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..a8a43bc
--- /dev/null
@@ -0,0 +1,136 @@
+//$$CDS-header$$
+
+#include "set/hdr_set.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/split_list_set_rcu.h>
+
+namespace set {
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+
+        struct RCU_SHT_cmp_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::relaxed_ordering        memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+            };
+        };
+
+        struct RCU_SHT_less_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+            typedef cc::opt::v::sequential_consistent   memory_model;
+            enum { dynamic_bucket_table = false };
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+
+        struct RCU_SHT_cmpmix_traits: public cc::split_list::type_traits
+        {
+            typedef cc::michael_list_tag                ordered_list;
+            typedef HashSetHdrTest::hash_int            hash;
+            typedef HashSetHdrTest::simple_item_counter item_counter;
+
+            struct ordered_list_traits: public cc::michael_list::type_traits
+            {
+                typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
+                typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
+            };
+        };
+    }
+#endif
+
+    void HashSetHdrTest::Split_RCU_SHT_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHT_cmp_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
+                ,cc::split_list::dynamic_bucket_table< true >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Split_RCU_SHT_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHT_less_traits > set;
+
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+    void HashSetHdrTest::Split_RCU_SHT_cmpmix()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // traits-based version
+        typedef cc::SplitListSet< rcu_type, item, RCU_SHT_cmpmix_traits > set;
+        test_int_rcu< set >();
+
+        // option-based version
+        typedef cc::SplitListSet< rcu_type, item,
+            cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::opt::hash< hash_int >
+                ,cc::opt::item_counter< simple_item_counter >
+                ,cc::split_list::ordered_list_traits<
+                    cc::michael_list::make_traits<
+                        cc::opt::less< less<item> >
+                        ,cc::opt::compare< cmp<item> >
+                    >::type
+                >
+            >::type
+        > opt_set;
+        test_int_rcu< opt_set >();
+#endif
+    }
+
+} // namespace set
diff --git a/tests/test-hdr/set/hdr_striped_hashset_boost_flat_set.cpp b/tests/test-hdr/set/hdr_striped_hashset_boost_flat_set.cpp
new file mode 100644 (file)
index 0000000..eaaf0c7
--- /dev/null
@@ -0,0 +1,171 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Striped_boost_flat_set()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::flat_set you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_set/boost_flat_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        typedef boost::container::flat_set< StripedSetHdrTest::item, StripedSetHdrTest::less<StripedSetHdrTest::item> > set_t;
+
+        struct my_copy_policy {
+            typedef set_t::iterator iterator;
+
+            void operator()( set_t& set, iterator itWhat )
+            {
+                set.insert( *itWhat );
+            }
+        };
+    }
+
+    void StripedSetHdrTest::Striped_boost_flat_set()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+
+            set_less_resizing_lf s( 30, cc::striped_set::load_factor_resizing<0>( 1024 ) );
+            test_striped_with( s );
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+
+            set_less_resizing_sbt s( 30, cc::striped_set::single_bucket_size_threshold<0>( 1024 ) );
+            test_striped_with( s );
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_policy");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+
+    }
+
+}   // namespace set
+
+/*
+#else
+    namespace set {
+        void StripedSetHdrTest::Striped_boost_flat_set()
+        {
+            CPPUNIT_MESSAGE( "Skipped; boost::container::flat_set is not compatible with MS VC++ 11" );
+        }
+    }
+#endif
+*/
+
+#else // BOOST_VERSION < 104800
+
+namespace set {
+    void StripedSetHdrTest::Striped_boost_flat_set()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::flat_set you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/set/hdr_striped_hashset_boost_list.cpp b/tests/test-hdr/set/hdr_striped_hashset_boost_list.cpp
new file mode 100644 (file)
index 0000000..7952106
--- /dev/null
@@ -0,0 +1,153 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Striped_boost_list()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::list you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_set/boost_list.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef boost::container::list<StripedSetHdrTest::item> list_type;
+            typedef list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+        typedef boost::container::list<StripedSetHdrTest::item> sequence_t;
+    }
+
+    void StripedSetHdrTest::Striped_boost_list()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s( 30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt6;
+        test_striped2< set_less_resizing_sbt6 >();
+
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy policy");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace set
+
+#else // BOOST_VERSION < 104800
+
+namespace set {
+    void StripedSetHdrTest::Striped_boost_list()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::list you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/set/hdr_striped_hashset_boost_set.cpp b/tests/test-hdr/set/hdr_striped_hashset_boost_set.cpp
new file mode 100644 (file)
index 0000000..4006e35
--- /dev/null
@@ -0,0 +1,159 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Striped_boost_set()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::set you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_set/boost_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        typedef boost::container::set< StripedSetHdrTest::item, StripedSetHdrTest::less<StripedSetHdrTest::item> > set_t;
+
+        struct my_copy_policy {
+            typedef set_t::iterator iterator;
+
+            void operator()( set_t& set, iterator itWhat )
+            {
+                set.insert( *itWhat );
+            }
+        };
+    }
+
+    void StripedSetHdrTest::Striped_boost_set()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>( 1024 ));
+            test_striped_with( s );
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s( 30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace set
+
+#else // BOOST_VERSION < 104800
+
+namespace set {
+    void StripedSetHdrTest::Striped_boost_set()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::set you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/set/hdr_striped_hashset_boost_stable_vector.cpp b/tests/test-hdr/set/hdr_striped_hashset_boost_stable_vector.cpp
new file mode 100644 (file)
index 0000000..b1e9bc6
--- /dev/null
@@ -0,0 +1,156 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+
+#include <boost/version.hpp>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Striped_boost_stable_vector()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::stable_vector you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/details/defs.h>
+
+#include <cds/container/striped_set/boost_stable_vector.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef boost::container::stable_vector<StripedSetHdrTest::item> vector_type;
+            typedef vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, *itWhat );
+            }
+        };
+
+        typedef boost::container::stable_vector<StripedSetHdrTest::item> sequence_t;
+    }
+
+    void StripedSetHdrTest::Striped_boost_stable_vector()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s( 30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt6;
+        test_striped2< set_less_resizing_sbt6 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+}   // namespace set
+
+#else // BOOST_VERSION < 104800
+
+namespace set {
+    void StripedSetHdrTest::Striped_boost_stable_vector()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::stable_vector you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/set/hdr_striped_hashset_boost_unordered_set.cpp b/tests/test-hdr/set/hdr_striped_hashset_boost_unordered_set.cpp
new file mode 100644 (file)
index 0000000..cad515b
--- /dev/null
@@ -0,0 +1,145 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/boost_unordered_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct equal_item
+        {
+            template <typename T>
+            bool operator ()( T const& i1, T const& i2) const
+            {
+                return i1.key() == i2.key();
+            }
+        };
+
+        typedef boost::unordered_set< StripedSetHdrTest::item, StripedSetHdrTest::hash_int, equal_item > set_t;
+
+        struct my_copy_policy {
+            typedef set_t::iterator iterator;
+
+            void operator()( set_t& set, iterator itWhat )
+            {
+                set.insert( std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+    }
+
+    void StripedSetHdrTest::Striped_boost_unordered_set()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>( 1024 ));
+            test_striped_with( s );
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s( 30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_striped_hashset_boost_vector.cpp b/tests/test-hdr/set/hdr_striped_hashset_boost_vector.cpp
new file mode 100644 (file)
index 0000000..ef0b9f9
--- /dev/null
@@ -0,0 +1,156 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Striped_boost_vector()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::vector you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_set/boost_vector.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef boost::container::vector<StripedSetHdrTest::item> vector_type;
+            typedef vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, *itWhat );
+            }
+        };
+
+        typedef boost::container::vector<StripedSetHdrTest::item> sequence_t;
+    }
+
+    void StripedSetHdrTest::Striped_boost_vector()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s( 30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt6;
+        test_striped2< set_less_resizing_sbt6 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace set
+
+#else // BOOST_VERSION < 104800
+
+namespace set {
+    void StripedSetHdrTest::Striped_boost_vector()
+    {
+        CPPUNIT_MESSAGE( "Skipped; for boost::container::vector you should use boost version 1.48 or above" );
+    }
+}
+#endif  // BOOST_VERSION
diff --git a/tests/test-hdr/set/hdr_striped_hashset_hashset_std.cpp b/tests/test-hdr/set/hdr_striped_hashset_hashset_std.cpp
new file mode 100644 (file)
index 0000000..feb7b25
--- /dev/null
@@ -0,0 +1,149 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/std_hash_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+#if !((CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600)
+
+namespace set {
+
+    namespace {
+        struct equal_item
+        {
+            template <typename T>
+            bool operator ()( T const& i1, T const& i2) const
+            {
+                return i1.key() == i2.key();
+            }
+        };
+
+        typedef std::unordered_set< StripedSetHdrTest::item, StripedSetHdrTest::hash_int, equal_item > set_t;
+
+        struct my_copy_policy {
+            typedef set_t::iterator iterator;
+
+            void operator()( set_t& set, iterator itWhat )
+            {
+                set.insert( std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+    }
+
+    void StripedSetHdrTest::Striped_hashset()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>( 1024 ));
+            test_striped_with( s );
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s( 30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+
+    }
+
+}   // namespace set
+#endif // #if !(CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION < 1600)
diff --git a/tests/test-hdr/set/hdr_striped_hashset_hashset_vc.cpp b/tests/test-hdr/set/hdr_striped_hashset_hashset_vc.cpp
new file mode 100644 (file)
index 0000000..dbe78e9
--- /dev/null
@@ -0,0 +1,149 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/std_hash_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600
+
+namespace stdext {
+    inline size_t hash_value(set::StripedSetHdrTest::item const& _Keyval)
+    {
+        return set::StripedSetHdrTest::hash_int()( _Keyval );
+    }
+}
+
+namespace set {
+
+    namespace {
+        typedef stdext::hash_compare<StripedSetHdrTest::item, StripedSetHdrTest::less<StripedSetHdrTest::item> >    hash_set_t;
+
+        struct my_copy_policy {
+            typedef stdext::hash_set< StripedSetHdrTest::item, hash_set_t > set_type;
+            typedef set_type::iterator iterator;
+
+            void operator()( set_type& set, iterator itWhat )
+            {
+                set.insert( std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+
+        typedef stdext::hash_set<StripedSetHdrTest::item, hash_set_t > set_t;
+    }
+
+    void StripedSetHdrTest::Striped_hashset()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>( 1024 ));
+            test_striped_with( s );
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s( 30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace set
+#endif // #if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION < 1600
diff --git a/tests/test-hdr/set/hdr_striped_hashset_list.cpp b/tests/test-hdr/set/hdr_striped_hashset_list.cpp
new file mode 100644 (file)
index 0000000..432b551
--- /dev/null
@@ -0,0 +1,134 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/std_list.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef std::list<StripedSetHdrTest::item> list_type;
+            typedef list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert( itInsert, std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+
+        typedef std::list<StripedSetHdrTest::item> sequence_t;
+    }
+
+    void StripedSetHdrTest::Striped_list()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s( 30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt6;
+        test_striped2< set_less_resizing_sbt6 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_striped_hashset_set.cpp b/tests/test-hdr/set/hdr_striped_hashset_set.cpp
new file mode 100644 (file)
index 0000000..5a58a39
--- /dev/null
@@ -0,0 +1,137 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/std_set.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef std::set<StripedSetHdrTest::item, StripedSetHdrTest::less<StripedSetHdrTest::item> > set_type;
+            typedef set_type::iterator iterator;
+
+            void operator()( set_type& set, iterator itWhat )
+            {
+                set.insert( std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+
+        typedef std::set<StripedSetHdrTest::item, StripedSetHdrTest::less<StripedSetHdrTest::item> > set_t;
+    }
+
+    void StripedSetHdrTest::Striped_set()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmp;
+        test_striped< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_less;
+        test_striped< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmpmix;
+        test_striped< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(1024)");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s(30, cc::striped_set::load_factor_resizing<0>( 1024 ));
+            test_striped_with( s );
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+        >   set_less_resizing_lf16;
+        test_striped< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(1024");
+        {
+            typedef cc::StripedSet< set_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s( 30, cc::striped_set::single_bucket_size_threshold<0>(1024));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<256>");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<256> >
+        >   set_less_resizing_sbt16;
+        test_striped< set_less_resizing_sbt16 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, copy_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, swap_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, move_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped< set_move_item >();
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<256>, special copy_item");
+        typedef cc::StripedSet< set_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<256> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped< set_special_copy_item >();
+    }
+
+}   // namespace set
diff --git a/tests/test-hdr/set/hdr_striped_hashset_slist.cpp b/tests/test-hdr/set/hdr_striped_hashset_slist.cpp
new file mode 100644 (file)
index 0000000..68637a3
--- /dev/null
@@ -0,0 +1,158 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <boost/version.hpp>
+#include <cds/details/defs.h>
+#if CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION == CDS_COMPILER_MSVC12 && BOOST_VERSION <= 105500
+namespace set {
+    void StripedSetHdrTest::Striped_slist()
+    {
+        CPPUNIT_MESSAGE("Skipped; for Microsoft Visual C++ 2013 and boost::container::slist you should use boost version 1.56 or above");
+    }
+}
+
+#elif BOOST_VERSION >= 104800
+
+#include <cds/container/striped_set/boost_slist.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef boost::container::slist<StripedSetHdrTest::item> list_type;
+            typedef list_type::iterator iterator;
+
+            void operator()( list_type& list, iterator itInsert, iterator itWhat )
+            {
+                list.insert_after( itInsert, StripedSetHdrTest::item(std::make_pair(itWhat->key(), itWhat->val())) );
+            }
+        };
+
+        typedef boost::container::slist<StripedSetHdrTest::item> sequence_t;
+    }
+
+    void StripedSetHdrTest::Striped_slist()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s( 30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt6;
+        test_striped2< set_less_resizing_sbt6 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace set
+
+
+#else
+
+namespace set {
+    void StripedSetHdrTest::Striped_slist()
+    {
+        CPPUNIT_MESSAGE("Skipped; for boost::container::slist you should use boost version 1.48 or above");
+    }
+} // namespace set
+
+#endif // BOOST_VERSION
+
diff --git a/tests/test-hdr/set/hdr_striped_hashset_vector.cpp b/tests/test-hdr/set/hdr_striped_hashset_vector.cpp
new file mode 100644 (file)
index 0000000..4fda502
--- /dev/null
@@ -0,0 +1,135 @@
+//$$CDS-header$$
+
+#include "set/hdr_striped_set.h"
+#include <cds/container/striped_set/std_vector.h>
+#include <cds/container/striped_set.h>
+#include <cds/lock/spinlock.h>
+
+namespace set {
+
+    namespace {
+        struct my_copy_policy {
+            typedef std::vector<StripedSetHdrTest::item> vector_type;
+            typedef vector_type::iterator iterator;
+
+            void operator()( vector_type& vec, iterator itInsert, iterator itWhat )
+            {
+                vec.insert( itInsert, std::make_pair(itWhat->key(), itWhat->val()) );
+            }
+        };
+
+        typedef std::vector<StripedSetHdrTest::item> sequence_t;
+    }
+
+    void StripedSetHdrTest::Striped_vector()
+    {
+        CPPUNIT_MESSAGE( "cmp");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+        >   set_cmp;
+        test_striped2< set_cmp >();
+
+        CPPUNIT_MESSAGE( "less");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+            , co::less< less<item> >
+        >   set_less;
+        test_striped2< set_less >();
+
+        CPPUNIT_MESSAGE( "cmpmix");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            ,co::mutex_policy< cc::striped_set::striping<> >
+            , co::less< less<item> >
+        >   set_cmpmix;
+        test_striped2< set_cmpmix >();
+
+        // Spinlock as lock policy
+        CPPUNIT_MESSAGE( "spinlock");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            ,co::mutex_policy< cc::striped_set::striping< cds::lock::Spin > >
+        >   set_spin;
+        test_striped2< set_spin >();
+
+        // Resizing policy
+        CPPUNIT_MESSAGE( "load_factor_resizing<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::load_factor_resizing<0> >
+            >   set_less_resizing_lf;
+            set_less_resizing_lf s( 30, cc::striped_set::load_factor_resizing<0>(8));
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "load_factor_resizing<4>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::load_factor_resizing<4> >
+        >   set_less_resizing_lf16;
+        test_striped2< set_less_resizing_lf16 >();
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<0>(8)");
+        {
+            typedef cc::StripedSet< sequence_t
+                , co::hash< hash_int >
+                , co::less< less<item> >
+                , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<0> >
+            >   set_less_resizing_sbt;
+            set_less_resizing_sbt s(30, cc::striped_set::single_bucket_size_threshold<0>(8) );
+            test_striped_with(s);
+        }
+
+        CPPUNIT_MESSAGE( "single_bucket_size_threshold<6>");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::less< less<item> >
+            , co::resizing_policy< cc::striped_set::single_bucket_size_threshold<6> >
+        >   set_less_resizing_sbt6;
+        test_striped2< set_less_resizing_sbt6 >();
+
+        // Copy policy
+        CPPUNIT_MESSAGE( "copy_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::copy_item >
+        >   set_copy_item;
+        test_striped2< set_copy_item >();
+
+        CPPUNIT_MESSAGE( "swap_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::swap_item >
+        >   set_swap_item;
+        test_striped2< set_swap_item >();
+
+        CPPUNIT_MESSAGE( "move_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< cc::striped_set::move_item >
+        >   set_move_item;
+        test_striped2< set_move_item >();
+
+        CPPUNIT_MESSAGE( "special copy_item");
+        typedef cc::StripedSet< sequence_t
+            , co::hash< hash_int >
+            , co::compare< cmp<item> >
+            , co::copy_policy< my_copy_policy >
+        >   set_special_copy_item;
+        test_striped2< set_special_copy_item >();
+    }
+
+}   // namespace set
+
+CPPUNIT_TEST_SUITE_REGISTRATION(set::StripedSetHdrTest);
diff --git a/tests/test-hdr/set/hdr_striped_set.h b/tests/test-hdr/set/hdr_striped_set.h
new file mode 100644 (file)
index 0000000..5abb542
--- /dev/null
@@ -0,0 +1,770 @@
+//$$CDS-header$$
+
+#ifndef __CDSTEST_HDR_STRIPED_SET_H
+#define __CDSTEST_HDR_STRIPED_SET_H
+
+#include "cppunit/cppunit_proxy.h"
+#include "size_check.h"
+
+#include <cds/opt/hash.h>
+#include <cds/os/timer.h>
+#include <cds/ref.h>
+#include <algorithm>    // random_shuffle
+
+// forward namespace declaration
+namespace cds {
+    namespace container {}
+    namespace opt {}
+}
+
+namespace set {
+    using misc::check_size;
+
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+
+    class StripedSetHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        struct stat
+        {
+            unsigned int nFindCount     ;   // count of find-functor calling
+            unsigned int nEnsureNewCount;
+            unsigned int nEnsureCount;
+
+            stat()
+            {
+                memset( this, 0, sizeof(*this));
+            }
+
+            void copy( stat const& s )
+            {
+                nFindCount = s.nFindCount;
+                nEnsureCount = s.nEnsureCount;
+                nEnsureNewCount = s.nEnsureNewCount;
+            }
+        };
+
+        struct item: public stat
+        {
+            int nKey;
+            int nVal;
+
+            item()
+            {}
+
+            item( int key )
+                : nKey( key )
+                , nVal( key )
+            {}
+
+            item (int key, int val )
+                : nKey(key)
+                , nVal( val )
+            {}
+
+            item( std::pair<int,int> const& p )
+                : nKey( p.first )
+                , nVal( p.second )
+            {}
+
+            item( item const& i )
+                : nKey( i.nKey )
+                , nVal( i.nVal )
+            {}
+
+            item& operator=(item const& i)
+            {
+                nKey = i.nKey;
+                nVal = i.nVal;
+                stat::copy(i);
+
+                return *this;
+            }
+
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            item( item&& i )
+                : nKey( i.nKey )
+                , nVal( i.nVal )
+            {}
+
+            //item& operator=(item&& i)
+            //{
+            //    nKey = i.nKey;
+            //    nVal = i.nVal;
+            //    return *this;
+            //}
+#endif
+
+            int key() const
+            {
+                return nKey;
+            }
+
+            int val() const
+            {
+                return nVal;
+            }
+        };
+
+        struct hash_int {
+            size_t operator()( int i ) const
+            {
+                return co::v::hash<int>()( i );
+            }
+
+            size_t operator()( std::pair<int,int> const& i ) const
+            {
+                return co::v::hash<int>()( i.first );
+            }
+
+            template <typename Item>
+            size_t operator()( Item const& i ) const
+            {
+                return (*this)( i.key() );
+            }
+        };
+
+        struct simple_item_counter {
+            size_t  m_nCount;
+
+            simple_item_counter()
+                : m_nCount(0)
+            {}
+
+            size_t operator ++()
+            {
+                return ++m_nCount;
+            }
+
+            size_t operator --()
+            {
+                return --m_nCount;
+            }
+
+            void reset()
+            {
+                m_nCount = 0;
+            }
+
+            operator size_t() const
+            {
+                return m_nCount;
+            }
+        };
+
+        template <typename T>
+        struct less
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() < v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() < v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 < v2.key();
+            }
+
+            bool operator ()( std::pair<int, int> const& v1, const T& v2 ) const
+            {
+                return v1.first < v2.key();
+            }
+
+            bool operator ()(const T& v1, std::pair<int, int> const& v2 ) const
+            {
+                return v1.key() < v2.first;
+            }
+        };
+
+        template <typename T>
+        struct cmp {
+            int operator ()(const T& v1, const T& v2 ) const
+            {
+                if ( v1.key() < v2.key() )
+                    return -1;
+                return v1.key() > v2.key() ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const T& v1, const Q& v2 ) const
+            {
+                if ( v1.key() < v2 )
+                    return -1;
+                return v1.key() > v2 ? 1 : 0;
+            }
+
+            template <typename Q>
+            int operator ()(const Q& v1, const T& v2 ) const
+            {
+                if ( v1 < v2.key() )
+                    return -1;
+                return v1 > v2.key() ? 1 : 0;
+            }
+
+            int operator()( std::pair<int,int> const& v1, T const& v2 ) const
+            {
+                if ( v1.first < v2.key() )
+                    return -1;
+                return v1.first > v2.key() ? 1 : 0;
+            }
+
+            int operator()( T const& v1, std::pair<int,int> const& v2 ) const
+            {
+                if ( v1.key() < v2.first )
+                    return -1;
+                return v1.key() > v2.first ? 1 : 0;
+            }
+        };
+
+        template <typename T>
+        struct equal
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() == v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() == v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 == v2.key();
+            }
+
+            bool operator ()( std::pair<int, int> const& v1, const T& v2 ) const
+            {
+                return v1.first == v2.key();
+            }
+
+            bool operator ()(const T& v1, std::pair<int, int> const& v2 ) const
+            {
+                return v1.key() == v2.first;
+            }
+        };
+
+        struct find_functor
+        {
+            template <typename Item, typename T>
+            void operator()( Item& i, T& val )
+            {
+                ++i.nFindCount;
+            }
+            template <typename Item, typename T>
+            void operator()( Item& i, T const& val )
+            {
+                ++i.nFindCount;
+            }
+        };
+
+        template <typename Item>
+        struct copy_found
+        {
+            Item    m_found;
+
+            template <typename T>
+            void operator()( Item& i, T& /*val*/ )
+            {
+                m_found = i;
+            }
+
+            void operator()( Item const& i )
+            {
+                m_found = i;
+            }
+        };
+
+        struct insert_functor
+        {
+            template <typename Item>
+            void operator()(Item& i )
+            {
+                i.nVal = i.nKey * 100;
+            }
+        };
+
+        template <typename Item, typename Q>
+        static void ensure_func( bool bNew, Item& i, Q& /*val*/ )
+        {
+            if ( bNew )
+                ++i.nEnsureNewCount;
+            else
+                ++i.nEnsureCount;
+        }
+
+        struct ensure_functor
+        {
+            template <typename Item, typename Q>
+            void operator()( bool bNew, Item& i, Q& val )
+            {
+                ensure_func( bNew, i, val );
+            }
+        };
+
+    public:
+        template <class Set>
+        void test_striped()
+        {
+            Set s( 30 );
+            CPPUNIT_ASSERT( s.bucket_count() == 32 );
+            CPPUNIT_ASSERT( s.lock_count() == 32 );
+
+            test_striped_with( s );
+        }
+
+        template <class Set>
+        void test_striped_with( Set& s )
+        {
+            cds::OS::Timer    timer;
+
+            test_int_with( s );
+
+            // Resizing test
+            for ( int i = 0; i < 10000; i++ ) {
+                s.insert( i );
+            }
+
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+        }
+
+        template <class Set>
+        void test_int_with( Set& s)
+        {
+            typedef typename Set::value_type    value_type;
+
+            item itm;
+            int key;
+
+            // insert/find test
+            CPPUNIT_ASSERT( !s.find( 10 ) );
+            CPPUNIT_ASSERT( s.insert( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( s.find( 10 ) );
+
+            CPPUNIT_ASSERT( !s.insert( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            CPPUNIT_ASSERT( !s.find( 20 ) );
+            CPPUNIT_ASSERT( s.insert( std::make_pair(20, 25) ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( s.find( 10 ) );
+            CPPUNIT_ASSERT( s.find( key = 20 ) );
+            CPPUNIT_ASSERT( s.find( key, find_functor() ) );
+            {
+                copy_found<item> f;
+                key = 20;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+                CPPUNIT_ASSERT( f.m_found.nFindCount == 1 );
+            }
+            {
+                copy_found<item> f;
+                key = 20;
+                CPPUNIT_ASSERT( s.find( key, find_functor() ) );
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+                CPPUNIT_ASSERT( f.m_found.nFindCount == 2 );
+            }
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( !s.find( 25 ) );
+            CPPUNIT_ASSERT( s.insert( std::make_pair(25, -1), insert_functor() ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            {
+                copy_found<item> f;
+                key = 25;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 25 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 2500 );
+            }
+
+            // ensure test
+            key = 10;
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 10 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 10 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 0 );
+            }
+            std::pair<bool, bool> ensureResult = s.ensure( key, ensure_functor() );
+            CPPUNIT_ASSERT( ensureResult.first && !ensureResult.second );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 10 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 10 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 1 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 0 );
+            }
+
+            ensureResult = s.ensure( std::make_pair(13, 1300), ensure_functor() );
+            CPPUNIT_ASSERT( ensureResult.first && ensureResult.second );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 4 ));
+            {
+                copy_found<item> f;
+                key = 13;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 13 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 1300 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 1 );
+            }
+
+            // erase test
+            CPPUNIT_ASSERT( s.erase(13) );
+            CPPUNIT_ASSERT( !s.find( 13 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            CPPUNIT_ASSERT( !s.erase(13) );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find( 10 ));
+            CPPUNIT_ASSERT( s.erase( 10 ));
+            CPPUNIT_ASSERT( !s.find( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.erase(10) );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( s.find(20) );
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.erase( 20, boost::ref(f) ));
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+
+                CPPUNIT_ASSERT( s.insert(235))
+                    CPPUNIT_ASSERT( s.erase( 235, boost::ref(f) ));
+                CPPUNIT_ASSERT( f.m_found.nKey == 235 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 235 );
+            }
+            CPPUNIT_ASSERT( !s.find( 20 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            CPPUNIT_ASSERT( s.emplace( 151 )) ;  // key = 151,  val = 151
+            CPPUNIT_ASSERT( s.emplace( 174, 471 )) ;    // key = 174, val = 471
+            CPPUNIT_ASSERT( s.emplace( std::make_pair( 190, 91 ) )) ; // key == 190, val = 91
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find(151));
+            CPPUNIT_ASSERT( s.find(174));
+            CPPUNIT_ASSERT( s.find(190));
+
+            {
+                copy_found<item> f;
+                key = 151;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 151 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 151 );
+
+                key = 174;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 174 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 471 );
+
+                key = 190;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 190 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 91 );
+            }
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+#       endif
+        }
+
+        //*******************************************
+        // If erase_with && find_with are supported
+#ifndef CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+        template <class Set>
+        void test_striped2()
+        {
+            test_striped<Set>();
+        }
+#else
+        template <class Set>
+        void test_striped2()
+        {
+            Set s( 30 );
+            CPPUNIT_ASSERT( s.bucket_count() == 32 );
+            CPPUNIT_ASSERT( s.lock_count() == 32 );
+
+            test_striped_with2( s );
+        }
+
+        template <class Set>
+        void test_striped_with2( Set& s )
+        {
+            cds::OS::Timer    timer;
+
+            test_int_with2( s );
+
+            // Resizing test
+            for ( int i = 0; i < 10000; i++ ) {
+                s.insert( i );
+            }
+
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+        }
+
+        template <class Set>
+        void test_int_with2( Set& s)
+        {
+            typedef typename Set::value_type    value_type;
+
+            item itm;
+            int key;
+
+            // insert/find test
+            CPPUNIT_ASSERT( !s.find( 10 ) );
+            CPPUNIT_ASSERT( s.insert( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( s.find( 10 ) );
+
+            CPPUNIT_ASSERT( !s.insert( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            CPPUNIT_ASSERT( !s.find_with( 20, less<value_type>() ) );
+            CPPUNIT_ASSERT( s.insert( std::make_pair(20, 25) ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( s.find( 10 ) );
+            CPPUNIT_ASSERT( s.find_with( key = 20, less<value_type>() ) );
+            CPPUNIT_ASSERT( s.find_with( key, less<value_type>(), find_functor() ) );
+            {
+                copy_found<item> f;
+                key = 20;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+                CPPUNIT_ASSERT( f.m_found.nFindCount == 1 );
+            }
+            {
+                copy_found<item> f;
+                key = 20;
+                CPPUNIT_ASSERT( s.find_with( 20, less<value_type>(), find_functor() ) );
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+                CPPUNIT_ASSERT( f.m_found.nFindCount == 2 );
+            }
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( !s.find( 25 ) );
+            CPPUNIT_ASSERT( s.insert( std::make_pair(25, -1), insert_functor() ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            {
+                copy_found<item> f;
+                key = 25;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 25 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 2500 );
+            }
+
+            // ensure test
+            key = 10;
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 10 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 10 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 0 );
+            }
+            std::pair<bool, bool> ensureResult = s.ensure( key, ensure_functor() );
+            CPPUNIT_ASSERT( ensureResult.first && !ensureResult.second );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 10 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 10 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 1 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 0 );
+            }
+
+            ensureResult = s.ensure( std::make_pair(13, 1300), ensure_functor() );
+            CPPUNIT_ASSERT( ensureResult.first && ensureResult.second );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 4 ));
+            {
+                copy_found<item> f;
+                key = 13;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 13 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 1300 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureCount == 0 );
+                CPPUNIT_ASSERT( f.m_found.nEnsureNewCount == 1 );
+            }
+
+            // erase test
+            CPPUNIT_ASSERT( s.erase(13) );
+            CPPUNIT_ASSERT( !s.find( 13 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            CPPUNIT_ASSERT( !s.erase(13) );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find( 10 ));
+            CPPUNIT_ASSERT( s.erase_with( 10, less<value_type>() ));
+            CPPUNIT_ASSERT( !s.find( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.erase_with( 10, less<value_type>() ) );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( s.find(20) );
+            {
+                copy_found<item> f;
+                CPPUNIT_ASSERT( s.erase( 20, boost::ref(f) ));
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+
+                CPPUNIT_ASSERT( s.insert(235))
+                CPPUNIT_ASSERT( s.erase_with( 235, less<value_type>(), boost::ref(f) ));
+                CPPUNIT_ASSERT( f.m_found.nKey == 235 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 235 );
+            }
+            CPPUNIT_ASSERT( !s.find( 20 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            CPPUNIT_ASSERT( s.emplace( 151 )) ;  // key = 151,  val = 151
+            CPPUNIT_ASSERT( s.emplace( 174, 471 )) ;    // key = 174, val = 471
+            CPPUNIT_ASSERT( s.emplace( std::make_pair( 190, 91 ) )) ; // key == 190, val = 91
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find(151));
+            CPPUNIT_ASSERT( s.find(174));
+            CPPUNIT_ASSERT( s.find(190));
+
+            {
+                copy_found<item> f;
+                key = 151;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 151 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 151 );
+
+                key = 174;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 174 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 471 );
+
+                key = 190;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 190 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 91 );
+            }
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+#       endif
+        }
+#endif // CDS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS_SUPPORT
+
+        void Striped_list();
+        void Striped_vector();
+        void Striped_set();
+        void Striped_hashset();
+        void Striped_slist();
+        void Striped_boost_list();
+        void Striped_boost_vector();
+        void Striped_boost_stable_vector();
+        void Striped_boost_flat_set();
+        void Striped_boost_set();
+        void Striped_boost_unordered_set();
+
+        void Refinable_list();
+        void Refinable_vector();
+        void Refinable_set();
+        void Refinable_hashset();
+        void Refinable_slist();
+        void Refinable_boost_list();
+        void Refinable_boost_vector();
+        void Refinable_boost_stable_vector();
+        void Refinable_boost_flat_set();
+        void Refinable_boost_set();
+        void Refinable_boost_unordered_set();
+
+        CPPUNIT_TEST_SUITE(StripedSetHdrTest)
+            CPPUNIT_TEST(Striped_list)
+            CPPUNIT_TEST(Striped_vector)
+            CPPUNIT_TEST(Striped_set)
+            CPPUNIT_TEST(Striped_hashset)
+            CPPUNIT_TEST(Striped_slist)
+            CPPUNIT_TEST(Striped_boost_list)
+            CPPUNIT_TEST(Striped_boost_vector)
+            CPPUNIT_TEST(Striped_boost_stable_vector)
+            CPPUNIT_TEST(Striped_boost_flat_set)
+            CPPUNIT_TEST(Striped_boost_set)
+            CPPUNIT_TEST(Striped_boost_unordered_set)
+
+            CPPUNIT_TEST(Refinable_list)
+            CPPUNIT_TEST(Refinable_vector)
+            CPPUNIT_TEST(Refinable_set)
+            CPPUNIT_TEST(Refinable_hashset)
+            CPPUNIT_TEST(Refinable_slist)
+            CPPUNIT_TEST(Refinable_boost_list)
+            CPPUNIT_TEST(Refinable_boost_vector)
+            CPPUNIT_TEST(Refinable_boost_stable_vector)
+            CPPUNIT_TEST(Refinable_boost_flat_set)
+            CPPUNIT_TEST(Refinable_boost_set)
+            CPPUNIT_TEST(Refinable_boost_unordered_set)
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+} // namespace set
+
+#endif // #ifndef __CDSTEST_HDR_STRIPED_SET_H
diff --git a/tests/test-hdr/set/intrusive_cuckoo_set_common.h b/tests/test-hdr/set/intrusive_cuckoo_set_common.h
new file mode 100644 (file)
index 0000000..967f2ff
--- /dev/null
@@ -0,0 +1,51 @@
+//$$CDS-header$$
+
+namespace set {
+    namespace {
+
+        typedef IntrusiveCuckooSetHdrTest::hash_int    hash1;
+        struct hash2: private hash1
+        {
+            typedef hash1 base_class;
+
+            size_t operator()( int i ) const
+            {
+                size_t h = ~( base_class::operator()(i));
+                return ~h + 0x9e3779b9 + (h << 6) + (h >> 2);
+            }
+            template <typename Item>
+            size_t operator()( const Item& i ) const
+            {
+                size_t h = ~( base_class::operator()(i));
+                return ~h + 0x9e3779b9 + (h << 6) + (h >> 2);
+            }
+            size_t operator()( IntrusiveCuckooSetHdrTest::find_key const& i) const
+            {
+                size_t h = ~( base_class::operator()(i));
+                return ~h + 0x9e3779b9 + (h << 6) + (h >> 2);
+            }
+        };
+
+        template <typename T>
+        struct equal_to
+        {
+            bool operator ()(const T& v1, const T& v2 ) const
+            {
+                return v1.key() == v2.key();
+            }
+
+            template <typename Q>
+            bool operator ()(const T& v1, const Q& v2 ) const
+            {
+                return v1.key() == v2;
+            }
+
+            template <typename Q>
+            bool operator ()(const Q& v1, const T& v2 ) const
+            {
+                return v1 == v2.key();
+            }
+        };
+
+    }
+} // namespace set
diff --git a/tests/test-hdr/size_check.h b/tests/test-hdr/size_check.h
new file mode 100644 (file)
index 0000000..912b2d4
--- /dev/null
@@ -0,0 +1,36 @@
+//$$CDS-header$$
+
+#ifndef __CDSTEST_SIZE_CHECK_H
+#define __CDSTEST_SIZE_CHECK_H
+
+#include <cds/cxx11_atomic.h>
+
+namespace misc {
+
+    template <typename ItemCounter>
+    struct size_checker {
+        template <typename Container>
+        bool operator()( Container const& c, size_t nSize ) const
+        {
+            return c.size() == nSize;
+        }
+    };
+
+    template<>
+    struct size_checker< cds::atomicity::empty_item_counter > {
+        template <typename Container>
+        bool operator()( Container const& /*c*/, size_t /*nSize*/ ) const
+        {
+            return true;
+        }
+    };
+
+    template <class Container>
+    static inline bool check_size( Container const& cont, size_t nSize )
+    {
+        return size_checker<typename Container::item_counter>()( cont, nSize );
+    }
+
+} // namespace misc
+
+#endif // #ifndef __CDSTEST_SIZE_CHECK_H
diff --git a/tests/test-hdr/stack/hdr_elimination_stack_hp.cpp b/tests/test-hdr/stack/hdr_elimination_stack_hp.cpp
new file mode 100644 (file)
index 0000000..793e8ac
--- /dev/null
@@ -0,0 +1,70 @@
+//$$CDS-header$$
+
+#include "hdr_treiber_stack.h"
+#include <cds/gc/hp.h>
+#include <cds/container/treiber_stack.h>
+
+namespace stack {
+#define TEST(X)     void TestStack::X() { test<defs::X>(); }
+#define TEST_DYN(X)     void TestStack::X() { test_elimination<defs::X>(); }
+
+    namespace cs = cds::container;
+
+    namespace defs { namespace {
+
+        typedef cs::TreiberStack< cds::gc::HP, int
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HP;
+
+        typedef cs::TreiberStack< cds::gc::HP, int
+            ,cds::opt::enable_elimination<true>
+            , cds::opt::buffer< cds::opt::v::dynamic_buffer<void *> >
+        > Elimination_HP_dyn;
+
+        typedef cs::TreiberStack< cds::gc::HP, int
+            ,cds::opt::enable_elimination<true>
+            , cds::opt::buffer< cds::opt::v::dynamic_buffer<void *> >
+            , cds::opt::stat< cs::treiber_stack::stat<> >
+        > Elimination_HP_stat;
+
+        typedef cs::TreiberStack< cds::gc::HP, int
+            ,cds::opt::enable_elimination<true>
+            , cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Elimination_HP_relaxed;
+
+        typedef cs::TreiberStack< cds::gc::HP, int
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off< cds::backoff::yield>
+        > Elimination_HP_yield;
+
+        typedef cs::TreiberStack< cds::gc::HP, int
+            , cds::opt::back_off< cds::backoff::yield>
+            ,cds::opt::enable_elimination<true>
+            , cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Elimination_HP_yield_relaxed;
+
+        typedef cs::TreiberStack< cds::gc::HP, int
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::allocator< std::allocator< bool * > >
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HP_pause_alloc;
+
+        typedef cs::TreiberStack< cds::gc::HP, int
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+            ,cds::opt::allocator< std::allocator< bool * > >
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HP_pause_alloc_relaxed;
+
+    }}
+
+    TEST(Elimination_HP)
+    TEST_DYN(Elimination_HP_dyn)
+    TEST_DYN(Elimination_HP_stat)
+    TEST(Elimination_HP_yield)
+    TEST(Elimination_HP_pause_alloc)
+
+    TEST(Elimination_HP_relaxed)
+    TEST(Elimination_HP_yield_relaxed)
+    TEST(Elimination_HP_pause_alloc_relaxed)
+}
diff --git a/tests/test-hdr/stack/hdr_elimination_stack_hrc.cpp b/tests/test-hdr/stack/hdr_elimination_stack_hrc.cpp
new file mode 100644 (file)
index 0000000..c5395ab
--- /dev/null
@@ -0,0 +1,69 @@
+//$$CDS-header$$
+
+#include "hdr_treiber_stack.h"
+#include <cds/gc/hrc.h>
+#include <cds/container/treiber_stack.h>
+
+namespace stack {
+#define TEST(X)     void TestStack::X() { test<defs::X>(); }
+#define TEST_DYN(X)     void TestStack::X() { test_elimination<defs::X>(); }
+
+    namespace cs = cds::container;
+
+    namespace defs { namespace {
+
+        typedef cs::TreiberStack< cds::gc::HRC, int
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HRC;
+
+        typedef cs::TreiberStack< cds::gc::HRC, int
+            , cds::opt::buffer< cds::opt::v::dynamic_buffer<void *> >
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HRC_dyn;
+
+        typedef cs::TreiberStack< cds::gc::HRC, int
+            , cds::opt::buffer< cds::opt::v::dynamic_buffer<void *> >
+            , cds::opt::stat< cs::treiber_stack::stat<> >
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HRC_stat;
+
+        typedef cs::TreiberStack< cds::gc::HRC, int
+            , cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HRC_relaxed;
+
+        typedef cs::TreiberStack< cds::gc::HRC, int
+            , cds::opt::back_off< cds::backoff::yield>
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HRC_yield;
+
+        typedef cs::TreiberStack< cds::gc::HRC, int
+            ,cds::opt::back_off< cds::backoff::yield>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HRC_yield_relaxed;
+
+        typedef cs::TreiberStack< cds::gc::HRC, int
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::allocator< std::allocator< bool * > >
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HRC_pause_alloc;
+
+        typedef cs::TreiberStack< cds::gc::HRC, int
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::allocator< std::allocator< bool * > >
+        > Elimination_HRC_pause_alloc_relaxed;
+    }}
+
+    TEST(Elimination_HRC)
+    TEST_DYN(Elimination_HRC_dyn)
+    TEST_DYN(Elimination_HRC_stat)
+    TEST(Elimination_HRC_yield)
+    TEST(Elimination_HRC_pause_alloc)
+
+    TEST(Elimination_HRC_relaxed)
+    TEST(Elimination_HRC_yield_relaxed)
+    TEST(Elimination_HRC_pause_alloc_relaxed)
+}
diff --git a/tests/test-hdr/stack/hdr_elimination_stack_ptb.cpp b/tests/test-hdr/stack/hdr_elimination_stack_ptb.cpp
new file mode 100644 (file)
index 0000000..27aa334
--- /dev/null
@@ -0,0 +1,69 @@
+//$$CDS-header$$
+
+#include "hdr_treiber_stack.h"
+#include <cds/gc/ptb.h>
+#include <cds/container/treiber_stack.h>
+
+namespace stack {
+#define TEST(X)     void TestStack::X() { test<defs::X>(); }
+#define TEST_DYN(X)     void TestStack::X() { test_elimination<defs::X>(); }
+    namespace cs = cds::container;
+
+    namespace defs { namespace {
+
+        typedef cs::TreiberStack< cds::gc::PTB, int
+            ,cds::opt::enable_elimination<true>
+        > Elimination_PTB;
+
+        typedef cs::TreiberStack< cds::gc::PTB, int
+            ,cds::opt::enable_elimination<true>
+            , cds::opt::buffer< cds::opt::v::dynamic_buffer<void *> >
+        > Elimination_PTB_dyn;
+
+        typedef cs::TreiberStack< cds::gc::PTB, int
+            , cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+            , cds::opt::stat< cs::treiber_stack::stat<> >
+            ,cds::opt::enable_elimination<true>
+        > Elimination_PTB_stat;
+
+        typedef cs::TreiberStack< cds::gc::PTB, int
+            , cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+            ,cds::opt::enable_elimination<true>
+        > Elimination_PTB_relaxed;
+
+        typedef cs::TreiberStack< cds::gc::PTB, int
+            , cds::opt::back_off< cds::backoff::yield>
+            ,cds::opt::enable_elimination<true>
+        > Elimination_PTB_yield;
+
+        typedef cs::TreiberStack< cds::gc::PTB, int
+            ,cds::opt::back_off< cds::backoff::yield>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+            ,cds::opt::enable_elimination<true>
+        > Elimination_PTB_yield_relaxed;
+
+        typedef cs::TreiberStack< cds::gc::PTB, int
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::allocator< std::allocator< bool * > >
+            ,cds::opt::enable_elimination<true>
+        > Elimination_PTB_pause_alloc;
+
+        typedef cs::TreiberStack< cds::gc::PTB, int
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::allocator< std::allocator< bool * > >
+            ,cds::opt::enable_elimination<true>
+        > Elimination_PTB_pause_alloc_relaxed;
+    }}
+
+    TEST(Elimination_PTB)
+    TEST_DYN(Elimination_PTB_dyn)
+    TEST_DYN(Elimination_PTB_stat)
+    TEST(Elimination_PTB_yield)
+    TEST(Elimination_PTB_pause_alloc)
+
+    TEST(Elimination_PTB_relaxed)
+    TEST(Elimination_PTB_yield_relaxed)
+    TEST(Elimination_PTB_pause_alloc_relaxed)
+
+}
diff --git a/tests/test-hdr/stack/hdr_fcstack.cpp b/tests/test-hdr/stack/hdr_fcstack.cpp
new file mode 100644 (file)
index 0000000..e360d23
--- /dev/null
@@ -0,0 +1,144 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/container/fcstack.h>
+
+#include <vector>
+#include <list>
+
+namespace stack {
+
+    class TestFCStack: public CppUnitMini::TestCase
+    {
+        template <class Stack>
+        void test()
+        {
+            Stack s;
+            test_with( s );
+        }
+
+        template <class Stack>
+        void test_with( Stack& stack)
+        {
+            typedef typename Stack::value_type  value_type;
+            value_type v;
+
+            CPPUNIT_ASSERT( stack.empty() );
+            CPPUNIT_ASSERT( stack.size() == 0 );
+
+            CPPUNIT_ASSERT( stack.push(1));
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.size() == 1 );
+            CPPUNIT_ASSERT( stack.push(2));
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.size() == 2 );
+            CPPUNIT_ASSERT( stack.push(3));
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.size() == 3 );
+
+            CPPUNIT_ASSERT( stack.pop(v) );
+            CPPUNIT_ASSERT( v == 3 );
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.size() == 2 );
+            CPPUNIT_ASSERT( stack.pop(v) );
+            CPPUNIT_ASSERT( v == 2 );
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.size() == 1 );
+            CPPUNIT_ASSERT( stack.pop(v) );
+            CPPUNIT_ASSERT( v == 1 );
+            CPPUNIT_ASSERT( stack.empty() );
+            CPPUNIT_ASSERT( stack.size() == 0 );
+            v = 1000;
+            CPPUNIT_ASSERT( !stack.pop(v) );
+            CPPUNIT_ASSERT( v == 1000 );
+            CPPUNIT_ASSERT( stack.empty() );
+            CPPUNIT_ASSERT( stack.size() == 0 );
+
+            CPPUNIT_ASSERT( stack.push(10));
+            CPPUNIT_ASSERT( stack.push(20));
+            CPPUNIT_ASSERT( stack.push(30));
+            CPPUNIT_ASSERT( !stack.empty());
+            CPPUNIT_ASSERT( stack.size() == 3 );
+
+            while ( stack.pop(v) );
+
+            CPPUNIT_ASSERT( stack.empty() );
+            CPPUNIT_ASSERT( stack.size() == 0 );
+        }
+
+        void FCStack_default();
+        void FCStack_deque();
+        void FCStack_deque_elimination();
+        void FCStack_vector();
+        void FCStack_vector_elimination();
+        void FCStack_list();
+        void FCStack_list_elimination();
+
+        CPPUNIT_TEST_SUITE(TestFCStack);
+            CPPUNIT_TEST( FCStack_default )
+            CPPUNIT_TEST( FCStack_deque )
+            CPPUNIT_TEST( FCStack_deque_elimination )
+            CPPUNIT_TEST( FCStack_vector )
+            CPPUNIT_TEST( FCStack_vector_elimination )
+            CPPUNIT_TEST( FCStack_list )
+            CPPUNIT_TEST( FCStack_list_elimination )
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+    void TestFCStack::FCStack_default()
+    {
+        typedef cds::container::FCStack< unsigned int > stack_type;
+        test<stack_type>();
+    }
+
+    void TestFCStack::FCStack_deque()
+    {
+        typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::deque<unsigned int> > > stack_type;
+        test<stack_type>();
+    }
+
+    void TestFCStack::FCStack_deque_elimination()
+    {
+        typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::deque<unsigned int> >,
+            cds::container::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    void TestFCStack::FCStack_vector()
+    {
+        typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::vector<unsigned int> > > stack_type;
+        test<stack_type>();
+    }
+
+    void TestFCStack::FCStack_vector_elimination()
+    {
+        typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::vector<unsigned int> >,
+            cds::container::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    void TestFCStack::FCStack_list()
+    {
+        typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::list<unsigned int> > > stack_type;
+        test<stack_type>();
+    }
+
+    void TestFCStack::FCStack_list_elimination()
+    {
+        typedef cds::container::FCStack< unsigned int, std::stack<unsigned int, std::list<unsigned int> >,
+            cds::container::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    CPPUNIT_TEST_SUITE_REGISTRATION(stack::TestFCStack);
+}   // namespace stack
+
diff --git a/tests/test-hdr/stack/hdr_intrusive_elimination_stack_hp.cpp b/tests/test-hdr/stack/hdr_intrusive_elimination_stack_hp.cpp
new file mode 100644 (file)
index 0000000..1a86bc3
--- /dev/null
@@ -0,0 +1,154 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_treiber_stack.h"
+#include <cds/gc/hp.h>
+#include <cds/intrusive/treiber_stack.h>
+
+namespace stack {
+
+#define TEST(X)     void TestIntrusiveStack::X() { test<defs::X>(); }
+#define TEST_DYN(X)     void TestIntrusiveStack::X() { test_elimination<defs::X>(); }
+
+    namespace defs {
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HP_default;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Elimination_HP_default_relaxed;
+
+        // HZP GC + base hook
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::base_hook<
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+        > Elimination_HP_base;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::base_hook<
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::buffer< ci::opt::v::dynamic_buffer<void *> >
+        > Elimination_HP_base_dyn;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::base_hook<
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Elimination_HP_base_relaxed;
+
+        // HZP GC + base hook + disposer
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+        > Elimination_HP_base_disposer;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Elimination_HP_base_disposer_relaxed;
+
+        // HZP GC + member hook
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::member_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+        > Elimination_HP_member;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::member_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::buffer< ci::opt::v::dynamic_buffer<void *> >
+        > Elimination_HP_member_dyn;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::member_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Elimination_HP_member_relaxed;
+
+        // HZP GC + member hook + disposer
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::member_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+        > Elimination_HP_member_disposer;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::member_hook_item<cds::gc::HP>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Elimination_HP_member_disposer_relaxed;
+    }
+
+    TEST(Elimination_HP_default)
+    TEST(Elimination_HP_base)
+    TEST_DYN(Elimination_HP_base_dyn)
+    TEST(Elimination_HP_base_disposer)
+    TEST(Elimination_HP_member)
+    TEST_DYN(Elimination_HP_member_dyn)
+    TEST(Elimination_HP_member_disposer)
+
+    TEST(Elimination_HP_default_relaxed)
+    TEST(Elimination_HP_base_relaxed)
+    TEST(Elimination_HP_base_disposer_relaxed)
+    TEST(Elimination_HP_member_relaxed)
+    TEST(Elimination_HP_member_disposer_relaxed)
+
+} // namespace stack
diff --git a/tests/test-hdr/stack/hdr_intrusive_elimination_stack_hrc.cpp b/tests/test-hdr/stack/hdr_intrusive_elimination_stack_hrc.cpp
new file mode 100644 (file)
index 0000000..4615110
--- /dev/null
@@ -0,0 +1,69 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_treiber_stack.h"
+#include <cds/gc/hrc.h>
+#include <cds/intrusive/treiber_stack.h>
+
+namespace stack {
+
+#define TEST(X)      void TestIntrusiveStack::X() { test<defs::X>(); }
+#define TEST_DYN(X)  void TestIntrusiveStack::X() { test_elimination<defs::X>(); }
+
+    namespace defs {
+        // HRC GC
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC,
+            TestIntrusiveStack::base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,cds::opt::enable_elimination<true>
+        > Elimination_HRC_base;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC,
+            TestIntrusiveStack::base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::buffer< ci::opt::v::dynamic_buffer<void *> >
+        > Elimination_HRC_base_dyn;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC,
+            TestIntrusiveStack::base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Elimination_HRC_base_relaxed;
+
+        // HRC GC + disposer
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC,
+            TestIntrusiveStack::base_hook_item<cds::gc::HRC>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+        > Elimination_HRC_base_disposer;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC,
+            TestIntrusiveStack::base_hook_item<cds::gc::HRC>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Elimination_HRC_base_disposer_relaxed;
+    }
+
+    TEST(Elimination_HRC_base)
+    TEST_DYN(Elimination_HRC_base_dyn)
+    TEST(Elimination_HRC_base_disposer)
+
+    TEST(Elimination_HRC_base_relaxed)
+    TEST(Elimination_HRC_base_disposer_relaxed)
+
+} // namespace stack
+
diff --git a/tests/test-hdr/stack/hdr_intrusive_elimination_stack_ptb.cpp b/tests/test-hdr/stack/hdr_intrusive_elimination_stack_ptb.cpp
new file mode 100644 (file)
index 0000000..688581d
--- /dev/null
@@ -0,0 +1,136 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_treiber_stack.h"
+#include <cds/gc/ptb.h>
+#include <cds/intrusive/treiber_stack.h>
+
+namespace stack {
+
+#define TEST(X)     void TestIntrusiveStack::X() { test<defs::X>(); }
+#define TEST_DYN(X) void TestIntrusiveStack::X() { test_elimination<defs::X>(); }
+
+    namespace defs {
+        // PTB GC + base hook
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::base_hook_item<cds::gc::PTB>
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+        > Elimination_PTB_base;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::buffer< ci::opt::v::dynamic_buffer<void *> >
+        > Elimination_PTB_base_dyn;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Elimination_PTB_base_relaxed;
+
+        // PTB GC + base hook + disposer
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+        > Elimination_PTB_base_disposer;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Elimination_PTB_base_disposer_relaxed;
+
+        // PTB GC + member hook
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,cds::opt::enable_elimination<true>
+        > Elimination_PTB_member;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::buffer< ci::opt::v::dynamic_buffer<void *> >
+        > Elimination_PTB_member_dyn;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Elimination_PTB_member_relaxed;
+
+        // PTB GC + member hook + disposer
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+        > Elimination_PTB_member_disposer;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,cds::opt::enable_elimination<true>
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Elimination_PTB_member_disposer_relaxed;
+    }
+
+    TEST(Elimination_PTB_base)
+    TEST_DYN(Elimination_PTB_base_dyn)
+    TEST(Elimination_PTB_base_disposer)
+    TEST(Elimination_PTB_member)
+    TEST_DYN(Elimination_PTB_member_dyn)
+    TEST(Elimination_PTB_member_disposer)
+
+    TEST(Elimination_PTB_base_relaxed)
+    TEST(Elimination_PTB_base_disposer_relaxed)
+    TEST(Elimination_PTB_member_relaxed)
+    TEST(Elimination_PTB_member_disposer_relaxed)
+
+} // namespace stack
+
diff --git a/tests/test-hdr/stack/hdr_intrusive_fcstack.cpp b/tests/test-hdr/stack/hdr_intrusive_fcstack.cpp
new file mode 100644 (file)
index 0000000..f037411
--- /dev/null
@@ -0,0 +1,294 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/intrusive/fcstack.h>
+
+#include <boost/intrusive/list.hpp>
+
+namespace stack {
+
+    class TestIntrusiveFCStack: public CppUnitMini::TestCase
+    {
+    public:
+        template <typename Hook>
+        struct base_hook_item: public Hook
+        {
+            int nVal;
+            int nDisposeCount;
+
+            base_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        template <typename Hook>
+        struct member_hook_item
+        {
+            int nVal;
+            int nDisposeCount;
+            Hook hMember;
+
+            member_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        struct faked_disposer
+        {
+            template <typename T>
+            void operator ()( T * p )
+            {
+                ++p->nDisposeCount;
+            }
+        };
+
+        template <class Stack>
+        void test()
+        {
+            Stack stack;
+            test_with(stack);
+        }
+
+        template <class Stack>
+        void test_with( Stack& stack )
+        {
+            typedef typename Stack::value_type  value_type;
+
+            CPPUNIT_ASSERT( stack.empty() );
+
+            value_type v1, v2, v3;
+            v1.nVal = 1;
+            v2.nVal = 2;
+            v3.nVal = 3;
+            CPPUNIT_ASSERT( stack.push(v1));
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.push(v2));
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.push(v3));
+            CPPUNIT_ASSERT( !stack.empty() );
+
+            value_type * pv;
+            pv = stack.pop();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 3 );
+            CPPUNIT_ASSERT( !stack.empty() );
+            pv = stack.pop();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 2 );
+            CPPUNIT_ASSERT( !stack.empty() );
+            pv = stack.pop();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 1 );
+            CPPUNIT_ASSERT( stack.empty() );
+            pv = stack.pop();
+            CPPUNIT_ASSERT( pv == NULL );
+
+            CPPUNIT_ASSERT( v1.nDisposeCount == 0 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 0 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 0 );
+
+            stack.push(v1);
+            stack.push(v2);
+            stack.push(v3);
+
+            stack.clear();
+            CPPUNIT_ASSERT( stack.empty() );
+
+            if ( !std::is_same<typename Stack::disposer, cds::intrusive::opt::v::empty_disposer>::value ) {
+                CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
+                CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
+                CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
+            }
+        }
+
+        void FCStack_slist();
+        void FCStack_slist_mutex();
+        void FCStack_slist_elimination();
+        void FCStack_slist_elimination_stat();
+        void FCStack_slist_member();
+        void FCStack_slist_member_elimination();
+        void FCStack_slist_member_elimination_stat();
+        void FCStack_list();
+        void FCStack_list_mutex();
+        void FCStack_list_elimination();
+        void FCStack_list_elimination_stat();
+        void FCStack_list_member();
+        void FCStack_list_member_elimination();
+        void FCStack_list_member_elimination_stat();
+
+        CPPUNIT_TEST_SUITE(TestIntrusiveFCStack)
+            CPPUNIT_TEST(FCStack_slist)
+            CPPUNIT_TEST(FCStack_slist_mutex)
+            CPPUNIT_TEST(FCStack_slist_elimination)
+            CPPUNIT_TEST(FCStack_slist_elimination_stat)
+            CPPUNIT_TEST(FCStack_slist_member)
+            CPPUNIT_TEST(FCStack_slist_member_elimination)
+            CPPUNIT_TEST(FCStack_slist_member_elimination_stat)
+            CPPUNIT_TEST(FCStack_list)
+            CPPUNIT_TEST(FCStack_list_mutex)
+            CPPUNIT_TEST(FCStack_list_elimination)
+            CPPUNIT_TEST(FCStack_list_elimination_stat)
+            CPPUNIT_TEST(FCStack_list_member)
+            CPPUNIT_TEST(FCStack_list_member_elimination)
+            CPPUNIT_TEST(FCStack_list_member_elimination_stat)
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+    void TestIntrusiveFCStack::FCStack_slist()
+    {
+        typedef base_hook_item< boost::intrusive::slist_base_hook<> > value_type;
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type > > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_slist_mutex()
+    {
+        typedef base_hook_item< boost::intrusive::slist_base_hook<> > value_type;
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type >,
+            cds::intrusive::fcstack::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_slist_elimination()
+    {
+        typedef base_hook_item< boost::intrusive::slist_base_hook<> > value_type;
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type >,
+            cds::intrusive::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_slist_elimination_stat()
+    {
+        typedef base_hook_item< boost::intrusive::slist_base_hook<> > value_type;
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type >,
+            cds::intrusive::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+                ,cds::opt::stat< cds::intrusive::fcstack::stat<> >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_slist_member()
+    {
+        typedef member_hook_item< boost::intrusive::slist_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::slist_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type, member_option > > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_slist_member_elimination()
+    {
+        typedef member_hook_item< boost::intrusive::slist_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::slist_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type, member_option >,
+            cds::intrusive::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_slist_member_elimination_stat()
+    {
+        typedef member_hook_item< boost::intrusive::slist_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::slist_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type, member_option >,
+            cds::intrusive::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+                ,cds::opt::stat< cds::intrusive::fcstack::stat<> >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_list()
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type > > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_list_mutex()
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type >,
+            cds::intrusive::fcstack::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+
+    void TestIntrusiveFCStack::FCStack_list_elimination()
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type >,
+            cds::intrusive::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_list_elimination_stat()
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type >,
+            cds::intrusive::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+                ,cds::opt::stat< cds::intrusive::fcstack::stat<> >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_list_member()
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type, member_option > > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_list_member_elimination()
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type, member_option >,
+            cds::intrusive::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    void TestIntrusiveFCStack::FCStack_list_member_elimination_stat()
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type, member_option >,
+            cds::intrusive::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+                ,cds::opt::stat< cds::intrusive::fcstack::stat<> >
+            >::type
+        > stack_type;
+        test<stack_type>();
+    }
+
+    CPPUNIT_TEST_SUITE_REGISTRATION(stack::TestIntrusiveFCStack);
+}   // namespace stack
+
diff --git a/tests/test-hdr/stack/hdr_intrusive_treiber_stack.h b/tests/test-hdr/stack/hdr_intrusive_treiber_stack.h
new file mode 100644 (file)
index 0000000..6749e3f
--- /dev/null
@@ -0,0 +1,220 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+#include <cds/intrusive/single_link_struct.h>
+
+namespace stack {
+
+    namespace ci = cds::intrusive;
+
+    class TestIntrusiveStack: public CppUnitMini::TestCase
+    {
+    public:
+        template <typename GC>
+        struct base_hook_item: public ci::single_link::node< GC >
+        {
+            int nVal;
+            int nDisposeCount;
+
+            base_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        template <typename GC>
+        struct member_hook_item
+        {
+            int nVal;
+            int nDisposeCount;
+            ci::single_link::node< GC > hMember;
+
+            member_hook_item()
+                : nDisposeCount(0)
+            {}
+        };
+
+        struct faked_disposer
+        {
+            template <typename T>
+            void operator ()( T * p )
+            {
+                ++p->nDisposeCount;
+            }
+        };
+
+        template <class Stack>
+        void test_elimination()
+        {
+            Stack stack( 2 );
+            test_with( stack );
+        }
+
+        template <class Stack>
+        void test()
+        {
+            Stack stack;
+            test_with(stack);
+        }
+
+
+        template <class Stack>
+        void test_with( Stack& stack )
+        {
+            typedef typename Stack::value_type  value_type;
+
+            CPPUNIT_ASSERT( stack.empty() );
+
+            value_type v1, v2, v3;
+            v1.nVal = 1;
+            v2.nVal = 2;
+            v3.nVal = 3;
+            CPPUNIT_ASSERT( stack.push(v1));
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.push(v2));
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.push(v3));
+            CPPUNIT_ASSERT( !stack.empty() );
+
+            value_type * pv;
+            pv = stack.pop();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 3 );
+            CPPUNIT_ASSERT( !stack.empty() );
+            pv = stack.pop();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 2 );
+            CPPUNIT_ASSERT( !stack.empty() );
+            pv = stack.pop();
+            CPPUNIT_ASSERT( pv != NULL );
+            CPPUNIT_ASSERT( pv->nVal == 1 );
+            CPPUNIT_ASSERT( stack.empty() );
+            pv = stack.pop();
+            CPPUNIT_ASSERT( pv == NULL );
+
+            CPPUNIT_ASSERT( v1.nDisposeCount == 0 );
+            CPPUNIT_ASSERT( v2.nDisposeCount == 0 );
+            CPPUNIT_ASSERT( v3.nDisposeCount == 0 );
+
+            stack.push(v1);
+            stack.push(v2);
+            stack.push(v3);
+
+            stack.clear();
+            CPPUNIT_ASSERT( stack.empty() );
+
+            Stack::gc::scan();
+            if ( !std::is_same<typename Stack::disposer, ci::opt::v::empty_disposer>::value ) {
+                CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
+                CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
+                CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
+            }
+        }
+
+        void Treiber_HP_default();
+        void Treiber_HP_base();
+        void Treiber_HP_base_disposer();
+        void Treiber_HP_member();
+        void Treiber_HP_member_disposer();
+        void Treiber_HRC_base();
+        void Treiber_HRC_base_disposer();
+        void Treiber_PTB_base();
+        void Treiber_PTB_base_disposer();
+        void Treiber_PTB_member();
+        void Treiber_PTB_member_disposer();
+
+        void Treiber_HP_default_relaxed();
+        void Treiber_HP_base_relaxed();
+        void Treiber_HP_base_disposer_relaxed();
+        void Treiber_HP_member_relaxed();
+        void Treiber_HP_member_disposer_relaxed();
+        void Treiber_HRC_base_relaxed();
+        void Treiber_HRC_base_disposer_relaxed();
+        void Treiber_PTB_base_relaxed();
+        void Treiber_PTB_base_disposer_relaxed();
+        void Treiber_PTB_member_relaxed();
+        void Treiber_PTB_member_disposer_relaxed();
+
+        void Elimination_HP_default();
+        void Elimination_HP_base();
+        void Elimination_HP_base_dyn();
+        void Elimination_HP_base_disposer();
+        void Elimination_HP_member();
+        void Elimination_HP_member_dyn();
+        void Elimination_HP_member_disposer();
+        void Elimination_HRC_base();
+        void Elimination_HRC_base_dyn();
+        void Elimination_HRC_base_disposer();
+        void Elimination_PTB_base();
+        void Elimination_PTB_base_dyn();
+        void Elimination_PTB_base_disposer();
+        void Elimination_PTB_member();
+        void Elimination_PTB_member_dyn();
+        void Elimination_PTB_member_disposer();
+
+        void Elimination_HP_default_relaxed();
+        void Elimination_HP_base_relaxed();
+        void Elimination_HP_base_disposer_relaxed();
+        void Elimination_HP_member_relaxed();
+        void Elimination_HP_member_disposer_relaxed();
+        void Elimination_HRC_base_relaxed();
+        void Elimination_HRC_base_disposer_relaxed();
+        void Elimination_PTB_base_relaxed();
+        void Elimination_PTB_base_disposer_relaxed();
+        void Elimination_PTB_member_relaxed();
+        void Elimination_PTB_member_disposer_relaxed();
+
+        CPPUNIT_TEST_SUITE(TestIntrusiveStack)
+            CPPUNIT_TEST(Treiber_HP_default)
+            CPPUNIT_TEST(Treiber_HP_default_relaxed)
+            CPPUNIT_TEST(Treiber_HP_base)
+            CPPUNIT_TEST(Treiber_HP_base_relaxed)
+            CPPUNIT_TEST(Treiber_HP_base_disposer)
+            CPPUNIT_TEST(Treiber_HP_base_disposer_relaxed)
+            CPPUNIT_TEST(Treiber_HP_member)
+            CPPUNIT_TEST(Treiber_HP_member_relaxed)
+            CPPUNIT_TEST(Treiber_HP_member_disposer)
+            CPPUNIT_TEST(Treiber_HP_member_disposer_relaxed)
+            CPPUNIT_TEST(Treiber_HRC_base)
+            CPPUNIT_TEST(Treiber_HRC_base_relaxed)
+            CPPUNIT_TEST(Treiber_HRC_base_disposer)
+            CPPUNIT_TEST(Treiber_HRC_base_disposer_relaxed)
+            CPPUNIT_TEST(Treiber_PTB_base)
+            CPPUNIT_TEST(Treiber_PTB_base_relaxed)
+            CPPUNIT_TEST(Treiber_PTB_base_disposer)
+            CPPUNIT_TEST(Treiber_PTB_base_disposer_relaxed)
+            CPPUNIT_TEST(Treiber_PTB_member)
+            CPPUNIT_TEST(Treiber_PTB_member_relaxed)
+            CPPUNIT_TEST(Treiber_PTB_member_disposer)
+            CPPUNIT_TEST(Treiber_PTB_member_disposer_relaxed)
+
+            CPPUNIT_TEST(Elimination_HP_default)
+            CPPUNIT_TEST(Elimination_HP_default_relaxed)
+            CPPUNIT_TEST(Elimination_HP_base)
+            CPPUNIT_TEST(Elimination_HP_base_dyn)
+            CPPUNIT_TEST(Elimination_HP_base_relaxed)
+            CPPUNIT_TEST(Elimination_HP_base_disposer)
+            CPPUNIT_TEST(Elimination_HP_base_disposer_relaxed)
+            CPPUNIT_TEST(Elimination_HP_member)
+            CPPUNIT_TEST(Elimination_HP_member_dyn)
+            CPPUNIT_TEST(Elimination_HP_member_relaxed)
+            CPPUNIT_TEST(Elimination_HP_member_disposer)
+            CPPUNIT_TEST(Elimination_HP_member_disposer_relaxed)
+            CPPUNIT_TEST(Elimination_HRC_base)
+            CPPUNIT_TEST(Elimination_HRC_base_dyn)
+            CPPUNIT_TEST(Elimination_HRC_base_relaxed)
+            CPPUNIT_TEST(Elimination_HRC_base_disposer)
+            CPPUNIT_TEST(Elimination_HRC_base_disposer_relaxed)
+            CPPUNIT_TEST(Elimination_PTB_base)
+            CPPUNIT_TEST(Elimination_PTB_base_dyn)
+            CPPUNIT_TEST(Elimination_PTB_base_relaxed)
+            CPPUNIT_TEST(Elimination_PTB_base_disposer)
+            CPPUNIT_TEST(Elimination_PTB_base_disposer_relaxed)
+            CPPUNIT_TEST(Elimination_PTB_member)
+            CPPUNIT_TEST(Elimination_PTB_member_dyn)
+            CPPUNIT_TEST(Elimination_PTB_member_relaxed)
+            CPPUNIT_TEST(Elimination_PTB_member_disposer)
+            CPPUNIT_TEST(Elimination_PTB_member_disposer_relaxed)
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+} // namespace stack
diff --git a/tests/test-hdr/stack/hdr_intrusive_treiber_stack_hp.cpp b/tests/test-hdr/stack/hdr_intrusive_treiber_stack_hp.cpp
new file mode 100644 (file)
index 0000000..cc73b7c
--- /dev/null
@@ -0,0 +1,119 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_treiber_stack.h"
+#include <cds/gc/hp.h>
+#include <cds/intrusive/treiber_stack.h>
+
+namespace stack {
+
+#define TEST(X)     void TestIntrusiveStack::X() { test<defs::X>(); }
+
+    namespace defs { namespace {
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+        > Treiber_HP_default;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Treiber_HP_default_relaxed;
+
+        // HZP GC + base hook
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook<
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+        > Treiber_HP_base;
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook<
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Treiber_HP_base_relaxed;
+
+        // HZP GC + base hook + disposer
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+        > Treiber_HP_base_disposer;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::base_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Treiber_HP_base_disposer_relaxed;
+
+        // HZP GC + member hook
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+        > Treiber_HP_member;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Treiber_HP_member_relaxed;
+
+        // HZP GC + member hook + disposer
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+        > Treiber_HP_member_disposer;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP,
+            TestIntrusiveStack::member_hook_item<cds::gc::HP>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::HP>, hMember),
+                    ci::opt::gc<cds::gc::HP>
+                >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Treiber_HP_member_disposer_relaxed;
+    }}
+
+    TEST(Treiber_HP_default)
+    TEST(Treiber_HP_base)
+    TEST(Treiber_HP_base_disposer)
+    TEST(Treiber_HP_member)
+    TEST(Treiber_HP_member_disposer)
+
+    TEST(Treiber_HP_default_relaxed)
+    TEST(Treiber_HP_base_relaxed)
+    TEST(Treiber_HP_base_disposer_relaxed)
+    TEST(Treiber_HP_member_relaxed)
+    TEST(Treiber_HP_member_disposer_relaxed)
+
+} // namespace stack
+
+CPPUNIT_TEST_SUITE_REGISTRATION(stack::TestIntrusiveStack);
diff --git a/tests/test-hdr/stack/hdr_intrusive_treiber_stack_hrc.cpp b/tests/test-hdr/stack/hdr_intrusive_treiber_stack_hrc.cpp
new file mode 100644 (file)
index 0000000..a6746b9
--- /dev/null
@@ -0,0 +1,54 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_treiber_stack.h"
+#include <cds/gc/hrc.h>
+#include <cds/intrusive/treiber_stack.h>
+
+namespace stack {
+
+#define TEST(X)     void TestIntrusiveStack::X() { test<defs::X>(); }
+
+    namespace defs {
+        // HRC GC
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC,
+            TestIntrusiveStack::base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+        > Treiber_HRC_base;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC,
+            TestIntrusiveStack::base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Treiber_HRC_base_relaxed;
+
+        // HRC GC + disposer
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC,
+            TestIntrusiveStack::base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+        > Treiber_HRC_base_disposer;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC,
+            TestIntrusiveStack::base_hook_item<cds::gc::HRC>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::HRC> >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Treiber_HRC_base_disposer_relaxed;
+    }
+
+    TEST(Treiber_HRC_base)
+    TEST(Treiber_HRC_base_disposer)
+
+    TEST(Treiber_HRC_base_relaxed)
+    TEST(Treiber_HRC_base_disposer_relaxed)
+
+} // namespace stack
+
diff --git a/tests/test-hdr/stack/hdr_intrusive_treiber_stack_ptb.cpp b/tests/test-hdr/stack/hdr_intrusive_treiber_stack_ptb.cpp
new file mode 100644 (file)
index 0000000..9337c56
--- /dev/null
@@ -0,0 +1,104 @@
+//$$CDS-header$$
+
+#include "hdr_intrusive_treiber_stack.h"
+#include <cds/gc/ptb.h>
+#include <cds/intrusive/treiber_stack.h>
+
+namespace stack {
+
+#define TEST(X)     void TestIntrusiveStack::X() { test<defs::X>(); }
+
+    namespace defs {
+        // PTB GC + base hook
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+        > Treiber_PTB_base;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Treiber_PTB_base_relaxed;
+
+        // PTB GC + base hook + disposer
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+        > Treiber_PTB_base_disposer;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::base_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::base_hook< ci::opt::gc<cds::gc::PTB> >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Treiber_PTB_base_disposer_relaxed;
+
+        // PTB GC + member hook
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+        > Treiber_PTB_member;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Treiber_PTB_member_relaxed;
+
+        // PTB GC + member hook + disposer
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+        > Treiber_PTB_member_disposer;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB,
+            TestIntrusiveStack::member_hook_item<cds::gc::PTB>
+            ,ci::opt::hook<
+                ci::single_link::member_hook<
+                    offsetof(TestIntrusiveStack::member_hook_item<cds::gc::PTB>, hMember),
+                    ci::opt::gc<cds::gc::PTB>
+                >
+            >
+            ,ci::opt::disposer< TestIntrusiveStack::faked_disposer >
+            ,ci::opt::memory_model< ci::opt::v::relaxed_ordering >
+        > Treiber_PTB_member_disposer_relaxed;
+    }
+
+    TEST(Treiber_PTB_base)
+    TEST(Treiber_PTB_base_disposer)
+    TEST(Treiber_PTB_member)
+    TEST(Treiber_PTB_member_disposer)
+
+    TEST(Treiber_PTB_base_relaxed)
+    TEST(Treiber_PTB_base_disposer_relaxed)
+    TEST(Treiber_PTB_member_relaxed)
+    TEST(Treiber_PTB_member_disposer_relaxed)
+
+} // namespace stack
+
diff --git a/tests/test-hdr/stack/hdr_treiber_stack.h b/tests/test-hdr/stack/hdr_treiber_stack.h
new file mode 100644 (file)
index 0000000..789c9e8
--- /dev/null
@@ -0,0 +1,162 @@
+//$$CDS-header$$
+
+#include "cppunit/cppunit_proxy.h"
+
+namespace stack {
+
+    class TestStack: public CppUnitMini::TestCase
+    {
+        template <class Stack>
+        void test()
+        {
+            Stack s;
+            test_with( s );
+        }
+
+        template <class Stack>
+        void test_elimination()
+        {
+            Stack s(2);
+            test_with( s );
+        }
+
+        template <class Stack>
+        void test_with( Stack& stack)
+        {
+            typedef typename Stack::value_type  value_type;
+            value_type v;
+
+            CPPUNIT_ASSERT( stack.empty() );
+
+            CPPUNIT_ASSERT( stack.push(1));
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.push(2));
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.push(3));
+            CPPUNIT_ASSERT( !stack.empty() );
+
+            CPPUNIT_ASSERT( stack.pop(v) );
+            CPPUNIT_ASSERT( v == 3 );
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.pop(v) );
+            CPPUNIT_ASSERT( v == 2 );
+            CPPUNIT_ASSERT( !stack.empty() );
+            CPPUNIT_ASSERT( stack.pop(v) );
+            CPPUNIT_ASSERT( v == 1 );
+            CPPUNIT_ASSERT( stack.empty() );
+            v = 1000;
+            CPPUNIT_ASSERT( !stack.pop(v) );
+            CPPUNIT_ASSERT( v == 1000 );
+            CPPUNIT_ASSERT( stack.empty() );
+
+            CPPUNIT_ASSERT( stack.push(10));
+            CPPUNIT_ASSERT( stack.push(20));
+            CPPUNIT_ASSERT( stack.push(30));
+            CPPUNIT_ASSERT( !stack.empty());
+
+#ifdef CDS_EMPLACE_SUPPORT
+            CPPUNIT_ASSERT( stack.emplace(100));
+            CPPUNIT_ASSERT( stack.pop(v));
+            CPPUNIT_ASSERT( v == 100 );
+#endif
+
+            stack.clear();
+            CPPUNIT_ASSERT( stack.empty() );
+
+            Stack::gc::scan();
+        }
+
+        void Treiber_HP();
+        void Treiber_HRC();
+        void Treiber_PTB();
+        void Treiber_HP_yield();
+        void Treiber_HRC_yield();
+        void Treiber_PTB_yield();
+        void Treiber_HP_pause_alloc();
+        void Treiber_HRC_pause_alloc();
+        void Treiber_PTB_pause_alloc();
+
+        void Treiber_HP_relaxed();
+        void Treiber_HRC_relaxed();
+        void Treiber_PTB_relaxed();
+        void Treiber_HP_yield_relaxed();
+        void Treiber_HRC_yield_relaxed();
+        void Treiber_PTB_yield_relaxed();
+        void Treiber_HP_pause_alloc_relaxed();
+        void Treiber_HRC_pause_alloc_relaxed();
+        void Treiber_PTB_pause_alloc_relaxed();
+
+        void Elimination_HP();
+        void Elimination_HP_dyn();
+        void Elimination_HP_stat();
+        void Elimination_HRC();
+        void Elimination_HRC_dyn();
+        void Elimination_HRC_stat();
+        void Elimination_PTB();
+        void Elimination_PTB_dyn();
+        void Elimination_PTB_stat();
+        void Elimination_HP_yield();
+        void Elimination_HRC_yield();
+        void Elimination_PTB_yield();
+        void Elimination_HP_pause_alloc();
+        void Elimination_HRC_pause_alloc();
+        void Elimination_PTB_pause_alloc();
+
+        void Elimination_HP_relaxed();
+        void Elimination_HRC_relaxed();
+        void Elimination_PTB_relaxed();
+        void Elimination_HP_yield_relaxed();
+        void Elimination_HRC_yield_relaxed();
+        void Elimination_PTB_yield_relaxed();
+        void Elimination_HP_pause_alloc_relaxed();
+        void Elimination_HRC_pause_alloc_relaxed();
+        void Elimination_PTB_pause_alloc_relaxed();
+
+        CPPUNIT_TEST_SUITE(TestStack);
+            CPPUNIT_TEST(Treiber_HP)
+            CPPUNIT_TEST(Treiber_HP_relaxed)
+            CPPUNIT_TEST(Treiber_HRC)
+            CPPUNIT_TEST(Treiber_HRC_relaxed)
+            CPPUNIT_TEST(Treiber_PTB)
+            CPPUNIT_TEST(Treiber_PTB_relaxed)
+            CPPUNIT_TEST(Treiber_HP_yield)
+            CPPUNIT_TEST(Treiber_HP_yield_relaxed)
+            CPPUNIT_TEST(Treiber_HRC_yield)
+            CPPUNIT_TEST(Treiber_HRC_yield_relaxed)
+            CPPUNIT_TEST(Treiber_PTB_yield)
+            CPPUNIT_TEST(Treiber_PTB_yield_relaxed)
+            CPPUNIT_TEST(Treiber_HP_pause_alloc)
+            CPPUNIT_TEST(Treiber_HP_pause_alloc_relaxed)
+            CPPUNIT_TEST(Treiber_HRC_pause_alloc)
+            CPPUNIT_TEST(Treiber_HRC_pause_alloc_relaxed)
+            CPPUNIT_TEST(Treiber_PTB_pause_alloc)
+            CPPUNIT_TEST(Treiber_PTB_pause_alloc_relaxed)
+
+            CPPUNIT_TEST(Elimination_HP)
+            CPPUNIT_TEST(Elimination_HP_dyn)
+            CPPUNIT_TEST(Elimination_HP_stat)
+            CPPUNIT_TEST(Elimination_HP_relaxed)
+            CPPUNIT_TEST(Elimination_HRC)
+            CPPUNIT_TEST(Elimination_HRC_dyn)
+            CPPUNIT_TEST(Elimination_HRC_stat)
+            CPPUNIT_TEST(Elimination_HRC_relaxed)
+            CPPUNIT_TEST(Elimination_PTB)
+            CPPUNIT_TEST(Elimination_PTB_dyn)
+            CPPUNIT_TEST(Elimination_PTB_stat)
+            CPPUNIT_TEST(Elimination_PTB_relaxed)
+            CPPUNIT_TEST(Elimination_HP_yield)
+            CPPUNIT_TEST(Elimination_HP_yield_relaxed)
+            CPPUNIT_TEST(Elimination_HRC_yield)
+            CPPUNIT_TEST(Elimination_HRC_yield_relaxed)
+            CPPUNIT_TEST(Elimination_PTB_yield)
+            CPPUNIT_TEST(Elimination_PTB_yield_relaxed)
+            CPPUNIT_TEST(Elimination_HP_pause_alloc)
+            CPPUNIT_TEST(Elimination_HP_pause_alloc_relaxed)
+            CPPUNIT_TEST(Elimination_HRC_pause_alloc)
+            CPPUNIT_TEST(Elimination_HRC_pause_alloc_relaxed)
+            CPPUNIT_TEST(Elimination_PTB_pause_alloc)
+            CPPUNIT_TEST(Elimination_PTB_pause_alloc_relaxed)
+        CPPUNIT_TEST_SUITE_END();
+    };
+}   // namespace stack
+
diff --git a/tests/test-hdr/stack/hdr_treiber_stack_hp.cpp b/tests/test-hdr/stack/hdr_treiber_stack_hp.cpp
new file mode 100644 (file)
index 0000000..cbd4a42
--- /dev/null
@@ -0,0 +1,42 @@
+//$$CDS-header$$
+
+#include "hdr_treiber_stack.h"
+#include <cds/gc/hp.h>
+#include <cds/container/treiber_stack.h>
+
+
+namespace stack {
+#define TEST(X)     void TestStack::X() { test<defs::X>(); }
+    namespace cs = cds::container;
+
+    namespace defs { namespace {
+
+        typedef cs::TreiberStack< cds::gc::HP, int > Treiber_HP;
+        typedef cs::TreiberStack< cds::gc::HP, int, cds::opt::memory_model<cds::opt::v::relaxed_ordering> > Treiber_HP_relaxed;
+        typedef cs::TreiberStack< cds::gc::HP, int, cds::opt::back_off< cds::backoff::yield> > Treiber_HP_yield;
+        typedef cs::TreiberStack< cds::gc::HP, int
+            , cds::opt::back_off< cds::backoff::yield>
+            , cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Treiber_HP_yield_relaxed;
+
+        typedef cs::TreiberStack< cds::gc::HP, int
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::allocator< std::allocator< bool * > >
+        > Treiber_HP_pause_alloc;
+
+        typedef cs::TreiberStack< cds::gc::HP, int
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+            ,cds::opt::allocator< std::allocator< unsigned long > >
+        > Treiber_HP_pause_alloc_relaxed;
+    }}
+
+    TEST(Treiber_HP)
+    TEST(Treiber_HP_yield)
+    TEST(Treiber_HP_pause_alloc)
+
+    TEST(Treiber_HP_relaxed)
+    TEST(Treiber_HP_yield_relaxed)
+    TEST(Treiber_HP_pause_alloc_relaxed)
+}
+CPPUNIT_TEST_SUITE_REGISTRATION(stack::TestStack);
diff --git a/tests/test-hdr/stack/hdr_treiber_stack_hrc.cpp b/tests/test-hdr/stack/hdr_treiber_stack_hrc.cpp
new file mode 100644 (file)
index 0000000..5914567
--- /dev/null
@@ -0,0 +1,41 @@
+//$$CDS-header$$
+
+#include "hdr_treiber_stack.h"
+#include <cds/gc/hrc.h>
+#include <cds/container/treiber_stack.h>
+
+namespace stack {
+#define TEST(X)     void TestStack::X() { test<defs::X>(); }
+    namespace cs = cds::container;
+
+    namespace defs { namespace {
+
+        typedef cs::TreiberStack< cds::gc::HRC, int > Treiber_HRC;
+        typedef cs::TreiberStack< cds::gc::HRC, int, cds::opt::memory_model<cds::opt::v::relaxed_ordering> > Treiber_HRC_relaxed;
+
+        typedef cs::TreiberStack< cds::gc::HRC, int, cds::opt::back_off< cds::backoff::yield> > Treiber_HRC_yield;
+        typedef cs::TreiberStack< cds::gc::HRC, int
+            ,cds::opt::back_off< cds::backoff::yield>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Treiber_HRC_yield_relaxed;
+
+        typedef cs::TreiberStack< cds::gc::HRC, int
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::allocator< std::allocator< bool * > >
+        > Treiber_HRC_pause_alloc;
+
+        typedef cs::TreiberStack< cds::gc::HRC, int
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+            ,cds::opt::allocator< std::allocator< bool * > >
+        > Treiber_HRC_pause_alloc_relaxed;
+    }}
+
+    TEST(Treiber_HRC)
+    TEST(Treiber_HRC_yield)
+    TEST(Treiber_HRC_pause_alloc)
+
+    TEST(Treiber_HRC_relaxed)
+    TEST(Treiber_HRC_yield_relaxed)
+    TEST(Treiber_HRC_pause_alloc_relaxed)
+}
diff --git a/tests/test-hdr/stack/hdr_treiber_stack_ptb.cpp b/tests/test-hdr/stack/hdr_treiber_stack_ptb.cpp
new file mode 100644 (file)
index 0000000..7947834
--- /dev/null
@@ -0,0 +1,42 @@
+//$$CDS-header$$
+
+#include "hdr_treiber_stack.h"
+#include <cds/gc/ptb.h>
+#include <cds/container/treiber_stack.h>
+
+namespace stack {
+#define TEST(X)     void TestStack::X() { test<defs::X>(); }
+    namespace cs = cds::container;
+
+    namespace defs { namespace {
+
+        typedef cs::TreiberStack< cds::gc::PTB, int > Treiber_PTB;
+        typedef cs::TreiberStack< cds::gc::PTB, int, cds::opt::memory_model<cds::opt::v::relaxed_ordering> > Treiber_PTB_relaxed;
+
+        typedef cs::TreiberStack< cds::gc::PTB, int, cds::opt::back_off< cds::backoff::yield> > Treiber_PTB_yield;
+        typedef cs::TreiberStack< cds::gc::PTB, int
+            ,cds::opt::back_off< cds::backoff::yield>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Treiber_PTB_yield_relaxed;
+
+        typedef cs::TreiberStack< cds::gc::PTB, int
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::allocator< std::allocator< bool * > >
+        > Treiber_PTB_pause_alloc;
+
+        typedef cs::TreiberStack< cds::gc::PTB, int
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+            ,cds::opt::back_off< cds::backoff::pause>
+            ,cds::opt::allocator< std::allocator< bool * > >
+        > Treiber_PTB_pause_alloc_relaxed;
+    }}
+
+    TEST(Treiber_PTB)
+    TEST(Treiber_PTB_yield)
+    TEST(Treiber_PTB_pause_alloc)
+
+    TEST(Treiber_PTB_relaxed)
+    TEST(Treiber_PTB_yield_relaxed)
+    TEST(Treiber_PTB_pause_alloc_relaxed)
+
+}
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_map.h b/tests/test-hdr/tree/hdr_ellenbintree_map.h
new file mode 100644 (file)
index 0000000..c122746
--- /dev/null
@@ -0,0 +1,706 @@
+//$$CDS-header$$
+
+#ifndef CDSHDRTEST_ELLENBINTREE_MAP_H
+#define CDSHDRTEST_ELLENBINTREE_MAP_H
+
+#include "cppunit/cppunit_proxy.h"
+#include "size_check.h"
+#include <cds/ref.h>
+#include <algorithm>
+
+namespace tree {
+    using misc::check_size;
+
+    class EllenBinTreeMapHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        typedef int     key_type;
+
+        struct stat_data {
+            size_t  nInsertFuncCall;
+            size_t  nEnsureExistFuncCall;
+            size_t  nEnsureNewFuncCall;
+            size_t  nEraseFuncCall;
+            size_t  nFindFuncCall;
+            size_t  nFindConstFuncCall;
+
+            stat_data()
+                : nInsertFuncCall(0)
+                , nEnsureExistFuncCall(0)
+                , nEnsureNewFuncCall(0)
+                , nEraseFuncCall(0)
+                , nFindFuncCall(0)
+                , nFindConstFuncCall(0)
+            {}
+        };
+
+        struct value_type: public stat_data
+        {
+            int         nVal;
+
+            value_type()
+                : nVal(0)
+            {}
+
+            value_type( int v )
+                : nVal( v )
+            {}
+
+            value_type( value_type const& v )
+                : nVal( v.nVal )
+            {}
+
+#ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            value_type( value_type&& v )
+                : nVal( v.nVal )
+            {}
+#endif
+
+            value_type& operator=( int n )
+            {
+                nVal = n;
+                return *this;
+            }
+
+            value_type& operator=( value_type const& v )
+            {
+                nVal = v.nVal;
+                return *this;
+            }
+        };
+
+        typedef std::pair<key_type const, value_type> pair_type;
+
+        struct less {
+            bool operator()( int k1, int k2 ) const
+            {
+                return k1 < k2;
+            }
+        };
+
+        struct compare {
+            int cmp( int k1, int k2 ) const
+            {
+                return k1 < k2 ? -1 : (k1 > k2 ? 1 : 0);
+            }
+            int operator()( int k1, int k2 ) const
+            {
+                return cmp( k1, k2 );
+            }
+        };
+
+        struct wrapped_int {
+            int  nKey;
+
+            wrapped_int( int n )
+                : nKey(n)
+            {}
+        };
+
+        struct wrapped_less
+        {
+            bool operator()( wrapped_int const& w, int n ) const
+            {
+                return w.nKey < n;
+            }
+            bool operator()( int n, wrapped_int const& w ) const
+            {
+                return n < w.nKey;
+            }
+            /*
+            template <typename T>
+            bool operator()( wrapped_int const& w, T const& v ) const
+            {
+                return w.nKey < v.nKey;
+            }
+            template <typename T>
+            bool operator()( T const& v, wrapped_int const& w ) const
+            {
+                return v.nKey < w.nKey;
+            }
+            */
+        };
+
+    protected:
+        template <typename Map>
+        struct insert_functor
+        {
+            typedef typename Map::value_type pair_type;
+
+            // insert ftor
+            void operator()( pair_type& item )
+            {
+                item.second.nVal = item.first * 3;
+            }
+
+            // ensure ftor
+            void operator()( bool bNew, pair_type& item )
+            {
+                if ( bNew )
+                    item.second.nVal = item.first * 2;
+                else
+                    item.second.nVal = item.first * 5;
+            }
+        };
+
+        struct check_value {
+            int     m_nExpected;
+
+            check_value( int nExpected )
+                : m_nExpected( nExpected )
+            {}
+
+            template <typename T>
+            void operator ()( T& pair )
+            {
+                CPPUNIT_ASSERT_CURRENT( pair.second.nVal == m_nExpected );
+            }
+            template <typename T, typename Q>
+            void operator ()( T& pair, Q )
+            {
+                CPPUNIT_ASSERT_CURRENT( pair.second.nVal == m_nExpected );
+            }
+        };
+
+        struct extract_functor
+        {
+            int *   m_pVal;
+            void operator()( pair_type const& val )
+            {
+                *m_pVal = val.second.nVal;
+            }
+        };
+
+    protected:
+        static const size_t c_nItemCount = 10000;
+
+        class data_array
+        {
+            int *     pFirst;
+            int *     pLast;
+
+        public:
+            data_array()
+                : pFirst( new int[c_nItemCount] )
+                , pLast( pFirst + c_nItemCount )
+            {
+                int i = 0;
+                for ( int * p = pFirst; p != pLast; ++p, ++i )
+                    *p = i;
+
+                std::random_shuffle( pFirst, pLast );
+            }
+
+            ~data_array()
+            {
+                delete [] pFirst;
+            }
+
+            int operator[]( size_t i ) const
+            {
+                assert( i < size_t(pLast - pFirst) );
+                return pFirst[i];
+            }
+        };
+
+        struct extract_functor2
+        {
+            int nKey;
+
+            template <typename Q>
+            void operator()( Q&, pair_type& v )
+            {
+                nKey = v.first;
+            }
+        };
+
+
+    protected:
+
+        template <class Map>
+        void test_with( Map& m )
+        {
+            std::pair<bool, bool> ensureResult;
+
+            // insert
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+            CPPUNIT_ASSERT( !m.find(25) );
+            CPPUNIT_ASSERT( m.insert( 25 ) )    ;   // value = 0
+            CPPUNIT_ASSERT( m.find(25) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 1 ));
+            CPPUNIT_ASSERT( m.find(25) );
+
+            CPPUNIT_ASSERT( !m.insert( 25 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 1 ));
+
+            CPPUNIT_ASSERT( !m.find_with(10, less()) );
+            CPPUNIT_ASSERT( m.insert( 10, 10 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+            CPPUNIT_ASSERT( m.find_with(10, less()) );
+
+            CPPUNIT_ASSERT( !m.insert( 10, 20 ) );
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+
+            CPPUNIT_ASSERT( !m.find(30) );
+            CPPUNIT_ASSERT( m.insert_key( 30, insert_functor<Map>() ) )    ; // value = 90
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( m.find(30) );
+
+            CPPUNIT_ASSERT( !m.insert_key( 10, insert_functor<Map>() ) );
+            CPPUNIT_ASSERT( !m.insert_key( 25, insert_functor<Map>() ) );
+            CPPUNIT_ASSERT( !m.insert_key( 30, insert_functor<Map>() ) );
+
+            // ensure (new key)
+            CPPUNIT_ASSERT( !m.find(27) );
+            ensureResult = m.ensure( 27, insert_functor<Map>() ) ;   // value = 54
+            CPPUNIT_ASSERT( ensureResult.first );
+            CPPUNIT_ASSERT( ensureResult.second );
+            CPPUNIT_ASSERT( m.find(27) );
+
+            // find test
+            check_value chk(10);
+            CPPUNIT_ASSERT( m.find( 10, cds::ref(chk) ));
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find_with( 25, less(), boost::ref(chk) ));
+            chk.m_nExpected = 90;
+            CPPUNIT_ASSERT( m.find( 30, boost::ref(chk) ));
+            chk.m_nExpected = 54;
+            CPPUNIT_ASSERT( m.find( 27, boost::ref(chk) ));
+
+            ensureResult = m.ensure( 10, insert_functor<Map>() ) ;   // value = 50
+            CPPUNIT_ASSERT( ensureResult.first );
+            CPPUNIT_ASSERT( !ensureResult.second );
+            chk.m_nExpected = 50;
+            CPPUNIT_ASSERT( m.find( 10, boost::ref(chk) ));
+
+            // erase test
+            CPPUNIT_ASSERT( !m.find(100) );
+            CPPUNIT_ASSERT( !m.erase( 100 )) ;  // not found
+
+            CPPUNIT_ASSERT( m.find(25) );
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.erase( 25 ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( !m.find(25) );
+            CPPUNIT_ASSERT( !m.erase( 25 ));
+
+            CPPUNIT_ASSERT( !m.find(258) );
+            CPPUNIT_ASSERT( m.insert(258))
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.find_with(258, less()) );
+            CPPUNIT_ASSERT( m.erase_with( 258, less() ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( !m.find(258) );
+            CPPUNIT_ASSERT( !m.erase_with( 258, less() ));
+
+            int nVal;
+            extract_functor ext;
+            ext.m_pVal = &nVal;
+
+            CPPUNIT_ASSERT( !m.find(29) );
+            CPPUNIT_ASSERT( m.insert(29, 290));
+            CPPUNIT_ASSERT( check_size( m, 4 ));
+            CPPUNIT_ASSERT( m.erase_with( 29, less(), boost::ref(ext)));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+            CPPUNIT_ASSERT( nVal == 290 );
+            nVal = -1;
+            CPPUNIT_ASSERT( !m.erase_with( 29, less(), boost::ref(ext)));
+            CPPUNIT_ASSERT( nVal == -1 );
+
+            CPPUNIT_ASSERT( m.erase( 30, boost::ref(ext)));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 2 ));
+            CPPUNIT_ASSERT( nVal == 90 );
+            nVal = -1;
+            CPPUNIT_ASSERT( !m.erase( 30, boost::ref(ext)));
+            CPPUNIT_ASSERT( nVal == -1 );
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            CPPUNIT_ASSERT( m.emplace(126) ) ; // key = 126, val = 0
+            CPPUNIT_ASSERT( m.emplace(137, 731))    ;   // key = 137, val = 731
+            CPPUNIT_ASSERT( m.emplace( 149, value_type(941) ))   ;   // key = 149, val = 941
+
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find( 126, cds::ref(chk) ));
+            chk.m_nExpected = 731;
+            CPPUNIT_ASSERT( m.find_with( 137, less(), cds::ref(chk) ));
+            chk.m_nExpected = 941;
+            CPPUNIT_ASSERT( m.find( 149, cds::ref(chk) ));
+
+            CPPUNIT_ASSERT( !m.emplace(126, 621)) ; // already in map
+            chk.m_nExpected = 0;
+            CPPUNIT_ASSERT( m.find( 126, cds::ref(chk) ));
+            CPPUNIT_ASSERT( !m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 3 ));
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+#       endif
+        }
+
+        template <typename Map>
+        void fill_map( Map& s, data_array& a )
+        {
+            CPPUNIT_ASSERT( s.empty() );
+            for ( size_t i = 0; i < c_nItemCount; ++i ) {
+                CPPUNIT_ASSERT( s.insert( a[i] ));
+            }
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, c_nItemCount ));
+        }
+
+        template <class Map, class PrintStat>
+        void test()
+        {
+            typedef Map map_type;
+
+            map_type m;
+
+            test_with( m );
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+            // extract min/max
+            {
+                typename map_type::guarded_ptr gp;
+
+                data_array arr;
+                fill_map( m, arr );
+
+                int i = 0;
+                std::pair<key_type, value_type> v;
+                while ( !m.empty() ) {
+                    CPPUNIT_ASSERT( m.extract_min( gp ) );
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( gp->first == i );
+                    ++i;
+                    gp.release();
+                }
+                CPPUNIT_ASSERT( m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 0 ));
+
+
+                fill_map( m, arr );
+                i = (int) c_nItemCount - 1;
+                while ( !m.empty() ) {
+                    CPPUNIT_ASSERT( m.extract_max( gp ) );
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( gp->first == i );
+                    --i;
+                    gp.release();
+                }
+                CPPUNIT_ASSERT( m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 0 ));
+
+                fill_map( m, arr );
+                for ( int i = 0; i < static_cast<int>( c_nItemCount ); ++i ) {
+                    int nKey = arr[i];
+                    CPPUNIT_ASSERT( m.get( gp, nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+
+                    gp.release();
+                    CPPUNIT_ASSERT( m.extract( gp, nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+
+                    gp.release();
+                    CPPUNIT_CHECK( !m.get( gp, nKey ));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !m.extract( gp, nKey ));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 0 ));
+
+                fill_map( m, arr );
+                for ( int i = 0; i < static_cast<int>( c_nItemCount ); ++i ) {
+                    int nKey = arr[i];
+                    CPPUNIT_ASSERT( m.get_with( gp, wrapped_int(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+
+                    gp.release();
+                    CPPUNIT_ASSERT( m.extract_with( gp, wrapped_int(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->first == nKey );
+
+                    gp.release();
+                    CPPUNIT_CHECK( !m.get_with( gp, wrapped_int(nKey), wrapped_less() ));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !m.extract_with( gp, wrapped_int(nKey), wrapped_less() ));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+
+                CPPUNIT_ASSERT( m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 0 ));
+            }
+
+            PrintStat()( m );
+        }
+
+        template <class Map, class PrintStat>
+        void test_rcu()
+        {
+            typedef Map map_type;
+
+            map_type m;
+
+            test_with( m );
+
+            m.clear();
+            CPPUNIT_ASSERT( m.empty() );
+            CPPUNIT_ASSERT( check_size( m, 0 ));
+
+            // extract min/max
+            {
+                typename map_type::exempt_ptr ep;
+                data_array arr;
+                fill_map( m, arr );
+
+                int i = 0;
+                while ( !m.empty() ) {
+                    CPPUNIT_ASSERT( m.extract_min( ep ) );
+                    CPPUNIT_ASSERT( !ep.empty());
+                    CPPUNIT_ASSERT(ep->first == i );
+                    ++i;
+                    ep.release();
+                }
+                CPPUNIT_ASSERT( m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 0 ));
+                CPPUNIT_ASSERT( !m.extract_min( ep ) );
+                CPPUNIT_ASSERT( ep.empty());
+
+                fill_map( m, arr );
+                i = (int) c_nItemCount - 1;
+                while ( !m.empty() ) {
+                    CPPUNIT_ASSERT( m.extract_max( ep ) );
+                    CPPUNIT_ASSERT( !ep.empty());
+                    CPPUNIT_ASSERT( ep->first == i );
+                    --i;
+                    ep.release();
+                }
+                CPPUNIT_ASSERT( m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 0 ));
+                CPPUNIT_ASSERT( !m.extract_max( ep ) );
+                CPPUNIT_ASSERT( ep.empty());
+
+                fill_map( m, arr );
+                for ( size_t i = 0; i < c_nItemCount; ++i ) {
+                    int nKey = arr[i];
+                    {
+                        typename map_type::rcu_lock l;
+                        typename map_type::value_type * pVal = m.get(nKey);
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->first == nKey);
+                    }
+                    CPPUNIT_ASSERT( m.extract( ep, nKey ));
+                    CPPUNIT_ASSERT( !ep.empty());
+                    CPPUNIT_CHECK( ep->first == nKey);
+                    ep.release();
+
+                    CPPUNIT_ASSERT( !m.extract( ep, nKey ));
+                    CPPUNIT_ASSERT( ep.empty());
+                    {
+                        typename map_type::rcu_lock l;
+                        CPPUNIT_CHECK( !m.get(nKey));
+                    }
+                }
+                CPPUNIT_ASSERT( m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 0 ));
+
+                fill_map( m, arr );
+                for ( size_t i = 0; i < c_nItemCount; ++i ) {
+                    int nKey = arr[i];
+                    {
+                        typename map_type::rcu_lock l;
+                        typename map_type::value_type * pVal = m.get_with(wrapped_int(nKey), wrapped_less());
+                        CPPUNIT_ASSERT( pVal != NULL );
+                        CPPUNIT_CHECK( pVal->first == nKey);
+                    }
+                    CPPUNIT_ASSERT( m.extract_with( ep, wrapped_int(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !ep.empty());
+                    CPPUNIT_CHECK( ep->first == nKey);
+                    ep.release();
+
+                    CPPUNIT_ASSERT( !m.extract_with( ep, wrapped_int(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( ep.empty());
+                    {
+                        typename map_type::rcu_lock l;
+                        CPPUNIT_CHECK( !m.get_with(wrapped_int(nKey), wrapped_less()));
+                    }
+                }
+                CPPUNIT_ASSERT( m.empty() );
+                CPPUNIT_ASSERT( check_size( m, 0 ));
+            }
+
+            PrintStat()( m );
+        }
+
+        void EllenBinTree_rcu_gpi_less();
+        void EllenBinTree_rcu_gpi_cmp();
+        void EllenBinTree_rcu_gpi_cmpless();
+        void EllenBinTree_rcu_gpi_less_ic();
+        void EllenBinTree_rcu_gpi_cmp_ic();
+        void EllenBinTree_rcu_gpi_less_stat();
+        void EllenBinTree_rcu_gpi_cmp_ic_stat();
+        void EllenBinTree_rcu_gpi_less_pool();
+        void EllenBinTree_rcu_gpi_less_pool_ic_stat();
+
+        void EllenBinTree_hp_less();
+        void EllenBinTree_hp_cmp();
+        void EllenBinTree_hp_cmpless();
+        void EllenBinTree_hp_less_ic();
+        void EllenBinTree_hp_cmp_ic();
+        void EllenBinTree_hp_less_stat();
+        void EllenBinTree_hp_cmp_ic_stat();
+        void EllenBinTree_hp_less_pool();
+        void EllenBinTree_hp_less_pool_ic_stat();
+
+        void EllenBinTree_ptb_less();
+        void EllenBinTree_ptb_cmp();
+        void EllenBinTree_ptb_cmpless();
+        void EllenBinTree_ptb_less_ic();
+        void EllenBinTree_ptb_cmp_ic();
+        void EllenBinTree_ptb_less_stat();
+        void EllenBinTree_ptb_cmp_ic_stat();
+        void EllenBinTree_ptb_less_pool();
+        void EllenBinTree_ptb_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_gpb_less();
+        void EllenBinTree_rcu_gpb_cmp();
+        void EllenBinTree_rcu_gpb_cmpless();
+        void EllenBinTree_rcu_gpb_less_ic();
+        void EllenBinTree_rcu_gpb_cmp_ic();
+        void EllenBinTree_rcu_gpb_less_stat();
+        void EllenBinTree_rcu_gpb_cmp_ic_stat();
+        void EllenBinTree_rcu_gpb_less_pool();
+        void EllenBinTree_rcu_gpb_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_gpt_less();
+        void EllenBinTree_rcu_gpt_cmp();
+        void EllenBinTree_rcu_gpt_cmpless();
+        void EllenBinTree_rcu_gpt_less_ic();
+        void EllenBinTree_rcu_gpt_cmp_ic();
+        void EllenBinTree_rcu_gpt_less_stat();
+        void EllenBinTree_rcu_gpt_cmp_ic_stat();
+        void EllenBinTree_rcu_gpt_less_pool();
+        void EllenBinTree_rcu_gpt_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_shb_less();
+        void EllenBinTree_rcu_shb_cmp();
+        void EllenBinTree_rcu_shb_cmpless();
+        void EllenBinTree_rcu_shb_less_ic();
+        void EllenBinTree_rcu_shb_cmp_ic();
+        void EllenBinTree_rcu_shb_less_stat();
+        void EllenBinTree_rcu_shb_cmp_ic_stat();
+        void EllenBinTree_rcu_shb_less_pool();
+        void EllenBinTree_rcu_shb_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_sht_less();
+        void EllenBinTree_rcu_sht_cmp();
+        void EllenBinTree_rcu_sht_cmpless();
+        void EllenBinTree_rcu_sht_less_ic();
+        void EllenBinTree_rcu_sht_cmp_ic();
+        void EllenBinTree_rcu_sht_less_stat();
+        void EllenBinTree_rcu_sht_cmp_ic_stat();
+        void EllenBinTree_rcu_sht_less_pool();
+        void EllenBinTree_rcu_sht_less_pool_ic_stat();
+
+        CPPUNIT_TEST_SUITE(EllenBinTreeMapHdrTest)
+            CPPUNIT_TEST(EllenBinTree_hp_less)
+            CPPUNIT_TEST(EllenBinTree_hp_cmp)
+            CPPUNIT_TEST(EllenBinTree_hp_less_stat)
+            CPPUNIT_TEST(EllenBinTree_hp_cmpless)
+            CPPUNIT_TEST(EllenBinTree_hp_less_ic)
+            CPPUNIT_TEST(EllenBinTree_hp_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_hp_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_hp_less_pool)
+            CPPUNIT_TEST(EllenBinTree_hp_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_ptb_less)
+            CPPUNIT_TEST(EllenBinTree_ptb_cmp)
+            CPPUNIT_TEST(EllenBinTree_ptb_less_stat)
+            CPPUNIT_TEST(EllenBinTree_ptb_cmpless)
+            CPPUNIT_TEST(EllenBinTree_ptb_less_ic)
+            CPPUNIT_TEST(EllenBinTree_ptb_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_ptb_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_ptb_less_pool)
+            CPPUNIT_TEST(EllenBinTree_ptb_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_less_pool_ic_stat)
+
+            CPPUNIT_TEST_SUITE_END()
+
+    };
+} // namespace tree
+
+#endif // #ifndef CDSHDRTEST_ELLENBINTREE_MAP_H
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_map_hp.cpp b/tests/test-hdr/tree/hdr_ellenbintree_map_hp.cpp
new file mode 100644 (file)
index 0000000..4b27b8f
--- /dev/null
@@ -0,0 +1,140 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_map.h"
+#include <cds/container/ellen_bintree_map_hp.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_hp.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::gc::HP gc_type;
+
+        typedef cc::ellen_bintree::map_node<gc_type, EllenBinTreeMapHdrTest::key_type, EllenBinTreeMapHdrTest::value_type> tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeMapHdrTest::key_type, tree_leaf_node >                        tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                                          tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_hp_less()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_hp_cmp()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_hp_cmpless()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_hp_less_ic()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_hp_cmp_ic()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_hp_less_stat()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_hp_cmp_ic_stat()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_hp_less_pool()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_hp::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_hp::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_hp_less_pool_ic_stat()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_hp::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_hp::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_map_ptb.cpp b/tests/test-hdr/tree/hdr_ellenbintree_map_ptb.cpp
new file mode 100644 (file)
index 0000000..d05f06b
--- /dev/null
@@ -0,0 +1,140 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_map.h"
+#include <cds/container/ellen_bintree_map_ptb.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_ptb.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::gc::PTB gc_type;
+
+        typedef cc::ellen_bintree::map_node<gc_type, EllenBinTreeMapHdrTest::key_type, EllenBinTreeMapHdrTest::value_type> tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeMapHdrTest::key_type, tree_leaf_node >                        tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                                          tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_ptb_less()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_ptb_cmp()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_ptb_cmpless()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_ptb_less_ic()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_ptb_cmp_ic()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_ptb_less_stat()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_ptb_cmp_ic_stat()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_ptb_less_pool()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_ptb::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_ptb::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_ptb_less_pool_ic_stat()
+    {
+        typedef cc::EllenBinTreeMap< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_ptb::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_ptb::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpb.cpp b/tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..f72e610
--- /dev/null
@@ -0,0 +1,141 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_map.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/ellen_bintree_map_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        typedef cc::ellen_bintree::map_node<rcu_type, EllenBinTreeMapHdrTest::key_type, EllenBinTreeMapHdrTest::value_type> tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeMapHdrTest::key_type, tree_leaf_node >                        tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                                          tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpb_less()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpb_cmp()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpb_cmpless()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpb_less_ic()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpb_cmp_ic()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpb_less_stat()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpb_cmp_ic_stat()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpb_less_pool()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpb_less_pool_ic_stat()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpi.cpp b/tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..2f308aa
--- /dev/null
@@ -0,0 +1,141 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_map.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/ellen_bintree_map_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        typedef cc::ellen_bintree::map_node<rcu_type, EllenBinTreeMapHdrTest::key_type, EllenBinTreeMapHdrTest::value_type> tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeMapHdrTest::key_type, tree_leaf_node >                        tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                                          tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpi_less()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpi_cmp()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpi_cmpless()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpi_less_ic()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpi_cmp_ic()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpi_less_stat()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpi_cmp_ic_stat()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpi_less_pool()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpi_less_pool_ic_stat()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpt.cpp b/tests/test-hdr/tree/hdr_ellenbintree_map_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..5b9b1f4
--- /dev/null
@@ -0,0 +1,141 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_map.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/ellen_bintree_map_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+
+        typedef cc::ellen_bintree::map_node<rcu_type, EllenBinTreeMapHdrTest::key_type, EllenBinTreeMapHdrTest::value_type> tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeMapHdrTest::key_type, tree_leaf_node >                        tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                                          tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpt_less()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpt_cmp()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpt_cmpless()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpt_less_ic()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpt_cmp_ic()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpt_less_stat()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpt_cmp_ic_stat()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpt_less_pool()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_gpt_less_pool_ic_stat()
+    {
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_map_rcu_shb.cpp b/tests/test-hdr/tree/hdr_ellenbintree_map_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..b10a47e
--- /dev/null
@@ -0,0 +1,160 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_map.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/ellen_bintree_map_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+
+        typedef cc::ellen_bintree::map_node<rcu_type, EllenBinTreeMapHdrTest::key_type, EllenBinTreeMapHdrTest::value_type> tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeMapHdrTest::key_type, tree_leaf_node >                        tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                                          tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+    }
+#endif
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_shb_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_shb_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_shb_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_shb_less_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_shb_cmp_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_shb_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_shb_cmp_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_shb_less_pool()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_shb_less_pool_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_map_rcu_sht.cpp b/tests/test-hdr/tree/hdr_ellenbintree_map_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..fb3f21c
--- /dev/null
@@ -0,0 +1,160 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_map.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/ellen_bintree_map_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+
+        typedef cc::ellen_bintree::map_node<rcu_type, EllenBinTreeMapHdrTest::key_type, EllenBinTreeMapHdrTest::value_type> tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeMapHdrTest::key_type, tree_leaf_node >                        tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                                          tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+    }
+#endif
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_sht_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_sht_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_sht_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_sht_less_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_sht_cmp_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_sht_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_sht_cmp_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_sht_less_pool()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeMapHdrTest::EllenBinTree_rcu_sht_less_pool_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeMap< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_map_traits<
+                co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_set.h b/tests/test-hdr/tree/hdr_ellenbintree_set.h
new file mode 100644 (file)
index 0000000..08e4f92
--- /dev/null
@@ -0,0 +1,802 @@
+//$$CDS-header$$
+
+#ifndef CDSHDRTEST_ELLENBINTREE_SET_H
+#define CDSHDRTEST_ELLENBINTREE_SET_H
+
+#include "cppunit/cppunit_proxy.h"
+#include "size_check.h"
+#include <cds/ref.h>
+#include <algorithm>
+
+namespace tree {
+    using misc::check_size;
+
+    class EllenBinTreeSetHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        typedef int     key_type;
+
+        struct stat_data {
+            size_t  nInsertFuncCall;
+            size_t  nEnsureExistFuncCall;
+            size_t  nEnsureNewFuncCall;
+            size_t  nEraseFuncCall;
+            size_t  nFindFuncCall;
+            size_t  nFindConstFuncCall;
+
+            stat_data()
+                : nInsertFuncCall(0)
+                , nEnsureExistFuncCall(0)
+                , nEnsureNewFuncCall(0)
+                , nEraseFuncCall(0)
+                , nFindFuncCall(0)
+                , nFindConstFuncCall(0)
+            {}
+        };
+
+        struct value_type {
+            key_type    nKey;
+            int         nVal;
+
+            stat_data   stat;
+
+            value_type()
+            {}
+
+            value_type( int key )
+                : nKey( key )
+                , nVal( key * 10 )
+            {}
+
+            value_type( int key, int v )
+                : nKey( key )
+                , nVal( v )
+            {}
+
+            value_type( std::pair<int,int> const& p )
+                : nKey( p.first )
+                , nVal( p.second )
+            {}
+        };
+
+        struct key_extractor {
+            void operator()( key_type& dest, value_type const& src ) const
+            {
+                dest = src.nKey;
+            }
+        };
+
+        struct less {
+            bool operator()( int k1, int k2 ) const
+            {
+                return k1 < k2;
+            }
+            bool operator()( value_type const& v1, value_type const& v2 ) const
+            {
+                return v1.nKey < v2.nKey;
+            }
+            bool operator()( value_type const& v, int k ) const
+            {
+                return v.nKey < k;
+            }
+            bool operator()( int k, value_type const& v ) const
+            {
+                return k < v.nKey;
+            }
+            bool operator()( std::pair<int,int> const& p, value_type& v ) const
+            {
+                return p.first < v.nKey;
+            }
+            bool operator()( value_type& v, std::pair<int,int> const& p ) const
+            {
+                return v.nKey < p.first;
+            }
+            bool operator()( std::pair<int,int> const& p, int v ) const
+            {
+                return p.first < v;
+            }
+            bool operator()( int v, std::pair<int,int> const& p ) const
+            {
+                return v < p.first;
+            }
+        };
+
+        struct compare {
+            int cmp( int k1, int k2 ) const
+            {
+                return k1 < k2 ? -1 : (k1 > k2 ? 1 : 0);
+            }
+            int operator()( int k1, int k2 ) const
+            {
+                return cmp( k1, k2 );
+            }
+            int operator()( value_type const& v1, value_type const& v2 ) const
+            {
+                return cmp( v1.nKey, v2.nKey );
+            }
+            int operator()( value_type const& v, int k ) const
+            {
+                return cmp( v.nKey, k );
+            }
+            int operator()( int k, value_type const& v ) const
+            {
+                return cmp( k, v.nKey );
+            }
+            int operator()( std::pair<int,int> const& p, value_type& v ) const
+            {
+                return cmp( p.first, v.nKey );
+            }
+            int operator()( value_type& v, std::pair<int,int> const& p ) const
+            {
+                return cmp( v.nKey, p.first );
+            }
+            int operator()( std::pair<int,int> const& p, int v ) const
+            {
+                return cmp( p.first, v );
+            }
+            int operator()( int v, std::pair<int,int> const& p ) const
+            {
+                return cmp( v, p.first );
+            }
+        };
+
+        struct wrapped_int {
+            int  nKey;
+
+            wrapped_int( int n )
+                : nKey(n)
+            {}
+        };
+
+        struct wrapped_less
+        {
+            bool operator()( wrapped_int const& w, int n ) const
+            {
+                return w.nKey < n;
+            }
+            bool operator()( int n, wrapped_int const& w ) const
+            {
+                return n < w.nKey;
+            }
+            template <typename T>
+            bool operator()( wrapped_int const& w, T const& v ) const
+            {
+                return w.nKey < v.nKey;
+            }
+            template <typename T>
+            bool operator()( T const& v, wrapped_int const& w ) const
+            {
+                return v.nKey < w.nKey;
+            }
+        };
+
+    protected:
+        static const size_t c_nItemCount = 10000;
+
+        class data_array
+        {
+            int *     pFirst;
+            int *     pLast;
+
+        public:
+            data_array()
+                : pFirst( new int[c_nItemCount] )
+                , pLast( pFirst + c_nItemCount )
+            {
+                int i = 0;
+                for ( int * p = pFirst; p != pLast; ++p, ++i )
+                    *p = i;
+
+                std::random_shuffle( pFirst, pLast );
+            }
+
+            ~data_array()
+            {
+                delete [] pFirst;
+            }
+
+            int operator[]( size_t i ) const
+            {
+                assert( i < size_t(pLast - pFirst) );
+                return pFirst[i];
+            }
+        };
+
+        struct find_functor
+        {
+            template <typename T>
+            void operator()( value_type& i, T& val )
+            {
+                ++i.stat.nFindFuncCall;
+            }
+            template <typename T>
+            void operator()( value_type& i, T const& val )
+            {
+                ++i.stat.nFindConstFuncCall;
+            }
+        };
+
+        template <typename Item>
+        struct copy_found
+        {
+            Item    m_found;
+
+            template <typename T>
+            void operator()( Item& i, T& /*val*/ )
+            {
+                m_found = i;
+            }
+
+            void operator()( Item const& i )
+            {
+                m_found = i;
+            }
+        };
+
+        struct insert_functor
+        {
+            template <typename Item>
+            void operator()(Item& i )
+            {
+                i.nVal = i.nKey * 100;
+                ++i.stat.nInsertFuncCall;
+            }
+        };
+
+        template <typename Q>
+        static void ensure_func( bool bNew, value_type& i, Q& /*val*/ )
+        {
+            if ( bNew )
+                ++i.stat.nEnsureNewFuncCall;
+            else
+                ++i.stat.nEnsureExistFuncCall;
+        }
+
+        struct ensure_functor
+        {
+            template <typename Q>
+            void operator()( bool bNew, value_type& i, Q& val )
+            {
+                ensure_func( bNew, i, val );
+            }
+        };
+
+        struct extract_functor
+        {
+            int nKey;
+
+            template <typename Q>
+            void operator()( Q&, value_type& v )
+            {
+                nKey = v.nKey;
+            }
+        };
+
+
+    protected:
+        template <class Set>
+        void test_with( Set& s)
+        {
+            value_type itm;
+            int key;
+
+            // insert/find test
+            CPPUNIT_ASSERT( !s.find( 10 ) );
+            CPPUNIT_ASSERT( s.insert( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+            CPPUNIT_ASSERT( s.find( 10 ) );
+
+            CPPUNIT_ASSERT( !s.insert( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            CPPUNIT_ASSERT( !s.find_with( 20, less() ) );
+            CPPUNIT_ASSERT( s.insert( std::make_pair(20, 25) ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( s.find_with( 10, less() ) );
+            CPPUNIT_ASSERT( s.find( key = 20 ) );
+            CPPUNIT_ASSERT( s.find_with( key, less(), find_functor() ) );
+            {
+                copy_found<value_type> f;
+                f.m_found.nKey = 0;
+                key = 20;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+                CPPUNIT_ASSERT( f.m_found.stat.nFindFuncCall == 1 );
+                CPPUNIT_ASSERT( f.m_found.stat.nFindConstFuncCall == 0 );
+            }
+            CPPUNIT_ASSERT( s.find( key, find_functor() ) );
+            {
+                copy_found<value_type> f;
+                f.m_found.nKey = 0;
+                key = 20;
+                CPPUNIT_ASSERT( s.find_with( key, less(), boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+                CPPUNIT_ASSERT( f.m_found.stat.nFindFuncCall == 2 );
+                CPPUNIT_ASSERT( f.m_found.stat.nFindConstFuncCall == 0 );
+            }
+            CPPUNIT_ASSERT( s.find( 20, find_functor() ) );
+            {
+                copy_found<value_type> f;
+                f.m_found.nKey = 0;
+                CPPUNIT_ASSERT( s.find_with( 20, less(), boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+                CPPUNIT_ASSERT( f.m_found.stat.nFindFuncCall == 2 );
+                CPPUNIT_ASSERT( f.m_found.stat.nFindConstFuncCall == 1 );
+            }
+
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( !s.find( 25 ) );
+            CPPUNIT_ASSERT( s.insert( std::make_pair(25, -1), insert_functor() ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            {
+                copy_found<value_type> f;
+                f.m_found.nKey = 0;
+                key = 25;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 25 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 2500 );
+                CPPUNIT_ASSERT( f.m_found.stat.nInsertFuncCall == 1 );
+            }
+
+            // ensure test
+            key = 10;
+            {
+                copy_found<value_type> f;
+                f.m_found.nKey = 0;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 10 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 100 );
+                CPPUNIT_ASSERT( f.m_found.stat.nEnsureExistFuncCall == 0 );
+                CPPUNIT_ASSERT( f.m_found.stat.nEnsureNewFuncCall == 0 );
+            }
+            std::pair<bool, bool> ensureResult = s.ensure( key, ensure_functor() );
+            CPPUNIT_ASSERT( ensureResult.first && !ensureResult.second );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            {
+                copy_found<value_type> f;
+                f.m_found.nKey = 0;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 10 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 100 );
+                CPPUNIT_ASSERT( f.m_found.stat.nEnsureExistFuncCall == 1 );
+                CPPUNIT_ASSERT( f.m_found.stat.nEnsureNewFuncCall == 0 );
+            }
+
+            ensureResult = s.ensure( std::make_pair(13, 1300), ensure_functor() );
+            CPPUNIT_ASSERT( ensureResult.first && ensureResult.second );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 4 ));
+            {
+                copy_found<value_type> f;
+                f.m_found.nKey = 0;
+                key = 13;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 13 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 1300 );
+                CPPUNIT_ASSERT( f.m_found.stat.nEnsureExistFuncCall == 0 );
+                CPPUNIT_ASSERT( f.m_found.stat.nEnsureNewFuncCall == 1 );
+            }
+
+            // erase test
+            CPPUNIT_ASSERT( s.erase(13) );
+            CPPUNIT_ASSERT( !s.find( 13 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+            CPPUNIT_ASSERT( !s.erase(13) );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find( 10 ));
+            CPPUNIT_ASSERT( s.erase_with( 10, less() ));
+            CPPUNIT_ASSERT( !s.find( 10 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+            CPPUNIT_ASSERT( !s.erase_with(10, less()) );
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 2 ));
+
+            CPPUNIT_ASSERT( s.find(20) );
+            {
+                copy_found<value_type> f;
+                f.m_found.nKey = 0;
+                CPPUNIT_ASSERT( s.erase( 20, boost::ref(f) ));
+                CPPUNIT_ASSERT( f.m_found.nKey == 20 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 25 );
+
+                CPPUNIT_ASSERT( s.insert(235))
+                CPPUNIT_ASSERT( s.erase_with( 235, less(), boost::ref(f) ));
+                CPPUNIT_ASSERT( f.m_found.nKey == 235 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 2350 );
+            }
+            CPPUNIT_ASSERT( !s.find( 20 ));
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 1 ));
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+#       ifdef CDS_EMPLACE_SUPPORT
+            // emplace test
+            CPPUNIT_ASSERT( s.emplace( 151 )) ;  // key = 151,  val = 1510
+            CPPUNIT_ASSERT( s.emplace( 174, 471 )) ;    // key = 174, val = 471
+            CPPUNIT_ASSERT( s.emplace( std::make_pair( 190, 91 ) )) ; // key == 190, val = 91
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 3 ));
+
+            CPPUNIT_ASSERT( s.find(151));
+            CPPUNIT_ASSERT( s.find_with(174, less()));
+            CPPUNIT_ASSERT( s.find(190));
+
+            {
+                copy_found<value_type> f;
+                f.m_found.nKey = 0;
+                key = 151;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 151 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 1510 );
+
+                key = 174;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 174 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 471 );
+
+                key = 190;
+                CPPUNIT_ASSERT( s.find( key, boost::ref(f) ) );
+                CPPUNIT_ASSERT( f.m_found.nKey == 190 );
+                CPPUNIT_ASSERT( f.m_found.nVal == 91 );
+            }
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+#       endif
+        }
+
+        template <typename Set>
+        void fill_set( Set& s, data_array& a )
+        {
+            CPPUNIT_ASSERT( s.empty() );
+            for ( size_t i = 0; i < c_nItemCount; ++i ) {
+                CPPUNIT_ASSERT( s.insert( a[i] ));
+            }
+            CPPUNIT_ASSERT( !s.empty() );
+            CPPUNIT_ASSERT( check_size( s, c_nItemCount ));
+
+        }
+
+        template <class Set, class PrintStat>
+        void test()
+        {
+            typedef Set set_type;
+
+            set_type s;
+
+            test_with( s );
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            // extract min/max
+            {
+                typename Set::guarded_ptr gp;
+
+                data_array arr;
+                fill_set( s, arr );
+
+                int i = 0;
+                while ( !s.empty() ) {
+                    CPPUNIT_ASSERT( s.extract_min( gp ) );
+                    CPPUNIT_ASSERT( gp->nKey == i );
+                    ++i;
+                }
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 0 ));
+
+                fill_set( s, arr );
+                i = (int) c_nItemCount - 1;
+                while ( !s.empty() ) {
+                    CPPUNIT_ASSERT( s.extract_max( gp ) );
+                    CPPUNIT_ASSERT( gp->nKey == i );
+                    --i;
+                }
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 0 ));
+
+                fill_set( s, arr );
+                for ( int i = 0; i < static_cast<int>( c_nItemCount ); ++i ) {
+                    int nKey = arr[i];
+                    CPPUNIT_ASSERT( s.get( gp, nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+
+                    gp.release();
+                    CPPUNIT_ASSERT( s.extract( gp, nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+
+                    gp.release();
+                    CPPUNIT_CHECK( !s.get( gp, nKey ));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !s.extract( gp, nKey ));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 0 ));
+
+                fill_set( s, arr );
+                for ( int i = 0; i < static_cast<int>( c_nItemCount ); ++i ) {
+                    int nKey = arr[i];
+                    CPPUNIT_ASSERT( s.get_with( gp, wrapped_int(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+
+                    gp.release();
+                    CPPUNIT_ASSERT( s.extract_with( gp, wrapped_int(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == nKey );
+
+                    gp.release();
+                    CPPUNIT_CHECK( !s.get_with( gp, wrapped_int(nKey), wrapped_less() ));
+                    CPPUNIT_CHECK( gp.empty());
+                    CPPUNIT_CHECK( !s.extract_with( gp, wrapped_int(nKey), wrapped_less() ));
+                    CPPUNIT_CHECK( gp.empty());
+                }
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 0 ));
+            }
+
+            PrintStat()( s );
+        }
+
+        template <class Set, class PrintStat>
+        void test_rcu()
+        {
+            typedef Set set_type;
+
+            set_type s;
+
+            test_with( s );
+
+            s.clear();
+            CPPUNIT_ASSERT( s.empty() );
+            CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            // extract min/max
+            {
+                typename set_type::exempt_ptr ep;
+                data_array arr;
+                fill_set( s, arr );
+
+                int i = 0;
+                value_type v;
+                while ( !s.empty() ) {
+                    CPPUNIT_ASSERT( s.extract_min( ep ) );
+                    CPPUNIT_ASSERT( !ep.empty());
+                    CPPUNIT_CHECK( ep->nKey == i );
+                    ++i;
+                    ep.release();
+                }
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 0 ));
+
+                fill_set( s, arr );
+                i = (int) c_nItemCount - 1;
+                while ( !s.empty() ) {
+                    CPPUNIT_ASSERT( s.extract_max( ep ) );
+                    CPPUNIT_ASSERT( !ep.empty());
+                    CPPUNIT_CHECK( ep->nKey == i );
+                    --i;
+                    ep.release();
+                }
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 0 ));
+
+                fill_set( s, arr );
+                for ( size_t i = 0; i < c_nItemCount; ++i ) {
+                    int nKey = arr[i];
+                    {
+                        typename set_type::rcu_lock l;
+                        value_type * p = s.get( nKey );
+                        CPPUNIT_ASSERT( p != NULL );
+                        CPPUNIT_CHECK( p->nKey == nKey );
+                    }
+                    CPPUNIT_ASSERT( s.extract( ep, nKey ));
+                    CPPUNIT_ASSERT( !ep.empty());
+                    CPPUNIT_CHECK( ep->nKey == nKey);
+                    ep.release();
+
+                    {
+                        typename set_type::rcu_lock l;
+                        CPPUNIT_CHECK( s.get( nKey ) == NULL );
+                    }
+                    CPPUNIT_CHECK( !s.extract( ep, nKey ));
+                }
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 0 ));
+
+                fill_set( s, arr );
+                for ( size_t i = 0; i < c_nItemCount; ++i ) {
+                    int nKey = arr[i];
+                    {
+                        typename set_type::rcu_lock l;
+                        value_type * p = s.get_with( wrapped_int(nKey), wrapped_less() );
+                        CPPUNIT_ASSERT( p != NULL );
+                        CPPUNIT_CHECK( p->nKey == nKey );
+                    }
+                    CPPUNIT_ASSERT( s.extract_with( ep, wrapped_int(nKey), wrapped_less() ));
+                    CPPUNIT_ASSERT( !ep.empty());
+                    CPPUNIT_CHECK( ep->nKey == nKey);
+                    ep.release();
+
+                    {
+                        typename set_type::rcu_lock l;
+                        CPPUNIT_CHECK( s.get_with( wrapped_int(nKey), wrapped_less() ) == NULL );
+                    }
+                    CPPUNIT_CHECK( !s.extract_with( ep, wrapped_int(nKey), wrapped_less() ));
+                }
+                CPPUNIT_ASSERT( s.empty() );
+                CPPUNIT_ASSERT( check_size( s, 0 ));
+
+            }
+
+            PrintStat()( s );
+        }
+
+        void EllenBinTree_hp_less();
+        void EllenBinTree_hp_cmp();
+        void EllenBinTree_hp_cmpless();
+        void EllenBinTree_hp_less_ic();
+        void EllenBinTree_hp_cmp_ic();
+        void EllenBinTree_hp_less_stat();
+        void EllenBinTree_hp_cmp_ic_stat();
+        void EllenBinTree_hp_less_pool();
+        void EllenBinTree_hp_less_pool_ic_stat();
+
+        void EllenBinTree_ptb_less();
+        void EllenBinTree_ptb_cmp();
+        void EllenBinTree_ptb_cmpless();
+        void EllenBinTree_ptb_less_ic();
+        void EllenBinTree_ptb_cmp_ic();
+        void EllenBinTree_ptb_less_stat();
+        void EllenBinTree_ptb_cmp_ic_stat();
+        void EllenBinTree_ptb_less_pool();
+        void EllenBinTree_ptb_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_gpi_less();
+        void EllenBinTree_rcu_gpi_cmp();
+        void EllenBinTree_rcu_gpi_cmpless();
+        void EllenBinTree_rcu_gpi_less_ic();
+        void EllenBinTree_rcu_gpi_cmp_ic();
+        void EllenBinTree_rcu_gpi_less_stat();
+        void EllenBinTree_rcu_gpi_cmp_ic_stat();
+        void EllenBinTree_rcu_gpi_less_pool();
+        void EllenBinTree_rcu_gpi_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_gpb_less();
+        void EllenBinTree_rcu_gpb_cmp();
+        void EllenBinTree_rcu_gpb_cmpless();
+        void EllenBinTree_rcu_gpb_less_ic();
+        void EllenBinTree_rcu_gpb_cmp_ic();
+        void EllenBinTree_rcu_gpb_less_stat();
+        void EllenBinTree_rcu_gpb_cmp_ic_stat();
+        void EllenBinTree_rcu_gpb_less_pool();
+        void EllenBinTree_rcu_gpb_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_gpt_less();
+        void EllenBinTree_rcu_gpt_cmp();
+        void EllenBinTree_rcu_gpt_cmpless();
+        void EllenBinTree_rcu_gpt_less_ic();
+        void EllenBinTree_rcu_gpt_cmp_ic();
+        void EllenBinTree_rcu_gpt_less_stat();
+        void EllenBinTree_rcu_gpt_cmp_ic_stat();
+        void EllenBinTree_rcu_gpt_less_pool();
+        void EllenBinTree_rcu_gpt_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_shb_less();
+        void EllenBinTree_rcu_shb_cmp();
+        void EllenBinTree_rcu_shb_cmpless();
+        void EllenBinTree_rcu_shb_less_ic();
+        void EllenBinTree_rcu_shb_cmp_ic();
+        void EllenBinTree_rcu_shb_less_stat();
+        void EllenBinTree_rcu_shb_cmp_ic_stat();
+        void EllenBinTree_rcu_shb_less_pool();
+        void EllenBinTree_rcu_shb_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_sht_less();
+        void EllenBinTree_rcu_sht_cmp();
+        void EllenBinTree_rcu_sht_cmpless();
+        void EllenBinTree_rcu_sht_less_ic();
+        void EllenBinTree_rcu_sht_cmp_ic();
+        void EllenBinTree_rcu_sht_less_stat();
+        void EllenBinTree_rcu_sht_cmp_ic_stat();
+        void EllenBinTree_rcu_sht_less_pool();
+        void EllenBinTree_rcu_sht_less_pool_ic_stat();
+
+        CPPUNIT_TEST_SUITE(EllenBinTreeSetHdrTest)
+            CPPUNIT_TEST(EllenBinTree_hp_less)
+            CPPUNIT_TEST(EllenBinTree_hp_cmp)
+            CPPUNIT_TEST(EllenBinTree_hp_less_stat)
+            CPPUNIT_TEST(EllenBinTree_hp_cmpless)
+            CPPUNIT_TEST(EllenBinTree_hp_less_ic)
+            CPPUNIT_TEST(EllenBinTree_hp_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_hp_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_hp_less_pool)
+            CPPUNIT_TEST(EllenBinTree_hp_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_ptb_less)
+            CPPUNIT_TEST(EllenBinTree_ptb_cmp)
+            CPPUNIT_TEST(EllenBinTree_ptb_less_stat)
+            CPPUNIT_TEST(EllenBinTree_ptb_cmpless)
+            CPPUNIT_TEST(EllenBinTree_ptb_less_ic)
+            CPPUNIT_TEST(EllenBinTree_ptb_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_ptb_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_ptb_less_pool)
+            CPPUNIT_TEST(EllenBinTree_ptb_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_less_pool_ic_stat)
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+} // namespace tree
+
+#endif // #ifndef CDSHDRTEST_ELLENBINTREE_SET_H
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_set_hp.cpp b/tests/test-hdr/tree/hdr_ellenbintree_set_hp.cpp
new file mode 100644 (file)
index 0000000..9f0a377
--- /dev/null
@@ -0,0 +1,149 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_set.h"
+#include <cds/container/ellen_bintree_set_hp.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_hp.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::gc::HP     gc_type;
+
+        typedef cc::ellen_bintree::node<gc_type, EllenBinTreeSetHdrTest::value_type>                    tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeSetHdrTest::key_type, tree_leaf_node >    tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                      tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_hp_less()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_hp_cmp()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_hp_cmpless()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_hp_less_ic()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_hp_cmp_ic()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_hp_less_stat()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_hp_cmp_ic_stat()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_hp_less_pool()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_hp::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_hp::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_hp_less_pool_ic_stat()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_hp::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_hp::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_set_ptb.cpp b/tests/test-hdr/tree/hdr_ellenbintree_set_ptb.cpp
new file mode 100644 (file)
index 0000000..269fd78
--- /dev/null
@@ -0,0 +1,149 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_set.h"
+#include <cds/container/ellen_bintree_set_ptb.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_ptb.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::gc::PTB     gc_type;
+
+        typedef cc::ellen_bintree::node<gc_type, EllenBinTreeSetHdrTest::value_type>                    tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeSetHdrTest::key_type, tree_leaf_node >    tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                      tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_ptb_less()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_ptb_cmp()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_ptb_cmpless()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_ptb_less_ic()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_ptb_cmp_ic()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_ptb_less_stat()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_ptb_cmp_ic_stat()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_ptb_less_pool()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_ptb::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_ptb::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_ptb_less_pool_ic_stat()
+    {
+        typedef cc::EllenBinTreeSet< gc_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_ptb::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_ptb::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test<set_type, print_stat>();
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpb.cpp b/tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..c91a441
--- /dev/null
@@ -0,0 +1,150 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_set.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/container/ellen_bintree_set_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        typedef cc::ellen_bintree::node<rcu_type, EllenBinTreeSetHdrTest::value_type>                   tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeSetHdrTest::key_type, tree_leaf_node >    tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                      tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpb_less()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpb_cmp()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpb_cmpless()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpb_less_ic()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpb_cmp_ic()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpb_less_stat()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpb_cmp_ic_stat()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpb_less_pool()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpb_less_pool_ic_stat()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpi.cpp b/tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..1794d9e
--- /dev/null
@@ -0,0 +1,150 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_set.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/container/ellen_bintree_set_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        typedef cc::ellen_bintree::node<rcu_type, EllenBinTreeSetHdrTest::value_type>                   tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeSetHdrTest::key_type, tree_leaf_node >    tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                      tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_less()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_cmp()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_cmpless()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_less_ic()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_cmp_ic()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_less_stat()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_cmp_ic_stat()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_less_pool()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_less_pool_ic_stat()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpt.cpp b/tests/test-hdr/tree/hdr_ellenbintree_set_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..49f3514
--- /dev/null
@@ -0,0 +1,150 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_set.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/container/ellen_bintree_set_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+
+        typedef cc::ellen_bintree::node<rcu_type, EllenBinTreeSetHdrTest::value_type>                   tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeSetHdrTest::key_type, tree_leaf_node >    tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                      tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpt_less()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpt_cmp()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpt_cmpless()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpt_less_ic()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpt_cmp_ic()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpt_less_stat()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpt_cmp_ic_stat()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpt_less_pool()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpt_less_pool_ic_stat()
+    {
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_set_rcu_shb.cpp b/tests/test-hdr/tree/hdr_ellenbintree_set_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..f153f89
--- /dev/null
@@ -0,0 +1,169 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_set.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/container/ellen_bintree_set_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+
+        typedef cc::ellen_bintree::node<rcu_type, EllenBinTreeSetHdrTest::value_type>                   tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeSetHdrTest::key_type, tree_leaf_node >    tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                      tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+    }
+#endif
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_shb_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_shb_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_shb_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_shb_less_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_shb_cmp_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_shb_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_shb_cmp_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_shb_less_pool()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_shb_less_pool_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_ellenbintree_set_rcu_sht.cpp b/tests/test-hdr/tree/hdr_ellenbintree_set_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..1e4982a
--- /dev/null
@@ -0,0 +1,169 @@
+//$$CDS-header$$
+
+#include "tree/hdr_ellenbintree_set.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/ellen_bintree_set_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+
+        typedef cc::ellen_bintree::node<rcu_type, EllenBinTreeSetHdrTest::value_type>                   tree_leaf_node;
+        typedef cc::ellen_bintree::internal_node< EllenBinTreeSetHdrTest::key_type, tree_leaf_node >    tree_internal_node;
+        typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                      tree_update_desc;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+    }
+#endif
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_sht_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_sht_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_sht_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::compare< compare >
+                ,co::less< less >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_sht_less_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_sht_cmp_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_sht_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_sht_cmp_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::compare< compare >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_sht_less_pool()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+    void EllenBinTreeSetHdrTest::EllenBinTree_rcu_sht_less_pool_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
+            cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< key_extractor >
+                ,co::less< less >
+                ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > set_type;
+
+        test_rcu<set_type, print_stat>();
+#endif
+    }
+
+} // namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_bintree.h b/tests/test-hdr/tree/hdr_intrusive_bintree.h
new file mode 100644 (file)
index 0000000..741be4f
--- /dev/null
@@ -0,0 +1,1208 @@
+//$$CDS-header$$
+
+#ifndef CDSHDRTEST_INTRUSIVE_BINTREE_H
+#define CDSHDRTEST_INTRUSIVE_BINTREE_H
+
+#include "cppunit/cppunit_proxy.h"
+#include "size_check.h"
+#include <algorithm>
+
+namespace tree {
+
+    class IntrusiveBinTreeHdrTest: public CppUnitMini::TestCase
+    {
+    public:
+        typedef int     key_type;
+
+        struct stat_data {
+            size_t  nDisposeCount;
+            size_t  nWaitingDispCount;
+            size_t  nInsertFuncCall;
+            size_t  nEnsureExistFuncCall;
+            size_t  nEnsureNewFuncCall;
+            size_t  nEraseFuncCall;
+            size_t  nFindFuncCall;
+            size_t  nFindConstFuncCall;
+
+            stat_data()
+                : nDisposeCount(0)
+                , nWaitingDispCount(0)
+                , nInsertFuncCall(0)
+                , nEnsureExistFuncCall(0)
+                , nEnsureNewFuncCall(0)
+                , nEraseFuncCall(0)
+                , nFindFuncCall(0)
+                , nFindConstFuncCall(0)
+            {}
+        };
+
+        template <typename Hook>
+        struct base_hook_value: public Hook
+        {
+            int     nKey;
+            int     nValue;
+            mutable stat_data   stat;
+
+            base_hook_value()
+            {}
+
+            base_hook_value( int key )
+                : nKey(key)
+                , nValue(key * 2)
+            {}
+
+            base_hook_value( int key, int val )
+                : nKey(key)
+                , nValue(val)
+            {}
+
+#   ifdef _DEBUG
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            base_hook_value( base_hook_value&& s )
+                : Hook()
+                , nKey(s.nKey)
+                , nValue(s.nValue)
+            {}
+#       endif
+            base_hook_value& operator=( base_hook_value const& s )
+            {
+                nKey = s.nKey;
+                nValue = s.nValue;
+                return *this;
+            }
+#   endif
+        };
+
+        template <typename Hook>
+        struct member_hook_value
+        {
+            int     nKey;
+            int     nValue;
+            Hook    hook;
+            mutable stat_data   stat;
+
+            member_hook_value()
+            {}
+
+            member_hook_value( int key )
+                : nKey(key)
+                , nValue(key * 2)
+            {}
+
+            member_hook_value( int key, int val )
+                : nKey(key)
+                , nValue(val)
+            {}
+#   ifdef _DEBUG
+#       ifdef CDS_MOVE_SEMANTICS_SUPPORT
+            member_hook_value( member_hook_value&& s )
+                : nKey(s.nKey)
+                , nValue(s.nValue)
+                , hook()
+            {}
+#       endif
+            member_hook_value& operator=( member_hook_value const& s )
+            {
+                nKey = s.nKey;
+                nValue = s.nValue;
+                return *this;
+            }
+#   endif
+        };
+
+        template <typename ValueType>
+        struct less {
+            typedef ValueType value_type;
+
+            bool operator()( int k1, int k2 ) const
+            {
+                return k1 < k2;
+            }
+            bool operator()( value_type const& v1, value_type const& v2 ) const
+            {
+                return v1.nKey < v2.nKey;
+            }
+            bool operator()( value_type const& v, int k ) const
+            {
+                return v.nKey < k;
+            }
+            bool operator()( int k, value_type const& v ) const
+            {
+                return k < v.nKey;
+            }
+        };
+
+        template <typename ValueType>
+        struct compare {
+            typedef ValueType value_type;
+
+            int cmp( int k1, int k2 ) const
+            {
+                return k1 < k2 ? -1 : (k1 > k2 ? 1 : 0);
+            }
+            int operator()( int k1, int k2 ) const
+            {
+                return cmp( k1, k2 );
+            }
+            int operator()( value_type const& v1, value_type const& v2 ) const
+            {
+                return cmp( v1.nKey, v2.nKey );
+            }
+            int operator()( value_type const& v, int k ) const
+            {
+                return cmp( v.nKey, k );
+            }
+            int operator()( int k, value_type const& v ) const
+            {
+                return cmp( k, v.nKey );
+            }
+        };
+
+        struct wrapped_int {
+            int  nKey;
+
+            wrapped_int( int n )
+                : nKey(n)
+            {}
+        };
+
+        template <typename T>
+        struct wrapped_less
+        {
+            bool operator()( wrapped_int const& w, int n ) const
+            {
+                return w.nKey < n;
+            }
+            bool operator()( int n, wrapped_int const& w ) const
+            {
+                return n < w.nKey;
+            }
+            bool operator()( wrapped_int const& w, T const& v ) const
+            {
+                return w.nKey < v.nKey;
+            }
+            bool operator()( T const& v, wrapped_int const& w ) const
+            {
+                return v.nKey < w.nKey;
+            }
+        };
+
+        template <typename ValueType>
+        struct key_extractor {
+            void operator()( int& dest, ValueType const& src ) const
+            {
+                dest = src.nKey;
+            }
+        };
+
+        template <typename ValueType>
+        struct disposer {
+            void operator()( ValueType * v ) const
+            {
+                ++v->stat.nDisposeCount;
+            }
+        };
+
+        struct insert_functor {
+            template <typename T>
+            void operator()( T& v ) const
+            {
+                ++v.stat.nInsertFuncCall;
+            }
+        };
+
+        struct ensure_functor {
+            template <typename T>
+            void operator()( bool bNew, T& dest, T& src) const
+            {
+                if ( bNew )
+                    ++dest.stat.nEnsureNewFuncCall;
+                else {
+                    dest.nValue *= 2;
+                    ++src.stat.nEnsureExistFuncCall;
+                }
+            }
+        };
+
+        struct erase_functor {
+            template <typename T>
+            void operator()( T const& v ) const
+            {
+                ++v.stat.nEraseFuncCall;
+            }
+        };
+
+        struct find_functor {
+            template <typename T, typename Q>
+            void operator()( T const& v, Q& q ) const
+            {
+                ++v.stat.nFindFuncCall;
+            }
+            template <typename T, typename Q>
+            void operator()( T const& v, Q const& q ) const
+            {
+                ++v.stat.nFindConstFuncCall;
+            }
+        };
+
+    protected:
+        static const size_t c_nItemCount = 10000;
+
+        template <typename T>
+        class data_array
+        {
+            T *     pFirst;
+            T *     pLast;
+
+        public:
+            data_array()
+                : pFirst( new T[c_nItemCount] )
+                , pLast( pFirst + c_nItemCount )
+            {
+                int i = 0;
+                for ( T * p = pFirst; p != pLast; ++p, ++i ) {
+                    p->nKey = i;
+                    p->nValue = i * 2;
+                }
+
+                std::random_shuffle( pFirst, pLast );
+            }
+
+            ~data_array()
+            {
+                delete [] pFirst;
+            }
+
+            T * begin() { return pFirst; }
+            T * end()   { return pLast ; }
+        };
+
+    protected:
+        template <typename Tree>
+        void test_common( Tree& t )
+        {
+            typedef Tree tree_type;
+            typedef typename tree_type::key_type     key_type;
+            typedef typename tree_type::value_type   value_type;
+
+            {
+                value_type v1( 10, 100 );
+                value_type v2( 20, 200 );
+                value_type v3( 30, 300 );
+                value_type v4( 25, 250 );
+                value_type v5( -50, -500 );
+
+                // insert/ensure
+                CPPUNIT_ASSERT( t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 0 ));
+                CPPUNIT_CHECK( !t.find( v1.nKey ));
+                CPPUNIT_CHECK( !t.find( v1 ));
+                CPPUNIT_CHECK( !t.find( v2.nKey ));
+                CPPUNIT_CHECK( !t.find( v2 ));
+                CPPUNIT_CHECK( !t.find( v3.nKey ));
+                CPPUNIT_CHECK( !t.find( v3 ));
+                CPPUNIT_CHECK( !t.find( v4.nKey ));
+                CPPUNIT_CHECK( !t.find( v4 ));
+                CPPUNIT_CHECK( !t.find( v5.nKey ));
+                CPPUNIT_CHECK( !t.find( v5 ));
+
+                CPPUNIT_ASSERT( t.insert( v1 ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 1 ));
+                CPPUNIT_CHECK( t.find( v1.nKey ));
+                CPPUNIT_CHECK( t.find( v1 ));
+                CPPUNIT_CHECK( !t.find( v2.nKey ));
+                CPPUNIT_CHECK( !t.find( v2 ));
+                CPPUNIT_CHECK( !t.find( v3.nKey ));
+                CPPUNIT_CHECK( !t.find( v3 ));
+                CPPUNIT_CHECK( !t.find( v4.nKey ));
+                CPPUNIT_CHECK( !t.find( v4 ));
+                CPPUNIT_CHECK( !t.find( v5.nKey ));
+                CPPUNIT_CHECK( !t.find( v5 ));
+
+                CPPUNIT_ASSERT( v2.stat.nInsertFuncCall == 0 );
+                CPPUNIT_ASSERT( t.insert( v2, insert_functor() ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( v2.stat.nInsertFuncCall == 1 );
+                CPPUNIT_ASSERT( t.find( v1.nKey ));
+                CPPUNIT_ASSERT( t.find( v1 ));
+                CPPUNIT_ASSERT( t.find( v2.nKey ));
+                CPPUNIT_ASSERT( t.find( v2 ));
+                CPPUNIT_ASSERT( !t.find( v3.nKey ));
+                CPPUNIT_ASSERT( !t.find( v3 ));
+                CPPUNIT_ASSERT( !t.find( v4.nKey ));
+                CPPUNIT_ASSERT( !t.find( v4 ));
+                CPPUNIT_ASSERT( !t.find( v5.nKey ));
+                CPPUNIT_ASSERT( !t.find( v5 ));
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 2 ));
+
+                CPPUNIT_ASSERT( v3.stat.nEnsureNewFuncCall == 0 );
+                CPPUNIT_ASSERT( v3.stat.nEnsureExistFuncCall == 0 );
+                CPPUNIT_ASSERT( t.ensure( v3, ensure_functor() ).second );
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( v3.stat.nEnsureNewFuncCall == 1 );
+                CPPUNIT_ASSERT( v3.stat.nEnsureExistFuncCall == 0 );
+                CPPUNIT_ASSERT( v3.nValue == 300 );
+                CPPUNIT_ASSERT( !t.ensure( v3, ensure_functor() ).second );
+                CPPUNIT_ASSERT( v3.stat.nEnsureNewFuncCall == 1 );
+                CPPUNIT_ASSERT( v3.stat.nEnsureExistFuncCall == 1 );
+                CPPUNIT_ASSERT( v3.nValue == 600 );
+                CPPUNIT_ASSERT( t.find( v1.nKey ));
+                CPPUNIT_ASSERT( t.find( v1 ));
+                CPPUNIT_ASSERT( t.find( v2.nKey ));
+                CPPUNIT_ASSERT( t.find( v2 ));
+                CPPUNIT_ASSERT( t.find( v3.nKey ));
+                CPPUNIT_ASSERT( t.find( v3 ));
+                CPPUNIT_ASSERT( !t.find( v4.nKey ));
+                CPPUNIT_ASSERT( !t.find( v4 ));
+                CPPUNIT_ASSERT( !t.find( v5.nKey ));
+                CPPUNIT_ASSERT( !t.find( v5 ));
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 3 ));
+
+                {
+                    value_type v( v3.nKey, v3.nValue );
+                    CPPUNIT_ASSERT( v.stat.nEnsureExistFuncCall == 0 );
+                    CPPUNIT_ASSERT( v3.stat.nEnsureNewFuncCall == 1 );
+                    CPPUNIT_ASSERT( v3.stat.nEnsureExistFuncCall == 1 );
+                    CPPUNIT_ASSERT( v3.nValue == 600 );
+                    CPPUNIT_ASSERT( !t.ensure( v, ensure_functor() ).second );
+                    CPPUNIT_ASSERT( v3.stat.nEnsureNewFuncCall == 1 );
+                    CPPUNIT_ASSERT( v.stat.nEnsureExistFuncCall == 1 );
+                    CPPUNIT_ASSERT( v3.nValue == 1200 );
+
+                }
+                v3.nValue = 300;
+                CPPUNIT_ASSERT( !t.insert( v3 ));
+
+                CPPUNIT_ASSERT( t.insert( v4 ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( t.find( v1.nKey ));
+                CPPUNIT_ASSERT( t.find( v1 ));
+                CPPUNIT_ASSERT( t.find( v2.nKey ));
+                CPPUNIT_ASSERT( t.find( v2 ));
+                CPPUNIT_ASSERT( t.find( v3.nKey ));
+                CPPUNIT_ASSERT( t.find( v3 ));
+                CPPUNIT_ASSERT( t.find( v4.nKey ));
+                CPPUNIT_ASSERT( t.find( v4 ));
+                CPPUNIT_ASSERT( !t.find( v5.nKey ));
+                CPPUNIT_ASSERT( !t.find( v5 ));
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 4 ));
+
+                CPPUNIT_ASSERT( t.insert( v5 ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( t.find( v1.nKey ));
+                CPPUNIT_ASSERT( t.find( v1 ));
+                CPPUNIT_ASSERT( t.find( v2.nKey ));
+                CPPUNIT_ASSERT( t.find( v2 ));
+                CPPUNIT_ASSERT( t.find( v3.nKey ));
+                CPPUNIT_ASSERT( t.find( v3 ));
+                CPPUNIT_ASSERT( t.find( v4.nKey ));
+                CPPUNIT_ASSERT( t.find( v4 ));
+                CPPUNIT_ASSERT( t.find( v5.nKey ));
+                CPPUNIT_ASSERT( t.find( v5 ));
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 5 ));
+
+                //unlink/erase
+                ++v1.stat.nWaitingDispCount;
+                CPPUNIT_ASSERT( t.unlink(v1));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( !t.find( v1.nKey ));
+                CPPUNIT_ASSERT( !t.find( v1 ));
+                CPPUNIT_ASSERT( !t.unlink(v1));
+                CPPUNIT_ASSERT( t.find( v2.nKey ));
+                CPPUNIT_ASSERT( t.find( v2 ));
+                CPPUNIT_ASSERT( t.find( v3.nKey ));
+                CPPUNIT_ASSERT( t.find( v3 ));
+                CPPUNIT_ASSERT( t.find( v4.nKey ));
+                CPPUNIT_ASSERT( t.find( v4 ));
+                CPPUNIT_ASSERT( t.find( v5.nKey ));
+                CPPUNIT_ASSERT( t.find( v5 ));
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 4 ));
+
+                ++v2.stat.nWaitingDispCount;
+                CPPUNIT_ASSERT( t.erase( v2.nKey ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( !t.find( v1.nKey ));
+                CPPUNIT_ASSERT( !t.find( v1 ));
+                CPPUNIT_ASSERT( !t.find( v2.nKey ));
+                CPPUNIT_ASSERT( !t.find( v2 ));
+                CPPUNIT_ASSERT( !t.erase(v2));
+                CPPUNIT_ASSERT( t.find( v3.nKey ));
+                CPPUNIT_ASSERT( t.find( v3 ));
+                CPPUNIT_ASSERT( t.find( v4.nKey ));
+                CPPUNIT_ASSERT( t.find( v4 ));
+                CPPUNIT_ASSERT( t.find( v5.nKey ));
+                CPPUNIT_ASSERT( t.find( v5 ));
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 3 ));
+
+                ++v3.stat.nWaitingDispCount;
+                CPPUNIT_ASSERT( t.erase_with( v3.nKey, less<value_type>() ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( !t.find( v1.nKey ));
+                CPPUNIT_ASSERT( !t.find( v1 ));
+                CPPUNIT_ASSERT( !t.find( v2.nKey ));
+                CPPUNIT_ASSERT( !t.find( v2 ));
+                CPPUNIT_ASSERT( !t.find( v3.nKey ));
+                CPPUNIT_ASSERT( !t.find( v3 ));
+                CPPUNIT_ASSERT( !t.erase_with(v3, less<value_type>() ));
+                CPPUNIT_ASSERT( t.find( v4.nKey ));
+                CPPUNIT_ASSERT( t.find( v4 ));
+                CPPUNIT_ASSERT( t.find( v5.nKey ));
+                CPPUNIT_ASSERT( t.find( v5 ));
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 2 ));
+
+                ++v4.stat.nWaitingDispCount;
+                CPPUNIT_ASSERT( v4.stat.nEraseFuncCall == 0 );
+                CPPUNIT_ASSERT( t.erase( v4.nKey, erase_functor() ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( v4.stat.nEraseFuncCall == 1 );
+                CPPUNIT_ASSERT( !t.find( v1.nKey ));
+                CPPUNIT_ASSERT( !t.find( v1 ));
+                CPPUNIT_ASSERT( !t.find( v2.nKey ));
+                CPPUNIT_ASSERT( !t.find( v2 ));
+                CPPUNIT_ASSERT( !t.find( v3.nKey ));
+                CPPUNIT_ASSERT( !t.find( v3 ));
+                CPPUNIT_ASSERT( !t.find( v4.nKey ));
+                CPPUNIT_ASSERT( !t.find( v4 ));
+                CPPUNIT_ASSERT( !t.erase( v4.nKey, erase_functor() ));
+                CPPUNIT_ASSERT( v4.stat.nEraseFuncCall == 1 );
+                CPPUNIT_ASSERT( t.find( v5.nKey ));
+                CPPUNIT_ASSERT( t.find( v5 ));
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 1 ));
+
+                ++v5.stat.nWaitingDispCount;
+                CPPUNIT_ASSERT( t.erase_with( v5.nKey, less<value_type>(), erase_functor() ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( v5.stat.nEraseFuncCall == 1 );
+                CPPUNIT_ASSERT( !t.find( v1.nKey ));
+                CPPUNIT_ASSERT( !t.find( v1 ));
+                CPPUNIT_ASSERT( !t.find( v2.nKey ));
+                CPPUNIT_ASSERT( !t.find( v2 ));
+                CPPUNIT_ASSERT( !t.find( v3.nKey ));
+                CPPUNIT_ASSERT( !t.find( v3 ));
+                CPPUNIT_ASSERT( !t.erase_with(v5, less<value_type>(), erase_functor() ));
+                CPPUNIT_ASSERT( !t.find( v4.nKey ));
+                CPPUNIT_ASSERT( !t.find( v4 ));
+                CPPUNIT_ASSERT( !t.find( v5.nKey ));
+                CPPUNIT_ASSERT( !t.find( v5 ));
+                CPPUNIT_ASSERT( t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 0 ));
+
+                tree_type::gc::force_dispose();
+
+                // find
+                CPPUNIT_ASSERT( t.insert( v1 ));
+                CPPUNIT_ASSERT( t.insert( v2 ));
+                CPPUNIT_ASSERT( t.insert( v3 ));
+                CPPUNIT_ASSERT( t.insert( v4 ));
+                CPPUNIT_ASSERT( t.insert( v5 ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 5 ));
+
+                CPPUNIT_ASSERT( t.find( 10 ));
+                CPPUNIT_ASSERT( !t.find( 11 ));
+                CPPUNIT_ASSERT( t.find( v1 ));
+                CPPUNIT_ASSERT( t.find( v2.nKey ));
+                CPPUNIT_ASSERT( t.find( v3 ));
+                CPPUNIT_ASSERT( t.find( v4.nKey ));
+                CPPUNIT_ASSERT( t.find( v5.nKey ));
+
+                // find_with
+                CPPUNIT_ASSERT( t.find_with( 10, less<value_type>() ));
+                CPPUNIT_ASSERT( !t.find_with( wrapped_int(11), wrapped_less<value_type>() ));
+                CPPUNIT_ASSERT( t.find_with( v1, less<value_type>() ));
+                CPPUNIT_ASSERT( t.find_with( wrapped_int(v2.nKey), wrapped_less<value_type>() ));
+                CPPUNIT_ASSERT( t.find_with( v3, less<value_type>() ));
+                CPPUNIT_ASSERT( t.find_with( v4.nKey, less<value_type>() ));
+                CPPUNIT_ASSERT( t.find_with( v5.nKey, less<value_type>() ));
+
+                // find<Func>
+                CPPUNIT_ASSERT( v1.stat.nFindFuncCall == 0 );
+                CPPUNIT_ASSERT( v1.stat.nFindConstFuncCall == 0 );
+                CPPUNIT_ASSERT( t.find( 10, find_functor() ));
+                CPPUNIT_ASSERT( v1.stat.nFindFuncCall == 0 );
+                CPPUNIT_ASSERT( v1.stat.nFindConstFuncCall == 1 );
+
+                CPPUNIT_ASSERT( !t.find( 11, find_functor() ));
+
+                CPPUNIT_ASSERT( t.find( v1, find_functor() ));
+                CPPUNIT_ASSERT( v1.stat.nFindFuncCall == 1 );
+                CPPUNIT_ASSERT( v1.stat.nFindConstFuncCall == 1 );
+
+                CPPUNIT_ASSERT( v2.stat.nFindFuncCall == 0 );
+                CPPUNIT_ASSERT( v2.stat.nFindConstFuncCall == 0 );
+                CPPUNIT_ASSERT( t.find( v2.nKey, find_functor() ));
+                CPPUNIT_ASSERT( v2.stat.nFindFuncCall == 1 );
+                CPPUNIT_ASSERT( v2.stat.nFindConstFuncCall == 0 );
+
+                CPPUNIT_ASSERT( v3.stat.nFindFuncCall == 0 );
+                CPPUNIT_ASSERT( v3.stat.nFindConstFuncCall == 0 );
+                CPPUNIT_ASSERT( t.find( v3, find_functor() ));
+                CPPUNIT_ASSERT( v3.stat.nFindFuncCall == 1 );
+                CPPUNIT_ASSERT( v3.stat.nFindConstFuncCall == 0 );
+
+                CPPUNIT_ASSERT( v4.stat.nFindFuncCall == 0 );
+                CPPUNIT_ASSERT( v4.stat.nFindConstFuncCall == 0 );
+                CPPUNIT_ASSERT( t.find( (value_type const&) v4, find_functor() ));
+                CPPUNIT_ASSERT( v4.stat.nFindFuncCall == 0 );
+                CPPUNIT_ASSERT( v4.stat.nFindConstFuncCall == 1 );
+
+                CPPUNIT_ASSERT( v5.stat.nFindFuncCall == 0 );
+                CPPUNIT_ASSERT( v5.stat.nFindConstFuncCall == 0 );
+                CPPUNIT_ASSERT( t.find( v5.nKey, find_functor() ));
+                CPPUNIT_ASSERT( v5.stat.nFindFuncCall == 1 );
+                CPPUNIT_ASSERT( v5.stat.nFindConstFuncCall == 0 );
+
+                // find_with<Func>
+                CPPUNIT_ASSERT( v1.stat.nFindFuncCall == 1 );
+                CPPUNIT_ASSERT( v1.stat.nFindConstFuncCall == 1 );
+                CPPUNIT_ASSERT( t.find_with( 10, less<value_type>(), find_functor() ));
+                CPPUNIT_ASSERT( v1.stat.nFindFuncCall == 1 );
+                CPPUNIT_ASSERT( v1.stat.nFindConstFuncCall == 2 );
+
+                CPPUNIT_ASSERT( !t.find_with( 11, less<value_type>(), find_functor() ));
+
+                CPPUNIT_ASSERT( t.find_with( v1, less<value_type>(), find_functor() ));
+                CPPUNIT_ASSERT( v1.stat.nFindFuncCall == 2 );
+                CPPUNIT_ASSERT( v1.stat.nFindConstFuncCall == 2 );
+
+                CPPUNIT_ASSERT( v2.stat.nFindFuncCall == 1 );
+                CPPUNIT_ASSERT( v2.stat.nFindConstFuncCall == 0 );
+                CPPUNIT_ASSERT( t.find_with( v2.nKey, less<value_type>(), find_functor() ));
+                CPPUNIT_ASSERT( v2.stat.nFindFuncCall == 2 );
+                CPPUNIT_ASSERT( v2.stat.nFindConstFuncCall == 0 );
+
+                CPPUNIT_ASSERT( v3.stat.nFindFuncCall == 1 );
+                CPPUNIT_ASSERT( v3.stat.nFindConstFuncCall == 0 );
+                CPPUNIT_ASSERT( t.find_with( wrapped_int(v3.nKey), wrapped_less<value_type>(), find_functor() ));
+                CPPUNIT_ASSERT( v3.stat.nFindFuncCall == 1 );
+                CPPUNIT_ASSERT( v3.stat.nFindConstFuncCall == 1 );
+
+                CPPUNIT_ASSERT( v4.stat.nFindFuncCall == 0 );
+                CPPUNIT_ASSERT( v4.stat.nFindConstFuncCall == 1 );
+                CPPUNIT_ASSERT( t.find_with( (value_type const&) v4, less<value_type>(), find_functor() ));
+                CPPUNIT_ASSERT( v4.stat.nFindFuncCall == 0 );
+                CPPUNIT_ASSERT( v4.stat.nFindConstFuncCall == 2 );
+
+                CPPUNIT_ASSERT( v5.stat.nFindFuncCall == 1 );
+                CPPUNIT_ASSERT( v5.stat.nFindConstFuncCall == 0 );
+                CPPUNIT_ASSERT( t.find_with( v5.nKey, less<value_type>(), find_functor() ));
+                CPPUNIT_ASSERT( v5.stat.nFindFuncCall == 2 );
+                CPPUNIT_ASSERT( v5.stat.nFindConstFuncCall == 0 );
+
+                CPPUNIT_ASSERT( t.check_consistency() );
+                t.clear();
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 0 ));
+
+                tree_type::gc::force_dispose();
+                CPPUNIT_CHECK_EX( v1.stat.nWaitingDispCount + 1 == v1.stat.nDisposeCount,
+                    "v1.stat.nWaitingDispCount=" << v1.stat.nWaitingDispCount << ", v1.stat.nDisposeCount=" << v1.stat.nDisposeCount );
+                CPPUNIT_CHECK_EX( v2.stat.nWaitingDispCount + 1 == v2.stat.nDisposeCount,
+                    "v2.stat.nWaitingDispCount=" << v2.stat.nWaitingDispCount << ", v2.stat.nDisposeCount=" << v2.stat.nDisposeCount );
+                CPPUNIT_CHECK_EX( v3.stat.nWaitingDispCount + 1 == v3.stat.nDisposeCount,
+                    "v3.stat.nWaitingDispCount=" << v3.stat.nWaitingDispCount << ", v3.stat.nDisposeCount=" << v3.stat.nDisposeCount );
+                CPPUNIT_CHECK_EX( v4.stat.nWaitingDispCount + 1 == v4.stat.nDisposeCount,
+                    "v4.stat.nWaitingDispCount=" << v4.stat.nWaitingDispCount << ", v4.stat.nDisposeCount=" << v4.stat.nDisposeCount );
+                CPPUNIT_CHECK_EX( v5.stat.nWaitingDispCount + 1 == v5.stat.nDisposeCount,
+                    "v5.stat.nWaitingDispCount=" << v5.stat.nWaitingDispCount << ", v5.stat.nDisposeCount=" << v5.stat.nDisposeCount );
+            }
+
+            {
+                data_array< value_type> arr;
+                value_type * pFirst = arr.begin();
+                value_type * pLast  = arr.end();
+
+                for ( value_type * p = pFirst; p != pLast; ++p ) {
+                    CPPUNIT_ASSERT( t.insert( *p ) );
+                    CPPUNIT_ASSERT( !t.insert( *p ));
+                }
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, c_nItemCount ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+
+                for ( int n = 0; n < (int) c_nItemCount; ++n ) {
+                    CPPUNIT_ASSERT_MSG( t.find( n ), n );
+                }
+                for ( value_type * p = pFirst; p != pLast; ++p ) {
+                    CPPUNIT_ASSERT( t.find( *p ));
+                    CPPUNIT_ASSERT( t.find( p->nKey ));
+                    CPPUNIT_ASSERT( t.unlink( *p ) );
+                    CPPUNIT_ASSERT( !t.unlink( *p ) );
+                    CPPUNIT_ASSERT( !t.find( p->nKey ));
+                }
+
+                tree_type::gc::force_dispose();
+            }
+        }
+
+        template <class Tree, class PrintStat>
+        void test()
+        {
+            typedef Tree tree_type;
+            typedef typename tree_type::key_type     key_type;
+            typedef typename tree_type::value_type   value_type;
+
+            tree_type t;
+            test_common(t);
+
+            {
+                value_type v1( 10, 100 );
+                value_type v2( 20, 200 );
+                value_type v3( 30, 300 );
+                value_type v4( 25, 250 );
+                value_type v5( -50, -500 );
+
+                // extract/extract_min/extract_max
+                CPPUNIT_ASSERT( t.insert( v1 ));
+                CPPUNIT_ASSERT( t.insert( v2 ));
+                CPPUNIT_ASSERT( t.insert( v3 ));
+                CPPUNIT_ASSERT( t.insert( v4 ));
+                CPPUNIT_ASSERT( t.insert( v5 ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 5 ));
+
+                {
+                    typename tree_type::guarded_ptr gp;
+
+                    CPPUNIT_ASSERT( t.get( gp, v2.nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == v2.nKey );
+                    gp.release();
+                    CPPUNIT_ASSERT( t.extract( gp, v2.nKey ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( !t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 4 ));
+                    CPPUNIT_ASSERT( gp->nKey == v2.nKey );
+                    CPPUNIT_ASSERT( !t.extract( gp, v2.nKey ));
+                    CPPUNIT_CHECK( !t.get( gp, v2.nKey ));
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( !t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 4 ));
+
+                    CPPUNIT_ASSERT( t.extract_min(gp));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( !t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 3 ));
+                    CPPUNIT_ASSERT( gp->nKey == v5.nKey );
+
+                    CPPUNIT_ASSERT( t.extract_min(gp));
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( !t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 2 ));
+                    CPPUNIT_ASSERT( gp->nKey == v1.nKey );
+
+                    CPPUNIT_ASSERT( t.extract_min(gp));
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( !t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 1 ));
+                    CPPUNIT_ASSERT( gp->nKey == v4.nKey );
+
+                    CPPUNIT_ASSERT( t.extract_min(gp));
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 0 ));
+                    CPPUNIT_ASSERT( gp->nKey == v3.nKey );
+
+                    CPPUNIT_ASSERT( !t.extract_min(gp));
+                    CPPUNIT_ASSERT( !t.extract_max(gp));
+                    CPPUNIT_ASSERT( !t.extract( gp, v1.nKey ));
+                }
+
+                tree_type::gc::force_dispose();
+
+                {
+                    typename tree_type::guarded_ptr gp;
+
+                    CPPUNIT_ASSERT( t.insert( v1 ));
+                    CPPUNIT_ASSERT( t.insert( v2 ));
+                    CPPUNIT_ASSERT( t.insert( v3 ));
+                    CPPUNIT_ASSERT( t.insert( v4 ));
+                    CPPUNIT_ASSERT( t.insert( v5 ));
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( !t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 5 ));
+
+                    CPPUNIT_ASSERT( t.get_with( gp, wrapped_int(v4.nKey), wrapped_less<value_type>() ));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == v4.nKey );
+                    CPPUNIT_ASSERT( t.extract_with( gp, wrapped_int(v4.nKey), wrapped_less<value_type>() ));
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( !t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 4 ));
+                    CPPUNIT_ASSERT( gp->nKey == v4.nKey );
+
+                    CPPUNIT_ASSERT( !t.extract_with( gp, v4.nKey, less<value_type>() ) );
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( !t.get_with( gp, v4.nKey, less<value_type>() ) );
+
+                    CPPUNIT_ASSERT( t.extract_max(gp));
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( !t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 3 ));
+                    CPPUNIT_ASSERT( gp->nKey == v3.nKey );
+
+                    CPPUNIT_ASSERT( t.extract_max(gp) );
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( !t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 2 ));
+                    CPPUNIT_ASSERT( gp->nKey == v2.nKey );
+
+                    CPPUNIT_ASSERT( t.extract_max(gp) );
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( !t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 1 ));
+                    CPPUNIT_ASSERT( gp->nKey == v1.nKey );
+
+                    CPPUNIT_ASSERT( t.extract_max(gp) );
+                    CPPUNIT_ASSERT( t.check_consistency() );
+                    CPPUNIT_ASSERT( t.empty() );
+                    CPPUNIT_ASSERT( misc::check_size( t, 0 ));
+                    CPPUNIT_ASSERT( gp->nKey == v5.nKey );
+                }
+
+                tree_type::gc::force_dispose();
+            }
+
+            {
+                data_array< value_type> arr;
+                value_type * pFirst = arr.begin();
+                value_type * pLast  = arr.end();
+
+                for ( value_type * p = pFirst; p != pLast; ++p ) {
+                    CPPUNIT_ASSERT( t.ensure( *p, ensure_functor()).second );
+                }
+                for ( int n = 0; n < (int) c_nItemCount; ++n ) {
+                    typename tree_type::guarded_ptr gp;
+                    CPPUNIT_ASSERT( t.extract_min(gp));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == n );
+                }
+
+                for ( value_type * p = pFirst; p != pLast; ++p ) {
+                    CPPUNIT_ASSERT( t.insert( *p ) );
+                }
+                for ( int n = (int) c_nItemCount - 1; n >= 0; --n ) {
+                    typename tree_type::guarded_ptr gp;
+                    CPPUNIT_ASSERT( t.extract_max(gp));
+                    CPPUNIT_ASSERT( !gp.empty());
+                    CPPUNIT_CHECK( gp->nKey == n );
+                }
+
+                tree_type::gc::force_dispose();
+            }
+
+            PrintStat()( t );
+        }
+
+        template <class Tree, class PrintStat>
+        void test_rcu()
+        {
+            typedef Tree tree_type;
+            typedef typename tree_type::key_type     key_type;
+            typedef typename tree_type::value_type   value_type;
+
+            tree_type t;
+            test_common(t);
+
+            // extract/get
+            {
+                value_type v1( 10, 100 );
+                value_type v2( 20, 200 );
+                value_type v3( 30, 300 );
+                value_type v4( 25, 250 );
+                value_type v5( -50, -500 );
+
+                // extract/extract_min/extract_max
+                CPPUNIT_ASSERT( t.insert( v1 ));
+                CPPUNIT_ASSERT( t.insert( v2 ));
+                CPPUNIT_ASSERT( t.insert( v3 ));
+                CPPUNIT_ASSERT( t.insert( v4 ));
+                CPPUNIT_ASSERT( t.insert( v5 ));
+                CPPUNIT_ASSERT( t.check_consistency() );
+                CPPUNIT_ASSERT( !t.empty() );
+                CPPUNIT_ASSERT( misc::check_size( t, 5 ));
+
+                typename tree_type::exempt_ptr  ep;
+                typename tree_type::value_type * pVal;
+                {
+                    typename tree_type::rcu_lock l;
+                    pVal = t.get( v1.nKey );
+                    CPPUNIT_ASSERT( pVal != NULL );
+                    CPPUNIT_CHECK( pVal == &v1 );
+                }
+                CPPUNIT_ASSERT( t.extract( ep, v1.nKey ));
+                CPPUNIT_ASSERT( !ep.empty());
+                CPPUNIT_CHECK( ep->nKey == v1.nKey );
+                {
+                    typename tree_type::rcu_lock l;
+                    CPPUNIT_CHECK( t.get( v1.nKey ) == NULL );
+                }
+                ep.release();
+                CPPUNIT_ASSERT( !t.extract( ep, v1.nKey ));
+
+                CPPUNIT_ASSERT( t.extract_min(ep));
+                CPPUNIT_CHECK( ep->nKey == v5.nKey );
+                {
+                    typename tree_type::rcu_lock l;
+                    CPPUNIT_CHECK( t.get( v5.nKey ) == NULL );
+                }
+                ep.release();
+                CPPUNIT_ASSERT( !t.extract( ep, v5.nKey ));
+
+                CPPUNIT_ASSERT( t.extract_max(ep));
+                CPPUNIT_CHECK( ep->nKey == v3.nKey );
+                {
+                    typename tree_type::rcu_lock l;
+                    CPPUNIT_CHECK( t.get( v3.nKey ) == NULL );
+                }
+                ep.release();
+
+                {
+                    typename tree_type::rcu_lock l;
+                    pVal = t.get_with( wrapped_int(v2.nKey), wrapped_less<value_type>() );
+                    CPPUNIT_ASSERT( pVal != NULL );
+                    CPPUNIT_CHECK( pVal == &v2 );
+                }
+                CPPUNIT_ASSERT( t.extract_with( ep, wrapped_int(v2.nKey), wrapped_less<value_type>() ));
+                CPPUNIT_ASSERT( !ep.empty());
+                CPPUNIT_CHECK( ep->nKey == v2.nKey );
+                {
+                    typename tree_type::rcu_lock l;
+                    CPPUNIT_CHECK( t.get_with( wrapped_int(v2.nKey), wrapped_less<value_type>() ) == NULL );
+                }
+                ep.release();
+                CPPUNIT_CHECK( !t.extract_with( ep, wrapped_int(v2.nKey), wrapped_less<value_type>() ));
+                CPPUNIT_CHECK( ep.empty());
+
+                CPPUNIT_ASSERT( t.extract( ep, v4.nKey ));
+                CPPUNIT_ASSERT( !ep.empty());
+                CPPUNIT_CHECK( ep->nKey == v4.nKey );
+                ep.release();
+
+                tree_type::gc::force_dispose();
+
+                CPPUNIT_CHECK( t.empty());
+                CPPUNIT_ASSERT( misc::check_size( t, 0 ));
+
+                {
+                    typename tree_type::rcu_lock l;
+                    CPPUNIT_CHECK( t.get( v1.nKey ) == NULL );
+                    CPPUNIT_CHECK( t.get( v2.nKey ) == NULL );
+                    CPPUNIT_CHECK( t.get( v3.nKey ) == NULL );
+                    CPPUNIT_CHECK( t.get( v4.nKey ) == NULL );
+                    CPPUNIT_CHECK( t.get( v5.nKey ) == NULL );
+                }
+
+                CPPUNIT_CHECK( !t.extract(ep, v1.nKey));
+                CPPUNIT_CHECK( !t.extract(ep, v2.nKey));
+                CPPUNIT_CHECK( !t.extract(ep, v3.nKey));
+                CPPUNIT_CHECK( !t.extract(ep, v4.nKey));
+                CPPUNIT_CHECK( !t.extract(ep, v5.nKey));
+
+                tree_type::gc::force_dispose();
+            }
+
+            PrintStat()( t );
+        }
+
+        void EllenBinTree_hp_base_less();
+        void EllenBinTree_hp_base_cmp();
+        void EllenBinTree_hp_base_cmpless();
+        void EllenBinTree_hp_base_less_ic();
+        void EllenBinTree_hp_base_cmp_ic();
+        void EllenBinTree_hp_base_less_stat();
+        void EllenBinTree_hp_base_cmp_ic_stat();
+        void EllenBinTree_hp_base_less_pool();
+        void EllenBinTree_hp_base_less_pool_ic_stat();
+
+        void EllenBinTree_hp_member_less();
+        void EllenBinTree_hp_member_cmp();
+        void EllenBinTree_hp_member_cmpless();
+        void EllenBinTree_hp_member_less_ic();
+        void EllenBinTree_hp_member_cmp_ic();
+        void EllenBinTree_hp_member_less_stat();
+        void EllenBinTree_hp_member_cmp_ic_stat();
+        void EllenBinTree_hp_member_less_pool();
+        void EllenBinTree_hp_member_less_pool_ic_stat();
+
+        void EllenBinTree_ptb_base_less();
+        void EllenBinTree_ptb_base_cmp();
+        void EllenBinTree_ptb_base_cmpless();
+        void EllenBinTree_ptb_base_less_ic();
+        void EllenBinTree_ptb_base_cmp_ic();
+        void EllenBinTree_ptb_base_less_stat();
+        void EllenBinTree_ptb_base_cmp_ic_stat();
+        void EllenBinTree_ptb_base_less_pool();
+        void EllenBinTree_ptb_base_less_pool_ic_stat();
+
+        void EllenBinTree_ptb_member_less();
+        void EllenBinTree_ptb_member_cmp();
+        void EllenBinTree_ptb_member_cmpless();
+        void EllenBinTree_ptb_member_less_ic();
+        void EllenBinTree_ptb_member_cmp_ic();
+        void EllenBinTree_ptb_member_less_stat();
+        void EllenBinTree_ptb_member_cmp_ic_stat();
+        void EllenBinTree_ptb_member_less_pool();
+        void EllenBinTree_ptb_member_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_gpi_base_less();
+        void EllenBinTree_rcu_gpi_base_cmp();
+        void EllenBinTree_rcu_gpi_base_cmpless();
+        void EllenBinTree_rcu_gpi_base_less_ic();
+        void EllenBinTree_rcu_gpi_base_cmp_ic();
+        void EllenBinTree_rcu_gpi_base_less_stat();
+        void EllenBinTree_rcu_gpi_base_cmp_ic_stat();
+        void EllenBinTree_rcu_gpi_base_less_pool();
+        void EllenBinTree_rcu_gpi_base_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_gpi_member_less();
+        void EllenBinTree_rcu_gpi_member_cmp();
+        void EllenBinTree_rcu_gpi_member_cmpless();
+        void EllenBinTree_rcu_gpi_member_less_ic();
+        void EllenBinTree_rcu_gpi_member_cmp_ic();
+        void EllenBinTree_rcu_gpi_member_less_stat();
+        void EllenBinTree_rcu_gpi_member_cmp_ic_stat();
+        void EllenBinTree_rcu_gpi_member_less_pool();
+        void EllenBinTree_rcu_gpi_member_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_gpb_base_less();
+        void EllenBinTree_rcu_gpb_base_cmp();
+        void EllenBinTree_rcu_gpb_base_cmpless();
+        void EllenBinTree_rcu_gpb_base_less_ic();
+        void EllenBinTree_rcu_gpb_base_cmp_ic();
+        void EllenBinTree_rcu_gpb_base_less_stat();
+        void EllenBinTree_rcu_gpb_base_cmp_ic_stat();
+        void EllenBinTree_rcu_gpb_base_less_pool();
+        void EllenBinTree_rcu_gpb_base_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_gpb_member_less();
+        void EllenBinTree_rcu_gpb_member_cmp();
+        void EllenBinTree_rcu_gpb_member_cmpless();
+        void EllenBinTree_rcu_gpb_member_less_ic();
+        void EllenBinTree_rcu_gpb_member_cmp_ic();
+        void EllenBinTree_rcu_gpb_member_less_stat();
+        void EllenBinTree_rcu_gpb_member_cmp_ic_stat();
+        void EllenBinTree_rcu_gpb_member_less_pool();
+        void EllenBinTree_rcu_gpb_member_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_gpt_base_less();
+        void EllenBinTree_rcu_gpt_base_cmp();
+        void EllenBinTree_rcu_gpt_base_cmpless();
+        void EllenBinTree_rcu_gpt_base_less_ic();
+        void EllenBinTree_rcu_gpt_base_cmp_ic();
+        void EllenBinTree_rcu_gpt_base_less_stat();
+        void EllenBinTree_rcu_gpt_base_cmp_ic_stat();
+        void EllenBinTree_rcu_gpt_base_less_pool();
+        void EllenBinTree_rcu_gpt_base_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_gpt_member_less();
+        void EllenBinTree_rcu_gpt_member_cmp();
+        void EllenBinTree_rcu_gpt_member_cmpless();
+        void EllenBinTree_rcu_gpt_member_less_ic();
+        void EllenBinTree_rcu_gpt_member_cmp_ic();
+        void EllenBinTree_rcu_gpt_member_less_stat();
+        void EllenBinTree_rcu_gpt_member_cmp_ic_stat();
+        void EllenBinTree_rcu_gpt_member_less_pool();
+        void EllenBinTree_rcu_gpt_member_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_shb_base_less();
+        void EllenBinTree_rcu_shb_base_cmp();
+        void EllenBinTree_rcu_shb_base_cmpless();
+        void EllenBinTree_rcu_shb_base_less_ic();
+        void EllenBinTree_rcu_shb_base_cmp_ic();
+        void EllenBinTree_rcu_shb_base_less_stat();
+        void EllenBinTree_rcu_shb_base_cmp_ic_stat();
+        void EllenBinTree_rcu_shb_base_less_pool();
+        void EllenBinTree_rcu_shb_base_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_shb_member_less();
+        void EllenBinTree_rcu_shb_member_cmp();
+        void EllenBinTree_rcu_shb_member_cmpless();
+        void EllenBinTree_rcu_shb_member_less_ic();
+        void EllenBinTree_rcu_shb_member_cmp_ic();
+        void EllenBinTree_rcu_shb_member_less_stat();
+        void EllenBinTree_rcu_shb_member_cmp_ic_stat();
+        void EllenBinTree_rcu_shb_member_less_pool();
+        void EllenBinTree_rcu_shb_member_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_sht_base_less();
+        void EllenBinTree_rcu_sht_base_cmp();
+        void EllenBinTree_rcu_sht_base_cmpless();
+        void EllenBinTree_rcu_sht_base_less_ic();
+        void EllenBinTree_rcu_sht_base_cmp_ic();
+        void EllenBinTree_rcu_sht_base_less_stat();
+        void EllenBinTree_rcu_sht_base_cmp_ic_stat();
+        void EllenBinTree_rcu_sht_base_less_pool();
+        void EllenBinTree_rcu_sht_base_less_pool_ic_stat();
+
+        void EllenBinTree_rcu_sht_member_less();
+        void EllenBinTree_rcu_sht_member_cmp();
+        void EllenBinTree_rcu_sht_member_cmpless();
+        void EllenBinTree_rcu_sht_member_less_ic();
+        void EllenBinTree_rcu_sht_member_cmp_ic();
+        void EllenBinTree_rcu_sht_member_less_stat();
+        void EllenBinTree_rcu_sht_member_cmp_ic_stat();
+        void EllenBinTree_rcu_sht_member_less_pool();
+        void EllenBinTree_rcu_sht_member_less_pool_ic_stat();
+
+        CPPUNIT_TEST_SUITE(IntrusiveBinTreeHdrTest)
+            CPPUNIT_TEST(EllenBinTree_hp_base_less)
+            CPPUNIT_TEST(EllenBinTree_hp_base_cmp)
+            CPPUNIT_TEST(EllenBinTree_hp_base_less_stat)
+            CPPUNIT_TEST(EllenBinTree_hp_base_cmpless)
+            CPPUNIT_TEST(EllenBinTree_hp_base_less_ic)
+            CPPUNIT_TEST(EllenBinTree_hp_base_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_hp_base_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_hp_base_less_pool)
+            CPPUNIT_TEST(EllenBinTree_hp_base_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_hp_member_less)
+            CPPUNIT_TEST(EllenBinTree_hp_member_cmp)
+            CPPUNIT_TEST(EllenBinTree_hp_member_less_stat)
+            CPPUNIT_TEST(EllenBinTree_hp_member_cmpless)
+            CPPUNIT_TEST(EllenBinTree_hp_member_less_ic)
+            CPPUNIT_TEST(EllenBinTree_hp_member_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_hp_member_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_hp_member_less_pool)
+            CPPUNIT_TEST(EllenBinTree_hp_member_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_ptb_base_less)
+            CPPUNIT_TEST(EllenBinTree_ptb_base_cmp)
+            CPPUNIT_TEST(EllenBinTree_ptb_base_less_stat)
+            CPPUNIT_TEST(EllenBinTree_ptb_base_cmpless)
+            CPPUNIT_TEST(EllenBinTree_ptb_base_less_ic)
+            CPPUNIT_TEST(EllenBinTree_ptb_base_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_ptb_base_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_ptb_base_less_pool)
+            CPPUNIT_TEST(EllenBinTree_ptb_base_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_ptb_member_less)
+            CPPUNIT_TEST(EllenBinTree_ptb_member_cmp)
+            CPPUNIT_TEST(EllenBinTree_ptb_member_less_stat)
+            CPPUNIT_TEST(EllenBinTree_ptb_member_cmpless)
+            CPPUNIT_TEST(EllenBinTree_ptb_member_less_ic)
+            CPPUNIT_TEST(EllenBinTree_ptb_member_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_ptb_member_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_ptb_member_less_pool)
+            CPPUNIT_TEST(EllenBinTree_ptb_member_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_base_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_base_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_base_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_base_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_base_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_base_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_base_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_base_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_base_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_member_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_member_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_member_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_member_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_member_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_member_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_member_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_member_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpi_member_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_base_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_base_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_base_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_base_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_base_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_base_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_base_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_base_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_base_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_member_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_member_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_member_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_member_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_member_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_member_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_member_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_member_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpb_member_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_base_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_base_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_base_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_base_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_base_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_base_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_base_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_base_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_base_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_member_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_member_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_member_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_member_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_member_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_member_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_member_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_member_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_gpt_member_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_base_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_base_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_base_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_base_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_base_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_base_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_base_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_base_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_base_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_member_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_member_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_member_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_member_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_member_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_member_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_member_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_member_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_shb_member_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_base_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_base_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_base_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_base_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_base_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_base_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_base_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_base_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_base_less_pool_ic_stat)
+
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_member_less)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_member_cmp)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_member_less_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_member_cmpless)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_member_less_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_member_cmp_ic)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_member_cmp_ic_stat)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_member_less_pool)
+            CPPUNIT_TEST(EllenBinTree_rcu_sht_member_less_pool_ic_stat)
+
+        CPPUNIT_TEST_SUITE_END()
+    };
+} // namespace tree
+
+#endif // #ifndef CDSHDRTEST_INTRUSIVE_BINTREE_H
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_hp.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_hp.cpp
new file mode 100644 (file)
index 0000000..39a189f
--- /dev/null
@@ -0,0 +1,167 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/intrusive/ellen_bintree_hp.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_hp.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef ci::ellen_bintree::node<cds::gc::HP>                        leaf_node;
+        typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_base_less()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::HP > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_base_less_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::HP > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_base_cmp()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::HP > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_base_cmpless()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::HP > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_base_less_ic()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::HP > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_base_cmp_ic()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::HP > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+        void IntrusiveBinTreeHdrTest::EllenBinTree_hp_base_cmp_ic_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::HP > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_base_less_pool()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::HP > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_hp::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_hp::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_base_less_pool_ic_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::HP > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_hp::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_hp::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_hp_member.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_hp_member.cpp
new file mode 100644 (file)
index 0000000..24473a7
--- /dev/null
@@ -0,0 +1,169 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/intrusive/ellen_bintree_hp.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_hp.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef ci::ellen_bintree::node<cds::gc::HP>                        leaf_node;
+        typedef IntrusiveBinTreeHdrTest::member_hook_value< leaf_node >     member_value;
+
+        typedef ci::opt::hook< ci::ellen_bintree::member_hook< offsetof(member_value, hook), co::gc< cds::gc::HP > > > member_hook;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_member_less()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_member_less_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_member_cmp()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_member_cmpless()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_member_less_ic()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_member_cmp_ic()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+        void IntrusiveBinTreeHdrTest::EllenBinTree_hp_member_cmp_ic_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_member_less_pool()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_hp::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_hp::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_hp_member_less_pool_ic_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::HP, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_hp::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_hp::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_pool_hp.h b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_pool_hp.h
new file mode 100644 (file)
index 0000000..f69fb67
--- /dev/null
@@ -0,0 +1,60 @@
+//$$CDS-header$$
+
+#ifndef CDSHDRTEST_INTRUSIVE_ELLEN_BINTREE_POOL_HP_H
+#define CDSHDRTEST_INTRUSIVE_ELLEN_BINTREE_POOL_HP_H
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/intrusive/ellen_bintree_hp.h>
+
+#include <cds/memory/vyukov_queue_pool.h>
+#include <cds/memory/pool_allocator.h>
+
+namespace tree {
+
+    namespace ellen_bintree_hp {
+        typedef cds::intrusive::ellen_bintree::node_types<cds::gc::HP, IntrusiveBinTreeHdrTest::key_type>   node_types;
+        typedef node_types::leaf_node_type                                  leaf_node;
+        typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
+        typedef node_types::internal_node_type                              internal_node;
+        typedef node_types::update_desc_type                                update_desc;
+
+
+        // Internal node pool based on Vyukov's queue
+        typedef cds::memory::lazy_vyukov_queue_pool<
+            internal_node,
+            cds::opt::buffer< cds::opt::v::dynamic_buffer< cds::any_type > >
+        > internal_node_pool_type;
+
+        extern internal_node_pool_type s_InternalNodePool;
+
+        struct internal_node_pool_accessor {
+            typedef internal_node_pool_type::value_type     value_type;
+
+            internal_node_pool_type& operator()() const
+            {
+                return s_InternalNodePool;
+            }
+        };
+
+        // Update descriptor pool based on Vyukov's queue
+        typedef cds::memory::vyukov_queue_pool<
+            update_desc,
+            cds::opt::buffer< cds::opt::v::static_buffer< cds::any_type, 16 > >
+        > update_desc_pool_type;
+
+        extern update_desc_pool_type s_UpdateDescPool;
+
+        struct update_desc_pool_accessor {
+            typedef update_desc_pool_type::value_type     value_type;
+
+            update_desc_pool_type& operator()() const
+            {
+                return s_UpdateDescPool;
+            }
+        };
+
+    } // namespace ellen_bintree_hp
+
+} // namespace tree
+
+#endif // #ifndef CDSHDRTEST_INTRUSIVE_ELLEN_BINTREE_POOL_HP_H
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_pool_ptb.h b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_pool_ptb.h
new file mode 100644 (file)
index 0000000..00fd22a
--- /dev/null
@@ -0,0 +1,60 @@
+//$$CDS-header$$
+
+#ifndef CDSHDRTEST_INTRUSIVE_ELLEN_BINTREE_POOL_PTB_H
+#define CDSHDRTEST_INTRUSIVE_ELLEN_BINTREE_POOL_PTB_H
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/intrusive/ellen_bintree_ptb.h>
+
+#include <cds/memory/vyukov_queue_pool.h>
+#include <cds/memory/pool_allocator.h>
+
+namespace tree {
+
+    namespace ellen_bintree_ptb {
+        typedef cds::intrusive::ellen_bintree::node_types<cds::gc::PTB, IntrusiveBinTreeHdrTest::key_type>   node_types;
+        typedef node_types::leaf_node_type                                  leaf_node;
+        typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
+        typedef node_types::internal_node_type                              internal_node;
+        typedef node_types::update_desc_type                                update_desc;
+
+
+        // Internal node pool based on Vyukov's queue
+        typedef cds::memory::lazy_vyukov_queue_pool<
+            internal_node,
+            cds::opt::buffer< cds::opt::v::dynamic_buffer< cds::any_type > >
+        > internal_node_pool_type;
+
+        extern internal_node_pool_type s_InternalNodePool;
+
+        struct internal_node_pool_accessor {
+            typedef internal_node_pool_type::value_type     value_type;
+
+            internal_node_pool_type& operator()() const
+            {
+                return s_InternalNodePool;
+            }
+        };
+
+        // Update descriptor pool based on Vyukov's queue
+        typedef cds::memory::vyukov_queue_pool<
+            update_desc,
+            cds::opt::buffer< cds::opt::v::static_buffer< cds::any_type, 16 > >
+        > update_desc_pool_type;
+
+        extern update_desc_pool_type s_UpdateDescPool;
+
+        struct update_desc_pool_accessor {
+            typedef update_desc_pool_type::value_type     value_type;
+
+            update_desc_pool_type& operator()() const
+            {
+                return s_UpdateDescPool;
+            }
+        };
+
+    } // namespace ellen_bintree_ptb
+
+} // namespace tree
+
+#endif // #ifndef CDSHDRTEST_INTRUSIVE_ELLEN_BINTREE_POOL_PTB_H
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_pool_rcu.h b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_pool_rcu.h
new file mode 100644 (file)
index 0000000..3232275
--- /dev/null
@@ -0,0 +1,70 @@
+//$$CDS-header$$
+
+#ifndef CDSHDRTEST_INTRUSIVE_ELLEN_BINTREE_POOL_RCU_H
+#define CDSHDRTEST_INTRUSIVE_ELLEN_BINTREE_POOL_RCU_H
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+#include <cds/memory/vyukov_queue_pool.h>
+#include <cds/memory/pool_allocator.h>
+
+namespace tree {
+
+    namespace ellen_bintree_rcu {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        typedef cds::intrusive::ellen_bintree::node_types<rcu_type, IntrusiveBinTreeHdrTest::key_type>   node_types;
+        typedef node_types::leaf_node_type                                  leaf_node;
+        typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
+        typedef node_types::internal_node_type                              internal_node;
+        typedef node_types::update_desc_type                                update_desc;
+
+        /*
+        typedef cds::intrusive::ellen_bintree::node<rcu_type>               leaf_node;
+        typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
+        typedef cds::intrusive::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef cds::intrusive::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+        */
+
+
+        // Internal node pool based on Vyukov's queue
+        typedef cds::memory::lazy_vyukov_queue_pool<
+            internal_node,
+            cds::opt::buffer< cds::opt::v::dynamic_buffer< cds::any_type > >
+        > internal_node_pool_type;
+
+        extern internal_node_pool_type s_InternalNodePool;
+
+        struct internal_node_pool_accessor {
+            typedef internal_node_pool_type::value_type     value_type;
+
+            internal_node_pool_type& operator()() const
+            {
+                return s_InternalNodePool;
+            }
+        };
+
+        // Update descriptor pool based on Vyukov's queue
+        typedef cds::memory::vyukov_queue_pool<
+            update_desc,
+            cds::opt::buffer< cds::opt::v::static_buffer< cds::any_type, 16 > >
+        > update_desc_pool_type;
+
+        extern update_desc_pool_type s_UpdateDescPool;
+
+        struct update_desc_pool_accessor {
+            typedef update_desc_pool_type::value_type     value_type;
+
+            update_desc_pool_type& operator()() const
+            {
+                return s_UpdateDescPool;
+            }
+        };
+
+    } // namespace ellen_bintree_rcu
+
+} // namespace tree
+
+#endif // #ifndef CDSHDRTEST_INTRUSIVE_ELLEN_BINTREE_POOL_RCU_H
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_ptb.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_ptb.cpp
new file mode 100644 (file)
index 0000000..f30e152
--- /dev/null
@@ -0,0 +1,167 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/intrusive/ellen_bintree_ptb.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_ptb.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef ci::ellen_bintree::node<cds::gc::PTB>                        leaf_node;
+        typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_base_less()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::PTB > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_base_less_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::PTB > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_base_cmp()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::PTB > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_base_cmpless()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::PTB > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_base_less_ic()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::PTB > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_base_cmp_ic()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::PTB > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+        void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_base_cmp_ic_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::PTB > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_base_less_pool()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::PTB > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_ptb::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_ptb::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_base_less_pool_ic_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::PTB > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_ptb::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_ptb::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_ptb_member.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_ptb_member.cpp
new file mode 100644 (file)
index 0000000..0fd41f6
--- /dev/null
@@ -0,0 +1,169 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/intrusive/ellen_bintree_ptb.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_ptb.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef ci::ellen_bintree::node<cds::gc::PTB>                        leaf_node;
+        typedef IntrusiveBinTreeHdrTest::member_hook_value< leaf_node >     member_value;
+
+        typedef ci::opt::hook< ci::ellen_bintree::member_hook< offsetof(member_value, hook), co::gc< cds::gc::PTB > > > member_hook;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_member_less()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_member_less_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_member_cmp()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_member_cmpless()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_member_less_ic()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_member_cmp_ic()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+        void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_member_cmp_ic_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_member_less_pool()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_ptb::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_ptb::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_ptb_member_less_pool_ic_stat()
+    {
+        typedef ci::EllenBinTree< cds::gc::PTB, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_ptb::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_ptb::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test<tree_type, print_stat>();
+    }
+
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpb.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpb.cpp
new file mode 100644 (file)
index 0000000..642f222
--- /dev/null
@@ -0,0 +1,170 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        typedef ci::ellen_bintree::node<rcu_type>                           leaf_node;
+        typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_less()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_less_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_cmp()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_cmpless()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_less_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_cmp_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+        void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_cmp_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_less_pool()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_less_pool_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpb_member.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpb_member.cpp
new file mode 100644 (file)
index 0000000..1fdbebc
--- /dev/null
@@ -0,0 +1,172 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/urcu/general_buffered.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
+
+        typedef ci::ellen_bintree::node<rcu_type>                           leaf_node;
+        typedef IntrusiveBinTreeHdrTest::member_hook_value< leaf_node >     member_value;
+
+        typedef ci::opt::hook< ci::ellen_bintree::member_hook< offsetof(member_value, hook), co::gc< rcu_type > > > member_hook;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_member_less()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_member_less_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_member_cmp()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_member_cmpless()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_member_less_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_member_cmp_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+        void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_member_cmp_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_member_less_pool()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_member_less_pool_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpi.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpi.cpp
new file mode 100644 (file)
index 0000000..ddd379a
--- /dev/null
@@ -0,0 +1,170 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        typedef ci::ellen_bintree::node<rcu_type>                           leaf_node;
+        typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_base_less()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_base_less_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_base_cmp()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_base_cmpless()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_base_less_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_base_cmp_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+        void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_base_cmp_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_base_less_pool()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_base_less_pool_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpi_member.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpi_member.cpp
new file mode 100644 (file)
index 0000000..e9651a1
--- /dev/null
@@ -0,0 +1,172 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/urcu/general_instant.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
+
+        typedef ci::ellen_bintree::node<rcu_type>                           leaf_node;
+        typedef IntrusiveBinTreeHdrTest::member_hook_value< leaf_node >     member_value;
+
+        typedef ci::opt::hook< ci::ellen_bintree::member_hook< offsetof(member_value, hook), co::gc< rcu_type > > > member_hook;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_member_less()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_member_less_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_member_cmp()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_member_cmpless()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_member_less_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_member_cmp_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+        void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_member_cmp_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_member_less_pool()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpi_member_less_pool_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpt.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpt.cpp
new file mode 100644 (file)
index 0000000..d11b4eb
--- /dev/null
@@ -0,0 +1,170 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+
+        typedef ci::ellen_bintree::node<rcu_type>                           leaf_node;
+        typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+}
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_base_less()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_base_less_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_base_cmp()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_base_cmpless()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_base_less_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_base_cmp_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+        void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_base_cmp_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_base_less_pool()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_base_less_pool_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpt_member.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_gpt_member.cpp
new file mode 100644 (file)
index 0000000..f0488f8
--- /dev/null
@@ -0,0 +1,172 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/urcu/general_threaded.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_type;
+
+        typedef ci::ellen_bintree::node<rcu_type>                           leaf_node;
+        typedef IntrusiveBinTreeHdrTest::member_hook_value< leaf_node >     member_value;
+
+        typedef ci::opt::hook< ci::ellen_bintree::member_hook< offsetof(member_value, hook), co::gc< rcu_type > > > member_hook;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_member_less()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_member_less_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_member_cmp()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_member_cmpless()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_member_less_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_member_cmp_ic()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+        void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_member_cmp_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_member_less_pool()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpt_member_less_pool_ic_stat()
+    {
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+    }
+
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_shb.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_shb.cpp
new file mode 100644 (file)
index 0000000..87b7fcc
--- /dev/null
@@ -0,0 +1,190 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+
+        typedef ci::ellen_bintree::node<rcu_type>                           leaf_node;
+        typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+#endif
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_base_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_base_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_base_less_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_base_cmp_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_base_cmp_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_base_less_pool()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_base_less_pool_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_shb_member.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_shb_member.cpp
new file mode 100644 (file)
index 0000000..d6e5f64
--- /dev/null
@@ -0,0 +1,191 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/urcu/signal_buffered.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
+
+        typedef ci::ellen_bintree::node<rcu_type>                           leaf_node;
+        typedef IntrusiveBinTreeHdrTest::member_hook_value< leaf_node >     member_value;
+
+        typedef ci::opt::hook< ci::ellen_bintree::member_hook< offsetof(member_value, hook), co::gc< rcu_type > > > member_hook;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+#endif
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_member_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_member_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_member_less_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_member_cmp_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_member_cmp_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_member_less_pool()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_shb_member_less_pool_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_sht.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_sht.cpp
new file mode 100644 (file)
index 0000000..bd2a579
--- /dev/null
@@ -0,0 +1,189 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+
+        typedef ci::ellen_bintree::node<rcu_type>                           leaf_node;
+        typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+#endif
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_base_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_base_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_base_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_base_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_base_less_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_base_cmp_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_base_cmp_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::compare< compare< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_base_less_pool()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_base_less_pool_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, base_value,
+            ci::ellen_bintree::make_traits<
+                ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
+                ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
+                ,co::less< less< base_value > >
+                ,ci::opt::disposer< disposer< base_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_sht_member.cpp b/tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_sht_member.cpp
new file mode 100644 (file)
index 0000000..c968426
--- /dev/null
@@ -0,0 +1,192 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include <cds/urcu/signal_threaded.h>
+#include <cds/intrusive/ellen_bintree_rcu.h>
+
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "unit/print_ellenbintree_stat.h"
+
+namespace tree {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    namespace ci = cds::intrusive;
+    namespace co = cds::opt;
+    namespace {
+        typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
+
+        typedef ci::ellen_bintree::node<rcu_type>                           leaf_node;
+        typedef IntrusiveBinTreeHdrTest::member_hook_value< leaf_node >     member_value;
+
+        typedef ci::opt::hook< ci::ellen_bintree::member_hook< offsetof(member_value, hook), co::gc< rcu_type > > > member_hook;
+
+        struct print_stat {
+            template <typename Tree>
+            void operator()( Tree const& t)
+            {
+                std::cout << t.statistics();
+            }
+        };
+
+        typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
+        typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
+    }
+#endif
+
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_member_less()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_member_less_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_member_cmp()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_member_cmpless()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_member_less_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_member_cmp_ic()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_member_cmp_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::compare< compare< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_member_less_pool()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+    void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_sht_member_less_pool_ic_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef ci::EllenBinTree< rcu_type, key_type, member_value,
+            ci::ellen_bintree::make_traits<
+                member_hook
+                ,ci::ellen_bintree::key_extractor< key_extractor< member_value > >
+                ,co::less< less< member_value > >
+                ,ci::opt::disposer< disposer< member_value > >
+                ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
+                ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< ci::ellen_bintree::stat<> >
+            >::type
+        > tree_type;
+
+        test_rcu<tree_type, print_stat>();
+#endif
+    }
+
+} //namespace tree
diff --git a/tests/test-hdr/tree/hdr_tree_reg.cpp b/tests/test-hdr/tree/hdr_tree_reg.cpp
new file mode 100644 (file)
index 0000000..9e55483
--- /dev/null
@@ -0,0 +1,29 @@
+//$$CDS-header$$
+
+#include "tree/hdr_intrusive_bintree.h"
+#include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
+#include "tree/hdr_intrusive_ellen_bintree_pool_hp.h"
+#include "tree/hdr_intrusive_ellen_bintree_pool_ptb.h"
+
+#include "tree/hdr_ellenbintree_set.h"
+#include "tree/hdr_ellenbintree_map.h"
+
+namespace tree {
+    namespace ellen_bintree_rcu {
+        internal_node_pool_type s_InternalNodePool( 1024 * 8 );
+        update_desc_pool_type   s_UpdateDescPool;
+    }
+    namespace ellen_bintree_hp {
+        internal_node_pool_type s_InternalNodePool( 1024 * 8 );
+        update_desc_pool_type   s_UpdateDescPool;
+    }
+    namespace ellen_bintree_ptb {
+        internal_node_pool_type s_InternalNodePool( 1024 * 8 );
+        update_desc_pool_type   s_UpdateDescPool;
+    }
+}
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION_(tree::IntrusiveBinTreeHdrTest, s_IntrusiveBinTreeHdrTest);
+CPPUNIT_TEST_SUITE_REGISTRATION_(tree::EllenBinTreeSetHdrTest, s_EllenBinTreeSetHdrTest);
+CPPUNIT_TEST_SUITE_REGISTRATION_(tree::EllenBinTreeMapHdrTest, s_EllenBinTreeMapHdrTest);
diff --git a/tests/unit/_template.cpp b/tests/unit/_template.cpp
new file mode 100644 (file)
index 0000000..6a8a628
--- /dev/null
@@ -0,0 +1,33 @@
+//$$CDS-header$$
+
+#include <vector>
+#include <algorithm>
+
+#include "cppunit/cppunit_proxy.h"
+
+#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
+using namespace std;
+#endif
+
+//
+// TestCase class
+//
+class Test : public CPPUNIT_NS::TestCase
+{
+  CPPUNIT_TEST_SUITE(Test);
+  CPPUNIT_TEST(test);
+  CPPUNIT_TEST_SUITE_END();
+
+protected:
+  void test();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(Test);
+
+//
+// tests implementation
+//
+void Test::test()
+{
+  CPPUNIT_ASSERT(true);
+}
diff --git a/tests/unit/alloc/hoard_threadtest.cpp b/tests/unit/alloc/hoard_threadtest.cpp
new file mode 100644 (file)
index 0000000..c931a5b
--- /dev/null
@@ -0,0 +1,180 @@
+//$$CDS-header$$
+
+// Hoard threadtest allocator test
+
+#include "alloc/michael_allocator.h"
+
+#include <cds/os/timer.h>
+#include <cds/os/topology.h>
+
+#include "cppunit/thread.h"
+
+namespace memory {
+
+    static size_t s_nPassCount = 1000;
+    static size_t s_nBlockCount = 10000;
+    static size_t s_nMinBlockSize = 16;
+    static size_t s_nMaxBlockSize = 1024;
+    static size_t s_nMaxThreadCount = 32;
+
+    static size_t s_nPassPerThread;
+
+    static size_t s_nCurBlockSize;
+
+#    define TEST_ALLOC(X, CLASS)            void X() { test< CLASS >( false )    ; }
+#    define TEST_ALLOC_STAT(X, CLASS)       void X() { test< CLASS >( true )    ; }
+
+    /*
+        In Threadtest, each thread performs s_nPassCount iterations of allocating s_nBlockCount
+        s_nCurBlockSize-byte blocks and then freeing them in order. The benchmarks capture
+        allocator latency and scalability under regular private allocation patterns.
+    */
+    class Hoard_ThreadTest: public CppUnitMini::TestCase
+    {
+        template <class ALLOC>
+        class Thread: public CppUnitMini::TestThread
+        {
+            ALLOC&      m_Alloc;
+            typedef typename ALLOC::value_type  value_type;
+            value_type **     m_arr;
+
+            virtual Thread *    clone()
+            {
+                return new Thread( *this );
+            }
+        public:
+
+        public:
+            Thread( CppUnitMini::ThreadPool& pool, ALLOC& a )
+                : CppUnitMini::TestThread( pool )
+                , m_Alloc( a )
+            {}
+            Thread( Thread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Alloc( src.m_Alloc )
+            {}
+
+            Hoard_ThreadTest&  getTest()
+            {
+                return reinterpret_cast<Hoard_ThreadTest&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+                m_arr = new value_type *[s_nBlockCount];
+            }
+            virtual void fini()
+            {
+                delete [] m_arr;
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                size_t nSize = s_nCurBlockSize / sizeof(value_type);
+                for ( size_t nPass = 0; nPass < s_nPassPerThread; ++nPass ) {
+                    value_type ** pCell = m_arr;
+                    for ( size_t i = 0; i < s_nBlockCount; ++i, ++pCell ) {
+                        *pCell = m_Alloc.allocate( nSize, NULL );
+                        CPPUNIT_ASSERT( *pCell != NULL );
+
+                        if ( nSize < 32 )
+                            memset( *pCell, 0, nSize );
+                        else {
+                            memset( *pCell, 0, 16 );
+                            memset( ((char *)(*pCell)) + nSize * sizeof(value_type) - 16, 0, 16 );
+                        }
+
+                        CPPUNIT_ASSERT( (reinterpret_cast<cds::uptr_atomic_t>(*pCell) & (ALLOC::alignment - 1)) == 0 );
+                    }
+                    pCell = m_arr;
+                    for ( size_t i = 0; i < s_nBlockCount; ++i, ++pCell ) {
+                        m_Alloc.deallocate( *pCell, 1 );
+                    }
+                }
+            }
+        };
+
+        template <class ALLOC>
+        void test( size_t nThreadCount )
+        {
+            ALLOC alloc;
+            cds::OS::Timer    timer;
+
+            CPPUNIT_MSG( "Thread count=" << nThreadCount );
+            s_nPassPerThread = s_nPassCount / nThreadCount;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread<ALLOC>( pool, alloc ), nThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "  Duration=" << pool.avgDuration() );
+        }
+
+        template <class ALLOC>
+        void test( bool bStat)
+        {
+            s_nCurBlockSize = s_nMinBlockSize;
+            while ( s_nCurBlockSize <= s_nMaxBlockSize ) {
+                CPPUNIT_MSG( "Block size=" << s_nCurBlockSize << ", block count=" << s_nBlockCount << ", pass count=" << s_nPassCount << " per thread" );
+                for ( size_t nThreadCount = 1; nThreadCount <= s_nMaxThreadCount; nThreadCount *= 2 ) {
+                    summary_stat stBegin;
+                    if ( bStat )
+                        ALLOC::stat(stBegin);
+
+                    test<ALLOC>( nThreadCount );
+
+                    summary_stat    stEnd;
+                    if ( bStat ) {
+                        ALLOC::stat( stEnd );
+
+                        std::cout << "\nStatistics:\n"
+                            << stEnd
+;
+                        stEnd -= stBegin;
+                        std::cout << "\nDelta statistics:\n"
+                            << stEnd
+;
+                    }
+                }
+                s_nCurBlockSize *= 2;
+            }
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg )
+        {
+            s_nPassCount = cfg.getULong( "PassCount", 1000 );
+            s_nBlockCount = cfg.getULong( "BlockCount", 10000 );
+            s_nMinBlockSize = cfg.getULong( "MinBlockSize", 16 );
+            s_nMaxBlockSize = cfg.getULong( "MaxBlockSize", 1024 );
+            s_nMaxThreadCount = cfg.getUInt( "MaxThreadCount", 32 );
+            if ( s_nMaxThreadCount == 0 )
+                s_nMaxThreadCount = cds::OS::topology::processor_count() * 2;
+        }
+
+        typedef MichaelAlignHeap_Stat<int, 64>      t_MichaelAlignHeap_Stat;
+        typedef MichaelAlignHeap_NoStat<int,64>     t_MichaelAlignHeap_NoStat;
+        typedef system_aligned_allocator<int, 64>   t_system_aligned_allocator;
+
+        TEST_ALLOC_STAT( michael_heap_stat,      MichaelHeap_Stat<int> )
+        TEST_ALLOC( michael_heap_nostat,    MichaelHeap_NoStat<int> )
+        TEST_ALLOC( std_alloc,              std_allocator<int> )
+
+        TEST_ALLOC_STAT( michael_alignheap_stat,     t_MichaelAlignHeap_Stat )
+        TEST_ALLOC( michael_alignheap_nostat,   t_MichaelAlignHeap_NoStat )
+        TEST_ALLOC( system_aligned_alloc,       t_system_aligned_allocator )
+
+        CPPUNIT_TEST_SUITE( Hoard_ThreadTest )
+            CPPUNIT_TEST( std_alloc )
+            CPPUNIT_TEST( michael_heap_stat )
+            CPPUNIT_TEST( michael_heap_nostat )
+
+            CPPUNIT_TEST( system_aligned_alloc )
+            CPPUNIT_TEST( michael_alignheap_stat )
+            CPPUNIT_TEST( michael_alignheap_nostat )
+
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+}   // namespace memory
+CPPUNIT_TEST_SUITE_REGISTRATION( memory::Hoard_ThreadTest );
diff --git a/tests/unit/alloc/larson.cpp b/tests/unit/alloc/larson.cpp
new file mode 100644 (file)
index 0000000..f09de31
--- /dev/null
@@ -0,0 +1,202 @@
+//$$CDS-header$$
+
+// Larson allocator test
+
+#include "alloc/michael_allocator.h"
+#include "alloc/random_gen.h"
+
+#include <cds/os/timer.h>
+#include <cds/os/topology.h>
+
+#include "cppunit/thread.h"
+
+namespace memory {
+
+    static size_t s_nMaxThreadCount = 32;
+    static unsigned int s_nMinBlockSize = 8;
+    static unsigned int s_nMaxBlockSize = 1024;
+    static size_t s_nBlocksPerThread = 1000;
+    static size_t s_nPassCount = 100000;
+
+    static size_t s_nPassPerThread;
+
+
+#    define TEST_ALLOC(X, CLASS)    void X() { test< CLASS >(false)    ; }
+#    define TEST_ALLOC_STAT(X, CLASS)    void X() { test< CLASS >(true)    ; }
+
+    /*
+        In this test, initially one thread allocates and frees random
+        sized blocks (s_nMinBlockSize to s_nMaxBlockSize bytes) in random order, then an
+        equal number of blocks (s_nBlocksPerThread) is handed over to each of the
+        remaining threads. In the parallel phase, each thread randomly selects a block and
+        frees it, then allocates a new random-sized block in its place.
+        The benchmark measures the duration of s_nPassCount free/malloc pairs
+        during the parallel phase. Larson captures the robustness of malloc\92s latency
+        and scalability under irregular allocation patterns with respect to block-size
+        and order of deallocation over a long period of time.
+    */
+    class Larson: public CppUnitMini::TestCase
+    {
+        typedef char ** thread_data;
+
+        thread_data *   m_aThreadData;
+
+
+        template <class ALLOC>
+        class Thread: public CppUnitMini::TestThread
+        {
+            ALLOC&      m_Alloc;
+            typedef typename ALLOC::value_type value_type;
+
+            virtual Thread *    clone()
+            {
+                return new Thread( *this );
+            }
+
+            randomGen<size_t>   m_rndGen;
+        public:
+            thread_data     m_arr;
+
+        public:
+            Thread( CppUnitMini::ThreadPool& pool, ALLOC& a )
+                : CppUnitMini::TestThread( pool )
+                , m_Alloc( a )
+            {}
+            Thread( Thread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Alloc( src.m_Alloc )
+            {}
+
+            Larson&  getTest()
+            {
+                return reinterpret_cast<Larson&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                for ( size_t nPass = 0; nPass < s_nPassPerThread; ++nPass ) {
+                    size_t nItem = m_rndGen( size_t(1), s_nBlocksPerThread ) - 1;
+                    m_Alloc.deallocate( reinterpret_cast<value_type *>(m_arr[nItem]), 1 );
+                    m_arr[nItem] = reinterpret_cast<char *>( m_Alloc.allocate( m_rndGen(s_nMinBlockSize, s_nMaxBlockSize), NULL ));
+                    CPPUNIT_ASSERT( (reinterpret_cast<cds::uptr_atomic_t>(m_arr[nItem]) & (ALLOC::alignment - 1)) == 0 );
+                }
+            }
+        };
+
+        template <class ALLOC>
+        void test( size_t nThreadCount )
+        {
+            ALLOC alloc;
+
+            CPPUNIT_MSG( "Thread count=" << nThreadCount );
+            CPPUNIT_MSG("Initialize data..." );
+
+            randomGen<unsigned int> rndGen;
+
+            s_nPassPerThread = s_nPassCount / nThreadCount;
+
+            size_t nThread;
+            m_aThreadData = new thread_data[ nThreadCount ];
+            for ( nThread = 0; nThread < nThreadCount; ++nThread ) {
+                thread_data thData
+                    = m_aThreadData[nThread]
+                    = new char *[ s_nBlocksPerThread ];
+                    for ( size_t i = 0; i < s_nBlocksPerThread; ++i ) {
+                        thData[i] = reinterpret_cast<char *>( alloc.allocate( rndGen(s_nMinBlockSize, s_nMaxBlockSize), NULL ));
+                        CPPUNIT_ASSERT( (reinterpret_cast<cds::uptr_atomic_t>(thData[i]) & (ALLOC::alignment - 1)) == 0 );
+                    }
+            }
+            CPPUNIT_MSG("Initializatin done" );
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread<ALLOC>( pool, alloc ), nThreadCount );
+            nThread = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it )
+                static_cast<Thread<ALLOC> *>(*it)->m_arr = m_aThreadData[nThread++];
+
+            cds::OS::Timer    timer;
+            pool.run();
+            CPPUNIT_MSG( "  Duration=" << pool.avgDuration() );
+
+            for ( nThread = 0; nThread < nThreadCount; ++nThread ) {
+                thread_data thData = m_aThreadData[nThread];
+                for ( size_t i = 0; i < s_nBlocksPerThread; ++i ) {
+                    alloc.deallocate( reinterpret_cast<typename ALLOC::value_type *>(thData[i]), 1 );
+                }
+                delete [] thData;
+            }
+            delete [] m_aThreadData;
+        }
+
+        template <class ALLOC>
+        void test( bool bStat )
+        {
+            CPPUNIT_MSG( "Block size=" << s_nMinBlockSize << "-" << s_nMaxBlockSize
+                << ", block count per thread=" << s_nBlocksPerThread << ", pass count=" << s_nPassCount );
+
+            for ( size_t nThreadCount = 2; nThreadCount <= s_nMaxThreadCount; nThreadCount *= 2 ) {
+                summary_stat stBegin;
+                if ( bStat )
+                    ALLOC::stat(stBegin);
+
+                test<ALLOC>( nThreadCount );
+
+                summary_stat    stEnd;
+                if ( bStat ) {
+                    ALLOC::stat( stEnd );
+
+                    std::cout << "\nStatistics:\n"
+                        << stEnd
+;
+                    stEnd -= stBegin;
+                    std::cout << "\nDelta statistics:\n"
+                        << stEnd
+;
+                }
+            }
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg )
+        {
+            s_nPassCount = cfg.getULong( "PassCount", 100000 );
+            s_nMinBlockSize = cfg.getUInt( "MinBlockSize", 8 );
+            s_nMaxBlockSize = cfg.getUInt( "MaxBlockSize", 1024 );
+            s_nBlocksPerThread = cfg.getUInt( "BlocksPerThread", 10000 );
+            s_nMaxThreadCount = cfg.getUInt( "MaxThreadCount", 32 );
+            if ( s_nMaxThreadCount == 0 )
+                s_nMaxThreadCount = cds::OS::topology::processor_count() * 2;
+            if ( s_nMaxThreadCount < 2 )
+                s_nMaxThreadCount = 2;
+            if ( s_nPassCount < s_nBlocksPerThread )
+                s_nBlocksPerThread = s_nPassCount;
+        }
+
+        typedef MichaelAlignHeap_Stat<int, 64>      t_MichaelAlignHeap_Stat;
+        typedef MichaelAlignHeap_NoStat<int,64>     t_MichaelAlignHeap_NoStat;
+        typedef system_aligned_allocator<int, 64>   t_system_aligned_allocator;
+
+        TEST_ALLOC_STAT( michael_heap_stat,      MichaelHeap_Stat<int> )
+        TEST_ALLOC( michael_heap_nostat,    MichaelHeap_NoStat<int> )
+        TEST_ALLOC( std_alloc,              std_allocator<int> )
+
+        TEST_ALLOC_STAT( michael_alignheap_stat,     t_MichaelAlignHeap_Stat )
+        TEST_ALLOC( michael_alignheap_nostat,   t_MichaelAlignHeap_NoStat )
+        TEST_ALLOC( system_aligned_alloc,       t_system_aligned_allocator )
+
+        CPPUNIT_TEST_SUITE( Larson )
+            CPPUNIT_TEST( michael_heap_stat )
+            CPPUNIT_TEST( michael_heap_nostat )
+            CPPUNIT_TEST( std_alloc )
+
+            CPPUNIT_TEST( system_aligned_alloc )
+            CPPUNIT_TEST( michael_alignheap_stat )
+            CPPUNIT_TEST( michael_alignheap_nostat )
+
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+}   // namespace memory
+CPPUNIT_TEST_SUITE_REGISTRATION( memory::Larson );
diff --git a/tests/unit/alloc/linux_scale.cpp b/tests/unit/alloc/linux_scale.cpp
new file mode 100644 (file)
index 0000000..a09d5a9
--- /dev/null
@@ -0,0 +1,157 @@
+//$$CDS-header$$
+
+// Linux scalability allocator test
+
+#include "alloc/michael_allocator.h"
+
+#include <cds/os/timer.h>
+#include <cds/os/topology.h>
+
+#include "cppunit/thread.h"
+
+namespace memory {
+
+    static size_t s_nPassCount = 10000000;
+    static size_t s_nMaxBlockSize = 64 * 1024 - 16;
+    static size_t s_nMaxThreadCount = 64;
+
+    static size_t s_nPassPerThread;
+
+#    define TEST_ALLOC(X, CLASS)    void X() { test< CLASS >(false)     ; }
+#    define TEST_ALLOC_STAT(X, CLASS)    void X() { test< CLASS >(true) ; }
+
+    class Linux_Scale: public CppUnitMini::TestCase
+    {
+        template <class ALLOC>
+        class Thread: public CppUnitMini::TestThread
+        {
+            ALLOC&      m_Alloc;
+            size_t      m_nSize;
+
+            virtual Thread *    clone()
+            {
+                return new Thread( *this );
+            }
+        public:
+
+        public:
+            Thread( CppUnitMini::ThreadPool& pool, ALLOC& a, size_t nSize )
+                : CppUnitMini::TestThread( pool )
+                , m_Alloc( a )
+                , m_nSize( nSize )
+            {}
+            Thread( Thread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Alloc( src.m_Alloc )
+                , m_nSize( src.m_nSize )
+            {}
+
+            Linux_Scale&  getTest()
+            {
+                return reinterpret_cast<Linux_Scale&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                for ( size_t i = 0; i < s_nPassPerThread; ++i ) {
+                    typename ALLOC::value_type * p = m_Alloc.allocate( m_nSize / sizeof(typename ALLOC::value_type), NULL );
+                    CPPUNIT_ASSERT( p != NULL );
+                    if ( m_nSize < 32 )
+                        memset( p, 0, m_nSize );
+                    else {
+                        memset( p, 0, 16 );
+                        memset( ((char *)p) + m_nSize * sizeof(*p) - 16, 0, 16 );
+                    }
+                    CPPUNIT_ASSERT( (reinterpret_cast<cds::uptr_atomic_t>(p) & (ALLOC::alignment - 1)) == 0 );
+                    m_Alloc.deallocate( p, 1 );
+                }
+            }
+        };
+
+        template <class ALLOC>
+        void test( size_t nThreadCount, size_t nSize )
+        {
+            cds::OS::Timer    timer;
+
+            ALLOC alloc;
+
+            CPPUNIT_MSG( "   Block size=" << nSize );
+            s_nPassPerThread = s_nPassCount / nThreadCount;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread<ALLOC>( pool, alloc, nSize ), nThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "      Duration=" << pool.avgDuration() );
+        }
+
+        template <class ALLOC>
+        void test( size_t nThreadCount )
+        {
+            CPPUNIT_MSG( "Thread count=" << nThreadCount );
+            for ( size_t sz = 1; sz < s_nMaxBlockSize; sz *= 2 ) {
+                test<ALLOC>( nThreadCount, sz );
+            }
+        }
+
+        template <class ALLOC>
+        void test( bool bStat )
+        {
+            for ( size_t nThreadCount = 1; nThreadCount <= s_nMaxThreadCount; nThreadCount *= 2 ) {
+                summary_stat stBegin;
+                if ( bStat )
+                    ALLOC::stat(stBegin);
+
+                test<ALLOC>( nThreadCount );
+
+                summary_stat    stEnd;
+                if ( bStat ) {
+                    ALLOC::stat( stEnd );
+
+                    std::cout << "\nStatistics:\n"
+                        << stEnd
+;
+                    stEnd -= stBegin;
+                    std::cout << "\nDelta statistics:\n"
+                        << stEnd
+;
+                }
+            }
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg )
+        {
+            s_nPassCount = cfg.getULong( "PassCount", 10000000 );
+            s_nMaxBlockSize = cfg.getULong( "MaxBlockSize", 64 * 1024 - 16 );
+            s_nMaxThreadCount = cfg.getUInt( "MaxThreadCount", 64 );
+            if ( s_nMaxThreadCount == 0 )
+                s_nMaxThreadCount = cds::OS::topology::processor_count() * 2;
+        }
+
+        typedef MichaelAlignHeap_Stat<char, 64>      t_MichaelAlignHeap_Stat;
+        typedef MichaelAlignHeap_NoStat<char,64>     t_MichaelAlignHeap_NoStat;
+        typedef system_aligned_allocator<char, 64>   t_system_aligned_allocator;
+
+        TEST_ALLOC_STAT( michael_heap_stat,      MichaelHeap_Stat<char> )
+        TEST_ALLOC( michael_heap_nostat,    MichaelHeap_NoStat<char> )
+        TEST_ALLOC( std_alloc,              std_allocator<char> )
+
+        TEST_ALLOC_STAT( michael_alignheap_stat,     t_MichaelAlignHeap_Stat )
+        TEST_ALLOC( michael_alignheap_nostat,   t_MichaelAlignHeap_NoStat )
+        TEST_ALLOC( system_aligned_alloc,       t_system_aligned_allocator )
+
+        CPPUNIT_TEST_SUITE( Linux_Scale )
+            CPPUNIT_TEST( michael_heap_nostat )
+            CPPUNIT_TEST( michael_heap_stat )
+            CPPUNIT_TEST( std_alloc )
+
+            CPPUNIT_TEST( system_aligned_alloc )
+            CPPUNIT_TEST( michael_alignheap_stat )
+            CPPUNIT_TEST( michael_alignheap_nostat )
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+}   // namespace memory
+CPPUNIT_TEST_SUITE_REGISTRATION( memory::Linux_Scale );
diff --git a/tests/unit/alloc/michael_allocator.cpp b/tests/unit/alloc/michael_allocator.cpp
new file mode 100644 (file)
index 0000000..782cc66
--- /dev/null
@@ -0,0 +1,8 @@
+//$$CDS-header$$
+
+#include "alloc/michael_allocator.h"
+
+namespace memory {
+    t_MichaelHeap_NoStat  s_MichaelHeap_NoStat;
+    t_MichaelHeap_Stat    s_MichaelHeap_Stat;
+}
diff --git a/tests/unit/alloc/michael_allocator.h b/tests/unit/alloc/michael_allocator.h
new file mode 100644 (file)
index 0000000..7ef01a6
--- /dev/null
@@ -0,0 +1,197 @@
+//$$CDS-header$$
+
+#include <cds/memory/michael/allocator.h>
+#include <iostream>
+
+namespace memory {
+    namespace ma = cds::memory::michael;
+
+    typedef ma::Heap<
+        ma::opt::procheap_stat<ma::procheap_empty_stat>,
+        ma::opt::os_allocated_stat<ma::os_allocated_empty>,
+        ma::opt::check_bounds<ma::debug_bound_checking>
+    >      t_MichaelHeap_NoStat;
+
+    typedef ma::Heap<
+        ma::opt::procheap_stat<ma::procheap_atomic_stat >,
+        ma::opt::os_allocated_stat<ma::os_allocated_atomic >,
+        ma::opt::check_bounds<ma::debug_bound_checking>
+    >  t_MichaelHeap_Stat;
+
+    typedef ma::summary_stat            summary_stat;
+
+    extern t_MichaelHeap_NoStat  s_MichaelHeap_NoStat;
+    extern t_MichaelHeap_Stat    s_MichaelHeap_Stat;
+
+    template <typename T>
+    class MichaelHeap_NoStat
+    {
+    public:
+        typedef T value_type;
+        typedef T * pointer;
+
+        enum {
+            alignment = 1
+        };
+
+
+        pointer allocate( size_t nSize, const void * pHint )
+        {
+            return reinterpret_cast<pointer>( s_MichaelHeap_NoStat.alloc( sizeof(T) * nSize ) );
+        }
+
+        void deallocate( pointer p, size_t nCount )
+        {
+            s_MichaelHeap_NoStat.free( p );
+        }
+
+        static void stat(summary_stat& s)
+        {
+            s_MichaelHeap_NoStat.summaryStat(s);
+        }
+    };
+
+    template <typename T>
+    class std_allocator: public std::allocator<T>
+    {
+    public:
+        enum {
+            alignment = 1
+        };
+
+        static void stat(summary_stat& s)
+        {}
+    };
+
+    template <typename T>
+    class MichaelHeap_Stat
+    {
+    public:
+        typedef T value_type;
+        typedef T * pointer;
+
+        enum {
+            alignment = 1
+        };
+
+        pointer allocate( size_t nSize, const void * pHint )
+        {
+            return reinterpret_cast<pointer>( s_MichaelHeap_Stat.alloc( sizeof(T) * nSize ) );
+        }
+
+        void deallocate( pointer p, size_t nCount )
+        {
+            s_MichaelHeap_Stat.free( p );
+        }
+
+        static void stat(summary_stat& s)
+        {
+            s_MichaelHeap_Stat.summaryStat(s);
+        }
+    };
+
+    template <typename T, size_t ALIGN>
+    class MichaelAlignHeap_NoStat
+    {
+    public:
+        typedef T value_type;
+        typedef T * pointer;
+
+        enum {
+            alignment = ALIGN
+        };
+
+        pointer allocate( size_t nSize, const void * pHint )
+        {
+            return reinterpret_cast<pointer>( s_MichaelHeap_NoStat.alloc_aligned( sizeof(T) * nSize, ALIGN ) );
+        }
+
+        void deallocate( pointer p, size_t nCount )
+        {
+            s_MichaelHeap_NoStat.free_aligned( p );
+        }
+
+        static void stat(summary_stat& s)
+        {
+            s_MichaelHeap_NoStat.summaryStat(s);
+        }
+    };
+
+    template <typename T, size_t ALIGN>
+    class MichaelAlignHeap_Stat {
+    public:
+        typedef T value_type;
+        typedef T * pointer;
+
+        enum {
+            alignment = ALIGN
+        };
+
+        pointer allocate( size_t nSize, const void * pHint )
+        {
+            return reinterpret_cast<pointer>( s_MichaelHeap_Stat.alloc_aligned( sizeof(T) * nSize, ALIGN ) );
+        }
+
+        void deallocate( pointer p, size_t nCount )
+        {
+            s_MichaelHeap_Stat.free_aligned( p );
+        }
+
+        static void stat(summary_stat& s)
+        {
+            s_MichaelHeap_Stat.summaryStat(s);
+        }
+    };
+
+    template <typename T, size_t ALIGN>
+    class system_aligned_allocator
+    {
+    public:
+        typedef T value_type;
+        typedef T * pointer;
+
+        enum {
+            alignment = ALIGN
+        };
+
+        pointer allocate( size_t nSize, const void * pHint )
+        {
+            return reinterpret_cast<pointer>( cds::OS::aligned_malloc( sizeof(T) * nSize, ALIGN ) );
+        }
+
+        void deallocate( pointer p, size_t nCount )
+        {
+            cds::OS::aligned_free( p );
+        }
+
+        static void stat(summary_stat& s)
+        {}
+    };
+
+    static inline std::ostream& operator <<(std::ostream& os, const summary_stat& s)
+    {
+        os  << "\t         alloc from active: " << s.nAllocFromActive << "\n"
+            << "\t        alloc from partial: " << s.nAllocFromPartial << "\n"
+            << "\t            alloc from new: " << s.nAllocFromNew << "\n"
+            << "\t           free call count: " << s.nFreeCount << "\n"
+            << "\t      superblock allocated: " << s.nPageAllocCount << "\n"
+            << "\t    superblock deallocated: " << s.nPageDeallocCount << "\n"
+            << "\t superblock desc allocated: " << s.nDescAllocCount << "\n"
+            << "\t      superblock full desc: " << s.nDescFull << "\n"
+            << "\t     total allocated bytes: " << s.nBytesAllocated << "\n"
+            << "\t   total deallocated bytes: " << s.nBytesDeallocated << "\n"
+            << "\tOS-allocated large blocks\n"
+            << "\t          alloc call count: " << s.nSysAllocCount << "\n"
+            << "\t           free call count: " << s.nSysFreeCount << "\n"
+            << "\t     total allocated bytes: " << s.nSysBytesAllocated << "\n"
+            << "\t   total deallocated bytes: " << s.nSysBytesDeallocated << "\n"
+            << "\tCAS contention indicators\n"
+            << "\t updating active field of active block: " << s.nActiveDescCASFailureCount << "\n"
+            << "\t updating anchor field of active block: " << s.nActiveAnchorCASFailureCount << "\n"
+            << "\tupdating active field of partial block: " << s.nPartialDescCASFailureCount << "\n"
+            << "\tupdating anchor field of partial block: " << s.nPartialAnchorCASFailureCount
+            << std::endl;
+
+        return os;
+    }
+}
diff --git a/tests/unit/alloc/random.cpp b/tests/unit/alloc/random.cpp
new file mode 100644 (file)
index 0000000..dca2b10
--- /dev/null
@@ -0,0 +1,202 @@
+//$$CDS-header$$
+
+// Random allocator test
+
+#include "alloc/michael_allocator.h"
+#include "alloc/random_gen.h"
+
+#include <cds/os/timer.h>
+#include <cds/os/topology.h>
+
+#include "cppunit/thread.h"
+
+namespace memory {
+
+    static size_t s_nMaxThreadCount = 32;
+    static unsigned int s_nMinBlockSize = 8;
+    static unsigned int s_nMaxBlockSize = 1024;
+    //static size_t s_nBlocksPerThread = 1000;
+    static size_t s_nPassCount = 100000;
+    static size_t s_nDataSize = 1000;
+
+    static size_t s_nPassPerThread;
+
+    struct Item {
+        cds::SpinLock   m_access;
+        char *          m_pszBlock;
+
+        Item()
+            : m_access( false )
+            , m_pszBlock( NULL )
+        {}
+
+        Item& operator =(Item const& i)
+        {
+            m_pszBlock = i.m_pszBlock;
+            return *this;
+        }
+    };
+    typedef std::vector<Item>   item_array;
+
+#    define TEST_ALLOC(X, CLASS)        void X() { test< CLASS >(false); }
+#    define TEST_ALLOC_STAT(X, CLASS)   void X() { test< CLASS >(true) ; }
+
+    class Random_Alloc: public CppUnitMini::TestCase
+    {
+        item_array  m_Data;
+
+        template <class ALLOC>
+        class Thread: public CppUnitMini::TestThread
+        {
+            ALLOC&      m_Alloc;
+            typedef typename ALLOC::value_type value_type;
+
+            randomGen<size_t>   m_rndGen;
+
+            virtual Thread *    clone()
+            {
+                return new Thread( *this );
+            }
+
+        public:
+            Thread( CppUnitMini::ThreadPool& pool, ALLOC& a )
+                : CppUnitMini::TestThread( pool )
+                , m_Alloc( a )
+            {}
+            Thread( Thread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Alloc( src.m_Alloc )
+            {}
+
+            Random_Alloc&  getTest()
+            {
+                return reinterpret_cast<Random_Alloc&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                item_array& arr = getTest().m_Data;
+                for ( size_t nPass = 0; nPass < s_nPassPerThread; ) {
+                    size_t nIdx = m_rndGen( size_t(0), s_nDataSize - 1 );
+                    Item & item = arr.at(nIdx);
+                    if ( item.m_access.tryLock() ) {
+                        if ( item.m_pszBlock ) {
+                            m_Alloc.deallocate( item.m_pszBlock, 1 );
+                            item.m_pszBlock = NULL;
+                        }
+                        else {
+                            size_t nSize;
+                            item.m_pszBlock = m_Alloc.allocate( nSize = m_rndGen(s_nMinBlockSize, s_nMaxBlockSize ), NULL );
+
+                            if ( nSize < 32 )
+                                memset( item.m_pszBlock, 0, nSize );
+                            else {
+                                memset( item.m_pszBlock, 0, 16 );
+                                memset( ((char *) item.m_pszBlock) + nSize * sizeof(*item.m_pszBlock) - 16, 0, 16 );
+                            }
+                        }
+                        item.m_access.unlock();
+
+                        ++nPass;
+                    }
+                }
+            }
+        };
+
+        template <class ALLOC>
+        void test( size_t nThreadCount )
+        {
+            ALLOC alloc;
+
+            CPPUNIT_MSG( "Thread count=" << nThreadCount );
+            s_nPassPerThread = s_nPassCount / nThreadCount;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread<ALLOC>( pool, alloc ), nThreadCount );
+
+            cds::OS::Timer    timer;
+            pool.run();
+            CPPUNIT_MSG( "  Duration=" << pool.avgDuration() );
+
+            for ( size_t i = 0; i < m_Data.size(); ++i ) {
+                if ( m_Data[i].m_pszBlock ) {
+                    alloc.deallocate( m_Data[i].m_pszBlock, 1 );
+                    m_Data[i].m_pszBlock = NULL;
+                }
+            }
+        }
+
+        template <class ALLOC>
+        void test( bool bStat )
+        {
+            CPPUNIT_MSG( "Block size=" << s_nMinBlockSize << "-" << s_nMaxBlockSize
+                << ", pass count=" << s_nPassCount << ", data size=" << s_nDataSize );
+
+            m_Data.resize( s_nDataSize );
+
+            for ( size_t nThreadCount = 2; nThreadCount <= s_nMaxThreadCount; nThreadCount *= 2 ) {
+                summary_stat    stBegin;
+                if ( bStat )
+                    ALLOC::stat( stBegin );
+
+                test<ALLOC>( nThreadCount );
+
+                summary_stat    stEnd;
+                if ( bStat ) {
+                    ALLOC::stat( stEnd );
+
+                    std::cout << "\nStatistics:\n"
+                        << stEnd
+;
+                    stEnd -= stBegin;
+                    std::cout << "\nDelta statistics:\n"
+                        << stEnd
+;
+                }
+            }
+
+            m_Data.resize(0);
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg )
+        {
+            s_nDataSize = cfg.getULong( "DataSize", 1000 );
+            s_nPassCount = cfg.getULong( "PassCount", 100000 );
+            s_nMinBlockSize = cfg.getUInt( "MinBlockSize", 8 );
+            s_nMaxBlockSize = cfg.getUInt( "MaxBlockSize", 1024 );
+            s_nMaxThreadCount = cfg.getUInt( "MaxThreadCount", 32 );
+            if ( s_nMaxThreadCount == 0 )
+                s_nMaxThreadCount = cds::OS::topology::processor_count() * 2;
+            if ( s_nMaxThreadCount < 2 )
+                s_nMaxThreadCount = 2;
+        }
+
+        typedef MichaelAlignHeap_Stat<char, 32>     t_MichaelAlignHeap_Stat;
+        typedef MichaelAlignHeap_NoStat<char,32>    t_MichaelAlignHeap_NoStat;
+        typedef system_aligned_allocator<char, 32>  t_system_aligned_allocator;
+
+        TEST_ALLOC_STAT( michael_heap_stat, MichaelHeap_Stat<char> )
+        TEST_ALLOC( michael_heap_nostat,    MichaelHeap_NoStat<char> )
+        TEST_ALLOC( std_alloc,              std_allocator<char> )
+
+        TEST_ALLOC_STAT( michael_alignheap_stat,t_MichaelAlignHeap_Stat )
+        TEST_ALLOC( michael_alignheap_nostat,   t_MichaelAlignHeap_NoStat )
+        TEST_ALLOC( system_aligned_alloc,       t_system_aligned_allocator )
+
+        CPPUNIT_TEST_SUITE( Random_Alloc )
+            CPPUNIT_TEST( michael_heap_stat )
+            CPPUNIT_TEST( michael_heap_nostat )
+            CPPUNIT_TEST( std_alloc )
+
+            CPPUNIT_TEST( system_aligned_alloc )
+            CPPUNIT_TEST( michael_alignheap_stat )
+            CPPUNIT_TEST( michael_alignheap_nostat )
+
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+}   // namespace memory
+CPPUNIT_TEST_SUITE_REGISTRATION( memory::Random_Alloc );
diff --git a/tests/unit/alloc/random_gen.h b/tests/unit/alloc/random_gen.h
new file mode 100644 (file)
index 0000000..9d6c66c
--- /dev/null
@@ -0,0 +1,44 @@
+//$$CDS-header$$
+
+// Random number geerator
+
+#ifndef __CPPUNIT_MEMORY_RANDOM_GEN_H
+#define __CPPUNIT_MEMORY_RANDOM_GEN_H
+
+
+#include <boost/random/mersenne_twister.hpp>
+#include <boost/random/uniform_int.hpp>
+#include <boost/random/variate_generator.hpp>
+
+namespace memory {
+    template <typename T>
+    class randomGen
+    {
+        boost::mt19937   m_rndGen;
+    public:
+        typedef T   random_type;
+
+        randomGen()
+        {}
+
+        random_type gen( random_type nMin, random_type nMax )
+        {
+            boost::uniform_int<random_type> dist(nMin, nMax);
+            return boost::variate_generator<boost::mt19937&, boost::uniform_int<random_type> >(m_rndGen, dist)();
+        }
+
+        /*
+        random_type operator()()
+        {
+            return gen( s_nMinBlockSize, s_nMaxBlockSize );
+        }
+        */
+
+        random_type operator()( random_type nMin, random_type nMax )
+        {
+            return gen( nMin, nMax );
+        }
+    };
+}   // namespace memory
+
+#endif // __CPPUNIT_MEMORY_RANDOM_GEN_H
diff --git a/tests/unit/ellen_bintree_update_desc_pool.cpp b/tests/unit/ellen_bintree_update_desc_pool.cpp
new file mode 100644 (file)
index 0000000..e971f91
--- /dev/null
@@ -0,0 +1,12 @@
+//$$CDS-header$$
+
+#include "ellen_bintree_update_desc_pool.h"
+
+namespace ellen_bintree_pool {
+    update_desc_pool_type s_UpdateDescPool;
+
+    bounded_update_desc_pool_type s_BoundedUpdateDescPool;
+
+    cds::atomicity::event_counter   internal_node_counter::m_nAlloc;
+    cds::atomicity::event_counter   internal_node_counter::m_nFree;
+}
diff --git a/tests/unit/ellen_bintree_update_desc_pool.h b/tests/unit/ellen_bintree_update_desc_pool.h
new file mode 100644 (file)
index 0000000..d88f60c
--- /dev/null
@@ -0,0 +1,101 @@
+//$$CDS-header$$
+
+#ifndef __CDS_UNIT_ELLEN_BINTREE_UPDATE_DESC_POOL_H
+#define __CDS_UNIT_ELLEN_BINTREE_UPDATE_DESC_POOL_H
+
+#include <cds/urcu/general_instant.h>
+#include <cds/container/ellen_bintree_base.h>
+#include <cds/memory/vyukov_queue_pool.h>
+#include <cds/memory/pool_allocator.h>
+
+namespace ellen_bintree_pool {
+    typedef cds::container::ellen_bintree::node_types< cds::urcu::gc< cds::urcu::general_instant<> >, int > node_types ; // fake
+    typedef node_types::leaf_node_type     leaf_node;
+    typedef node_types::internal_node_type internal_node;
+    typedef node_types::update_desc_type   update_desc;
+
+    // Update descriptor pool based on Vyukov's queue
+    typedef cds::memory::vyukov_queue_pool<
+        update_desc,
+        cds::opt::buffer< cds::opt::v::static_buffer< cds::any_type, 4096 > >
+    > update_desc_pool_type;
+
+    extern update_desc_pool_type s_UpdateDescPool;
+
+    struct update_desc_pool_accessor {
+        typedef update_desc_pool_type::value_type     value_type;
+
+        update_desc_pool_type& operator()() const
+        {
+            return s_UpdateDescPool;
+        }
+    };
+
+    // Update descriptor pool based on bounded Vyukov's queue
+    typedef cds::memory::bounded_vyukov_queue_pool<
+        update_desc,
+        cds::opt::buffer< cds::opt::v::static_buffer< cds::any_type, 4096 > >
+    > bounded_update_desc_pool_type;
+
+    extern bounded_update_desc_pool_type s_BoundedUpdateDescPool;
+
+    struct bounded_update_desc_pool_accessor {
+        typedef bounded_update_desc_pool_type::value_type     value_type;
+
+        bounded_update_desc_pool_type& operator()() const
+        {
+            return s_BoundedUpdateDescPool;
+        }
+    };
+
+
+    // Internal node allocator
+    struct internal_node_counter
+    {
+        static cds::atomicity::event_counter   m_nAlloc;
+        static cds::atomicity::event_counter   m_nFree;
+
+        static void onAlloc()
+        {
+            ++m_nAlloc;
+        }
+        static void onFree()
+        {
+            ++m_nFree;
+        }
+
+        static void reset()
+        {
+            m_nAlloc.reset();
+            m_nFree.reset();
+        }
+    };
+
+    template <typename T, typename Alloc = CDS_DEFAULT_ALLOCATOR>
+    class internal_node_allocator
+        : public Alloc::template rebind< T >::other
+        , internal_node_counter
+    {
+        typedef typename Alloc::template rebind< T >::other  base_class;
+    public:
+        template <typename Other>
+        struct rebind {
+            typedef internal_node_allocator< Other, Alloc > other;
+        };
+
+        T * allocate( size_t n, void const * pHint = NULL )
+        {
+            internal_node_counter::onAlloc();
+            return base_class::allocate( n, pHint );
+        }
+
+        void deallocate( T * p, size_t n )
+        {
+            internal_node_counter::onFree();
+            return base_class::deallocate( p, n );
+        }
+    };
+
+} // namespace ellen_bintree_pool
+
+#endif // #ifndef __CDS_UNIT_ELLEN_BINTREE_UPDATE_DESC_POOL_H
diff --git a/tests/unit/lock/nolock.h b/tests/unit/lock/nolock.h
new file mode 100644 (file)
index 0000000..d986cf9
--- /dev/null
@@ -0,0 +1,16 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_LOCK_NOLOCK_H
+#define __UNIT_LOCK_NOLOCK_H
+
+namespace lock {
+    // Win32 critical section
+    class NoLock {
+    public:
+        void lock()     {}
+        void unlock()   {}
+        bool tryLock()  { return true; }
+    };
+}
+
+#endif // #ifndef __UNIT_LOCK_NOLOCK_H
diff --git a/tests/unit/lock/spinlock.cpp b/tests/unit/lock/spinlock.cpp
new file mode 100644 (file)
index 0000000..bfaae2b
--- /dev/null
@@ -0,0 +1,137 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+
+#include <cds/lock/spinlock.h>
+
+// Multi-threaded stack test for push operation
+namespace lock {
+
+#define TEST_CASE( N, L )   void N() { test<L>(); }
+
+    namespace {
+        static size_t s_nThreadCount = 8;
+        static size_t s_nLoopCount = 1000000    ;     // loop count per thread
+
+        static size_t   s_nSharedInt;
+    }
+
+    class Spinlock_MT: public CppUnitMini::TestCase
+    {
+        template <class LOCK>
+        class Thread: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Thread( *this );
+            }
+        public:
+            LOCK&               m_Lock;
+            double              m_fTime;
+
+        public:
+            Thread( CppUnitMini::ThreadPool& pool, LOCK& l )
+                : CppUnitMini::TestThread( pool )
+                , m_Lock( l )
+            {}
+            Thread( Thread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Lock( src.m_Lock )
+            {}
+
+            Spinlock_MT&  getTest()
+            {
+                return reinterpret_cast<Spinlock_MT&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {}
+            virtual void fini()
+            {}
+
+            virtual void test()
+            {
+                m_fTime = m_Timer.duration();
+
+                for ( size_t i  = 0; i < s_nLoopCount; ++i ) {
+                    m_Lock.lock();
+                    ++s_nSharedInt;
+                    m_Lock.unlock();
+                }
+
+                m_fTime = m_Timer.duration() - m_fTime;
+            }
+        };
+
+    protected:
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nThreadCount = cfg.getULong("ThreadCount", 8 );
+            s_nLoopCount = cfg.getULong("LoopCount", 1000000 );
+        }
+
+        template <class LOCK>
+        void test()
+        {
+            LOCK    testLock;
+
+            for ( size_t nThreadCount = 1; nThreadCount <= s_nThreadCount; nThreadCount *= 2 ) {
+                s_nSharedInt = 0;
+
+                CppUnitMini::ThreadPool pool( *this );
+                pool.add( new Thread<LOCK>( pool, testLock ), nThreadCount );
+
+                CPPUNIT_MSG( "   Lock test, thread count=" << nThreadCount
+                    << " loop per thread=" << s_nLoopCount
+                    << "...");
+                cds::OS::Timer      timer;
+                pool.run();
+                CPPUNIT_MSG( "     Duration=" << timer.duration() );
+
+                CPPUNIT_ASSERT_EX( s_nSharedInt == nThreadCount * s_nLoopCount,
+                    "Expected=" << nThreadCount * s_nLoopCount
+                    << " real=" << s_nSharedInt );
+            }
+        }
+
+        typedef cds::lock::Spinlock<cds::backoff::exponential<cds::backoff::hint, cds::backoff::yield> > Spinlock_exp;
+
+        typedef cds::lock::ReentrantSpinT<unsigned int, cds::backoff::exponential<cds::backoff::hint, cds::backoff::yield> > reentrantSpin_exp;
+        typedef cds::lock::ReentrantSpinT<unsigned int, cds::backoff::yield> reentrantSpin_yield;
+        typedef cds::lock::ReentrantSpinT<unsigned int, cds::backoff::hint> reentrantSpin_hint;
+        typedef cds::lock::ReentrantSpinT<unsigned int, cds::backoff::empty> reentrantSpin_empty;
+
+        TEST_CASE(spinLock_exp,         Spinlock_exp );
+        TEST_CASE(spinLock_yield,       cds::lock::Spinlock<cds::backoff::yield> );
+        TEST_CASE(spinLock_hint,        cds::lock::Spinlock<cds::backoff::hint> );
+        TEST_CASE(spinLock_empty,       cds::lock::Spinlock<cds::backoff::empty> );
+
+        TEST_CASE(reentrantSpinLock,    cds::lock::ReentrantSpin    );
+        TEST_CASE(reentrantSpinLock32,  cds::lock::ReentrantSpin32  );
+        TEST_CASE(reentrantSpinLock64,  cds::lock::ReentrantSpin64  );
+
+        TEST_CASE(reentrantSpinlock_exp,        reentrantSpin_exp );
+        TEST_CASE(reentrantSpinlock_yield,      reentrantSpin_yield );
+        TEST_CASE(reentrantSpinlock_hint,       reentrantSpin_hint );
+        TEST_CASE(reentrantSpinlock_empty,      reentrantSpin_empty );
+
+    protected:
+        CPPUNIT_TEST_SUITE(Spinlock_MT)
+            CPPUNIT_TEST(spinLock_exp);
+            CPPUNIT_TEST(spinLock_yield);
+            CPPUNIT_TEST(spinLock_hint);
+            CPPUNIT_TEST(spinLock_empty);
+
+            CPPUNIT_TEST(reentrantSpinLock);
+            CPPUNIT_TEST(reentrantSpinLock32);
+            CPPUNIT_TEST(reentrantSpinLock64);
+
+            CPPUNIT_TEST(reentrantSpinlock_exp)
+            CPPUNIT_TEST(reentrantSpinlock_yield)
+            CPPUNIT_TEST(reentrantSpinlock_hint)
+            CPPUNIT_TEST(reentrantSpinlock_empty)
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+} // namespace lock
+
+CPPUNIT_TEST_SUITE_REGISTRATION(lock::Spinlock_MT);
diff --git a/tests/unit/lock/win32_lock.h b/tests/unit/lock/win32_lock.h
new file mode 100644 (file)
index 0000000..d9f1511
--- /dev/null
@@ -0,0 +1,42 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_LOCK_WIN32_LOCK_H
+#define __UNIT_LOCK_WIN32_LOCK_H
+
+#if defined(_WIN32) || defined(_WIN64)
+#include <windows.h>
+
+#define UNIT_LOCK_WIN_CS
+
+namespace lock {
+    namespace win {
+        // Win32 critical section
+        class CS {
+            CRITICAL_SECTION    m_cs;
+
+        public:
+            CS()    { ::InitializeCriticalSection( &m_cs ) ; }
+            ~CS()   { ::DeleteCriticalSection( &m_cs ) ; }
+
+            void lock()     { ::EnterCriticalSection( &m_cs ) ; }
+            void unlock()   { ::LeaveCriticalSection( &m_cs)  ; }
+            bool tryLock()  { return ::TryEnterCriticalSection( &m_cs ) != 0 ; }
+        };
+
+        class Mutex {
+            HANDLE  m_hMutex;
+        public:
+
+            Mutex()     { m_hMutex = ::CreateMutex( NULL, false, NULL ) ; }
+            ~Mutex()    { ::CloseHandle( m_hMutex ) ; }
+
+            void lock()     { ::WaitForSingleObject( m_hMutex, INFINITE ); }
+            void unlock()   { ::ReleaseMutex( m_hMutex ); }
+            bool tryLock()  { return ::WaitForSingleObject( m_hMutex, 0) == WAIT_OBJECT_0; }
+        };
+
+    } // namespace win
+}   // namespace lock
+
+#endif  // defined(_WIN32) || defined(_WIN64)
+#endif  // #ifndef __UNIT_LOCK_WIN32_LOCK_H
diff --git a/tests/unit/map2/map_defs.h b/tests/unit/map2/map_defs.h
new file mode 100644 (file)
index 0000000..a69562a
--- /dev/null
@@ -0,0 +1,550 @@
+//$$CDS-header$$
+
+#ifndef _CDSUNIT_MAP2_MAP_DEFS_H
+#define _CDSUNIT_MAP2_MAP_DEFS_H
+
+#define CDSUNIT_DECLARE_StdMap \
+    TEST_MAP(StdMap_Spin) \
+    TEST_MAP(StdHashMap_Spin)
+#define CDSUNIT_TEST_StdMap \
+    CPPUNIT_TEST(StdMap_Spin) \
+    CPPUNIT_TEST(StdHashMap_Spin) \
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#   define CDSUNIT_DECLARE_MichaelMap_RCU_signal \
+    TEST_MAP_EXTRACT(MichaelMap_RCU_SHB_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_RCU_SHB_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_RCU_SHT_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_RCU_SHT_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_RCU_SHB_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_RCU_SHB_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_RCU_SHT_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_RCU_SHT_less_michaelAlloc)
+
+#   define CDSUNIT_TEST_MichaelMap_RCU_signal \
+    CPPUNIT_TEST(MichaelMap_RCU_SHB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_RCU_SHB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelMap_RCU_SHT_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_RCU_SHT_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_RCU_SHB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_RCU_SHB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_RCU_SHT_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_RCU_SHT_less_michaelAlloc)
+
+#else
+#   define CDSUNIT_DECLARE_MichaelMap_RCU_signal
+#   define CDSUNIT_TEST_MichaelMap_RCU_signal
+#endif
+
+
+#define CDSUNIT_DECLARE_MichaelMap  \
+    TEST_MAP_EXTRACT(MichaelMap_HP_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_HP_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_HRC_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_HRC_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_PTB_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_PTB_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_RCU_GPI_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_RCU_GPI_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_RCU_GPB_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_RCU_GPB_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_RCU_GPT_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_RCU_GPT_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_HP_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_HP_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_HRC_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_HRC_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_PTB_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_PTB_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_RCU_GPI_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_RCU_GPI_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_RCU_GPB_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_RCU_GPB_less_michaelAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_RCU_GPT_cmp_stdAlloc) \
+    TEST_MAP_EXTRACT(MichaelMap_Lazy_RCU_GPT_less_michaelAlloc)\
+    CDSUNIT_DECLARE_MichaelMap_RCU_signal
+
+#define CDSUNIT_TEST_MichaelMap  \
+    CPPUNIT_TEST(MichaelMap_HP_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_HP_less_michaelAlloc) \
+    /*CPPUNIT_TEST(MichaelMap_HRC_cmp_stdAlloc)*/ \
+    /*CPPUNIT_TEST(MichaelMap_HRC_less_michaelAlloc)*/ \
+    CPPUNIT_TEST(MichaelMap_PTB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_PTB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelMap_RCU_GPI_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_RCU_GPI_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelMap_RCU_GPB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_RCU_GPB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelMap_RCU_GPT_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_RCU_GPT_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_HP_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_HP_less_michaelAlloc) \
+    /*CPPUNIT_TEST(MichaelMap_Lazy_HRC_cmp_stdAlloc)*/ \
+    /*CPPUNIT_TEST(MichaelMap_Lazy_HRC_less_michaelAlloc)*/ \
+    CPPUNIT_TEST(MichaelMap_Lazy_PTB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_PTB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_RCU_GPI_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_RCU_GPI_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_RCU_GPB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_RCU_GPB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_RCU_GPT_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_RCU_GPT_less_michaelAlloc)\
+    CDSUNIT_TEST_MichaelMap_RCU_signal
+
+#define CDSUNIT_DECLARE_MichaelMap_nogc  \
+    TEST_MAP(MichaelMap_NOGC_cmp_stdAlloc) \
+    TEST_MAP(MichaelMap_NOGC_less_michaelAlloc) \
+    TEST_MAP(MichaelMap_Lazy_NOGC_cmp_stdAlloc) \
+    TEST_MAP(MichaelMap_Lazy_NOGC_less_michaelAlloc)
+
+#define CDSUNIT_TEST_MichaelMap_nogc  \
+    CPPUNIT_TEST(MichaelMap_NOGC_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_NOGC_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_NOGC_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelMap_Lazy_NOGC_less_michaelAlloc) \
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#   define CDSUNIT_DECLARE_SplitList_RCU_signal  \
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_SHB_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_SHB_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_SHB_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_SHB_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_SHT_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_SHT_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_SHT_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_SHT_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_SHB_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_SHB_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_SHB_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_SHB_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_SHT_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_SHT_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_SHT_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_SHT_st_less)
+
+#   define CDSUNIT_TEST_SplitList_RCU_signal \
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHB_st_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHT_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHT_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHT_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHT_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHB_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHT_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHT_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHT_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHT_st_less)
+
+#else
+#   define CDSUNIT_DECLARE_SplitList_RCU_signal
+#   define CDSUNIT_TEST_SplitList_RCU_signal
+#endif
+
+#define CDSUNIT_DECLARE_SplitList  \
+    TEST_MAP_EXTRACT(SplitList_Michael_HP_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_HP_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_HP_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_HP_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_HRC_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_HRC_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_HRC_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_HRC_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_PTB_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_PTB_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_PTB_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_PTB_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPI_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPI_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPI_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPI_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPB_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPB_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPB_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPB_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPT_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPT_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPT_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Michael_RCU_GPT_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_HP_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_HP_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_HP_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_HP_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_HRC_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_HRC_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_HRC_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_HRC_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_PTB_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_PTB_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_PTB_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_PTB_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPI_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPI_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPI_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPI_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPB_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPB_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPB_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPB_st_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPT_dyn_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPT_st_cmp)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPT_dyn_less)\
+    TEST_MAP_EXTRACT(SplitList_Lazy_RCU_GPT_st_less)\
+    CDSUNIT_DECLARE_SplitList_RCU_signal
+
+#define CDSUNIT_TEST_SplitList  \
+    CPPUNIT_TEST(SplitList_Michael_HP_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_HP_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_HP_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_HP_st_less)\
+    /*CPPUNIT_TEST(SplitList_Michael_HRC_dyn_cmp)*/\
+    /*CPPUNIT_TEST(SplitList_Michael_HRC_st_cmp)*/\
+    /*CPPUNIT_TEST(SplitList_Michael_HRC_dyn_less)*/\
+    /*CPPUNIT_TEST(SplitList_Michael_HRC_st_less)*/\
+    CPPUNIT_TEST(SplitList_Michael_PTB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_PTB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_PTB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_PTB_st_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPI_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPI_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPI_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPI_st_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPB_st_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPT_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPT_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPT_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPT_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_HP_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_HP_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_HP_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_HP_st_less)\
+    /*CPPUNIT_TEST(SplitList_Lazy_HRC_dyn_cmp)*/\
+    /*CPPUNIT_TEST(SplitList_Lazy_HRC_st_cmp)*/\
+    /*CPPUNIT_TEST(SplitList_Lazy_HRC_dyn_less)*/\
+    /*CPPUNIT_TEST(SplitList_Lazy_HRC_st_less)*/\
+    CPPUNIT_TEST(SplitList_Lazy_PTB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_PTB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_PTB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_PTB_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPI_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPI_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPI_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPI_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPB_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPT_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPT_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPT_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPT_st_less)\
+    CDSUNIT_TEST_SplitList_RCU_signal
+
+#define CDSUNIT_DECLARE_SplitList_nogc  \
+    TEST_MAP(SplitList_Michael_NOGC_dyn_cmp)\
+    TEST_MAP(SplitList_Michael_NOGC_st_cmp)\
+    TEST_MAP(SplitList_Michael_NOGC_dyn_less)\
+    TEST_MAP(SplitList_Michael_NOGC_st_less)\
+    TEST_MAP(SplitList_Lazy_NOGC_dyn_cmp)\
+    TEST_MAP(SplitList_Lazy_NOGC_st_cmp)\
+    TEST_MAP(SplitList_Lazy_NOGC_dyn_less)\
+    TEST_MAP(SplitList_Lazy_NOGC_st_less)
+
+#define CDSUNIT_TEST_SplitList_nogc  \
+    CPPUNIT_TEST(SplitList_Michael_NOGC_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_NOGC_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_NOGC_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_NOGC_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_NOGC_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_NOGC_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_NOGC_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_NOGC_st_less)
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#   define CDSUNIT_DECLARE_SkipListMap_RCU_signal \
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_shb_less_pascal)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_shb_cmp_pascal_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_shb_less_xorshift)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_shb_cmp_xorshift_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_sht_less_pascal)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_sht_cmp_pascal_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_sht_less_xorshift)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_sht_cmp_xorshift_stat)
+
+#   define CDSUNIT_TEST_SkipListMap_RCU_signal \
+    CPPUNIT_TEST(SkipListMap_rcu_shb_less_pascal)\
+    CPPUNIT_TEST(SkipListMap_rcu_shb_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListMap_rcu_shb_less_xorshift)\
+    CPPUNIT_TEST(SkipListMap_rcu_shb_cmp_xorshift_stat)\
+    CPPUNIT_TEST(SkipListMap_rcu_sht_less_pascal)\
+    CPPUNIT_TEST(SkipListMap_rcu_sht_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListMap_rcu_sht_less_xorshift)\
+    CPPUNIT_TEST(SkipListMap_rcu_sht_cmp_xorshift_stat)
+
+#else
+#   define CDSUNIT_DECLARE_SkipListMap_RCU_signal
+#   define CDSUNIT_TEST_SkipListMap_RCU_signal
+#endif
+
+#define CDSUNIT_DECLARE_SkipListMap \
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_hp_less_pascal)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_hp_cmp_pascal_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_hp_less_xorshift)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_hp_cmp_xorshift_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_hrc_less_pascal)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_hrc_cmp_pascal_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_hrc_less_xorshift)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_hrc_cmp_xorshift_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_ptb_less_pascal)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_ptb_cmp_pascal_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_ptb_less_xorshift)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_ptb_cmp_xorshift_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpi_less_pascal)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpi_cmp_pascal_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpi_less_xorshift)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpi_cmp_xorshift_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpb_less_pascal)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpb_cmp_pascal_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpb_less_xorshift)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpb_cmp_xorshift_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpt_less_pascal)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpt_cmp_pascal_stat)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpt_less_xorshift)\
+    TEST_MAP_NOLF_EXTRACT(SkipListMap_rcu_gpt_cmp_xorshift_stat)\
+    CDSUNIT_DECLARE_SkipListMap_RCU_signal
+
+
+#define CDSUNIT_TEST_SkipListMap \
+    CPPUNIT_TEST(SkipListMap_hp_less_pascal)\
+    CPPUNIT_TEST(SkipListMap_hp_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListMap_hp_less_xorshift)\
+    CPPUNIT_TEST(SkipListMap_hp_cmp_xorshift_stat)\
+    /*CPPUNIT_TEST(SkipListMap_hrc_less_pascal)*/\
+    /*CPPUNIT_TEST(SkipListMap_hrc_cmp_pascal_stat)*/\
+    /*CPPUNIT_TEST(SkipListMap_hrc_less_xorshift)*/\
+    /*CPPUNIT_TEST(SkipListMap_hrc_cmp_xorshift_stat)*/\
+    CPPUNIT_TEST(SkipListMap_ptb_less_pascal)\
+    CPPUNIT_TEST(SkipListMap_ptb_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListMap_ptb_less_xorshift)\
+    CPPUNIT_TEST(SkipListMap_ptb_cmp_xorshift_stat)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpi_less_pascal)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpi_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpi_less_xorshift)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpi_cmp_xorshift_stat)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpb_less_pascal)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpb_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpb_less_xorshift)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpb_cmp_xorshift_stat)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpt_less_pascal)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpt_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpt_less_xorshift)\
+    CPPUNIT_TEST(SkipListMap_rcu_gpt_cmp_xorshift_stat)\
+    CDSUNIT_TEST_SkipListMap_RCU_signal
+
+#define CDSUNIT_DECLARE_SkipListMap_nogc \
+    TEST_MAP_NOLF(SkipListMap_nogc_less_pascal)\
+    TEST_MAP_NOLF(SkipListMap_nogc_cmp_pascal_stat)\
+    TEST_MAP_NOLF(SkipListMap_nogc_less_xorshift)\
+    TEST_MAP_NOLF(SkipListMap_nogc_cmp_xorshift_stat)
+
+#define CDSUNIT_TEST_SkipListMap_nogc \
+    CPPUNIT_TEST(SkipListMap_nogc_less_pascal)\
+    CPPUNIT_TEST(SkipListMap_nogc_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListMap_nogc_less_xorshift)\
+    CPPUNIT_TEST(SkipListMap_nogc_cmp_xorshift_stat)
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#   define CDSUNIT_DECLARE_EllenBinTreeMap_RCU_signal \
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_rcu_shb)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_rcu_shb_stat)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_rcu_sht)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_rcu_sht_stat)
+
+#   define CDSUNIT_TEST_EllenBinTreeMap_RCU_signal \
+    CPPUNIT_TEST(EllenBinTreeMap_rcu_shb)\
+    CPPUNIT_TEST(EllenBinTreeMap_rcu_shb_stat)\
+    CPPUNIT_TEST(EllenBinTreeMap_rcu_sht)\
+    CPPUNIT_TEST(EllenBinTreeMap_rcu_sht_stat)
+#else
+#   define CDSUNIT_DECLARE_EllenBinTreeMap_RCU_signal
+#   define CDSUNIT_TEST_EllenBinTreeMap_RCU_signal
+#endif
+
+#define CDSUNIT_DECLARE_EllenBinTreeMap \
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_hp)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_hp_stat)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_ptb)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_ptb_stat)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_rcu_gpi)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_rcu_gpi_stat)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_rcu_gpb)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_rcu_gpb_stat)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_rcu_gpt)\
+    TEST_MAP_NOLF_EXTRACT(EllenBinTreeMap_rcu_gpt_stat)\
+    CDSUNIT_DECLARE_EllenBinTreeMap_RCU_signal
+
+#define CDSUNIT_TEST_EllenBinTreeMap \
+    CPPUNIT_TEST(EllenBinTreeMap_hp)\
+    CPPUNIT_TEST(EllenBinTreeMap_hp_stat)\
+    CPPUNIT_TEST(EllenBinTreeMap_ptb)\
+    CPPUNIT_TEST(EllenBinTreeMap_ptb_stat)\
+    CPPUNIT_TEST(EllenBinTreeMap_rcu_gpi)\
+    CPPUNIT_TEST(EllenBinTreeMap_rcu_gpi_stat)\
+    CPPUNIT_TEST(EllenBinTreeMap_rcu_gpb)\
+    CPPUNIT_TEST(EllenBinTreeMap_rcu_gpb_stat)\
+    CPPUNIT_TEST(EllenBinTreeMap_rcu_gpt)\
+    CPPUNIT_TEST(EllenBinTreeMap_rcu_gpt_stat)\
+    CDSUNIT_TEST_EllenBinTreeMap_RCU_signal
+
+
+#define CDSUNIT_DECLARE_StripedMap_common \
+    TEST_MAP(StripedMap_list) \
+    TEST_MAP(StripedMap_map) \
+    TEST_MAP(StripedMap_hashmap) \
+    TEST_MAP(StripedMap_boost_unordered_map)
+
+#define CDSUNIT_TEST_StripedMap_common \
+    CPPUNIT_TEST(StripedMap_list) \
+    CPPUNIT_TEST(StripedMap_map) \
+    CPPUNIT_TEST(StripedMap_hashmap) \
+    CPPUNIT_TEST(StripedMap_boost_unordered_map)
+
+#if BOOST_VERSION >= 104800
+#   define CDSUNIT_DECLARE_StripedMap_boost_container \
+        TEST_MAP(StripedMap_boost_list) \
+        TEST_MAP(StripedMap_slist) \
+        TEST_MAP(StripedMap_boost_map)
+#   define CDSUNIT_TEST_StripedMap_boost_container \
+        CPPUNIT_TEST(StripedMap_boost_list) \
+        CPPUNIT_TEST(StripedMap_slist) \
+        CPPUNIT_TEST(StripedMap_boost_map)
+#else
+#   define CDSUNIT_DECLARE_StripedMap_boost_container
+#   define CDSUNIT_TEST_StripedMap_boost_container
+#endif
+
+#if BOOST_VERSION >= 104800 && defined(CDS_UNIT_MAP_TYPES_ENABLE_BOOST_FLAT_CONTAINERS)
+#   define CDSUNIT_DECLARE_StripedMap_boost_flat_container \
+        TEST_MAP(StripedMap_boost_flat_map)
+#   define CDSUNIT_TEST_StripedMap_boost_flat_container \
+        CPPUNIT_TEST(StripedMap_boost_flat_map)
+#else
+#   define CDSUNIT_DECLARE_StripedMap_boost_flat_container
+#   define CDSUNIT_TEST_StripedMap_boost_flat_container
+#endif
+
+#define CDSUNIT_DECLARE_StripedMap \
+    CDSUNIT_DECLARE_StripedMap_common \
+    CDSUNIT_DECLARE_StripedMap_boost_container \
+    CDSUNIT_DECLARE_StripedMap_boost_flat_container
+#define CDSUNIT_TEST_StripedMap \
+    CDSUNIT_TEST_StripedMap_common \
+    CDSUNIT_TEST_StripedMap_boost_container \
+    CDSUNIT_TEST_StripedMap_boost_flat_container
+
+
+
+#define CDSUNIT_DECLARE_RefinableMap_common \
+    TEST_MAP(RefinableMap_list) \
+    TEST_MAP(RefinableMap_map) \
+    TEST_MAP(RefinableMap_hashmap) \
+    TEST_MAP(RefinableMap_boost_unordered_map)
+#define CDSUNIT_TEST_RefinableMap_common \
+    CPPUNIT_TEST(RefinableMap_list) \
+    CPPUNIT_TEST(RefinableMap_map) \
+    CPPUNIT_TEST(RefinableMap_hashmap) \
+    CPPUNIT_TEST(RefinableMap_boost_unordered_map)
+
+#if BOOST_VERSION >= 104800
+#   define CDSUNIT_DECLARE_RefinableMap_boost_container \
+        TEST_MAP(RefinableMap_boost_list) \
+        TEST_MAP(RefinableMap_slist) \
+        TEST_MAP(RefinableMap_boost_map)
+#   define CDSUNIT_TEST_RefinableMap_boost_container \
+        CPPUNIT_TEST(RefinableMap_boost_list) \
+        CPPUNIT_TEST(RefinableMap_slist) \
+        CPPUNIT_TEST(RefinableMap_boost_map)
+#else
+#   define CDSUNIT_DECLARE_RefinableMap_boost_container
+#   define CDSUNIT_TEST_RefinableMap_boost_container
+#endif
+
+#if BOOST_VERSION >= 104800 && defined(CDS_UNIT_MAP_TYPES_ENABLE_BOOST_FLAT_CONTAINERS)
+#   define CDSUNIT_DECLARE_RefinableMap_boost_flat_container \
+        TEST_MAP(RefinableMap_boost_flat_map)
+#   define CDSUNIT_TEST_RefinableMap_boost_flat_container \
+        CPPUNIT_TEST(RefinableMap_boost_flat_map)
+#else
+#   define CDSUNIT_DECLARE_RefinableMap_boost_flat_container
+#   define CDSUNIT_TEST_RefinableMap_boost_flat_container
+#endif
+
+#define CDSUNIT_DECLARE_RefinableMap \
+    CDSUNIT_DECLARE_RefinableMap_common \
+    CDSUNIT_DECLARE_RefinableMap_boost_container \
+    CDSUNIT_DECLARE_RefinableMap_boost_flat_container
+#define CDSUNIT_TEST_RefinableMap \
+    CDSUNIT_TEST_RefinableMap_common \
+    CDSUNIT_TEST_RefinableMap_boost_container \
+    CDSUNIT_TEST_RefinableMap_boost_flat_container
+
+#define CDSUNIT_DECLARE_CuckooMap \
+    TEST_MAP(CuckooStripedMap_list_unord)\
+    TEST_MAP(CuckooStripedMap_list_ord)\
+    TEST_MAP(CuckooStripedMap_vector_unord)\
+    TEST_MAP(CuckooStripedMap_vector_ord)\
+    TEST_MAP(CuckooStripedMap_list_unord_stat)\
+    TEST_MAP(CuckooStripedMap_list_ord_stat)\
+    TEST_MAP(CuckooStripedMap_vector_unord_stat)\
+    TEST_MAP(CuckooStripedMap_vector_ord_stat)\
+    TEST_MAP(CuckooRefinableMap_list_unord)\
+    TEST_MAP(CuckooRefinableMap_list_ord)\
+    TEST_MAP(CuckooRefinableMap_vector_unord)\
+    TEST_MAP(CuckooRefinableMap_vector_ord) \
+    TEST_MAP(CuckooRefinableMap_list_unord_stat)\
+    TEST_MAP(CuckooRefinableMap_list_ord_stat)\
+    TEST_MAP(CuckooRefinableMap_vector_unord_stat)\
+    TEST_MAP(CuckooRefinableMap_vector_ord_stat) \
+    TEST_MAP(CuckooStripedMap_list_unord_storehash)\
+    TEST_MAP(CuckooStripedMap_list_ord_storehash)\
+    TEST_MAP(CuckooStripedMap_vector_unord_storehash)\
+    TEST_MAP(CuckooStripedMap_vector_ord_storehash)\
+    TEST_MAP(CuckooRefinableMap_list_unord_storehash)\
+    TEST_MAP(CuckooRefinableMap_list_ord_storehash)\
+    TEST_MAP(CuckooRefinableMap_vector_unord_storehash)\
+    TEST_MAP(CuckooRefinableMap_vector_ord_storehash)
+
+#define CDSUNIT_TEST_CuckooMap \
+    CPPUNIT_TEST(CuckooStripedMap_list_unord)\
+    CPPUNIT_TEST(CuckooStripedMap_list_unord_stat)\
+    CPPUNIT_TEST(CuckooStripedMap_list_unord_storehash)\
+    CPPUNIT_TEST(CuckooStripedMap_list_ord)\
+    CPPUNIT_TEST(CuckooStripedMap_list_ord_stat)\
+    CPPUNIT_TEST(CuckooStripedMap_list_ord_storehash)\
+    CPPUNIT_TEST(CuckooStripedMap_vector_unord)\
+    CPPUNIT_TEST(CuckooStripedMap_vector_unord_stat)\
+    CPPUNIT_TEST(CuckooStripedMap_vector_unord_storehash)\
+    CPPUNIT_TEST(CuckooStripedMap_vector_ord)\
+    CPPUNIT_TEST(CuckooStripedMap_vector_ord_stat)\
+    CPPUNIT_TEST(CuckooStripedMap_vector_ord_storehash)\
+    CPPUNIT_TEST(CuckooRefinableMap_list_unord)\
+    CPPUNIT_TEST(CuckooRefinableMap_list_unord_stat)\
+    CPPUNIT_TEST(CuckooRefinableMap_list_unord_storehash)\
+    CPPUNIT_TEST(CuckooRefinableMap_list_ord)\
+    CPPUNIT_TEST(CuckooRefinableMap_list_ord_stat)\
+    CPPUNIT_TEST(CuckooRefinableMap_list_ord_storehash)\
+    CPPUNIT_TEST(CuckooRefinableMap_vector_unord)\
+    CPPUNIT_TEST(CuckooRefinableMap_vector_unord_stat)\
+    CPPUNIT_TEST(CuckooRefinableMap_vector_unord_storehash)\
+    CPPUNIT_TEST(CuckooRefinableMap_vector_ord)\
+    CPPUNIT_TEST(CuckooRefinableMap_vector_ord_stat)\
+    CPPUNIT_TEST(CuckooRefinableMap_vector_ord_storehash)
+
+#endif // #ifndef _CDSUNIT_MAP2_MAP_DEFS_H
diff --git a/tests/unit/map2/map_delodd.cpp b/tests/unit/map2/map_delodd.cpp
new file mode 100644 (file)
index 0000000..6791b8e
--- /dev/null
@@ -0,0 +1,748 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "map2/map_types.h"
+#include <algorithm> // random_shuffle
+
+namespace map2 {
+
+#   define TEST_MAP(X)         void X() { test<MapTypes<key_type, value_type>::X >(); }
+#   define TEST_MAP_EXTRACT(X) void X() { test_extract<MapTypes<key_type, value_type>::X >(); }
+#   define TEST_MAP_NOLF(X)    void X() { test_nolf<MapTypes<key_type, value_type>::X >(); }
+#   define TEST_MAP_NOLF_EXTRACT(X) void X() { test_nolf_extract<MapTypes<key_type, value_type>::X >(); }
+
+    namespace {
+        static size_t  c_nMapSize = 1000000         ;  // max map size
+        static size_t  c_nInsThreadCount = 4        ;  // insert thread count
+        static size_t  c_nDelThreadCount = 4        ;  // delete thread count
+        static size_t  c_nExtractThreadCount = 4    ;  // extract thread count
+        static size_t  c_nMaxLoadFactor = 8         ;  // maximum load factor
+        static bool    c_bPrintGCState = true;
+    }
+
+    namespace {
+        struct key_thread
+        {
+            size_t  nKey;
+            size_t  nThread;
+
+            key_thread( size_t key, size_t threadNo )
+                : nKey( key )
+                , nThread( threadNo )
+            {}
+
+            key_thread()
+            {}
+        };
+
+        //typedef MapTypes<key_thread, size_t>::key_val     key_value_pair;
+    }
+
+    template <>
+    struct cmp<key_thread> {
+        int operator ()(key_thread const& k1, key_thread const& k2) const
+        {
+            if ( k1.nKey < k2.nKey )
+                return -1;
+            if ( k1.nKey > k2.nKey )
+                return 1;
+            if ( k1.nThread < k2.nThread )
+                return -1;
+            if ( k1.nThread > k2.nThread )
+                return 1;
+            return 0;
+        }
+        int operator ()(key_thread const& k1, size_t k2) const
+        {
+            if ( k1.nKey < k2 )
+                return -1;
+            if ( k1.nKey > k2 )
+                return 1;
+            return 0;
+        }
+        int operator ()(size_t k1, key_thread const& k2) const
+        {
+            if ( k1 < k2.nKey )
+                return -1;
+            if ( k1 > k2.nKey )
+                return 1;
+            return 0;
+        }
+    };
+
+} // namespace map2
+
+namespace std {
+    template <>
+    struct less<map2::key_thread>
+    {
+        bool operator()(map2::key_thread const& k1, map2::key_thread const& k2) const
+        {
+            if ( k1.nKey <= k2.nKey )
+                return k1.nKey < k2.nKey || k1.nThread < k2.nThread;
+            return false;
+        }
+    };
+} // namespace std
+
+CDS_BEGIN_STD_HASH_NAMESPACE
+template <>
+struct hash<map2::key_thread>
+{
+    typedef size_t              result_type;
+    typedef map2::key_thread    argument_type;
+
+    size_t operator()(map2::key_thread const& k) const
+    {
+        return CDS_STD_HASH_NAMESPACE::hash<size_t>()( k.nKey );
+    }
+    size_t operator()(size_t k) const
+    {
+        return CDS_STD_HASH_NAMESPACE::hash<size_t>()( k );
+    }
+};
+CDS_END_STD_HASH_NAMESPACE
+
+namespace boost {
+    inline size_t hash_value( map2::key_thread const& k )
+    {
+        return CDS_STD_HASH_NAMESPACE::hash<size_t>()( k.nKey );
+    }
+
+    template <>
+    struct hash<map2::key_thread>
+    {
+        typedef size_t              result_type;
+        typedef map2::key_thread    argument_type;
+
+        size_t operator()(map2::key_thread const& k) const
+        {
+            return boost::hash<size_t>()( k.nKey );
+        }
+        size_t operator()(size_t k) const
+        {
+            return boost::hash<size_t>()( k );
+        }
+    };
+} // namespace boost
+
+namespace map2 {
+
+    template <typename Map>
+    static inline void check_before_clear( Map& s )
+    {}
+
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void check_before_clear( cds::container::EllenBinTreeMap<GC, Key, T, Traits>& s )
+    {
+        CPPUNIT_CHECK_CURRENT( s.check_consistency() );
+    }
+
+    class Map_DelOdd: public CppUnitMini::TestCase
+    {
+        std::vector<size_t>     m_arrData;
+
+    protected:
+        typedef key_thread  key_type;
+        typedef size_t      value_type;
+        typedef std::pair<key_type const, value_type> pair_type;
+
+        CDS_ATOMIC::atomic<size_t>      m_nInsThreadCount;
+
+        // Inserts keys from [0..N)
+        template <class Map>
+        class InsertThread: public CppUnitMini::TestThread
+        {
+            Map&     m_Map;
+
+            virtual InsertThread *    clone()
+            {
+                return new InsertThread( *this );
+            }
+
+            struct ensure_func
+            {
+                template <typename Q>
+                void operator()( bool bNew, Q const& )
+                {}
+            };
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+
+        public:
+            InsertThread( CppUnitMini::ThreadPool& pool, Map& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            InsertThread( InsertThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_DelOdd&  getTest()
+            {
+                return reinterpret_cast<Map_DelOdd&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Map& rMap = m_Map;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed = 0;
+
+                std::vector<size_t>& arrData = getTest().m_arrData;
+                for ( size_t i = 0; i < arrData.size(); ++i ) {
+                    if ( rMap.insert( key_type( arrData[i], m_nThreadNo )))
+                        ++m_nInsertSuccess;
+                    else
+                        ++m_nInsertFailed;
+                }
+
+                ensure_func f;
+                for ( size_t i = arrData.size() - 1; i > 0; --i ) {
+                    if ( arrData[i] & 1 ) {
+                        rMap.ensure( key_type( arrData[i], m_nThreadNo ), f );
+                    }
+                }
+
+                getTest().m_nInsThreadCount.fetch_sub( 1, CDS_ATOMIC::memory_order_acquire );
+            }
+        };
+
+        struct key_equal {
+            bool operator()( key_type const& k1, key_type const& k2 ) const
+            {
+                return k1.nKey == k2.nKey;
+            }
+            bool operator()( size_t k1, key_type const& k2 ) const
+            {
+                return k1 == k2.nKey;
+            }
+            bool operator()( key_type const& k1, size_t k2 ) const
+            {
+                return k1.nKey == k2;
+            }
+        };
+
+        struct key_less {
+            bool operator()( key_type const& k1, key_type const& k2 ) const
+            {
+                return k1.nKey < k2.nKey;
+            }
+            bool operator()( size_t k1, key_type const& k2 ) const
+            {
+                return k1 < k2.nKey;
+            }
+            bool operator()( key_type const& k1, size_t k2 ) const
+            {
+                return k1.nKey < k2;
+            }
+
+            typedef key_equal equal_to;
+        };
+
+        // Deletes odd keys from [0..N)
+        template <class Map>
+        class DeleteThread: public CppUnitMini::TestThread
+        {
+            Map&     m_Map;
+
+            virtual DeleteThread *    clone()
+            {
+                return new DeleteThread( *this );
+            }
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+        public:
+            DeleteThread( CppUnitMini::ThreadPool& pool, Map& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            DeleteThread( DeleteThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_DelOdd&  getTest()
+            {
+                return reinterpret_cast<Map_DelOdd&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Map& rMap = m_Map;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                std::vector<size_t>& arrData = getTest().m_arrData;
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = 0; i < arrData.size(); ++i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( rMap.erase_with( arrData[i], key_less() ))
+                                    ++m_nDeleteSuccess;
+                                else
+                                    ++m_nDeleteFailed;
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+                else {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = arrData.size() - 1; i > 0; --i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( rMap.erase_with( arrData[i], key_less() ))
+                                    ++m_nDeleteSuccess;
+                                else
+                                    ++m_nDeleteFailed;
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+            }
+        };
+
+        // Deletes odd keys from [0..N)
+        template <class GC, class Map >
+        class ExtractThread: public CppUnitMini::TestThread
+        {
+            Map&     m_Map;
+
+            virtual ExtractThread *    clone()
+            {
+                return new ExtractThread( *this );
+            }
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+        public:
+            ExtractThread( CppUnitMini::ThreadPool& pool, Map& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            ExtractThread( ExtractThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_DelOdd&  getTest()
+            {
+                return reinterpret_cast<Map_DelOdd&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Map& rMap = m_Map;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                typename Map::guarded_ptr gp;
+
+                std::vector<size_t>& arrData = getTest().m_arrData;
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = 0; i < arrData.size(); ++i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( rMap.extract_with( gp, arrData[i], key_less() ))
+                                    ++m_nDeleteSuccess;
+                                else
+                                    ++m_nDeleteFailed;
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+                else {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = arrData.size() - 1; i > 0; --i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( rMap.extract_with( gp, arrData[i], key_less() ))
+                                    ++m_nDeleteSuccess;
+                                else
+                                    ++m_nDeleteFailed;
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+            }
+        };
+
+        template <class RCU, class Map >
+        class ExtractThread< cds::urcu::gc<RCU>, Map > : public CppUnitMini::TestThread
+        {
+            Map&     m_Map;
+
+            virtual ExtractThread *    clone()
+            {
+                return new ExtractThread( *this );
+            }
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+        public:
+            ExtractThread( CppUnitMini::ThreadPool& pool, Map& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            ExtractThread( ExtractThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_DelOdd&  getTest()
+            {
+                return reinterpret_cast<Map_DelOdd&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Map& rMap = m_Map;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                typename Map::exempt_ptr xp;
+
+                std::vector<size_t>& arrData = getTest().m_arrData;
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = 0; i < arrData.size(); ++i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( Map::c_bExtractLockExternal ) {
+                                    {
+                                        typename Map::rcu_lock l;
+                                        if ( rMap.extract_with( xp, arrData[i], key_less() )) {
+                                            ++m_nDeleteSuccess;
+                                        }
+                                        else
+                                            ++m_nDeleteFailed;
+                                    }
+                                    xp.release();
+                                }
+                                else {
+                                    if ( rMap.extract_with( xp, arrData[i], key_less() )) {
+                                        ++m_nDeleteSuccess;
+                                        xp.release();
+                                    }
+                                    else
+                                        ++m_nDeleteFailed;
+                                }
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+                else {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = arrData.size() - 1; i > 0; --i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( Map::c_bExtractLockExternal ) {
+                                    {
+                                        typename Map::rcu_lock l;
+                                        if ( rMap.extract_with( xp, arrData[i], key_less() ))
+                                            ++m_nDeleteSuccess;
+                                        else
+                                            ++m_nDeleteFailed;
+                                    }
+                                    xp.release();
+                                }
+                                else {
+                                    if ( rMap.extract_with( xp, arrData[i], key_less() )) {
+                                        ++m_nDeleteSuccess;
+                                        xp.release();
+                                    }
+                                    else
+                                        ++m_nDeleteFailed;
+                                }
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+            }
+        };
+
+    protected:
+        template <class Map>
+        void do_test( size_t nLoadFactor )
+        {
+            Map  testMap( c_nMapSize, nLoadFactor );
+            do_test_with( testMap );
+        }
+
+        template <class Map>
+        void do_test_extract( size_t nLoadFactor )
+        {
+            Map  testMap( c_nMapSize, nLoadFactor );
+            do_test_extract_with( testMap );
+        }
+
+        template <class Map>
+        void do_test_with( Map& testMap )
+        {
+            typedef InsertThread<Map> insert_thread;
+            typedef DeleteThread<Map> delete_thread;
+
+            m_nInsThreadCount.store( c_nInsThreadCount, CDS_ATOMIC::memory_order_release );
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new insert_thread( pool, testMap ), c_nInsThreadCount );
+            pool.add( new delete_thread( pool, testMap ), c_nDelThreadCount ? c_nDelThreadCount : cds::OS::topology::processor_count());
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                insert_thread * pThread = dynamic_cast<insert_thread *>( *it );
+                if ( pThread ) {
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                }
+                else {
+                    delete_thread * p = static_cast<delete_thread *>( *it );
+                    nDeleteSuccess += p->m_nDeleteSuccess;
+                    nDeleteFailed += p->m_nDeleteFailed;
+                }
+            }
+
+            CPPUNIT_MSG( "  Totals (success/failed): \n\t"
+                << "      Insert=" << nInsertSuccess << '/' << nInsertFailed << "\n\t"
+                << "      Delete=" << nDeleteSuccess << '/' << nDeleteFailed << "\n\t"
+                );
+            CPPUNIT_CHECK( nInsertSuccess == c_nMapSize * c_nInsThreadCount );
+            CPPUNIT_CHECK( nInsertFailed == 0 );
+
+            analyze( testMap );
+        }
+
+        template <class Map>
+        void do_test_extract_with( Map& testMap )
+        {
+            typedef InsertThread<Map> insert_thread;
+            typedef DeleteThread<Map> delete_thread;
+            typedef ExtractThread< typename Map::gc, Map > extract_thread;
+
+            m_nInsThreadCount.store( c_nInsThreadCount, CDS_ATOMIC::memory_order_release );
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new insert_thread( pool, testMap ), c_nInsThreadCount );
+            if ( c_nDelThreadCount )
+                pool.add( new delete_thread( pool, testMap ), c_nDelThreadCount );
+            if ( c_nExtractThreadCount )
+                pool.add( new extract_thread( pool, testMap ), c_nExtractThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            size_t nExtractSuccess = 0;
+            size_t nExtractFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                insert_thread * pThread = dynamic_cast<insert_thread *>( *it );
+                if ( pThread ) {
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                }
+                else {
+                    delete_thread * p = dynamic_cast<delete_thread *>( *it );
+                    if ( p ) {
+                        nDeleteSuccess += p->m_nDeleteSuccess;
+                        nDeleteFailed += p->m_nDeleteFailed;
+                    }
+                    else {
+                        extract_thread * pExtract = dynamic_cast<extract_thread *>( *it );
+                        assert( pExtract );
+                        nExtractSuccess += pExtract->m_nDeleteSuccess;
+                        nExtractFailed += pExtract->m_nDeleteFailed;
+                    }
+                }
+            }
+
+            CPPUNIT_MSG( "  Totals (success/failed): \n\t"
+                << "      Insert=" << nInsertSuccess << '/' << nInsertFailed << "\n\t"
+                << "      Delete=" << nDeleteSuccess << '/' << nDeleteFailed << "\n\t"
+                << "      Extract=" << nExtractSuccess << '/' << nExtractFailed << "\n\t"
+                );
+            CPPUNIT_CHECK( nInsertSuccess == c_nMapSize * c_nInsThreadCount );
+            CPPUNIT_CHECK( nInsertFailed == 0 );
+
+            analyze( testMap );
+        }
+
+        template <class Map>
+        void analyze( Map& testMap )
+        {
+            cds::OS::Timer    timer;
+
+            // All even keys must be in the map
+            {
+                size_t nErrorCount = 0;
+                CPPUNIT_MSG( "  Check even keys..." );
+                for ( size_t n = 0; n < c_nMapSize; n +=2 ) {
+                    for ( size_t i = 0; i < c_nInsThreadCount; ++i ) {
+                        if ( !testMap.find( key_type(n, i) ) ) {
+                            if ( ++nErrorCount < 10 ) {
+                                CPPUNIT_MSG( "key " << n << "-" << i << " is not found!");
+                            }
+                        }
+                    }
+                }
+                CPPUNIT_CHECK_EX( nErrorCount == 0, "Totals: " << nErrorCount << " keys is not found");
+            }
+
+            check_before_clear( testMap );
+
+            CPPUNIT_MSG( "  Clear map (single-threaded)..." );
+            timer.reset();
+            testMap.clear();
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+            CPPUNIT_CHECK_EX( testMap.empty(), ((long long) testMap.size()) );
+
+            additional_check( testMap );
+            print_stat( testMap );
+
+            additional_cleanup( testMap );
+        }
+
+
+        template <class Map>
+        void test()
+        {
+            CPPUNIT_MSG( "Insert thread count=" << c_nInsThreadCount
+                << " delete thread count=" << c_nDelThreadCount
+                << " set size=" << c_nMapSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                do_test<Map>( nLoadFactor );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class Map>
+        void test_extract()
+        {
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsThreadCount
+                << ", delete=" << c_nDelThreadCount
+                << ", extract=" << c_nExtractThreadCount
+                << "; set size=" << c_nMapSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                do_test_extract<Map>( nLoadFactor );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class Map>
+        void test_nolf()
+        {
+            CPPUNIT_MSG( "Insert thread count=" << c_nInsThreadCount
+                << " delete thread count=" << c_nDelThreadCount
+                << " set size=" << c_nMapSize
+                );
+
+            Map s;
+            do_test_with( s );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        template <class Map>
+        void test_nolf_extract()
+        {
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsThreadCount
+                << ", delete=" << c_nDelThreadCount
+                << ", extract=" << c_nExtractThreadCount
+                << "; set size=" << c_nMapSize
+                );
+
+            Map s;
+            do_test_extract_with( s );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nMapSize = cfg.getULong("MapSize", static_cast<unsigned long>(c_nMapSize) );
+            c_nInsThreadCount = cfg.getULong("InsThreadCount", static_cast<unsigned long>(c_nInsThreadCount) );
+            c_nDelThreadCount = cfg.getULong("DelThreadCount", static_cast<unsigned long>(c_nDelThreadCount) );
+            c_nExtractThreadCount = cfg.getULong("ExtractThreadCount", static_cast<unsigned long>(c_nExtractThreadCount) );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", static_cast<unsigned long>(c_nMaxLoadFactor) );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+
+            if ( c_nInsThreadCount == 0 )
+                c_nInsThreadCount = cds::OS::topology::processor_count();
+            if ( c_nDelThreadCount == 0 && c_nExtractThreadCount == 0 ) {
+                c_nExtractThreadCount = cds::OS::topology::processor_count() / 2;
+                c_nDelThreadCount = cds::OS::topology::processor_count() - c_nExtractThreadCount;
+            }
+
+            m_arrData.resize( c_nMapSize );
+            for ( size_t i = 0; i < c_nMapSize; ++i )
+                m_arrData[i] = i;
+            std::random_shuffle( m_arrData.begin(), m_arrData.end() );
+        }
+
+#   include "map2/map_defs.h"
+        CDSUNIT_DECLARE_MichaelMap
+        CDSUNIT_DECLARE_SplitList
+        //CDSUNIT_DECLARE_StripedMap
+        //CDSUNIT_DECLARE_RefinableMap
+        CDSUNIT_DECLARE_CuckooMap
+        CDSUNIT_DECLARE_SkipListMap
+        CDSUNIT_DECLARE_EllenBinTreeMap
+        //CDSUNIT_DECLARE_StdMap
+
+        CPPUNIT_TEST_SUITE( Map_DelOdd )
+            CDSUNIT_TEST_MichaelMap
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SkipListMap
+            CDSUNIT_TEST_EllenBinTreeMap
+            //CDSUNIT_TEST_StripedMap
+            //CDSUNIT_TEST_RefinableMap
+            CDSUNIT_TEST_CuckooMap
+            //CDSUNIT_TEST_StdMap
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Map_DelOdd );
+} // namespace map2
diff --git a/tests/unit/map2/map_find_int.cpp b/tests/unit/map2/map_find_int.cpp
new file mode 100644 (file)
index 0000000..491d43c
--- /dev/null
@@ -0,0 +1,279 @@
+//$$CDS-header$$
+
+// defines concurrent access to map::nonconcurrent_iterator::Sequence::TValue::nAccess field
+
+#include "map2/map_types.h"
+#include "cppunit/thread.h"
+
+#include <vector>
+#include <algorithm> // random_shuffle
+
+// find int test in map<int> in mutithreaded mode
+namespace map2 {
+
+#   define TEST_MAP(X)         void X() { test<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_NOLF(X)    void X() { test_nolf<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_EXTRACT(X)  TEST_MAP(X)
+#   define TEST_MAP_NOLF_EXTRACT(X) TEST_MAP_NOLF(X)
+
+    namespace {
+        static size_t  c_nThreadCount = 8      ;  // thread count
+        static size_t  c_nMapSize = 20000000   ;  // map size (count of searching item)
+        static size_t  c_nPercentExists = 50   ;  // percent of existing keys in searching sequence
+        static size_t  c_nPassCount = 2;
+        static size_t  c_nMaxLoadFactor = 8    ;  // maximum load factor
+        static bool    c_bPrintGCState = true;
+    }
+
+    class Map_find_int: public CppUnitMini::TestCase
+    {
+        typedef size_t   key_type;
+        struct value_type {
+            key_type    nKey    ;   // key
+            bool        bExists ;   // true - key in map, false - key not in map
+        };
+
+        typedef std::vector<value_type> ValueVector;
+        ValueVector             m_Arr;
+        size_t                  m_nRealMapSize;
+        bool                    m_bSequenceInitialized;
+
+        void generateSequence()
+        {
+            size_t nPercent = c_nPercentExists;
+
+            if ( nPercent > 100 )
+                nPercent = 100;
+            else if ( nPercent < 1 )
+                nPercent = 1;
+
+            m_nRealMapSize = 0;
+
+            m_Arr.resize( c_nMapSize );
+            for ( size_t i = 0; i < c_nMapSize; ++i ) {
+                m_Arr[i].nKey = i * 13;
+                m_Arr[i].bExists = CppUnitMini::Rand( 100 ) <= nPercent;
+                if ( m_Arr[i].bExists )
+                    ++m_nRealMapSize;
+            }
+            std::random_shuffle( m_Arr.begin(), m_Arr.end() );
+        }
+
+        template <class Map>
+        class TestThread: public CppUnitMini::TestThread
+        {
+            Map&     m_Map;
+
+            virtual TestThread *    clone()
+            {
+                return new TestThread( *this );
+            }
+        public:
+            struct Stat {
+                size_t      nSuccess;
+                size_t      nFailed;
+
+                Stat()
+                    : nSuccess(0)
+                    , nFailed(0)
+                {}
+            };
+
+            Stat    m_KeyExists;
+            Stat    m_KeyNotExists;
+
+        public:
+            TestThread( CppUnitMini::ThreadPool& pool, Map& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            TestThread( TestThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_find_int&  getTest()
+            {
+                return reinterpret_cast<Map_find_int&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                ValueVector& arr = getTest().m_Arr;
+                //size_t nSize = arr.size();
+
+                Map& rMap = m_Map;
+                for ( size_t nPass = 0; nPass < c_nPassCount; ++nPass ) {
+                    if ( m_nThreadNo & 1 ) {
+                        ValueVector::const_iterator itEnd = arr.end();
+                        for ( ValueVector::const_iterator it = arr.begin(); it != itEnd; ++it ) {
+                            bool bFound = rMap.find( it->nKey );
+                            if ( it->bExists ) {
+                                if ( bFound )
+                                    ++m_KeyExists.nSuccess;
+                                else {
+                                    //rMap.find( it->nKey );
+                                    ++m_KeyExists.nFailed;
+                                }
+                            }
+                            else {
+                                if ( bFound ) {
+                                    //rMap.find( it->nKey );
+                                    ++m_KeyNotExists.nFailed;
+                                }
+                                else
+                                    ++m_KeyNotExists.nSuccess;
+                            }
+                        }
+                    }
+                    else {
+                        ValueVector::const_reverse_iterator itEnd = arr.rend();
+                        for ( ValueVector::const_reverse_iterator it = arr.rbegin(); it != itEnd; ++it ) {
+                            bool bFound = rMap.find( it->nKey );
+                            if ( it->bExists ) {
+                                if ( bFound )
+                                    ++m_KeyExists.nSuccess;
+                                else {
+                                    //rMap.find( it->nKey );
+                                    ++m_KeyExists.nFailed;
+                                }
+                            }
+                            else {
+                                if ( bFound ) {
+                                    //rMap.find( it->nKey );
+                                    ++m_KeyNotExists.nFailed;
+                                }
+                                else
+                                    ++m_KeyNotExists.nSuccess;
+                            }
+                        }
+                    }
+                }
+            }
+        };
+
+    protected:
+
+        template <class Map>
+        void find_int_test( Map& testMap )
+        {
+            typedef TestThread<Map>     Thread;
+            cds::OS::Timer    timer;
+
+            // Fill the map
+            CPPUNIT_MSG( "  Fill map with " << m_Arr.size() << " items...");
+            timer.reset();
+            for ( size_t i = 0; i < m_Arr.size(); ++i ) {
+                if ( m_Arr[i].bExists ) {
+                    CPPUNIT_ASSERT( testMap.insert( m_Arr[i].nKey, m_Arr[i] ) );
+                }
+            }
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+
+            CPPUNIT_MSG( "  Searching...");
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread( pool, testMap ), c_nThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Thread * pThread = static_cast<Thread *>( *it );
+                CPPUNIT_ASSERT( pThread->m_KeyExists.nFailed == 0 );
+                CPPUNIT_ASSERT( pThread->m_KeyExists.nSuccess == m_nRealMapSize * c_nPassCount );
+                CPPUNIT_ASSERT( pThread->m_KeyNotExists.nFailed == 0 );
+                CPPUNIT_ASSERT( pThread->m_KeyNotExists.nSuccess == (m_Arr.size() - m_nRealMapSize) * c_nPassCount );
+            }
+
+            testMap.clear();
+            additional_check( testMap );
+            print_stat( testMap );
+            additional_cleanup( testMap );
+        }
+
+        void initTestSequence()
+        {
+            CPPUNIT_MSG( "Generating test data...");
+            cds::OS::Timer    timer;
+            generateSequence();
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+            CPPUNIT_MSG( "Map size=" << m_nRealMapSize << " find key loop=" << m_Arr.size() << " (" << c_nPercentExists << "% success)" );
+            CPPUNIT_MSG( "Thread count=" << c_nThreadCount << " Pass count=" << c_nPassCount );
+
+            m_bSequenceInitialized = true;
+        }
+
+        template <class Map>
+        void test()
+        {
+            if ( !m_bSequenceInitialized )
+                initTestSequence();
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                Map  testMap( c_nMapSize, nLoadFactor );
+                find_int_test( testMap );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class Map>
+        void test_nolf()
+        {
+            if ( !m_bSequenceInitialized )
+                initTestSequence();
+
+            Map testMap;
+            find_int_test( testMap );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nThreadCount = cfg.getULong("ThreadCount", 8 )        ; // thread count
+            c_nMapSize = cfg.getULong("MapSize", 20000000 )         ;  // map size (count of searching item)
+            c_nPercentExists = cfg.getULong("PercentExists", 50 )   ;  // percent of existing keys in searching sequence
+            c_nPassCount = cfg.getULong("PassCount", 2 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+        }
+
+
+    public:
+        Map_find_int()
+            : m_bSequenceInitialized( false )
+        {}
+
+#   include "map2/map_defs.h"
+        CDSUNIT_DECLARE_MichaelMap
+        CDSUNIT_DECLARE_MichaelMap_nogc
+        CDSUNIT_DECLARE_SplitList
+        CDSUNIT_DECLARE_SplitList_nogc
+        CDSUNIT_DECLARE_SkipListMap
+        CDSUNIT_DECLARE_SkipListMap_nogc
+        CDSUNIT_DECLARE_EllenBinTreeMap
+        CDSUNIT_DECLARE_StripedMap
+        CDSUNIT_DECLARE_RefinableMap
+        CDSUNIT_DECLARE_CuckooMap
+        CDSUNIT_DECLARE_StdMap
+
+        CPPUNIT_TEST_SUITE( Map_find_int )
+            CDSUNIT_TEST_MichaelMap
+            CDSUNIT_TEST_MichaelMap_nogc
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SplitList_nogc
+            CDSUNIT_TEST_SkipListMap
+            CDSUNIT_TEST_SkipListMap_nogc
+            CDSUNIT_TEST_EllenBinTreeMap
+            CDSUNIT_TEST_StripedMap
+            CDSUNIT_TEST_RefinableMap
+            CDSUNIT_TEST_CuckooMap
+            CDSUNIT_TEST_StdMap
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Map_find_int );
+} // namespace map
diff --git a/tests/unit/map2/map_find_string.cpp b/tests/unit/map2/map_find_string.cpp
new file mode 100644 (file)
index 0000000..807720b
--- /dev/null
@@ -0,0 +1,275 @@
+//$$CDS-header$$
+
+// defines concurrent access to map::nonconcurrent_iterator::Sequence::TValue::nAccess field
+
+#include "map2/map_types.h"
+#include "cppunit/thread.h"
+
+#include <vector>
+
+// find int test in map<int> in mutithreaded mode
+namespace map2 {
+
+#    define TEST_MAP(X)         void X() { test<MapTypes<key_type, value_type>::X >()    ; }
+#    define TEST_MAP_NOLF(X)    void X() { test_nolf<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_EXTRACT(X)  TEST_MAP(X)
+#   define TEST_MAP_NOLF_EXTRACT(X) TEST_MAP_NOLF(X)
+
+    namespace {
+        static size_t  c_nThreadCount = 8      ;  // thread count
+        static size_t  c_nMapSize = 20000000   ;  // map size (count of searching item)
+        static size_t  c_nPercentExists = 50   ;  // percent of existing keys in searching sequence
+        static size_t  c_nPassCount = 2;
+        static size_t  c_nMaxLoadFactor = 8    ;  // maximum load factor
+        static bool    c_bPrintGCState = true;
+    }
+
+    class Map_find_string: public CppUnitMini::TestCase
+    {
+        typedef std::string  key_type;
+        struct value_type {
+            std::string const * pKey;
+            bool        bExists ;   // true - key in map, false - key not in map
+        };
+
+        typedef std::vector<value_type> ValueVector;
+        ValueVector             m_Arr;
+        size_t                  m_nRealMapSize;
+        bool                    m_bSeqInit;
+
+        template <class MAP>
+        class TestThread: public CppUnitMini::TestThread
+        {
+            MAP&     m_Map;
+
+            virtual TestThread *    clone()
+            {
+                return new TestThread( *this );
+            }
+        public:
+            struct Stat {
+                size_t      nSuccess;
+                size_t      nFailed;
+
+                Stat()
+                    : nSuccess(0)
+                    , nFailed(0)
+                {}
+            };
+
+            Stat    m_KeyExists;
+            Stat    m_KeyNotExists;
+
+        public:
+            TestThread( CppUnitMini::ThreadPool& pool, MAP& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            TestThread( TestThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_find_string&  getTest()
+            {
+                return reinterpret_cast<Map_find_string&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                ValueVector& arr = getTest().m_Arr;
+                //size_t nSize = arr.size();
+
+                MAP& rMap = m_Map;
+                for ( size_t nPass = 0; nPass < c_nPassCount; ++nPass ) {
+                    if ( m_nThreadNo & 1 ) {
+                        ValueVector::const_iterator itEnd = arr.end();
+                        for ( ValueVector::const_iterator it = arr.begin(); it != itEnd; ++it ) {
+                            bool bFound = rMap.find( *(it->pKey) );
+                            if ( it->bExists ) {
+                                if ( bFound )
+                                    ++m_KeyExists.nSuccess;
+                                else
+                                    ++m_KeyExists.nFailed;
+                            }
+                            else {
+                                if ( bFound )
+                                    ++m_KeyNotExists.nFailed;
+                                else
+                                    ++m_KeyNotExists.nSuccess;
+                            }
+                        }
+                    }
+                    else {
+                        ValueVector::const_reverse_iterator itEnd = arr.rend();
+                        for ( ValueVector::const_reverse_iterator it = arr.rbegin(); it != itEnd; ++it ) {
+                            bool bFound = rMap.find( *(it->pKey) );
+                            if ( it->bExists ) {
+                                if ( bFound )
+                                    ++m_KeyExists.nSuccess;
+                                else
+                                    ++m_KeyExists.nFailed;
+                            }
+                            else {
+                                if ( bFound )
+                                    ++m_KeyNotExists.nFailed;
+                                else
+                                    ++m_KeyNotExists.nSuccess;
+                            }
+                        }
+                    }
+                }
+            }
+        };
+
+    public:
+        Map_find_string()
+            : m_bSeqInit( false )
+        {}
+
+    protected:
+
+        void generateSequence()
+        {
+            size_t nPercent = c_nPercentExists;
+
+            if ( nPercent > 100 )
+                nPercent = 100;
+            else if ( nPercent < 1 )
+                nPercent = 1;
+
+            m_nRealMapSize = 0;
+
+            std::vector<std::string> const & arrString = CppUnitMini::TestCase::getTestStrings();
+            size_t nSize = arrString.size();
+            if ( nSize > c_nMapSize )
+                nSize = c_nMapSize;
+            m_Arr.resize( nSize );
+            for ( size_t i = 0; i < nSize; ++i ) {
+                m_Arr[i].pKey = &( arrString[i] );
+                m_Arr[i].bExists = CppUnitMini::Rand( 100 ) <= nPercent;
+                if ( m_Arr[i].bExists )
+                    ++m_nRealMapSize;
+            }
+        }
+
+
+        template <class MAP>
+        void find_string_test( MAP& testMap )
+        {
+            typedef TestThread<MAP>     Thread;
+            cds::OS::Timer    timer;
+
+            // Fill the map
+            CPPUNIT_MSG( "  Fill map...");
+            timer.reset();
+            for ( size_t i = 0; i < m_Arr.size(); ++i ) {
+                // Âñå êëþ÷è â arrData - óíèêàëüíûå, ïîýòîìó îøèáîê ïðè âñòàâêå áûòü íå äîëæíî
+                if ( m_Arr[i].bExists )
+                    CPPUNIT_ASSERT( testMap.insert( *(m_Arr[i].pKey), m_Arr[i] ) );
+            }
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+
+            CPPUNIT_MSG( "  Searching...");
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread( pool, testMap ), c_nThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            // Ïðîâåðÿåì, ÷òî ó âñåõ threads ÷èñëî óñïåøíûõ ïîèñêîâ = ÷èñëó ýëåìåíòîâ â map
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Thread * pThread = static_cast<Thread *>( *it );
+                CPPUNIT_ASSERT( pThread->m_KeyExists.nSuccess == m_nRealMapSize * c_nPassCount );
+                CPPUNIT_ASSERT( pThread->m_KeyExists.nFailed == 0 );
+                CPPUNIT_ASSERT( pThread->m_KeyNotExists.nSuccess == (m_Arr.size() - m_nRealMapSize) * c_nPassCount );
+                CPPUNIT_ASSERT( pThread->m_KeyNotExists.nFailed == 0 );
+            }
+
+            testMap.clear();
+            additional_check( testMap );
+            print_stat( testMap );
+            additional_cleanup( testMap );
+        }
+
+        void initTestSequence()
+        {
+            if ( !m_bSeqInit ) {
+                m_bSeqInit = true;
+
+                CPPUNIT_MSG( "Generating test data...");
+                cds::OS::Timer    timer;
+                generateSequence();
+                CPPUNIT_MSG( "   Duration=" << timer.duration() );
+                CPPUNIT_MSG( "Map size=" << m_nRealMapSize << " find key loop=" << m_Arr.size() << " (" << c_nPercentExists << "% success)" );
+                CPPUNIT_MSG( "Thread count=" << c_nThreadCount << " Pass count=" << c_nPassCount );
+            }
+        }
+
+        template <class MAP>
+        void test()
+        {
+            initTestSequence();
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                MAP  testMap( m_Arr.size(), nLoadFactor );
+                find_string_test( testMap );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class MAP>
+        void test_nolf()
+        {
+            initTestSequence();
+
+            MAP testMap;
+            find_string_test( testMap );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nThreadCount = cfg.getULong("ThreadCount", 8 )        ; // thread count
+            c_nMapSize = cfg.getULong("MapSize", 20000000 )         ;  // map size (count of searching item)
+            c_nPercentExists = cfg.getULong("PercentExists", 50 )   ;  // percent of existing keys in searching sequence
+            c_nPassCount = cfg.getULong("PassCount", 2 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+        }
+
+#   include "map2/map_defs.h"
+        CDSUNIT_DECLARE_MichaelMap
+        CDSUNIT_DECLARE_MichaelMap_nogc
+        CDSUNIT_DECLARE_SplitList
+        CDSUNIT_DECLARE_SplitList_nogc
+        CDSUNIT_DECLARE_SkipListMap
+        CDSUNIT_DECLARE_SkipListMap_nogc
+        CDSUNIT_DECLARE_EllenBinTreeMap
+        CDSUNIT_DECLARE_StripedMap
+        CDSUNIT_DECLARE_RefinableMap
+        CDSUNIT_DECLARE_CuckooMap
+        CDSUNIT_DECLARE_StdMap
+
+        CPPUNIT_TEST_SUITE( Map_find_string )
+            CDSUNIT_TEST_MichaelMap
+            CDSUNIT_TEST_MichaelMap_nogc
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SplitList_nogc
+            CDSUNIT_TEST_SkipListMap
+            CDSUNIT_TEST_SkipListMap_nogc
+            CDSUNIT_TEST_EllenBinTreeMap
+            CDSUNIT_TEST_StripedMap
+            CDSUNIT_TEST_RefinableMap
+            CDSUNIT_TEST_CuckooMap
+            CDSUNIT_TEST_StdMap
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Map_find_string );
+} // namespace map2
diff --git a/tests/unit/map2/map_insdel_func.cpp b/tests/unit/map2/map_insdel_func.cpp
new file mode 100644 (file)
index 0000000..d47a6be
--- /dev/null
@@ -0,0 +1,550 @@
+//$$CDS-header$$
+
+#include "map2/map_types.h"
+#include "cppunit/thread.h"
+
+#include <cds/lock/spinlock.h>
+#include <vector>
+#include <algorithm>    // random_shuffle
+#include <boost/ref.hpp>
+
+namespace map2 {
+
+#   define TEST_MAP(X)          void X() { test<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_EXTRACT(X)  TEST_MAP(X)
+#   define TEST_MAP_NOLF(X)     void X() { test_nolf<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_NOLF_EXTRACT(X) TEST_MAP_NOLF(X)
+
+    namespace {
+        static size_t  c_nMapSize = 1000000    ;  // map size
+        static size_t  c_nInsertThreadCount = 4;  // count of insertion thread
+        static size_t  c_nDeleteThreadCount = 4;  // count of deletion thread
+        static size_t  c_nEnsureThreadCount = 4;  // count of ensure thread
+        static size_t  c_nThreadPassCount = 4  ;  // pass count for each thread
+        static size_t  c_nMaxLoadFactor = 8    ;  // maximum load factor
+        static bool    c_bPrintGCState = true;
+    }
+
+    class Map_InsDel_func: public CppUnitMini::TestCase
+    {
+        typedef size_t  key_type;
+        struct value_type {
+            size_t      nKey;
+            size_t      nData;
+            CDS_ATOMIC::atomic<size_t> nEnsureCall;
+            CDS_ATOMIC::atomic<bool>   bInitialized;
+            cds::OS::ThreadId          threadId     ;   // insert thread id
+
+            typedef cds::lock::Spinlock< cds::backoff::pause >   lock_type;
+            mutable lock_type   m_access;
+
+            value_type()
+                : nKey(0)
+                , nData(0)
+                , nEnsureCall(0)
+                , bInitialized( false )
+                , threadId( cds::OS::getCurrentThreadId() )
+            {}
+
+            value_type( value_type const& s )
+                : nKey(s.nKey)
+                , nData(s.nData)
+                , nEnsureCall(s.nEnsureCall.load(CDS_ATOMIC::memory_order_relaxed))
+                , bInitialized( s.bInitialized.load(CDS_ATOMIC::memory_order_relaxed) )
+                , threadId( cds::OS::getCurrentThreadId() )
+            {}
+
+            // boost::container::flat_map requires operator =
+            value_type& operator=( value_type const& v )
+            {
+                nKey = v.nKey;
+                nData = v.nData;
+                nEnsureCall.store( v.nEnsureCall.load(CDS_ATOMIC::memory_order_relaxed), CDS_ATOMIC::memory_order_relaxed );
+                bInitialized.store(v.bInitialized.load(CDS_ATOMIC::memory_order_relaxed), CDS_ATOMIC::memory_order_relaxed);
+
+                return *this;
+            }
+        };
+
+        typedef std::vector<key_type>   key_array;
+        key_array                       m_arrValues;
+
+        template <class Map>
+        class Inserter: public CppUnitMini::TestThread
+        {
+            Map&     m_Map;
+            typedef typename Map::value_type pair_type;
+
+            virtual Inserter *    clone()
+            {
+                return new Inserter( *this );
+            }
+
+            struct insert_functor {
+                size_t nTestFunctorRef;
+
+                insert_functor()
+                    : nTestFunctorRef(0)
+                {}
+
+                void operator()( pair_type& val )
+                {
+                    cds::lock::scoped_lock< typename value_type::lock_type>    ac( val.second.m_access );
+
+                    val.second.nKey  = val.first;
+                    val.second.nData = val.first * 8;
+
+                    ++nTestFunctorRef;
+                    val.second.bInitialized.store( true, CDS_ATOMIC::memory_order_relaxed);
+                }
+            };
+
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+
+            size_t  m_nTestFunctorRef;
+
+        public:
+            Inserter( CppUnitMini::ThreadPool& pool, Map& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Inserter( Inserter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDel_func&  getTest()
+            {
+                return reinterpret_cast<Map_InsDel_func&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Map& rMap = m_Map;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed =
+                    m_nTestFunctorRef = 0;
+
+                // func is passed by reference
+                insert_functor  func;
+                key_array const& arr = getTest().m_arrValues;
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( key_array::const_iterator it = arr.begin(), itEnd = arr.end(); it != itEnd; ++it ) {
+                            if ( rMap.insert_key( *it, cds::ref(func) ) )
+                                ++m_nInsertSuccess;
+                            else
+                                ++m_nInsertFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( key_array::const_reverse_iterator it = arr.rbegin(), itEnd = arr.rend(); it != itEnd; ++it ) {
+                            if ( rMap.insert_key( *it, cds::ref(func) ) )
+                                ++m_nInsertSuccess;
+                            else
+                                ++m_nInsertFailed;
+                        }
+                    }
+                }
+
+                m_nTestFunctorRef = func.nTestFunctorRef;
+            }
+        };
+
+        template <class Map>
+        class Ensurer: public CppUnitMini::TestThread
+        {
+            Map&     m_Map;
+            typedef typename Map::value_type pair_type;
+
+            virtual Ensurer *    clone()
+            {
+                return new Ensurer( *this );
+            }
+
+            struct ensure_functor {
+                size_t  nCreated;
+                size_t  nModified;
+
+                ensure_functor()
+                    : nCreated(0)
+                    , nModified(0)
+                {}
+
+                void operator()( bool bNew, pair_type& val )
+                {
+                    cds::lock::scoped_lock<typename value_type::lock_type>    ac( val.second.m_access );
+                    if ( bNew ) {
+                        ++nCreated;
+                        val.second.nKey = val.first;
+                        val.second.nData = val.first * 8;
+                        val.second.bInitialized.store( true, CDS_ATOMIC::memory_order_relaxed);
+                    }
+                    else {
+                        val.second.nEnsureCall.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+                        ++nModified;
+                    }
+                }
+            private:
+                ensure_functor(const ensure_functor& );
+            };
+
+        public:
+            size_t  m_nEnsureFailed;
+            size_t  m_nEnsureCreated;
+            size_t  m_nEnsureExisted;
+            size_t  m_nFunctorCreated;
+            size_t  m_nFunctorModified;
+
+        public:
+            Ensurer( CppUnitMini::ThreadPool& pool, Map& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Ensurer( Ensurer& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDel_func&  getTest()
+            {
+                return reinterpret_cast<Map_InsDel_func&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Map& rMap = m_Map;
+
+                m_nEnsureCreated =
+                    m_nEnsureExisted =
+                    m_nEnsureFailed = 0;
+
+                ensure_functor func;
+
+                key_array const& arr = getTest().m_arrValues;
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( key_array::const_iterator it = arr.begin(), itEnd = arr.end(); it != itEnd; ++it ) {
+                        //for ( size_t nItem = 0; nItem < c_nMapSize; ++nItem ) {
+                            std::pair<bool, bool> ret = rMap.ensure( *it, cds::ref( func ) );
+                            if ( ret.first  ) {
+                                if ( ret.second )
+                                    ++m_nEnsureCreated;
+                                else
+                                    ++m_nEnsureExisted;
+                            }
+                            else
+                                ++m_nEnsureFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( key_array::const_reverse_iterator it = arr.rbegin(), itEnd = arr.rend(); it != itEnd; ++it ) {
+                        //for ( size_t nItem = c_nMapSize; nItem > 0; --nItem ) {
+                            std::pair<bool, bool> ret = rMap.ensure( *it, cds::ref( func ) );
+                            if ( ret.first  ) {
+                                if ( ret.second )
+                                    ++m_nEnsureCreated;
+                                else
+                                    ++m_nEnsureExisted;
+                            }
+                            else
+                                ++m_nEnsureFailed;
+                        }
+                    }
+                }
+
+                m_nFunctorCreated = func.nCreated;
+                m_nFunctorModified = func.nModified;
+            }
+        };
+
+        template <class Map>
+        class Deleter: public CppUnitMini::TestThread
+        {
+            Map&     m_Map;
+            typedef typename Map::mapped_type value_type;
+            typedef typename Map::value_type pair_type;
+
+            virtual Deleter *    clone()
+            {
+                return new Deleter( *this );
+            }
+
+            struct value_container
+            {
+                size_t      nKeyExpected;
+
+                size_t      nSuccessItem;
+                size_t      nFailedItem;
+
+                value_container()
+                    : nSuccessItem(0)
+                    , nFailedItem(0)
+                {}
+            };
+
+            struct erase_functor {
+                value_container     m_cnt;
+
+                void operator ()( pair_type& item )
+                {
+                    while ( true ) {
+                        if ( item.second.bInitialized.load( CDS_ATOMIC::memory_order_relaxed )) {
+                            cds::lock::scoped_lock< typename value_type::lock_type>    ac( item.second.m_access );
+
+                            if ( m_cnt.nKeyExpected == item.second.nKey && m_cnt.nKeyExpected * 8 == item.second.nData )
+                                ++m_cnt.nSuccessItem;
+                            else
+                                ++m_cnt.nFailedItem;
+                            item.second.nData++;
+                            item.second.nKey = 0;
+                            break;
+                        }
+                        else
+                            cds::backoff::yield()();
+                    }
+                }
+            };
+
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+            size_t  m_nValueSuccess;
+            size_t  m_nValueFailed;
+
+        public:
+            Deleter( CppUnitMini::ThreadPool& pool, Map& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Deleter( Deleter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDel_func&  getTest()
+            {
+                return reinterpret_cast<Map_InsDel_func&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Map& rMap = m_Map;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                erase_functor   func;
+                key_array const& arr = getTest().m_arrValues;
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( key_array::const_iterator it = arr.begin(), itEnd = arr.end(); it != itEnd; ++it ) {
+                            func.m_cnt.nKeyExpected = *it;
+                            if ( rMap.erase( *it, cds::ref(func) ))
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( key_array::const_reverse_iterator it = arr.rbegin(), itEnd = arr.rend(); it != itEnd; ++it ) {
+                            func.m_cnt.nKeyExpected = *it;
+                            if ( rMap.erase( *it, cds::ref(func) ))
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+
+                m_nValueSuccess = func.m_cnt.nSuccessItem;
+                m_nValueFailed = func.m_cnt.nFailedItem;
+            }
+        };
+
+    protected:
+
+        template <class Map>
+        void do_test( Map& testMap )
+        {
+            typedef Inserter<Map>       InserterThread;
+            typedef Deleter<Map>        DeleterThread;
+            typedef Ensurer<Map>        EnsurerThread;
+            cds::OS::Timer    timer;
+
+            m_arrValues.clear();
+            m_arrValues.reserve( c_nMapSize );
+            for ( size_t i = 0; i < c_nMapSize; ++i )
+                m_arrValues.push_back( i );
+            std::random_shuffle( m_arrValues.begin(), m_arrValues.end() );
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new InserterThread( pool, testMap ), c_nInsertThreadCount );
+            pool.add( new DeleterThread( pool, testMap ), c_nDeleteThreadCount );
+            pool.add( new EnsurerThread( pool, testMap ), c_nEnsureThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            size_t nDelValueSuccess = 0;
+            size_t nDelValueFailed = 0;
+            size_t nEnsureFailed = 0;
+            size_t nEnsureCreated = 0;
+            size_t nEnsureModified = 0;
+            size_t nEnsFuncCreated = 0;
+            size_t nEnsFuncModified = 0;
+            size_t nTestFunctorRef = 0;
+
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                InserterThread * pThread = dynamic_cast<InserterThread *>( *it );
+                if ( pThread ) {
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                    nTestFunctorRef += pThread->m_nTestFunctorRef;
+                }
+                else {
+                    DeleterThread * p = dynamic_cast<DeleterThread *>( *it );
+                    if ( p ) {
+                        nDeleteSuccess += p->m_nDeleteSuccess;
+                        nDeleteFailed += p->m_nDeleteFailed;
+                        nDelValueSuccess += p->m_nValueSuccess;
+                        nDelValueFailed += p->m_nValueFailed;
+                    }
+                    else {
+                        EnsurerThread * pEns = static_cast<EnsurerThread *>( *it );
+                        nEnsureCreated += pEns->m_nEnsureCreated;
+                        nEnsureModified += pEns->m_nEnsureExisted;
+                        nEnsureFailed += pEns->m_nEnsureFailed;
+                        nEnsFuncCreated += pEns->m_nFunctorCreated;
+                        nEnsFuncModified += pEns->m_nFunctorModified;
+                    }
+                }
+            }
+
+            CPPUNIT_MSG( "    Totals: Ins succ=" << nInsertSuccess
+                << " Del succ=" << nDeleteSuccess << "\n"
+                << "          : Ins fail=" << nInsertFailed
+                << " Del fail=" << nDeleteFailed << "\n"
+                << "          : Ensure succ=" << (nEnsureCreated + nEnsureModified) << " fail=" << nEnsureFailed
+                << " create=" << nEnsureCreated << " modify=" << nEnsureModified << "\n"
+                << "          Map size=" << testMap.size()
+                );
+
+            CPPUNIT_CHECK_EX( nDelValueFailed == 0, "Functor del failed=" << nDelValueFailed );
+            CPPUNIT_CHECK_EX( nDelValueSuccess == nDeleteSuccess,  "Delete success=" << nDeleteSuccess << " functor=" << nDelValueSuccess );
+
+            CPPUNIT_CHECK( nEnsureFailed == 0 );
+
+            CPPUNIT_CHECK_EX( nEnsureCreated == nEnsFuncCreated, "Ensure created=" << nEnsureCreated << " functor=" << nEnsFuncCreated );
+            CPPUNIT_CHECK_EX( nEnsureModified == nEnsFuncModified, "Ensure modified=" << nEnsureModified << " functor=" << nEnsFuncModified );
+
+            // nTestFunctorRef is call count of insert functor
+            CPPUNIT_CHECK_EX( nTestFunctorRef == nInsertSuccess, "nInsertSuccess=" << nInsertSuccess << " functor nTestFunctorRef=" << nTestFunctorRef );
+
+            CPPUNIT_MSG( "  Clear map (single-threaded)..." );
+            timer.reset();
+            for ( size_t nItem = 0; nItem < c_nMapSize; ++nItem ) {
+                testMap.erase( nItem );
+            }
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+            CPPUNIT_CHECK( testMap.empty() );
+
+            additional_check( testMap );
+            print_stat( testMap );
+            additional_cleanup( testMap );
+        }
+
+        template <class Map>
+        void test()
+        {
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " ensure=" << c_nEnsureThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " map size=" << c_nMapSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                Map  testMap( c_nMapSize, nLoadFactor );
+                do_test( testMap );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+
+        }
+
+        template <class Map>
+        void test_nolf()
+        {
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " ensure=" << c_nEnsureThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " map size=" << c_nMapSize
+                );
+
+            Map testMap;
+            do_test( testMap );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nInsertThreadCount = cfg.getULong("InsertThreadCount", 4 );
+            c_nDeleteThreadCount = cfg.getULong("DeleteThreadCount", 4 );
+            c_nEnsureThreadCount = cfg.getULong("EnsureThreadCount", 4 );
+            c_nThreadPassCount = cfg.getULong("ThreadPassCount", 4 );
+            c_nMapSize = cfg.getULong("MapSize", 1000000 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+        }
+
+#   include "map2/map_defs.h"
+    CDSUNIT_DECLARE_MichaelMap
+    CDSUNIT_DECLARE_SplitList
+    CDSUNIT_DECLARE_SkipListMap
+    CDSUNIT_DECLARE_EllenBinTreeMap
+    CDSUNIT_DECLARE_StripedMap
+    CDSUNIT_DECLARE_RefinableMap
+    CDSUNIT_DECLARE_CuckooMap
+
+    CPPUNIT_TEST_SUITE( Map_InsDel_func )
+        CDSUNIT_TEST_MichaelMap
+        CDSUNIT_TEST_SplitList
+        CDSUNIT_TEST_SkipListMap
+        CDSUNIT_TEST_EllenBinTreeMap
+        CDSUNIT_TEST_StripedMap
+        CDSUNIT_TEST_RefinableMap
+        CDSUNIT_TEST_CuckooMap
+    CPPUNIT_TEST_SUITE_END()
+
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Map_InsDel_func );
+} // namespace map2
diff --git a/tests/unit/map2/map_insdel_int.cpp b/tests/unit/map2/map_insdel_int.cpp
new file mode 100644 (file)
index 0000000..b669d02
--- /dev/null
@@ -0,0 +1,280 @@
+//$$CDS-header$$
+
+#include "map2/map_types.h"
+#include "cppunit/thread.h"
+
+#include <vector>
+
+namespace map2 {
+
+#   define TEST_MAP(X)         void X() { test<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_EXTRACT(X)  TEST_MAP(X)
+#   define TEST_MAP_NOLF(X)    void X() { test_nolf<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_NOLF_EXTRACT(X) TEST_MAP_NOLF(X)
+
+    namespace {
+        static size_t  c_nMapSize = 1000000    ;  // map size
+        static size_t  c_nInsertThreadCount = 4;  // count of insertion thread
+        static size_t  c_nDeleteThreadCount = 4;  // count of deletion thread
+        static size_t  c_nThreadPassCount = 4  ;  // pass count for each thread
+        static size_t  c_nMaxLoadFactor = 8    ;  // maximum load factor
+        static bool    c_bPrintGCState = true;
+    }
+
+    class Map_InsDel_int: public CppUnitMini::TestCase
+    {
+        typedef size_t  key_type;
+        typedef size_t  value_type;
+
+        typedef std::vector<key_type>   key_array;
+        key_array                       m_arrValues;
+
+        template <class MAP>
+        class Inserter: public CppUnitMini::TestThread
+        {
+            MAP&     m_Map;
+
+            virtual Inserter *    clone()
+            {
+                return new Inserter( *this );
+            }
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+
+        public:
+            Inserter( CppUnitMini::ThreadPool& pool, MAP& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Inserter( Inserter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDel_int&  getTest()
+            {
+                return reinterpret_cast<Map_InsDel_int&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                MAP& rMap = m_Map;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed = 0;
+                key_array const& arr = getTest().m_arrValues;
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( key_array::const_iterator it = arr.begin(), itEnd = arr.end(); it != itEnd; ++it ) {
+                            if ( rMap.insert( *it, *it * 8 ) )
+                                ++m_nInsertSuccess;
+                            else
+                                ++m_nInsertFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( key_array::const_reverse_iterator it = arr.rbegin(), itEnd = arr.rend(); it != itEnd; ++it ) {
+                            if ( rMap.insert( *it, *it * 8 ) )
+                                ++m_nInsertSuccess;
+                            else
+                                ++m_nInsertFailed;
+                        }
+                    }
+                }
+            }
+        };
+
+        template <class MAP>
+        class Deleter: public CppUnitMini::TestThread
+        {
+            MAP&     m_Map;
+
+            virtual Deleter *    clone()
+            {
+                return new Deleter( *this );
+            }
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+        public:
+            Deleter( CppUnitMini::ThreadPool& pool, MAP& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Deleter( Deleter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDel_int&  getTest()
+            {
+                return reinterpret_cast<Map_InsDel_int&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                MAP& rMap = m_Map;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+                key_array const& arr = getTest().m_arrValues;
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( key_array::const_iterator it = arr.begin(), itEnd = arr.end(); it != itEnd; ++it ) {
+                            if ( rMap.erase( *it ) )
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( key_array::const_reverse_iterator it = arr.rbegin(), itEnd = arr.rend(); it != itEnd; ++it ) {
+                            if ( rMap.erase( *it ) )
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+            }
+        };
+
+    protected:
+        template <class MAP>
+        void do_test( MAP& testMap )
+        {
+            typedef Inserter<MAP>       InserterThread;
+            typedef Deleter<MAP>        DeleterThread;
+            cds::OS::Timer    timer;
+
+            m_arrValues.clear();
+            m_arrValues.reserve( c_nMapSize );
+            for ( size_t i = 0; i < c_nMapSize; ++i )
+                m_arrValues.push_back( i );
+            std::random_shuffle( m_arrValues.begin(), m_arrValues.end() );
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new InserterThread( pool, testMap ), c_nInsertThreadCount );
+            pool.add( new DeleterThread( pool, testMap ), c_nDeleteThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                InserterThread * pThread = dynamic_cast<InserterThread *>( *it );
+                if ( pThread ) {
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                }
+                else {
+                    DeleterThread * p = static_cast<DeleterThread *>( *it );
+                    nDeleteSuccess += p->m_nDeleteSuccess;
+                    nDeleteFailed += p->m_nDeleteFailed;
+                }
+            }
+
+            CPPUNIT_MSG( "    Totals: Ins succ=" << nInsertSuccess
+                << " Del succ=" << nDeleteSuccess << "\n"
+                << "          : Ins fail=" << nInsertFailed
+                << " Del fail=" << nDeleteFailed
+                << " Map size=" << testMap.size()
+                );
+
+
+            CPPUNIT_MSG( "  Clear map (single-threaded)..." );
+            timer.reset();
+            for ( size_t nItem = 0; nItem < c_nMapSize; ++nItem ) {
+                testMap.erase( nItem );
+            }
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+            CPPUNIT_ASSERT_EX( testMap.empty(), ((long long) testMap.size()) );
+
+            additional_check( testMap );
+            print_stat( testMap );
+            additional_cleanup( testMap );
+        }
+
+        template <class MAP>
+        void test()
+        {
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " map size=" << c_nMapSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                MAP  testMap( c_nMapSize, nLoadFactor );
+                do_test( testMap );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class MAP>
+        void test_nolf()
+        {
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " map size=" << c_nMapSize
+                );
+
+            MAP testMap;
+            do_test( testMap );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nInsertThreadCount = cfg.getULong("InsertThreadCount", 4 );
+            c_nDeleteThreadCount = cfg.getULong("DeleteThreadCount", 4 );
+            c_nThreadPassCount = cfg.getULong("ThreadPassCount", 4 );
+            c_nMapSize = cfg.getULong("MapSize", 1000000 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+        }
+
+#   include "map2/map_defs.h"
+        CDSUNIT_DECLARE_MichaelMap
+        CDSUNIT_DECLARE_SplitList
+        CDSUNIT_DECLARE_SkipListMap
+        CDSUNIT_DECLARE_EllenBinTreeMap
+        CDSUNIT_DECLARE_StripedMap
+        CDSUNIT_DECLARE_RefinableMap
+        CDSUNIT_DECLARE_CuckooMap
+        CDSUNIT_DECLARE_StdMap
+
+        CPPUNIT_TEST_SUITE( Map_InsDel_int )
+            CDSUNIT_TEST_MichaelMap
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SkipListMap
+            CDSUNIT_TEST_EllenBinTreeMap
+            CDSUNIT_TEST_StripedMap
+            CDSUNIT_TEST_RefinableMap
+            CDSUNIT_TEST_CuckooMap
+            CDSUNIT_TEST_StdMap
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Map_InsDel_int );
+} // namespace map2
diff --git a/tests/unit/map2/map_insdel_item_int.cpp b/tests/unit/map2/map_insdel_item_int.cpp
new file mode 100644 (file)
index 0000000..ddf1726
--- /dev/null
@@ -0,0 +1,281 @@
+//$$CDS-header$$
+
+#include "map2/map_types.h"
+#include "cppunit/thread.h"
+
+#include <vector>
+#include <algorithm>    // random_shuffle
+
+namespace map2 {
+
+#   define TEST_MAP(X)         void X() { test<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_NOLF(X)    void X() { test_nolf<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_EXTRACT(X)  TEST_MAP(X)
+#   define TEST_MAP_NOLF_EXTRACT(X) TEST_MAP_NOLF(X)
+
+    namespace {
+        static size_t  c_nMapSize = 1000000    ;  // map size
+        static size_t  c_nThreadCount = 4      ;  // thread count
+        static size_t  c_nGoalItem = c_nMapSize / 2;
+        static size_t  c_nAttemptCount = 100000       ;   // count of SUCCESS insert/delete for each thread
+        static size_t  c_nMaxLoadFactor = 8    ;  // maximum load factor
+        static bool    c_bPrintGCState = true;
+    }
+
+    class Map_InsDel_Item_int: public CppUnitMini::TestCase
+    {
+        typedef size_t  key_type;
+        typedef size_t  value_type;
+
+        template <class MAP>
+        class Inserter: public CppUnitMini::TestThread
+        {
+            MAP&     m_Map;
+
+            virtual Inserter *    clone()
+            {
+                return new Inserter( *this );
+            }
+
+            struct ensure_func
+            {
+                void operator()( bool bNew, std::pair<key_type const, value_type>& item )
+                {
+                    if ( bNew )
+                        item.second = item.first;
+                }
+                // for boost::container::flat_map
+                void operator()( bool bNew, std::pair<key_type, value_type>& item )
+                {
+                    if ( bNew )
+                        item.second = item.first;
+                }
+            };
+
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+
+        public:
+            Inserter( CppUnitMini::ThreadPool& pool, MAP& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Inserter( Inserter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDel_Item_int&  getTest()
+            {
+                return reinterpret_cast<Map_InsDel_Item_int&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                MAP& rMap = m_Map;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed = 0;
+
+                size_t nGoalItem = c_nGoalItem;
+                for ( size_t nAttempt = 0; nAttempt < c_nAttemptCount; ) {
+                    if ( nAttempt % 2  == 0 ) {
+                        if ( rMap.insert( nGoalItem, nGoalItem )) {
+                            ++m_nInsertSuccess;
+                            ++nAttempt;
+                        }
+                        else
+                            ++m_nInsertFailed;
+                    }
+                    else {
+                        std::pair<bool, bool> ensureResult = rMap.ensure( nGoalItem, ensure_func() );
+                        if ( ensureResult.second ) {
+                            ++m_nInsertSuccess;
+                            ++nAttempt;
+                        }
+                        else
+                            ++m_nInsertFailed;
+                    }
+                }
+            }
+        };
+
+        template <class MAP>
+        class Deleter: public CppUnitMini::TestThread
+        {
+            MAP&     m_Map;
+
+            virtual Deleter *    clone()
+            {
+                return new Deleter( *this );
+            }
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+        public:
+            Deleter( CppUnitMini::ThreadPool& pool, MAP& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Deleter( Deleter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDel_Item_int&  getTest()
+            {
+                return reinterpret_cast<Map_InsDel_Item_int&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                MAP& rMap = m_Map;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                size_t nGoalItem = c_nGoalItem;
+                for ( size_t nAttempt = 0; nAttempt < c_nAttemptCount; ) {
+                    if ( rMap.erase( nGoalItem )) {
+                        ++m_nDeleteSuccess;
+                        ++nAttempt;
+                    }
+                    else
+                        ++m_nDeleteFailed;
+                }
+            }
+        };
+
+    protected:
+
+        template <class MAP>
+        void do_test( MAP& testMap )
+        {
+            typedef Inserter<MAP>       InserterThread;
+            typedef Deleter<MAP>        DeleterThread;
+            cds::OS::Timer    timer;
+
+            // Fill the map
+            CPPUNIT_MSG( "  Fill map (" << c_nMapSize << " items)...");
+            timer.reset();
+            {
+                std::vector<key_type>   v;
+                v.reserve( c_nMapSize );
+                for ( size_t i = 0; i < c_nMapSize; ++i )
+                    v.push_back( i );
+                std::random_shuffle( v.begin(), v.end() );
+                for ( size_t i = 0; i < v.size(); ++i ) {
+                    CPPUNIT_ASSERT( testMap.insert( v[i], v[i] ));
+                }
+            }
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+
+            CPPUNIT_MSG( "  Insert/delete the key " << c_nGoalItem << " (" << c_nAttemptCount << " successful times)...");
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new InserterThread( pool, testMap ), (c_nThreadCount + 1) / 2 );
+            pool.add( new DeleterThread( pool, testMap ), (c_nThreadCount + 1) / 2 );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                InserterThread * pThread = dynamic_cast<InserterThread *>( *it );
+                if ( pThread ) {
+                    CPPUNIT_ASSERT( pThread->m_nInsertSuccess == c_nAttemptCount );
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                }
+                else {
+                    DeleterThread * p = static_cast<DeleterThread *>( *it );
+                    CPPUNIT_ASSERT( p->m_nDeleteSuccess == c_nAttemptCount );
+                    nDeleteSuccess += p->m_nDeleteSuccess;
+                    nDeleteFailed += p->m_nDeleteFailed;
+                }
+            }
+            CPPUNIT_ASSERT( nInsertSuccess == nDeleteSuccess );
+            size_t nGoalItem = c_nGoalItem;
+            CPPUNIT_ASSERT( testMap.find( nGoalItem ));
+
+
+            CPPUNIT_MSG( "    Totals: Ins fail=" << nInsertFailed << " Del fail=" << nDeleteFailed );
+
+            // Check if the map contains all items
+            CPPUNIT_MSG( "    Check if the map contains all items" );
+            timer.reset();
+            for ( size_t i = 0; i < c_nMapSize; ++i ) {
+                CPPUNIT_ASSERT( testMap.find( i ));
+            }
+            CPPUNIT_MSG( "    Duration=" << timer.duration() );
+
+            testMap.clear();
+            additional_check( testMap );
+            print_stat( testMap );
+            additional_cleanup( testMap );
+        }
+
+        template <class MAP>
+        void test()
+        {
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                MAP testMap( c_nMapSize, nLoadFactor );
+                do_test( testMap );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class MAP>
+        void test_nolf()
+        {
+            MAP testMap;
+            do_test<MAP>( testMap );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nThreadCount = cfg.getULong("ThreadCount", 8 )        ; // thread count
+            c_nMapSize = cfg.getULong("MapSize", 1000000 );
+            c_nGoalItem = cfg.getULong("GoalItem", (unsigned long) (c_nMapSize / 2) );
+            c_nAttemptCount = cfg.getULong("AttemptCount", 100000 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+        }
+
+#   include "map2/map_defs.h"
+        CDSUNIT_DECLARE_MichaelMap
+        CDSUNIT_DECLARE_SplitList
+        CDSUNIT_DECLARE_SkipListMap
+        CDSUNIT_DECLARE_EllenBinTreeMap
+        CDSUNIT_DECLARE_StripedMap
+        CDSUNIT_DECLARE_RefinableMap
+        CDSUNIT_DECLARE_CuckooMap
+        CDSUNIT_DECLARE_StdMap
+
+        CPPUNIT_TEST_SUITE( Map_InsDel_Item_int )
+            CDSUNIT_TEST_MichaelMap
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SkipListMap
+            CDSUNIT_TEST_EllenBinTreeMap
+            CDSUNIT_TEST_StripedMap
+            CDSUNIT_TEST_RefinableMap
+            CDSUNIT_TEST_CuckooMap
+            //CDSUNIT_TEST_StdMap       // very slow!!!
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Map_InsDel_Item_int );
+} // namespace map2
diff --git a/tests/unit/map2/map_insdel_item_string.cpp b/tests/unit/map2/map_insdel_item_string.cpp
new file mode 100644 (file)
index 0000000..be1ccb9
--- /dev/null
@@ -0,0 +1,282 @@
+//$$CDS-header$$
+
+#include "map2/map_types.h"
+#include "cppunit/thread.h"
+
+#include <vector>
+
+namespace map2 {
+
+#   define TEST_MAP(X)         void X() { test<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_NOLF(X)    void X() { test_nolf<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_EXTRACT(X)  TEST_MAP(X)
+#   define TEST_MAP_NOLF_EXTRACT(X) TEST_MAP_NOLF(X)
+
+    namespace {
+        static size_t  c_nMapSize = 1000000    ;  // map size
+        static size_t  c_nThreadCount = 4      ;  // thread count
+        static size_t  c_nGoalItem = c_nMapSize / 2;
+        static size_t  c_nAttemptCount = 100000       ;   // count of SUCCESS insert/delete for each thread
+        static size_t  c_nMaxLoadFactor = 8    ;  // maximum load factor
+        static bool    c_bPrintGCState = true;
+    }
+
+    class Map_InsDel_Item_string: public CppUnitMini::TestCase
+    {
+        typedef std::string  key_type;
+        typedef size_t  value_type;
+
+        const std::vector<std::string> *  m_parrString;
+
+        template <class Map>
+        class Inserter: public CppUnitMini::TestThread
+        {
+            Map&     m_Map;
+
+            virtual Inserter *    clone()
+            {
+                return new Inserter( *this );
+            }
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+
+        public:
+            Inserter( CppUnitMini::ThreadPool& pool, Map& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Inserter( Inserter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDel_Item_string&  getTest()
+            {
+                return reinterpret_cast<Map_InsDel_Item_string&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Map& rMap = m_Map;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed = 0;
+
+                size_t nGoalItem = c_nGoalItem;
+                std::string strGoal = (*getTest().m_parrString)[nGoalItem];
+
+                for ( size_t nAttempt = 0; nAttempt < c_nAttemptCount; ) {
+                    if ( rMap.insert( strGoal, nGoalItem )) {
+                        ++m_nInsertSuccess;
+                        ++nAttempt;
+                    }
+                    else
+                        ++m_nInsertFailed;
+                }
+            }
+        };
+
+        template <class Map>
+        class Deleter: public CppUnitMini::TestThread
+        {
+            Map&     m_Map;
+
+            struct erase_cleaner {
+                void operator ()(std::pair<typename Map::key_type const, typename Map::mapped_type>& val )
+                {
+                    val.second = 0;
+                }
+                // for boost::container::flat_map
+                void operator ()(std::pair< typename std::remove_const< typename Map::key_type >::type, typename Map::mapped_type>& val )
+                {
+                    val.second = 0;
+                }
+            };
+
+            virtual Deleter *    clone()
+            {
+                return new Deleter( *this );
+            }
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+        public:
+            Deleter( CppUnitMini::ThreadPool& pool, Map& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Deleter( Deleter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDel_Item_string&  getTest()
+            {
+                return reinterpret_cast<Map_InsDel_Item_string&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Map& rMap = m_Map;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                size_t nGoalItem = c_nGoalItem;
+                std::string strGoal = (*getTest().m_parrString)[nGoalItem];
+
+                for ( size_t nAttempt = 0; nAttempt < c_nAttemptCount; ) {
+                    if ( rMap.erase( strGoal, erase_cleaner() )) {
+                        ++m_nDeleteSuccess;
+                        ++nAttempt;
+                    }
+                    else
+                        ++m_nDeleteFailed;
+                }
+            }
+        };
+
+    protected:
+
+        template <class Map>
+        void do_test( Map& testMap )
+        {
+            typedef Inserter<Map>       InserterThread;
+            typedef Deleter<Map>        DeleterThread;
+            cds::OS::Timer    timer;
+
+            // Fill the map
+            CPPUNIT_MSG( "  Fill map (" << c_nMapSize << " items)...");
+            timer.reset();
+            for ( size_t i = 0; i < c_nMapSize; ++i ) {
+                CPPUNIT_ASSERT_EX( testMap.insert( (*m_parrString)[i], i ), i );
+            }
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+
+            CPPUNIT_MSG( "  Insert/delete the key " << c_nGoalItem << " (" << c_nAttemptCount << " successful times)...");
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new InserterThread( pool, testMap ), (c_nThreadCount + 1) / 2 );
+            pool.add( new DeleterThread( pool, testMap ), (c_nThreadCount + 1) / 2 );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                InserterThread * pThread = dynamic_cast<InserterThread *>( *it );
+                if ( pThread ) {
+                    CPPUNIT_CHECK( pThread->m_nInsertSuccess == c_nAttemptCount );
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                }
+                else {
+                    DeleterThread * p = static_cast<DeleterThread *>( *it );
+                    CPPUNIT_CHECK( p->m_nDeleteSuccess == c_nAttemptCount );
+                    nDeleteSuccess += p->m_nDeleteSuccess;
+                    nDeleteFailed += p->m_nDeleteFailed;
+                }
+            }
+            CPPUNIT_CHECK_EX( nInsertSuccess == nDeleteSuccess, "nInsertSuccess=" << nInsertSuccess << ", nDeleteSuccess=" << nDeleteSuccess );
+            CPPUNIT_MSG( "    Totals: Ins fail=" << nInsertFailed << " Del fail=" << nDeleteFailed );
+
+            // Check if the map contains all items
+            CPPUNIT_MSG( "    Check if the map contains all items" );
+            timer.reset();
+            for ( size_t i = 0; i < c_nMapSize; ++i ) {
+                CPPUNIT_CHECK_EX( testMap.find( (*m_parrString)[i] ), "Key \"" << (*m_parrString)[i] << "\" not found" );
+            }
+            CPPUNIT_MSG( "    Duration=" << timer.duration() );
+
+            testMap.clear();
+            additional_check( testMap );
+            print_stat( testMap );
+            additional_cleanup( testMap );
+        }
+
+        template <class Map>
+        void test()
+        {
+            m_parrString = &CppUnitMini::TestCase::getTestStrings();
+            if ( c_nMapSize > m_parrString->size() )
+                c_nMapSize = m_parrString->size();
+            if ( c_nGoalItem > m_parrString->size() )
+                c_nGoalItem = m_parrString->size() / 2;
+
+            CPPUNIT_MSG( "Thread count= " << c_nThreadCount
+                << " pass count=" << c_nAttemptCount
+                << " map size=" << c_nMapSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                Map  testMap( c_nMapSize, nLoadFactor );
+                do_test( testMap );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <typename Map>
+        void test_nolf()
+        {
+            m_parrString = &CppUnitMini::TestCase::getTestStrings();
+            if ( c_nMapSize > m_parrString->size() )
+                c_nMapSize = m_parrString->size();
+            if ( c_nGoalItem > m_parrString->size() )
+                c_nGoalItem = m_parrString->size() / 2;
+
+            CPPUNIT_MSG( "Thread count= " << c_nThreadCount
+                << " pass count=" << c_nAttemptCount
+                << " map size=" << c_nMapSize
+                );
+
+            Map testMap;
+            do_test( testMap );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nThreadCount = cfg.getULong("ThreadCount", 8 )        ; // thread count
+            c_nMapSize = cfg.getULong("MapSize", 1000000 );
+            c_nGoalItem = cfg.getULong("GoalItemIndex", (unsigned long) (c_nMapSize / 2) );
+            c_nAttemptCount = cfg.getULong("AttemptCount", 100000 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+        }
+
+#   include "map2/map_defs.h"
+        CDSUNIT_DECLARE_MichaelMap
+        CDSUNIT_DECLARE_SplitList
+        CDSUNIT_DECLARE_SkipListMap
+        CDSUNIT_DECLARE_EllenBinTreeMap
+        CDSUNIT_DECLARE_StripedMap
+        CDSUNIT_DECLARE_RefinableMap
+        CDSUNIT_DECLARE_CuckooMap
+        CDSUNIT_DECLARE_StdMap
+
+        CPPUNIT_TEST_SUITE( Map_InsDel_Item_string )
+            CDSUNIT_TEST_MichaelMap
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SkipListMap
+            CDSUNIT_TEST_EllenBinTreeMap
+            CDSUNIT_TEST_StripedMap
+            CDSUNIT_TEST_RefinableMap
+            CDSUNIT_TEST_CuckooMap
+            //CDSUNIT_TEST_StdMap       // very slow!!!
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Map_InsDel_Item_string );
+} // namespace map2
diff --git a/tests/unit/map2/map_insdel_string.cpp b/tests/unit/map2/map_insdel_string.cpp
new file mode 100644 (file)
index 0000000..9682890
--- /dev/null
@@ -0,0 +1,281 @@
+//$$CDS-header$$
+
+#include "map2/map_types.h"
+#include "cppunit/thread.h"
+
+#include <vector>
+
+namespace map2 {
+
+#   define TEST_MAP(X)         void X() { test<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_NOLF(X)    void X() { test_nolf<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_EXTRACT(X)  TEST_MAP(X)
+#   define TEST_MAP_NOLF_EXTRACT(X) TEST_MAP_NOLF(X)
+
+    namespace {
+        static size_t  c_nMapSize = 1000000    ;  // map size
+        static size_t  c_nInsertThreadCount = 4;  // count of insertion thread
+        static size_t  c_nDeleteThreadCount = 4;  // count of deletion thread
+        static size_t  c_nThreadPassCount = 4  ;  // pass count for each thread
+        static size_t  c_nMaxLoadFactor = 8    ;  // maximum load factor
+        static bool    c_bPrintGCState = true;
+    }
+
+    class Map_InsDel_string: public CppUnitMini::TestCase
+    {
+        typedef std::string key_type;
+        typedef size_t      value_type;
+
+        const std::vector<std::string> *  m_parrString;
+
+        template <class MAP>
+        class Inserter: public CppUnitMini::TestThread
+        {
+            MAP&     m_Map;
+
+            virtual Inserter *    clone()
+            {
+                return new Inserter( *this );
+            }
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+
+        public:
+            Inserter( CppUnitMini::ThreadPool& pool, MAP& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Inserter( Inserter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDel_string&  getTest()
+            {
+                return reinterpret_cast<Map_InsDel_string&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                MAP& rMap = m_Map;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed = 0;
+
+                const std::vector<std::string>& arrString = *getTest().m_parrString;
+                size_t nArrSize = arrString.size();
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = 0; nItem < c_nMapSize; ++nItem ) {
+                            if ( rMap.insert( arrString[nItem % nArrSize], nItem * 8 ) )
+                                ++m_nInsertSuccess;
+                            else
+                                ++m_nInsertFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = c_nMapSize; nItem > 0; --nItem ) {
+                            if ( rMap.insert( arrString[nItem % nArrSize], nItem * 8 ) )
+                                ++m_nInsertSuccess;
+                            else
+                                ++m_nInsertFailed;
+                        }
+                    }
+                }
+            }
+        };
+
+        template <class MAP>
+        class Deleter: public CppUnitMini::TestThread
+        {
+            MAP&     m_Map;
+
+            virtual Deleter *    clone()
+            {
+                return new Deleter( *this );
+            }
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+        public:
+            Deleter( CppUnitMini::ThreadPool& pool, MAP& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Deleter( Deleter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDel_string&  getTest()
+            {
+                return reinterpret_cast<Map_InsDel_string&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                MAP& rMap = m_Map;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                const std::vector<std::string>& arrString = *getTest().m_parrString;
+                size_t nArrSize = arrString.size();
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = 0; nItem < c_nMapSize; ++nItem ) {
+                            if ( rMap.erase( arrString[nItem % nArrSize] ) )
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = c_nMapSize; nItem > 0; --nItem ) {
+                            if ( rMap.erase( arrString[nItem % nArrSize] ) )
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+            }
+        };
+
+    protected:
+
+        template <class MAP>
+        void do_test( MAP& testMap )
+        {
+            typedef Inserter<MAP>       InserterThread;
+            typedef Deleter<MAP>        DeleterThread;
+            cds::OS::Timer    timer;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new InserterThread( pool, testMap ), c_nInsertThreadCount );
+            pool.add( new DeleterThread( pool, testMap ), c_nDeleteThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                InserterThread * pThread = dynamic_cast<InserterThread *>( *it );
+                if ( pThread ) {
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                }
+                else {
+                    DeleterThread * p = static_cast<DeleterThread *>( *it );
+                    nDeleteSuccess += p->m_nDeleteSuccess;
+                    nDeleteFailed += p->m_nDeleteFailed;
+                }
+            }
+
+            CPPUNIT_MSG( "    Totals: Ins succ=" << nInsertSuccess
+                << " Del succ=" << nDeleteSuccess << "\n"
+                      << "          : Ins fail=" << nInsertFailed
+                << " Del fail=" << nDeleteFailed
+                << " Map size=" << testMap.size()
+                );
+
+
+            CPPUNIT_MSG( "  Clear map (single-threaded)..." );
+            timer.reset();
+            for ( size_t i = 0; i < m_parrString->size(); ++i )
+                testMap.erase( (*m_parrString)[i] );
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+            CPPUNIT_ASSERT( testMap.empty() );
+
+            additional_check( testMap );
+            print_stat( testMap );
+            additional_cleanup( testMap );
+        }
+
+        template <class MAP>
+        void test()
+        {
+            m_parrString = &CppUnitMini::TestCase::getTestStrings();
+
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " map size=" << c_nMapSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                MAP  testMap( c_nMapSize, nLoadFactor );
+                do_test( testMap );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class MAP>
+        void test_nolf()
+        {
+            m_parrString = &CppUnitMini::TestCase::getTestStrings();
+
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " map size=" << c_nMapSize
+                );
+
+            MAP testMap;
+            do_test( testMap );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nInsertThreadCount = cfg.getULong("InsertThreadCount", 4 );
+            c_nDeleteThreadCount = cfg.getULong("DeleteThreadCount", 4 );
+            c_nThreadPassCount = cfg.getULong("ThreadPassCount", 4 );
+            c_nMapSize = cfg.getULong("MapSize", 1000000 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+        }
+
+#   include "map2/map_defs.h"
+        CDSUNIT_DECLARE_MichaelMap
+        CDSUNIT_DECLARE_SplitList
+        CDSUNIT_DECLARE_SkipListMap
+        CDSUNIT_DECLARE_EllenBinTreeMap
+        CDSUNIT_DECLARE_StripedMap
+        CDSUNIT_DECLARE_RefinableMap
+        CDSUNIT_DECLARE_CuckooMap
+        CDSUNIT_DECLARE_StdMap
+
+        CPPUNIT_TEST_SUITE( Map_InsDel_string )
+            CDSUNIT_TEST_MichaelMap
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SkipListMap
+            CDSUNIT_TEST_EllenBinTreeMap
+            CDSUNIT_TEST_StripedMap
+            CDSUNIT_TEST_RefinableMap
+            CDSUNIT_TEST_CuckooMap
+            CDSUNIT_TEST_StdMap
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Map_InsDel_string );
+} // namespace map2
diff --git a/tests/unit/map2/map_insdelfind.cpp b/tests/unit/map2/map_insdelfind.cpp
new file mode 100644 (file)
index 0000000..fe051ce
--- /dev/null
@@ -0,0 +1,270 @@
+//$$CDS-header$$
+
+#include "map2/map_types.h"
+#include "cppunit/thread.h"
+#include <algorithm> // random_shuffle
+#include <vector>
+
+namespace map2 {
+
+#   define TEST_MAP(X)         void X() { test<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_NOLF(X)    void X() { test_nolf<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_EXTRACT(X)  TEST_MAP(X)
+#   define TEST_MAP_NOLF_EXTRACT(X) TEST_MAP_NOLF(X)
+
+    namespace {
+        static size_t  c_nInitialMapSize = 500000   ;  // initial map size
+        static size_t  c_nThreadCount = 8           ;  // thread count
+        static size_t  c_nMaxLoadFactor = 8         ;  // maximum load factor
+        static unsigned int c_nInsertPercentage = 5;
+        static unsigned int c_nDeletePercentage = 5;
+        static unsigned int c_nDuration = 30        ;  // test duration, seconds
+        static bool    c_bPrintGCState = true;
+    }
+
+    class Map_InsDelFind: public CppUnitMini::TestCase
+    {
+    public:
+        enum actions
+        {
+            do_find,
+            do_insert,
+            do_delete
+        };
+        static const unsigned int c_nShuffleSize = 100;
+        actions m_arrShuffle[c_nShuffleSize];
+
+    protected:
+        typedef size_t  key_type;
+        typedef size_t  value_type;
+
+        template <class MAP>
+        class WorkThread: public CppUnitMini::TestThread
+        {
+            MAP&     m_Map;
+
+            virtual WorkThread *    clone()
+            {
+                return new WorkThread( *this );
+            }
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+            size_t  m_nFindSuccess;
+            size_t  m_nFindFailed;
+
+        public:
+            WorkThread( CppUnitMini::ThreadPool& pool, MAP& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            WorkThread( WorkThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsDelFind&  getTest()
+            {
+                return reinterpret_cast<Map_InsDelFind&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                MAP& rMap = m_Map;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed =
+                    m_nDeleteSuccess =
+                    m_nDeleteFailed =
+                    m_nFindSuccess =
+                    m_nFindFailed = 0;
+
+                actions * pAct = getTest().m_arrShuffle;
+                unsigned int i = 0;
+                size_t const nNormalize = size_t(-1) / (c_nInitialMapSize * 2);
+
+                size_t nRand = 0;
+                while ( !time_elapsed() ) {
+                    nRand = cds::bitop::RandXorShift(nRand);
+                    size_t n = nRand / nNormalize;
+                    switch ( pAct[i] ) {
+                    case do_find:
+                        if ( rMap.find( n ))
+                            ++m_nFindSuccess;
+                        else
+                            ++m_nFindFailed;
+                        break;
+                    case do_insert:
+                        if ( rMap.insert( n, n ))
+                            ++m_nInsertSuccess;
+                        else
+                            ++m_nInsertFailed;
+                        break;
+                    case do_delete:
+                        if ( rMap.erase( n ))
+                            ++m_nDeleteSuccess;
+                        else
+                            ++m_nDeleteFailed;
+                        break;
+                    }
+
+                    if ( ++i >= c_nShuffleSize )
+                        i = 0;
+                }
+            }
+        };
+
+    protected:
+        template <class MAP>
+        void do_test( MAP& testMap )
+        {
+            typedef WorkThread<MAP> work_thread;
+            cds::OS::Timer    timer;
+
+            // fill map - only odd number
+            {
+                std::vector<size_t> arr;
+                arr.reserve( c_nInitialMapSize );
+                for ( size_t i = 0; i < c_nInitialMapSize; ++i )
+                    arr.push_back( i * 2 + 1);
+                std::random_shuffle( arr.begin(), arr.end() );
+                for ( size_t i = 0; i < c_nInitialMapSize; ++i )
+                    testMap.insert( arr[i], arr[i] );
+            }
+            CPPUNIT_MSG( "   Insert " << c_nInitialMapSize << " items time (single-threaded)=" << timer.duration() );
+
+            timer.reset();
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new work_thread( pool, testMap ), c_nThreadCount );
+            pool.run( c_nDuration );
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            size_t nFindSuccess = 0;
+            size_t nFindFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                work_thread * pThread = static_cast<work_thread *>( *it );
+                assert( pThread != NULL );
+                nInsertSuccess += pThread->m_nInsertSuccess;
+                nInsertFailed += pThread->m_nInsertFailed;
+                nDeleteSuccess += pThread->m_nDeleteSuccess;
+                nDeleteFailed += pThread->m_nDeleteFailed;
+                nFindSuccess += pThread->m_nFindSuccess;
+                nFindFailed += pThread->m_nFindFailed;
+            }
+
+            CPPUNIT_MSG( "  Totals (success/failed): \n\t"
+                      << "      Insert=" << nInsertSuccess << '/' << nInsertFailed << "\n\t"
+                      << "      Delete=" << nDeleteSuccess << '/' << nDeleteFailed << "\n\t"
+                      << "        Find=" << nFindSuccess   << '/' << nFindFailed   << "\n\t"
+                      << "       Speed=" << (nFindSuccess + nFindFailed) / c_nDuration << " find/sec\n\t"
+                      << "             " << (nInsertSuccess + nDeleteSuccess) / c_nDuration << " modify/sec\n\t"
+                      << "      Map size=" << testMap.size()
+                );
+
+
+            CPPUNIT_MSG( "  Clear map (single-threaded)..." );
+            timer.reset();
+            testMap.clear();
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+            CPPUNIT_ASSERT_EX( testMap.empty(), ((long long) testMap.size()) );
+
+            additional_check( testMap );
+            print_stat( testMap );
+            additional_cleanup( testMap );
+        }
+
+        template <class MAP>
+        void test()
+        {
+            CPPUNIT_MSG( "Thread count=" << c_nThreadCount
+                << " initial map size=" << c_nInitialMapSize
+                << " insert=" << c_nInsertPercentage << '%'
+                << " delete=" << c_nDeletePercentage << '%'
+                << " duration=" << c_nDuration << "s"
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                MAP  testMap( c_nInitialMapSize, nLoadFactor );
+                do_test( testMap );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+
+        }
+
+        template <class MAP>
+        void test_nolf()
+        {
+            CPPUNIT_MSG( "Thread count=" << c_nThreadCount
+                << " initial map size=" << c_nInitialMapSize
+                << " insert=" << c_nInsertPercentage << '%'
+                << " delete=" << c_nDeletePercentage << '%'
+                << " duration=" << c_nDuration << "s"
+                );
+
+            MAP testMap;
+            do_test( testMap );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nInitialMapSize = cfg.getULong("InitialMapSize", 500000 );
+            c_nThreadCount = cfg.getULong("ThreadCount", 8 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_nInsertPercentage = cfg.getUInt("InsertPercentage", 5 );
+            c_nDeletePercentage = cfg.getUInt("DeletePercentage", 5 );
+            c_nDuration = cfg.getUInt("Duration", 30 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+
+            if ( c_nThreadCount == 0 )
+                c_nThreadCount = cds::OS::topology::processor_count() * 2;
+
+            CPPUNIT_ASSERT( c_nInsertPercentage + c_nDeletePercentage <= 100 );
+
+            actions * pFirst = m_arrShuffle;
+            actions * pLast = m_arrShuffle + c_nInsertPercentage;
+            std::fill( pFirst, pLast, do_insert );
+            pFirst = pLast;
+            pLast += c_nDeletePercentage;
+            std::fill( pFirst, pLast, do_delete );
+            pFirst = pLast;
+            pLast = m_arrShuffle + sizeof(m_arrShuffle)/sizeof(m_arrShuffle[0]);
+            std::fill( pFirst, pLast, do_find );
+            std::random_shuffle( m_arrShuffle, pLast );
+        }
+
+#   include "map2/map_defs.h"
+        CDSUNIT_DECLARE_MichaelMap
+        CDSUNIT_DECLARE_SplitList
+        CDSUNIT_DECLARE_SkipListMap
+        CDSUNIT_DECLARE_EllenBinTreeMap
+        CDSUNIT_DECLARE_StripedMap
+        CDSUNIT_DECLARE_RefinableMap
+        CDSUNIT_DECLARE_CuckooMap
+        CDSUNIT_DECLARE_StdMap
+
+        CPPUNIT_TEST_SUITE( Map_InsDelFind )
+            CDSUNIT_TEST_MichaelMap
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SkipListMap
+            CDSUNIT_TEST_EllenBinTreeMap
+            CDSUNIT_TEST_StripedMap
+            CDSUNIT_TEST_RefinableMap
+            CDSUNIT_TEST_CuckooMap
+            CDSUNIT_TEST_StdMap
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Map_InsDelFind );
+} // namespace map2
diff --git a/tests/unit/map2/map_insfind_int.cpp b/tests/unit/map2/map_insfind_int.cpp
new file mode 100644 (file)
index 0000000..f9a44a1
--- /dev/null
@@ -0,0 +1,217 @@
+//$$CDS-header$$
+
+#include "map2/map_types.h"
+#include "cppunit/thread.h"
+
+#include <cds/os/topology.h>
+#include <vector>
+#include <algorithm> // random_shuffle
+
+namespace map2 {
+
+#    define TEST_MAP(X)         void X() { test<MapTypes<key_type, value_type>::X >()    ; }
+#    define TEST_MAP_NOLF(X)    void X() { test_nolf<MapTypes<key_type, value_type>::X >()    ; }
+#   define TEST_MAP_EXTRACT(X)  TEST_MAP(X)
+#   define TEST_MAP_NOLF_EXTRACT(X) TEST_MAP_NOLF(X)
+
+    namespace {
+        static size_t  c_nMapSize = 1000000    ;  // map size
+        static size_t  c_nThreadCount = 4      ;  // count of insertion thread
+        static size_t  c_nMaxLoadFactor = 8    ;  // maximum load factor
+        static bool    c_bPrintGCState = true;
+    }
+
+    class Map_InsFind_int: public CppUnitMini::TestCase
+    {
+        typedef size_t  key_type;
+        typedef size_t  value_type;
+
+        template <class Map>
+        class Inserter: public CppUnitMini::TestThread
+        {
+            Map&     m_Map;
+            std::vector<size_t> m_arrVal;
+
+            virtual Inserter *    clone()
+            {
+                return new Inserter( *this );
+            }
+
+            void make_array()
+            {
+                size_t const nSize = c_nMapSize / c_nThreadCount + 1;
+                m_arrVal.resize( nSize );
+                size_t nItem = m_nThreadNo;
+                for ( size_t i = 0; i < nSize; nItem += c_nThreadCount, ++i )
+                    m_arrVal[i] = nItem;
+                std::random_shuffle( m_arrVal.begin(), m_arrVal.end() );
+            }
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+            size_t  m_nFindSuccess;
+            size_t  m_nFindFail;
+
+        public:
+            Inserter( CppUnitMini::ThreadPool& pool, Map& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            Inserter( Inserter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Map_InsFind_int&  getTest()
+            {
+                return reinterpret_cast<Map_InsFind_int&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+                make_array();
+            }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Map& rMap = m_Map;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed =
+                    m_nFindSuccess =
+                    m_nFindFail = 0;
+
+                size_t const nArrSize = m_arrVal.size();
+                for ( size_t i = 0; i < nArrSize; ++i ) {
+                    size_t const nItem = m_arrVal[i];
+                    if ( rMap.insert( nItem, nItem * 8 ) )
+                        ++m_nInsertSuccess;
+                    else
+                        ++m_nInsertFailed;
+
+                    for ( size_t k = 0; k <= i; ++k ) {
+                        if ( rMap.find( m_arrVal[k] ) )
+                            ++m_nFindSuccess;
+                        else
+                            ++m_nFindFail;
+                    }
+                }
+            }
+        };
+
+    protected:
+
+        template <class Map>
+        void do_test( Map& testMap )
+        {
+            typedef Inserter<Map>       InserterThread;
+            cds::OS::Timer    timer;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new InserterThread( pool, testMap ), c_nThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nFindSuccess = 0;
+            size_t nFindFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                InserterThread * pThread = static_cast<InserterThread *>( *it );
+
+                nInsertSuccess += pThread->m_nInsertSuccess;
+                nInsertFailed += pThread->m_nInsertFailed;
+                nFindSuccess += pThread->m_nFindSuccess;
+                nFindFailed += pThread->m_nFindFail;
+            }
+
+            CPPUNIT_MSG( "    Totals: Ins succ=" << nInsertSuccess << " fail=" << nInsertFailed << "\n"
+                      << "           Find succ=" << nFindSuccess << " fail=" << nFindFailed
+            );
+
+            CPPUNIT_ASSERT( nInsertFailed == 0 );
+            CPPUNIT_ASSERT( nFindFailed == 0 );
+
+            testMap.clear();
+            additional_check( testMap );
+            print_stat( testMap );
+            additional_cleanup( testMap );
+        }
+
+        template <class Map>
+        void test()
+        {
+            static_assert( (!std::is_same< typename Map::item_counter, cds::atomicity::empty_item_counter >::value),
+                "Empty item counter is not suitable for this test");
+
+            CPPUNIT_MSG( "Thread count: " << c_nThreadCount
+                << " map size=" << c_nMapSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                Map  testMap( c_nMapSize, nLoadFactor );
+                do_test( testMap );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class Map>
+        void test_nolf()
+        {
+            static_assert( (!std::is_same< typename Map::item_counter, cds::atomicity::empty_item_counter >::value),
+                "Empty item counter is not suitable for this test");
+
+            CPPUNIT_MSG( "Thread count: " << c_nThreadCount
+                << " map size=" << c_nMapSize
+                );
+
+            Map testMap;
+            do_test( testMap );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nThreadCount = cfg.getULong("ThreadCount", 0 );
+            c_nMapSize = cfg.getULong("MapSize", 10000 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+            if ( c_nThreadCount == 0 )
+                c_nThreadCount = cds::OS::topology::processor_count();
+        }
+
+#   include "map2/map_defs.h"
+        CDSUNIT_DECLARE_MichaelMap
+        CDSUNIT_DECLARE_MichaelMap_nogc
+        CDSUNIT_DECLARE_SplitList
+        CDSUNIT_DECLARE_SplitList_nogc
+        CDSUNIT_DECLARE_SkipListMap
+        CDSUNIT_DECLARE_SkipListMap_nogc
+        CDSUNIT_DECLARE_EllenBinTreeMap
+        CDSUNIT_DECLARE_StripedMap
+        CDSUNIT_DECLARE_RefinableMap
+        CDSUNIT_DECLARE_CuckooMap
+        CDSUNIT_DECLARE_StdMap
+
+        CPPUNIT_TEST_SUITE( Map_InsFind_int )
+            CDSUNIT_TEST_MichaelMap
+            CDSUNIT_TEST_MichaelMap_nogc
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SplitList_nogc
+            CDSUNIT_TEST_SkipListMap
+            CDSUNIT_TEST_SkipListMap_nogc
+            CDSUNIT_TEST_EllenBinTreeMap
+            CDSUNIT_TEST_StripedMap
+            CDSUNIT_TEST_RefinableMap
+            CDSUNIT_TEST_CuckooMap
+            CDSUNIT_TEST_StdMap
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Map_InsFind_int );
+} // namespace map2
diff --git a/tests/unit/map2/map_types.h b/tests/unit/map2/map_types.h
new file mode 100644 (file)
index 0000000..c5d2cd7
--- /dev/null
@@ -0,0 +1,5199 @@
+//$$CDS-header$$
+
+#ifndef _CDSUNIT_MAP2_MAP_TYPES_H
+#define _CDSUNIT_MAP2_MAP_TYPES_H
+
+#include <cds/urcu/general_instant.h>
+#include <cds/urcu/general_buffered.h>
+#include <cds/urcu/general_threaded.h>
+#include <cds/urcu/signal_buffered.h>
+#include <cds/urcu/signal_threaded.h>
+
+#include <cds/container/michael_kvlist_hp.h>
+#include <cds/container/michael_kvlist_hrc.h>
+#include <cds/container/michael_kvlist_ptb.h>
+#include <cds/container/michael_kvlist_rcu.h>
+#include <cds/container/michael_kvlist_nogc.h>
+
+#include <cds/container/lazy_kvlist_hp.h>
+#include <cds/container/lazy_kvlist_hrc.h>
+#include <cds/container/lazy_kvlist_ptb.h>
+#include <cds/container/lazy_kvlist_rcu.h>
+#include <cds/container/lazy_kvlist_nogc.h>
+
+#include <cds/container/michael_map.h>
+#include <cds/container/michael_map_rcu.h>
+#include <cds/container/michael_map_nogc.h>
+
+#include <cds/container/split_list_map.h>
+#include <cds/container/split_list_map_rcu.h>
+#include <cds/container/split_list_map_nogc.h>
+
+#include <cds/container/striped_map/std_list.h>
+#include <cds/container/striped_map/std_map.h>
+#include <cds/container/striped_map/std_hash_map.h>
+#include <cds/container/cuckoo_map.h>
+
+#include <cds/container/skip_list_map_hp.h>
+#include <cds/container/skip_list_map_hrc.h>
+#include <cds/container/skip_list_map_ptb.h>
+#include <cds/container/skip_list_map_rcu.h>
+#include <cds/container/skip_list_map_nogc.h>
+
+#include <cds/container/ellen_bintree_map_rcu.h>
+#include <cds/container/ellen_bintree_map_hp.h>
+#include <cds/container/ellen_bintree_map_ptb.h>
+
+#include <boost/version.hpp>
+#if BOOST_VERSION >= 104800
+#   include <cds/container/striped_map/boost_list.h>
+#   include <cds/container/striped_map/boost_slist.h>
+#   include <cds/container/striped_map/boost_map.h>
+#   include <cds/container/striped_map/boost_flat_map.h>
+#endif
+#include <cds/container/striped_map/boost_unordered_map.h>
+#include <cds/container/striped_map.h>
+
+#include <cds/lock/spinlock.h>
+
+#include "cppunit/cppunit_mini.h"
+#include "lock/nolock.h"
+#include "map2/std_map.h"
+#include "map2/std_hash_map.h"
+#include "michael_alloc.h"
+#include "print_cuckoo_stat.h"
+#include "print_skip_list_stat.h"
+#include "print_ellenbintree_stat.h"
+#include "ellen_bintree_update_desc_pool.h"
+
+namespace map2 {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+    typedef cds::urcu::gc< cds::urcu::general_instant<> >   rcu_gpi;
+    typedef cds::urcu::gc< cds::urcu::general_buffered<> >  rcu_gpb;
+    typedef cds::urcu::gc< cds::urcu::general_threaded<> >  rcu_gpt;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    typedef cds::urcu::gc< cds::urcu::signal_buffered<> >  rcu_shb;
+    typedef cds::urcu::gc< cds::urcu::signal_threaded<> >  rcu_sht;
+#endif
+
+    template <typename Key>
+    struct cmp {
+        int operator ()(Key const& k1, Key const& k2) const
+        {
+            if ( std::less<Key>( k1, k2 ) )
+                return -1;
+            return std::less<Key>( k2, k1 ) ? 1 : 0;
+        }
+    };
+
+#define CDSUNIT_INT_COMPARE(t)  template <> struct cmp<t> { int operator()( t k1, t k2 ){ return (int)(k1 - k2); } }
+    CDSUNIT_INT_COMPARE(char);
+    CDSUNIT_INT_COMPARE(unsigned char);
+    CDSUNIT_INT_COMPARE(int);
+    CDSUNIT_INT_COMPARE(unsigned int);
+    CDSUNIT_INT_COMPARE(long);
+    CDSUNIT_INT_COMPARE(unsigned long);
+    CDSUNIT_INT_COMPARE(long long);
+    CDSUNIT_INT_COMPARE(unsigned long long);
+#undef CDSUNIT_INT_COMPARE
+
+    template <>
+    struct cmp<std::string>
+    {
+        int operator()(std::string const& s1, std::string const& s2)
+        {
+            return s1.compare( s2 );
+        }
+        int operator()(std::string const& s1, char const * s2)
+        {
+            return s1.compare( s2 );
+        }
+        int operator()(char const * s1, std::string const& s2)
+        {
+            return -s2.compare( s1 );
+        }
+    };
+
+    template <typename K, typename V, CDS_DECL_OPTIONS10>
+    class CuckooStripedMap:
+        public cc::CuckooMap< K, V,
+            typename cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,CDS_OPTIONS10
+            >::type
+        >
+    {
+    public:
+        typedef typename cc::cuckoo::make_traits<
+            co::mutex_policy< cc::cuckoo::striping<> >
+            ,CDS_OPTIONS10
+        >::type cuckoo_traits;
+
+        typedef cc::CuckooMap< K, V, cuckoo_traits > cuckoo_base_class;
+
+    public:
+        CuckooStripedMap( size_t nCapacity, size_t nLoadFactor )
+            : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int) 4 )
+        {}
+
+        template <typename Q, typename Pred>
+        bool erase_with( Q const& key, Pred pred )
+        {
+            return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
+        }
+    };
+
+    template <typename K, typename V, CDS_DECL_OPTIONS10>
+    class CuckooRefinableMap:
+        public cc::CuckooMap< K, V,
+            typename cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,CDS_OPTIONS10
+            >::type
+        >
+    {
+    public:
+        typedef typename cc::cuckoo::make_traits<
+            co::mutex_policy< cc::cuckoo::refinable<> >
+            ,CDS_OPTIONS10
+        >::type cuckoo_traits;
+
+        typedef cc::CuckooMap< K, V, cuckoo_traits > cuckoo_base_class;
+
+    public:
+        CuckooRefinableMap( size_t nCapacity, size_t nLoadFactor )
+            : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int) 4 )
+        {}
+
+        template <typename Q, typename Pred>
+        bool erase_with( Q const& key, Pred pred )
+        {
+            return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
+        }
+    };
+
+    template <typename Key, typename Value>
+    struct MapTypes {
+        typedef co::v::hash<Key>    key_hash;
+        typedef std::less<Key>      less;
+        typedef cmp<Key>            compare;
+
+        struct equal_to {
+            bool operator()( Key const& k1, Key const& k2 ) const
+            {
+                return compare()( k1, k2 ) == 0;
+            }
+        };
+
+        struct hash: public key_hash
+        {
+            size_t operator()( Key const& k ) const
+            {
+                return key_hash::operator()( k );
+            }
+            template <typename Q>
+            size_t operator()( Q const& k ) const
+            {
+                return key_hash::operator()( k );
+            }
+        };
+
+        struct hash2: public key_hash
+        {
+            size_t operator()( Key const& k ) const
+            {
+                size_t seed = ~key_hash::operator ()( k );
+                boost::hash_combine( seed, k );
+                return seed;
+            }
+            template <typename Q>
+            size_t operator()( Q const& k ) const
+            {
+                size_t seed = ~key_hash::operator()( k );
+                boost::hash_combine( seed, k );
+                return seed;
+            }
+        };
+
+        // ***************************************************************************
+        // MichaelKVList
+
+        typedef cc::MichaelKVList< cds::gc::HP, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_HP_cmp_stdAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::HP, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_HP_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< cds::gc::HP, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_HP_cmp_michaelAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::HP, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_HP_less_stdAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::HP, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_HP_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< cds::gc::HP, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_HP_less_michaelAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::HRC, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_HRC_cmp_stdAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::HRC, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_HRC_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< cds::gc::HRC, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_HRC_cmp_michaelAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::HRC, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_HRC_less_stdAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::HRC, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_HRC_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< cds::gc::HRC, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_HRC_less_michaelAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::PTB, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_PTB_cmp_stdAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::PTB, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_PTB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< cds::gc::PTB, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_PTB_cmp_michaelAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::PTB, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_PTB_less_stdAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::PTB, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_PTB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< cds::gc::PTB, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_PTB_less_michaelAlloc;
+
+        // RCU
+        typedef cc::MichaelKVList< rcu_gpi, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_RCU_GPI_cmp_stdAlloc;
+
+        typedef cc::MichaelKVList< rcu_gpi, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPI_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< rcu_gpi, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPI_cmp_michaelAlloc;
+
+        typedef cc::MichaelKVList< rcu_gpi, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_RCU_GPI_less_stdAlloc;
+
+        typedef cc::MichaelKVList< rcu_gpi, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPI_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< rcu_gpi, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPI_less_michaelAlloc;
+
+        //
+        typedef cc::MichaelKVList< rcu_gpb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_RCU_GPB_cmp_stdAlloc;
+
+        typedef cc::MichaelKVList< rcu_gpb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< rcu_gpb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPB_cmp_michaelAlloc;
+
+        typedef cc::MichaelKVList< rcu_gpb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_RCU_GPB_less_stdAlloc;
+
+        typedef cc::MichaelKVList< rcu_gpb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< rcu_gpb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPB_less_michaelAlloc;
+
+        //
+        typedef cc::MichaelKVList< rcu_gpt, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_RCU_GPT_cmp_stdAlloc;
+
+        typedef cc::MichaelKVList< rcu_gpt, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< rcu_gpt, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPT_cmp_michaelAlloc;
+
+        typedef cc::MichaelKVList< rcu_gpt, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_RCU_GPT_less_stdAlloc;
+
+        typedef cc::MichaelKVList< rcu_gpt, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< rcu_gpt, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPT_less_michaelAlloc;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelKVList< rcu_shb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_RCU_SHB_cmp_stdAlloc;
+
+        typedef cc::MichaelKVList< rcu_shb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_SHB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< rcu_shb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_SHB_cmp_michaelAlloc;
+
+        typedef cc::MichaelKVList< rcu_shb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_RCU_SHB_less_stdAlloc;
+
+        typedef cc::MichaelKVList< rcu_shb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_SHB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< rcu_shb, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_SHB_less_michaelAlloc;
+
+        //
+        typedef cc::MichaelKVList< rcu_sht, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_RCU_SHT_cmp_stdAlloc;
+
+        typedef cc::MichaelKVList< rcu_sht, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_SHT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< rcu_sht, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_SHT_cmp_michaelAlloc;
+
+        typedef cc::MichaelKVList< rcu_sht, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_RCU_SHT_less_stdAlloc;
+
+        typedef cc::MichaelKVList< rcu_sht, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_SHT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< rcu_sht, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_SHT_less_michaelAlloc;
+#endif
+
+        // gc::nogc
+        typedef cc::MichaelKVList< cds::gc::nogc, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_NOGC_cmp_stdAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::nogc, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_NOGC_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< cds::gc::nogc, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_NOGC_cmp_michaelAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::nogc, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_NOGC_less_stdAlloc;
+
+        typedef cc::MichaelKVList< cds::gc::nogc, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_NOGC_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelKVList< cds::gc::nogc, Key, Value,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_NOGC_less_michaelAlloc;
+
+        template <typename Base>
+        class NogcMapWrapper: public Base
+        {
+            typedef Base    base_class;
+        public:
+            NogcMapWrapper( size_t nMaxItemCount, size_t nLoadFactor )
+                : base_class( nMaxItemCount, nLoadFactor )
+            {}
+
+            template <typename K>
+            bool insert( K const& key )
+            {
+                return base_class::insert( key ) != base_class::end();
+            }
+
+            template <typename K, typename V>
+            bool insert( K const& key, V const& val )
+            {
+                return base_class::insert( key, val ) != base_class::end();
+            }
+
+            template <typename K, typename Func>
+            bool insert_key( K const& key, Func func )
+            {
+                return base_class::insert_key( key, func ) != base_class::end();
+            }
+
+            template <typename K>
+            bool find( K const& key )
+            {
+                return base_class::find( key ) != base_class::end();
+            }
+
+            void clear()
+            {
+                base_class::clear();
+            }
+        };
+
+        template <typename Base>
+        class NogcMapWrapper_dctor: public Base
+        {
+            typedef Base    base_class;
+        public:
+            NogcMapWrapper_dctor()
+            {}
+
+            template <typename K>
+            bool insert( K const& key )
+            {
+                return base_class::insert( key ) != base_class::end();
+            }
+
+            template <typename K, typename V>
+            bool insert( K const& key, V const& val )
+            {
+                return base_class::insert( key, val ) != base_class::end();
+            }
+
+            template <typename K, typename Func>
+            bool insert_key( K const& key, Func func )
+            {
+                return base_class::insert_key( key, func ) != base_class::end();
+            }
+
+            template <typename K>
+            bool find( K const& key )
+            {
+                return base_class::find( key ) != base_class::end();
+            }
+        };
+
+        // SplitListMap<gc::nogc> has no clear() method
+        template <typename Base>
+        class NogcSplitMapWrapper: public Base
+        {
+            typedef Base    base_class;
+        public:
+            NogcSplitMapWrapper( size_t nMaxItemCount, size_t nLoadFactor )
+                : base_class( nMaxItemCount, nLoadFactor )
+            {}
+
+            template <typename K>
+            bool insert( K const& key )
+            {
+                return base_class::insert( key ) != base_class::end();
+            }
+
+            template <typename K, typename V>
+            bool insert( K const& key, V const& val )
+            {
+                return base_class::insert( key, val ) != base_class::end();
+            }
+
+            template <typename K, typename Func>
+            bool insert_key( K const& key, Func func )
+            {
+                return base_class::insert_key( key, func ) != base_class::end();
+            }
+
+            template <typename K>
+            bool find( K const& key )
+            {
+                return base_class::find( key ) != base_class::end();
+            }
+
+            void clear()
+            {}
+        };
+
+
+        // ***************************************************************************
+        // MichaelHashMap based on MichaelKVList
+
+        typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_HP_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_HP_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_HP_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_HP_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_HP_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_HP_less_michaelAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, MichaelList_HRC_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_HRC_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, MichaelList_HRC_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_HRC_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, MichaelList_HRC_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_HRC_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, MichaelList_HRC_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_HRC_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, MichaelList_HRC_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_HRC_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, MichaelList_HRC_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_HRC_less_michaelAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, MichaelList_PTB_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_PTB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, MichaelList_PTB_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_PTB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, MichaelList_PTB_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_PTB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, MichaelList_PTB_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_PTB_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, MichaelList_PTB_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_PTB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, MichaelList_PTB_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_PTB_less_michaelAlloc;
+
+        //RCU
+        typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPI_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPI_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_RCU_GPI_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPI_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPI_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_RCU_GPI_less_michaelAlloc;
+
+        //
+        typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_RCU_GPB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPB_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_RCU_GPB_less_michaelAlloc;
+
+        //
+        typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPT_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_RCU_GPT_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPT_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_GPT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_RCU_GPT_less_michaelAlloc;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_SHB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_SHB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_RCU_SHB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_SHB_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_SHB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_RCU_SHB_less_michaelAlloc;
+
+        //
+        typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_SHT_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_SHT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_RCU_SHT_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_SHT_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_RCU_SHT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_RCU_SHT_less_michaelAlloc;
+#endif
+
+        // gc::nogc
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        > >  MichaelMap_NOGC_cmp_stdAlloc;
+
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        > >   MichaelMap_NOGC_cmp_stdAlloc_seqcst;
+
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > >  MichaelMap_NOGC_cmp_michaelAlloc;
+
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        > >   MichaelMap_NOGC_less_stdAlloc;
+
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        > >   MichaelMap_NOGC_less_stdAlloc_seqcst;
+
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > >  MichaelMap_NOGC_less_michaelAlloc;
+
+
+        // ***************************************************************************
+        // LazyKVList
+
+        typedef cc::LazyKVList< cds::gc::HP, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_HP_cmp_stdAlloc;
+
+        typedef cc::LazyKVList< cds::gc::HP, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_HP_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< cds::gc::HP, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_HP_cmp_michaelAlloc;
+
+        typedef cc::LazyKVList< cds::gc::HP, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_HP_less_stdAlloc;
+
+        typedef cc::LazyKVList< cds::gc::HP, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_HP_less_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< cds::gc::HP, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_HP_less_michaelAlloc;
+
+        typedef cc::LazyKVList< cds::gc::HRC, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_HRC_cmp_stdAlloc;
+
+        typedef cc::LazyKVList< cds::gc::HRC, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_HRC_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< cds::gc::HRC, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_HRC_cmp_michaelAlloc;
+
+        typedef cc::LazyKVList< cds::gc::HRC, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_HRC_less_stdAlloc;
+
+        typedef cc::LazyKVList< cds::gc::HRC, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_HRC_less_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< cds::gc::HRC, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_HRC_less_michaelAlloc;
+
+        typedef cc::LazyKVList< cds::gc::PTB, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_PTB_cmp_stdAlloc;
+
+        typedef cc::LazyKVList< cds::gc::PTB, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_PTB_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< cds::gc::PTB, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_PTB_cmp_michaelAlloc;
+
+        typedef cc::LazyKVList< cds::gc::PTB, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_PTB_less_stdAlloc;
+
+        typedef cc::LazyKVList< cds::gc::PTB, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_PTB_less_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< cds::gc::PTB, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_PTB_less_michaelAlloc;
+
+        // RCU
+        typedef cc::LazyKVList< rcu_gpi, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_RCU_GPI_cmp_stdAlloc;
+
+        typedef cc::LazyKVList< rcu_gpi, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPI_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< rcu_gpi, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPI_cmp_michaelAlloc;
+
+        typedef cc::LazyKVList< rcu_gpi, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_RCU_GPI_less_stdAlloc;
+
+        typedef cc::LazyKVList< rcu_gpi, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPI_less_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< rcu_gpi, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPI_less_michaelAlloc;
+
+        //
+        typedef cc::LazyKVList< rcu_gpb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_RCU_GPB_cmp_stdAlloc;
+
+        typedef cc::LazyKVList< rcu_gpb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPB_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< rcu_gpb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPB_cmp_michaelAlloc;
+
+        typedef cc::LazyKVList< rcu_gpb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_RCU_GPB_less_stdAlloc;
+
+        typedef cc::LazyKVList< rcu_gpb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPB_less_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< rcu_gpb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPB_less_michaelAlloc;
+
+        //
+        typedef cc::LazyKVList< rcu_gpt, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_RCU_GPT_cmp_stdAlloc;
+
+        typedef cc::LazyKVList< rcu_gpt, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPT_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< rcu_gpt, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPT_cmp_michaelAlloc;
+
+        typedef cc::LazyKVList< rcu_gpt, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_RCU_GPT_less_stdAlloc;
+
+        typedef cc::LazyKVList< rcu_gpt, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPT_less_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< rcu_gpt, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPT_less_michaelAlloc;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyKVList< rcu_shb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_RCU_SHB_cmp_stdAlloc;
+
+        typedef cc::LazyKVList< rcu_shb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_SHB_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< rcu_shb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_SHB_cmp_michaelAlloc;
+
+        typedef cc::LazyKVList< rcu_shb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_RCU_SHB_less_stdAlloc;
+
+        typedef cc::LazyKVList< rcu_shb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_SHB_less_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< rcu_shb, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_SHB_less_michaelAlloc;
+
+        //
+        typedef cc::LazyKVList< rcu_sht, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_RCU_SHT_cmp_stdAlloc;
+
+        typedef cc::LazyKVList< rcu_sht, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_SHT_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< rcu_sht, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_SHT_cmp_michaelAlloc;
+
+        typedef cc::LazyKVList< rcu_sht, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_RCU_SHT_less_stdAlloc;
+
+        typedef cc::LazyKVList< rcu_sht, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_SHT_less_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< rcu_sht, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_SHT_less_michaelAlloc;
+#endif
+
+        // gc::nogc
+        typedef cc::LazyKVList< cds::gc::nogc, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_NOGC_cmp_stdAlloc;
+
+        typedef cc::LazyKVList< cds::gc::nogc, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_NOGC_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< cds::gc::nogc, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_NOGC_cmp_michaelAlloc;
+
+        typedef cc::LazyKVList< cds::gc::nogc, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_NOGC_less_stdAlloc;
+
+        typedef cc::LazyKVList< cds::gc::nogc, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_NOGC_less_stdAlloc_seqcst;
+
+        typedef cc::LazyKVList< cds::gc::nogc, Key, Value,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_NOGC_less_michaelAlloc;
+
+
+        // ***************************************************************************
+        // MichaelHashMap based on LazyKVList
+
+        typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_HP_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_HP_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_HP_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_HP_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_HP_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_HP_less_michaelAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, LazyList_HRC_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_HRC_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, LazyList_HRC_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_HRC_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, LazyList_HRC_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_HRC_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, LazyList_HRC_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_HRC_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, LazyList_HRC_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_HRC_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::HRC, LazyList_HRC_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_HRC_less_michaelAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, LazyList_PTB_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_PTB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, LazyList_PTB_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_PTB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, LazyList_PTB_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_PTB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, LazyList_PTB_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_PTB_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, LazyList_PTB_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_PTB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< cds::gc::PTB, LazyList_PTB_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_PTB_less_michaelAlloc;
+
+        // RCU
+        typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPI_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPI_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPI_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPI_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPI_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPI_less_michaelAlloc;
+
+        //
+        typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPB_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPB_less_michaelAlloc;
+
+        //
+        typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPT_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPT_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPT_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_RCU_GPT_less_michaelAlloc;
+
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHB_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHB_less_michaelAlloc;
+
+        //
+        typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHT_cmp_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHT_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHT_less_stdAlloc;
+
+        typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelMap_Lazy_RCU_SHT_less_michaelAlloc;
+#endif
+
+        // gc::nogc
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_cmp_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        > >   MichaelMap_Lazy_NOGC_cmp_stdAlloc;
+
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_cmp_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        > >   MichaelMap_Lazy_NOGC_cmp_stdAlloc_seqcst;
+
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_cmp_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > >  MichaelMap_Lazy_NOGC_cmp_michaelAlloc;
+
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_less_stdAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        > >  MichaelMap_Lazy_NOGC_less_stdAlloc;
+
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_less_stdAlloc_seqcst,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >
+            >::type
+        > >  MichaelMap_Lazy_NOGC_less_stdAlloc_seqcst;
+
+        typedef NogcMapWrapper< cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_less_michaelAlloc,
+            typename cc::michael_map::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        > >  MichaelMap_Lazy_NOGC_less_michaelAlloc;
+
+
+        // ***************************************************************************
+        // SplitListMap based on MichaelList
+
+        // HP
+        class traits_SplitList_Michael_HP_dyn_cmp: public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_HP_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
+
+        class traits_SplitList_Michael_HP_dyn_cmp_seqcst: public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_HP_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
+
+        class traits_SplitList_Michael_HP_st_cmp: public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_HP_st_cmp > SplitList_Michael_HP_st_cmp;
+
+        class traits_SplitList_Michael_HP_st_cmp_seqcst: public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_HP_st_cmp_seqcst > SplitList_Michael_HP_st_cmp_seqcst;
+
+        //HP + less
+        class traits_SplitList_Michael_HP_dyn_less: public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_HP_dyn_less > SplitList_Michael_HP_dyn_less;
+
+        class traits_SplitList_Michael_HP_dyn_less_seqcst: public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_HP_dyn_less_seqcst > SplitList_Michael_HP_dyn_less_seqcst;
+
+        class traits_SplitList_Michael_HP_st_less: public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_HP_st_less > SplitList_Michael_HP_st_less;
+
+        class traits_SplitList_Michael_HP_st_less_seqcst: public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_HP_st_less_seqcst > SplitList_Michael_HP_st_less_seqcst;
+
+        // HRC
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_dyn_cmp;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_st_cmp;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_st_cmp_seqcst;
+
+        // HRC + less
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_dyn_less;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_st_less;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_st_less_seqcst;
+
+        // PTB
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_dyn_cmp;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_st_cmp;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_st_cmp_seqcst;
+
+        // PTB + less
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_dyn_less;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_st_less;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_st_less_seqcst;
+
+        // RCU
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_dyn_cmp;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_st_cmp;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_st_cmp_seqcst;
+
+        // RCU_GPI + less
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_dyn_less;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_st_less;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_st_less_seqcst;
+
+        //
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_dyn_cmp;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_st_cmp;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_st_cmp_seqcst;
+
+        // RCU_GPB + less
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_dyn_less;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_st_less;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_st_less_seqcst;
+
+        //
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_dyn_cmp;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_st_cmp;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_st_cmp_seqcst;
+
+        // RCU_GPT + less
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_dyn_less;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_st_less;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_st_less_seqcst;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_dyn_cmp;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_st_cmp;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_st_cmp_seqcst;
+
+        // RCU_SHB + less
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_dyn_less;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_st_less;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_st_less_seqcst;
+
+        //
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_dyn_cmp;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_st_cmp;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_st_cmp_seqcst;
+
+        // RCU_SHT + less
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_dyn_less;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_st_less;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_st_less_seqcst;
+#endif
+
+        // gc::nogc
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > > SplitList_Michael_NOGC_dyn_cmp;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > > SplitList_Michael_NOGC_dyn_cmp_seqcst;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > > SplitList_Michael_NOGC_st_cmp;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > > SplitList_Michael_NOGC_st_cmp_seqcst;
+
+        //NOGC + less
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > > SplitList_Michael_NOGC_dyn_less;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > > SplitList_Michael_NOGC_dyn_less_seqcst;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > > SplitList_Michael_NOGC_st_less;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > > SplitList_Michael_NOGC_st_less_seqcst;
+
+
+        // ***************************************************************************
+        // SplitListMap based on LazyKVList
+
+        // HP
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_dyn_cmp;
+
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_st_cmp;
+
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_st_cmp_seqcst;
+
+
+        // HP + less
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_dyn_less;
+
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_st_less;
+
+        typedef cc::SplitListMap< cds::gc::HP, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_st_less_seqcst;
+
+        // HRC
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_dyn_cmp;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_st_cmp;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_st_cmp_seqcst;
+
+        // HRC + less
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_dyn_less;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_st_less;
+
+        typedef cc::SplitListMap< cds::gc::HRC, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_st_less_seqcst;
+
+
+        // PTB
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_dyn_cmp;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_st_cmp;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_st_cmp_seqcst;
+
+        // PTB + less
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_dyn_less;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_st_less;
+
+        typedef cc::SplitListMap< cds::gc::PTB, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_st_less_seqcst;
+
+        // RCU
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_dyn_cmp;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_st_cmp;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
+
+        // RCU_GPI + less
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_dyn_less;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_st_less;
+
+        typedef cc::SplitListMap< rcu_gpi, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_st_less_seqcst;
+
+        //
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_dyn_cmp;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_st_cmp;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
+
+        // RCU_GPB + less
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_dyn_less;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_st_less;
+
+        typedef cc::SplitListMap< rcu_gpb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_st_less_seqcst;
+
+        //
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_dyn_cmp;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_st_cmp;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
+
+        // RCU_GPT + less
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_dyn_less;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_st_less;
+
+        typedef cc::SplitListMap< rcu_gpt, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_st_less_seqcst;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_dyn_cmp;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_st_cmp;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
+
+        // RCU_SHB + less
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_dyn_less;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_st_less;
+
+        typedef cc::SplitListMap< rcu_shb, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_st_less_seqcst;
+
+        //
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_dyn_cmp;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_st_cmp;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
+
+        // RCU_SHT + less
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_dyn_less;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_st_less;
+
+        typedef cc::SplitListMap< rcu_sht, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_st_less_seqcst;
+#endif
+
+        // gc::nogc
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > > SplitList_Lazy_NOGC_dyn_cmp;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > > SplitList_Lazy_NOGC_dyn_cmp_seqcst;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > > SplitList_Lazy_NOGC_st_cmp;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > > SplitList_Lazy_NOGC_st_cmp_seqcst;
+
+
+        // NOGC + less
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > > SplitList_Lazy_NOGC_dyn_less;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > > SplitList_Lazy_NOGC_dyn_less_seqcst;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > > SplitList_Lazy_NOGC_st_less;
+
+        typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > > SplitList_Lazy_NOGC_st_less_seqcst;
+
+
+        // ***************************************************************************
+        // StripedHashMap
+
+        // for sequential containers
+        template <class BucketEntry, CDS_DECL_OPTIONS7>
+        class StripedHashMap_seq:
+            public cc::StripedMap< BucketEntry,
+                co::mutex_policy< cc::striped_set::striping<> >
+                ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                , CDS_OPTIONS7
+            >
+        {
+            typedef cc::StripedMap< BucketEntry,
+                co::mutex_policy< cc::striped_set::striping<> >
+                ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                , CDS_OPTIONS7
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            StripedHashMap_seq( size_t nCapacity, size_t nLoadFactor )
+                : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
+            {}
+        };
+
+        // for non-sequential ordered containers
+        template <class BucketEntry, CDS_DECL_OPTIONS7>
+        class StripedHashMap_ord:
+            public cc::StripedMap< BucketEntry,
+                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::striping<> >
+                , CDS_OPTIONS7
+            >
+        {
+            typedef cc::StripedMap< BucketEntry,
+               co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::striping<> >
+                , CDS_OPTIONS7
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            StripedHashMap_ord( size_t nCapacity, size_t nLoadFactor )
+                : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
+            {}
+        };
+
+
+        typedef StripedHashMap_seq<
+            std::list< std::pair< Key const, Value > >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedMap_list;
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600
+        typedef StripedHashMap_ord<
+            stdext::hash_map< Key, Value, stdext::hash_compare<Key, less > >
+            , co::hash< hash2 >
+        > StripedMap_hashmap;
+#else
+        typedef StripedHashMap_ord<
+            std::unordered_map< Key, Value, hash, equal_to >
+            , co::hash< hash2 >
+        > StripedMap_hashmap;
+#endif
+
+        typedef StripedHashMap_ord<
+            std::map< Key, Value, less >
+            , co::hash< hash2 >
+        > StripedMap_map;
+
+        typedef StripedHashMap_ord<
+            boost::unordered_map< Key, Value, hash, equal_to >
+            , co::hash< hash2 >
+        > StripedMap_boost_unordered_map;
+
+#if BOOST_VERSION >= 104800
+        typedef StripedHashMap_seq<
+            boost::container::slist< std::pair< Key const, Value > >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedMap_slist;
+
+        typedef StripedHashMap_seq<
+            boost::container::list< std::pair< Key const, Value > >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedMap_boost_list;
+
+        typedef StripedHashMap_ord<
+            boost::container::map< Key, Value, less >
+            , co::hash< hash2 >
+        > StripedMap_boost_map;
+
+//#   ifdef CDS_UNIT_MAP_TYPES_ENABLE_BOOST_FLAT_CONTAINERS
+        typedef StripedHashMap_ord<
+            boost::container::flat_map< Key, Value, less >
+            , co::hash< hash2 >
+        > StripedMap_boost_flat_map;
+//#   endif
+#endif  // BOOST_VERSION >= 104800
+
+        // ***************************************************************************
+        // RefinableHashMap
+
+        // for sequential containers
+        template <class BucketEntry, CDS_DECL_OPTIONS7>
+        class RefinableHashMap_seq:
+            public cc::StripedMap< BucketEntry,
+                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , CDS_OPTIONS7
+            >
+        {
+            typedef cc::StripedMap< BucketEntry,
+               co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , CDS_OPTIONS7
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            RefinableHashMap_seq( size_t nCapacity, size_t nLoadFactor )
+                : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
+            {}
+        };
+
+        // for non-sequential ordered containers
+        template <class BucketEntry, CDS_DECL_OPTIONS7>
+        class RefinableHashMap_ord:
+            public cc::StripedMap< BucketEntry,
+                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , CDS_OPTIONS7
+            >
+        {
+            typedef cc::StripedMap< BucketEntry,
+               co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , CDS_OPTIONS7
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            RefinableHashMap_ord( size_t nCapacity, size_t nLoadFactor )
+                : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
+            {}
+        };
+
+
+        typedef RefinableHashMap_seq<
+            std::list< std::pair< Key const, Value > >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableMap_list;
+
+#if BOOST_VERSION >= 104800
+        typedef RefinableHashMap_seq<
+            boost::container::slist< std::pair< Key const, Value > >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableMap_slist;
+#endif
+
+        typedef RefinableHashMap_ord<
+            std::map< Key, Value, less >
+            , co::hash< hash2 >
+        > RefinableMap_map;
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600
+        typedef RefinableHashMap_ord<
+            stdext::hash_map< Key, Value, stdext::hash_compare<Key, less > >
+            , co::hash< hash2 >
+        > RefinableMap_hashmap;
+#else
+        typedef RefinableHashMap_ord<
+            std::unordered_map< Key, Value, hash, equal_to >
+            , co::hash< hash2 >
+        > RefinableMap_hashmap;
+#endif
+        typedef RefinableHashMap_ord<
+            boost::unordered_map< Key, Value, hash, equal_to >
+            , co::hash< hash2 >
+        > RefinableMap_boost_unordered_map;
+
+#if BOOST_VERSION >= 104800
+        typedef RefinableHashMap_seq<
+            boost::container::list< std::pair< Key const, Value > >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableMap_boost_list;
+
+        typedef RefinableHashMap_ord<
+            boost::container::map< Key, Value, less >
+            , co::hash< hash2 >
+        > RefinableMap_boost_map;
+
+//#   ifdef CDS_UNIT_MAP_TYPES_ENABLE_BOOST_FLAT_CONTAINERS
+        typedef RefinableHashMap_ord<
+            boost::container::flat_map< Key, Value, less >
+            , co::hash< hash2 >
+        > RefinableMap_boost_flat_map;
+//#   endif
+#endif // #if BOOST_VERSION >= 104800
+
+
+        // ***************************************************************************
+        // CuckooMap
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooStripedMap_list_unord;
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooStripedMap_list_unord_stat;
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooStripedMap_list_unord_storehash;
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooStripedMap_list_ord;
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooStripedMap_list_ord_stat;
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooStripedMap_list_ord_storehash;
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooStripedMap_vector_unord;
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooStripedMap_vector_unord_stat;
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooStripedMap_vector_unord_storehash;
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooStripedMap_vector_ord;
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooStripedMap_vector_ord_stat;
+
+        typedef CuckooStripedMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooStripedMap_vector_ord_storehash;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooRefinableMap_list_unord;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooRefinableMap_list_unord_stat;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooRefinableMap_list_unord_storehash;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooRefinableMap_list_ord;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooRefinableMap_list_ord_stat;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooRefinableMap_list_ord_storehash;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooRefinableMap_vector_unord;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooRefinableMap_vector_unord_stat;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooRefinableMap_vector_unord_storehash;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooRefinableMap_vector_ord;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooRefinableMap_vector_ord_stat;
+
+        typedef CuckooRefinableMap< Key, Value,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooRefinableMap_vector_ord_storehash;
+
+        // ***************************************************************************
+        // SkipListMap - HP
+
+        class traits_SkipListMap_hp_less_pascal: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_less_pascal > SkipListMap_hp_less_pascal;
+
+        class traits_SkipListMap_hp_less_pascal_seqcst: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_less_pascal_seqcst > SkipListMap_hp_less_pascal_seqcst;
+
+        class traits_SkipListMap_hp_less_pascal_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_less_pascal_stat > SkipListMap_hp_less_pascal_stat;
+
+        class traits_SkipListMap_hp_cmp_pascal: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_cmp_pascal > SkipListMap_hp_cmp_pascal;
+
+        class traits_SkipListMap_hp_cmp_pascal_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_cmp_pascal_stat > SkipListMap_hp_cmp_pascal_stat;
+
+        class traits_SkipListMap_hp_less_xorshift: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_less_xorshift > SkipListMap_hp_less_xorshift;
+
+        class traits_SkipListMap_hp_less_xorshift_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_less_xorshift_stat > SkipListMap_hp_less_xorshift_stat;
+
+        class traits_SkipListMap_hp_cmp_xorshift: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_cmp_xorshift > SkipListMap_hp_cmp_xorshift;
+
+        class traits_SkipListMap_hp_cmp_xorshift_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_cmp_xorshift_stat > SkipListMap_hp_cmp_xorshift_stat;
+
+        // ***************************************************************************
+        // SkipListMap - HRC
+
+        class traits_SkipListMap_hrc_less_pascal: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HRC, Key, Value, traits_SkipListMap_hrc_less_pascal > SkipListMap_hrc_less_pascal;
+
+        class traits_SkipListMap_hrc_less_pascal_seqcst: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HRC, Key, Value, traits_SkipListMap_hrc_less_pascal_seqcst > SkipListMap_hrc_less_pascal_seqcst;
+
+        class traits_SkipListMap_hrc_less_pascal_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HRC, Key, Value, traits_SkipListMap_hrc_less_pascal_stat > SkipListMap_hrc_less_pascal_stat;
+
+        class traits_SkipListMap_hrc_cmp_pascal: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HRC, Key, Value, traits_SkipListMap_hrc_cmp_pascal > SkipListMap_hrc_cmp_pascal;
+
+        class traits_SkipListMap_hrc_cmp_pascal_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HRC, Key, Value, traits_SkipListMap_hrc_cmp_pascal_stat > SkipListMap_hrc_cmp_pascal_stat;
+
+        class traits_SkipListMap_hrc_less_xorshift: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HRC, Key, Value, traits_SkipListMap_hrc_less_xorshift > SkipListMap_hrc_less_xorshift;
+
+        class traits_SkipListMap_hrc_less_xorshift_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HRC, Key, Value, traits_SkipListMap_hrc_less_xorshift_stat > SkipListMap_hrc_less_xorshift_stat;
+
+        class traits_SkipListMap_hrc_cmp_xorshift: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HRC, Key, Value, traits_SkipListMap_hrc_cmp_xorshift > SkipListMap_hrc_cmp_xorshift;
+
+        class traits_SkipListMap_hrc_cmp_xorshift_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::HRC, Key, Value, traits_SkipListMap_hrc_cmp_xorshift_stat > SkipListMap_hrc_cmp_xorshift_stat;
+
+        // ***************************************************************************
+        // SkipListMap - PTB
+
+        class traits_SkipListMap_ptb_less_pascal: public cc::skip_list::make_traits <
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::PTB, Key, Value, traits_SkipListMap_ptb_less_pascal > SkipListMap_ptb_less_pascal;
+
+        class traits_SkipListMap_ptb_less_pascal_seqcst: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::PTB, Key, Value, traits_SkipListMap_ptb_less_pascal_seqcst > SkipListMap_ptb_less_pascal_seqcst;
+
+        class traits_SkipListMap_ptb_less_pascal_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::PTB, Key, Value, traits_SkipListMap_ptb_less_pascal_stat > SkipListMap_ptb_less_pascal_stat;
+
+        class traits_SkipListMap_ptb_cmp_pascal: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::PTB, Key, Value, traits_SkipListMap_ptb_cmp_pascal > SkipListMap_ptb_cmp_pascal;
+
+        class traits_SkipListMap_ptb_cmp_pascal_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::PTB, Key, Value, traits_SkipListMap_ptb_cmp_pascal_stat > SkipListMap_ptb_cmp_pascal_stat;
+
+        class traits_SkipListMap_ptb_less_xorshift: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::PTB, Key, Value, traits_SkipListMap_ptb_less_xorshift > SkipListMap_ptb_less_xorshift;
+
+        class traits_SkipListMap_ptb_less_xorshift_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::PTB, Key, Value, traits_SkipListMap_ptb_less_xorshift_stat > SkipListMap_ptb_less_xorshift_stat;
+
+        class traits_SkipListMap_ptb_cmp_xorshift: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::PTB, Key, Value, traits_SkipListMap_ptb_cmp_xorshift > SkipListMap_ptb_cmp_xorshift;
+
+        class traits_SkipListMap_ptb_cmp_xorshift_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< cds::gc::PTB, Key, Value, traits_SkipListMap_ptb_cmp_xorshift_stat > SkipListMap_ptb_cmp_xorshift_stat;
+
+        // ***************************************************************************
+        // SkipListMap< gc::nogc >
+
+        class traits_SkipListMap_nogc_less_pascal: public cc::skip_list::make_traits <
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef NogcMapWrapper_dctor< 
+            cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_less_pascal > 
+        > SkipListMap_nogc_less_pascal;
+
+        class traits_SkipListMap_nogc_less_pascal_seqcst: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef NogcMapWrapper_dctor< 
+            cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_less_pascal_seqcst > 
+        > SkipListMap_nogc_less_pascal_seqcst;
+
+        class traits_SkipListMap_nogc_less_pascal_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef NogcMapWrapper_dctor< 
+            cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_less_pascal_stat > 
+        > SkipListMap_nogc_less_pascal_stat;
+
+        class traits_SkipListMap_nogc_cmp_pascal: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef NogcMapWrapper_dctor<
+            cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_cmp_pascal > 
+        > SkipListMap_nogc_cmp_pascal;
+
+        class traits_SkipListMap_nogc_cmp_pascal_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef NogcMapWrapper_dctor< 
+            cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_cmp_pascal_stat > 
+        > SkipListMap_nogc_cmp_pascal_stat;
+
+        class traits_SkipListMap_nogc_less_xorshift: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef NogcMapWrapper_dctor< 
+            cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_less_xorshift > 
+        > SkipListMap_nogc_less_xorshift;
+
+        class traits_SkipListMap_nogc_less_xorshift_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef NogcMapWrapper_dctor< 
+            cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_less_xorshift_stat > 
+        > SkipListMap_nogc_less_xorshift_stat;
+
+        class traits_SkipListMap_nogc_cmp_xorshift: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        {};
+        typedef NogcMapWrapper_dctor< cc::SkipListMap< 
+            cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_cmp_xorshift > 
+        > SkipListMap_nogc_cmp_xorshift;
+
+        class traits_SkipListMap_nogc_cmp_xorshift_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef NogcMapWrapper_dctor< 
+            cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_cmp_xorshift_stat > 
+        > SkipListMap_nogc_cmp_xorshift_stat;
+
+        // ***************************************************************************
+        // SkipListMap - RCU general_instant
+
+        class traits_SkipListMap_rcu_gpi_less_pascal: public cc::skip_list::make_traits <
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_less_pascal > SkipListMap_rcu_gpi_less_pascal;
+
+        class traits_SkipListMap_rcu_gpi_less_pascal_seqcst: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_less_pascal_seqcst > SkipListMap_rcu_gpi_less_pascal_seqcst;
+
+        class traits_SkipListMap_rcu_gpi_less_pascal_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_less_pascal_stat > SkipListMap_rcu_gpi_less_pascal_stat;
+
+        class traits_SkipListMap_rcu_gpi_cmp_pascal: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_cmp_pascal > SkipListMap_rcu_gpi_cmp_pascal;
+
+        class traits_SkipListMap_rcu_gpi_cmp_pascal_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_cmp_pascal_stat > SkipListMap_rcu_gpi_cmp_pascal_stat;
+
+        class traits_SkipListMap_rcu_gpi_less_xorshift: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_less_xorshift > SkipListMap_rcu_gpi_less_xorshift;
+
+        class traits_SkipListMap_rcu_gpi_less_xorshift_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_less_xorshift_stat > SkipListMap_rcu_gpi_less_xorshift_stat;
+
+        class traits_SkipListMap_rcu_gpi_cmp_xorshift: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_cmp_xorshift > SkipListMap_rcu_gpi_cmp_xorshift;
+
+        class traits_SkipListMap_rcu_gpi_cmp_xorshift_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_cmp_xorshift_stat > SkipListMap_rcu_gpi_cmp_xorshift_stat;
+
+        // ***************************************************************************
+        // SkipListMap - RCU general_buffered
+
+        class traits_SkipListMap_rcu_gpb_less_pascal: public cc::skip_list::make_traits <
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_less_pascal > SkipListMap_rcu_gpb_less_pascal;
+
+        class traits_SkipListMap_rcu_gpb_less_pascal_seqcst: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_less_pascal_seqcst > SkipListMap_rcu_gpb_less_pascal_seqcst;
+
+        class traits_SkipListMap_rcu_gpb_less_pascal_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_less_pascal_stat > SkipListMap_rcu_gpb_less_pascal_stat;
+
+        class traits_SkipListMap_rcu_gpb_cmp_pascal: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_cmp_pascal > SkipListMap_rcu_gpb_cmp_pascal;
+
+        class traits_SkipListMap_rcu_gpb_cmp_pascal_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_cmp_pascal_stat > SkipListMap_rcu_gpb_cmp_pascal_stat;
+
+        class traits_SkipListMap_rcu_gpb_less_xorshift: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_less_xorshift > SkipListMap_rcu_gpb_less_xorshift;
+
+        class traits_SkipListMap_rcu_gpb_less_xorshift_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_less_xorshift_stat > SkipListMap_rcu_gpb_less_xorshift_stat;
+
+        class traits_SkipListMap_rcu_gpb_cmp_xorshift: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_cmp_xorshift > SkipListMap_rcu_gpb_cmp_xorshift;
+
+        class traits_SkipListMap_rcu_gpb_cmp_xorshift_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_cmp_xorshift_stat > SkipListMap_rcu_gpb_cmp_xorshift_stat;
+
+        // ***************************************************************************
+        // SkipListMap - RCU general_threaded
+
+        class traits_SkipListMap_rcu_gpt_less_pascal: public cc::skip_list::make_traits <
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_less_pascal > SkipListMap_rcu_gpt_less_pascal;
+
+        class traits_SkipListMap_rcu_gpt_less_pascal_seqcst: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_less_pascal_seqcst > SkipListMap_rcu_gpt_less_pascal_seqcst;
+
+        class traits_SkipListMap_rcu_gpt_less_pascal_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_less_pascal_stat > SkipListMap_rcu_gpt_less_pascal_stat;
+
+        class traits_SkipListMap_rcu_gpt_cmp_pascal: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_cmp_pascal > SkipListMap_rcu_gpt_cmp_pascal;
+
+        class traits_SkipListMap_rcu_gpt_cmp_pascal_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_cmp_pascal_stat > SkipListMap_rcu_gpt_cmp_pascal_stat;
+
+        class traits_SkipListMap_rcu_gpt_less_xorshift: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_less_xorshift > SkipListMap_rcu_gpt_less_xorshift;
+
+        class traits_SkipListMap_rcu_gpt_less_xorshift_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_less_xorshift_stat > SkipListMap_rcu_gpt_less_xorshift_stat;
+
+        class traits_SkipListMap_rcu_gpt_cmp_xorshift: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_cmp_xorshift > SkipListMap_rcu_gpt_cmp_xorshift;
+
+        class traits_SkipListMap_rcu_gpt_cmp_xorshift_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_cmp_xorshift_stat > SkipListMap_rcu_gpt_cmp_xorshift_stat;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // ***************************************************************************
+        // SkipListMap - RCU signal_buffered
+
+        class traits_SkipListMap_rcu_shb_less_pascal: public cc::skip_list::make_traits <
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_less_pascal > SkipListMap_rcu_shb_less_pascal;
+
+        class traits_SkipListMap_rcu_shb_less_pascal_seqcst: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_less_pascal_seqcst > SkipListMap_rcu_shb_less_pascal_seqcst;
+
+        class traits_SkipListMap_rcu_shb_less_pascal_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_less_pascal_stat > SkipListMap_rcu_shb_less_pascal_stat;
+
+        class traits_SkipListMap_rcu_shb_cmp_pascal: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_cmp_pascal > SkipListMap_rcu_shb_cmp_pascal;
+
+        class traits_SkipListMap_rcu_shb_cmp_pascal_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_cmp_pascal_stat > SkipListMap_rcu_shb_cmp_pascal_stat;
+
+        class traits_SkipListMap_rcu_shb_less_xorshift: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_less_xorshift > SkipListMap_rcu_shb_less_xorshift;
+
+        class traits_SkipListMap_rcu_shb_less_xorshift_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_less_xorshift_stat > SkipListMap_rcu_shb_less_xorshift_stat;
+
+        class traits_SkipListMap_rcu_shb_cmp_xorshift: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_cmp_xorshift > SkipListMap_rcu_shb_cmp_xorshift;
+
+        class traits_SkipListMap_rcu_shb_cmp_xorshift_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_cmp_xorshift_stat > SkipListMap_rcu_shb_cmp_xorshift_stat;
+
+        // ***************************************************************************
+        // SkipListMap - RCU signal_threaded
+
+        class traits_SkipListMap_rcu_sht_less_pascal: public cc::skip_list::make_traits <
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_less_pascal > SkipListMap_rcu_sht_less_pascal;
+
+        class traits_SkipListMap_rcu_sht_less_pascal_seqcst: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_less_pascal_seqcst > SkipListMap_rcu_sht_less_pascal_seqcst;
+
+        class traits_SkipListMap_rcu_sht_less_pascal_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_less_pascal_stat > SkipListMap_rcu_sht_less_pascal_stat;
+
+        class traits_SkipListMap_rcu_sht_cmp_pascal: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_cmp_pascal > SkipListMap_rcu_sht_cmp_pascal;
+
+        class traits_SkipListMap_rcu_sht_cmp_pascal_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_cmp_pascal_stat > SkipListMap_rcu_sht_cmp_pascal_stat;
+
+        class traits_SkipListMap_rcu_sht_less_xorshift: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_less_xorshift > SkipListMap_rcu_sht_less_xorshift;
+
+        class traits_SkipListMap_rcu_sht_less_xorshift_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_less_xorshift_stat > SkipListMap_rcu_sht_less_xorshift_stat;
+
+        class traits_SkipListMap_rcu_sht_cmp_xorshift: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_cmp_xorshift > SkipListMap_rcu_sht_cmp_xorshift;
+
+        class traits_SkipListMap_rcu_sht_cmp_xorshift_stat: public cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        {};
+        typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_cmp_xorshift_stat > SkipListMap_rcu_sht_cmp_xorshift_stat;
+#endif
+
+
+        // ***************************************************************************
+        // EllenBinTreeMap
+        struct ellen_bintree_props {
+            struct hp_gc {
+                typedef cc::ellen_bintree::map_node<cds::gc::HP, Key, Value>        leaf_node;
+                typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+            struct ptb_gc {
+                typedef cc::ellen_bintree::map_node<cds::gc::PTB, Key, Value>       leaf_node;
+                typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+            struct gpi {
+                typedef cc::ellen_bintree::map_node<rcu_gpi, Key, Value>            leaf_node;
+                typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+            struct gpb {
+                typedef cc::ellen_bintree::map_node<rcu_gpb, Key, Value>            leaf_node;
+                typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+            struct gpt {
+                typedef cc::ellen_bintree::map_node<rcu_gpt, Key, Value>            leaf_node;
+                typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+            struct shb {
+                typedef cc::ellen_bintree::map_node<rcu_shb, Key, Value>            leaf_node;
+                typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+            struct sht {
+                typedef cc::ellen_bintree::map_node<rcu_sht, Key, Value>            leaf_node;
+                typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+#endif
+        };
+
+
+        // ***************************************************************************
+        // EllenBinTreeMap - HP
+
+        struct traits_EllenBinTreeMap_hp: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< cds::gc::HP, Key, Value, traits_EllenBinTreeMap_hp >EllenBinTreeMap_hp;
+
+        struct traits_EllenBinTreeMap_hp_stat: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< cds::gc::HP, Key, Value, traits_EllenBinTreeMap_hp_stat > EllenBinTreeMap_hp_stat;
+
+        // ***************************************************************************
+        // EllenBinTreeMap - PTB
+
+        struct traits_EllenBinTreeMap_ptb: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::ptb_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< cds::gc::PTB, Key, Value, traits_EllenBinTreeMap_ptb> EllenBinTreeMap_ptb;
+
+        struct traits_EllenBinTreeMap_ptb_stat: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::ptb_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< cds::gc::PTB, Key, Value, traits_EllenBinTreeMap_ptb_stat > EllenBinTreeMap_ptb_stat;
+
+        // ***************************************************************************
+        // EllenBinTreeMap - RCU
+
+        struct traits_EllenBinTreeMap_rcu_gpi: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::bounded_update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< rcu_gpi, Key, Value, traits_EllenBinTreeMap_rcu_gpi > EllenBinTreeMap_rcu_gpi;
+
+        struct traits_EllenBinTreeMap_rcu_gpi_stat: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::bounded_update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< rcu_gpi, Key, Value, traits_EllenBinTreeMap_rcu_gpi_stat > EllenBinTreeMap_rcu_gpi_stat;
+
+        struct traits_EllenBinTreeMap_rcu_gpb: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< rcu_gpb, Key, Value, traits_EllenBinTreeMap_rcu_gpb > EllenBinTreeMap_rcu_gpb;
+
+        struct traits_EllenBinTreeMap_rcu_gpb_stat: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< rcu_gpb, Key, Value, traits_EllenBinTreeMap_rcu_gpb_stat > EllenBinTreeMap_rcu_gpb_stat;
+
+        struct traits_EllenBinTreeMap_rcu_gpt: public cc::ellen_bintree::make_set_traits<
+            co::less< less >
+            ,cc::ellen_bintree::update_desc_allocator<
+            cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::EllenBinTreeMap< rcu_gpt, Key, Value, traits_EllenBinTreeMap_rcu_gpt > EllenBinTreeMap_rcu_gpt;
+
+        struct traits_EllenBinTreeMap_rcu_gpt_stat: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::stat< cc::ellen_bintree::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< rcu_gpt, Key, Value, traits_EllenBinTreeMap_rcu_gpt_stat > EllenBinTreeMap_rcu_gpt_stat;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        struct traits_EllenBinTreeMap_rcu_shb: public cc::ellen_bintree::make_set_traits<
+            co::less< less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::EllenBinTreeMap< rcu_shb, Key, Value, traits_EllenBinTreeMap_rcu_shb > EllenBinTreeMap_rcu_shb;
+
+        struct traits_EllenBinTreeMap_rcu_shb_stat: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< rcu_shb, Key, Value, traits_EllenBinTreeMap_rcu_shb_stat > EllenBinTreeMap_rcu_shb_stat;
+
+        struct traits_EllenBinTreeMap_rcu_sht: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< rcu_sht, Key, Value, traits_EllenBinTreeMap_rcu_sht > EllenBinTreeMap_rcu_sht;
+
+        struct traits_EllenBinTreeMap_rcu_sht_stat: public cc::ellen_bintree::make_set_traits<
+                co::less< less >
+                ,cc::ellen_bintree::update_desc_allocator<
+                    cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+                >
+                ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        {};
+        typedef cc::EllenBinTreeMap< rcu_sht, Key, Value, traits_EllenBinTreeMap_rcu_sht_stat > EllenBinTreeMap_rcu_sht_stat;
+
+#endif
+
+
+        // ***************************************************************************
+        // Standard implementations
+
+        typedef StdMap< Key, Value, cds::SpinLock >             StdMap_Spin;
+        typedef StdMap< Key, Value, lock::NoLock>               StdMap_NoLock;
+
+        typedef StdHashMap< Key, Value, cds::SpinLock >         StdHashMap_Spin;
+        typedef StdHashMap< Key, Value, lock::NoLock >          StdHashMap_NoLock;
+
+    };
+
+    template <typename Map>
+    static inline void print_stat( Map const& m )
+    {}
+
+    template <typename Map>
+    static inline void additional_cleanup( Map& m )
+    {}
+
+    template <typename Map>
+    static inline void additional_check( Map& m )
+    {}
+
+
+    template <typename K, typename T, typename Traits >
+    static inline void print_stat( cc::CuckooMap< K, T, Traits > const& m )
+    {
+        CPPUNIT_MSG( m.statistics() << m.mutex_policy_statistics() );
+    }
+
+    template <typename GC, typename K, typename T, typename Traits >
+    static inline void print_stat( cc::SkipListMap< GC, K, T, Traits > const& m )
+    {
+        CPPUNIT_MSG( m.statistics() );
+    }
+
+    // EllenBinTreeMap
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void print_stat( cc::EllenBinTreeMap<GC, Key, T, Traits> const& s )
+    {
+        CPPUNIT_MSG( s.statistics() );
+    }
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void additional_cleanup( cc::EllenBinTreeMap<GC, Key, T, Traits>& s )
+    {
+        ellen_bintree_pool::internal_node_counter::reset();
+    }
+    namespace ellen_bintree_check {
+        static inline void check_stat( cds::intrusive::ellen_bintree::empty_stat const& s )
+        {
+            // This check is not valid for thread-based RCU
+            /*
+            CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get(),
+                "m_nAlloc=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
+                << ", m_nFree=" << ellen_bintree_pool::internal_node_counter::m_nFree.get()
+                );
+            */
+        }
+
+        static inline void check_stat( cds::intrusive::ellen_bintree::stat<> const& stat )
+        {
+            CPPUNIT_CHECK_CURRENT_EX( stat.m_nInternalNodeCreated == stat.m_nInternalNodeDeleted,
+                "m_nInternalNodeCreated=" << stat.m_nInternalNodeCreated
+                << " m_nInternalNodeDeleted=" << stat.m_nInternalNodeDeleted );
+            CPPUNIT_CHECK_CURRENT_EX( stat.m_nUpdateDescCreated == stat.m_nUpdateDescDeleted,
+                "m_nUpdateDescCreated=" << stat.m_nUpdateDescCreated
+                << " m_nUpdateDescDeleted=" << stat.m_nUpdateDescDeleted );
+            CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == stat.m_nInternalNodeCreated,
+                "allocated=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
+                << "m_nInternalNodeCreated=" << stat.m_nInternalNodeCreated );
+        }
+    }   // namespace ellen_bintree_check
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void additional_check( cc::EllenBinTreeMap<GC, Key, T, Traits>& s )
+    {
+        GC::force_dispose();
+        ellen_bintree_check::check_stat( s.statistics() );
+    }
+
+
+    template <typename K, typename V, CDS_SPEC_OPTIONS10>
+    static inline void print_stat( CuckooStripedMap< K, V, CDS_OPTIONS10 > const& m )
+    {
+        typedef CuckooStripedMap< K, V, CDS_OPTIONS10 > map_type;
+        print_stat( static_cast<typename map_type::cuckoo_base_class const&>(m) );
+    }
+
+    template <typename K, typename V, CDS_SPEC_OPTIONS10>
+    static inline void print_stat( CuckooRefinableMap< K, V, CDS_OPTIONS10 > const& m )
+    {
+        typedef CuckooRefinableMap< K, V, CDS_OPTIONS10 > map_type;
+        print_stat( static_cast<typename map_type::cuckoo_base_class const&>(m) );
+    }
+
+}   // namespace map2
+
+#endif // ifndef _CDSUNIT_MAP2_MAP_TYPES_H
diff --git a/tests/unit/map2/std_hash_map.h b/tests/unit/map2/std_hash_map.h
new file mode 100644 (file)
index 0000000..f0e1855
--- /dev/null
@@ -0,0 +1,14 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_HASH_MAP_H
+#define __CDSUNIT_STD_HASH_MAP_H
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   include "map2/std_hash_map_vc.h"
+#elif CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG
+#   include "map2/std_hash_map_gcc.h"
+#else
+#   error "unordered_map is undefined for this compiler"
+#endif
+
+#endif // #ifndef __CDSUNIT_STD_HASH_MAP_H
diff --git a/tests/unit/map2/std_hash_map_gcc.h b/tests/unit/map2/std_hash_map_gcc.h
new file mode 100644 (file)
index 0000000..e635e68
--- /dev/null
@@ -0,0 +1,99 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_HASH_MAP_GCC_H
+#define __CDSUNIT_STD_HASH_MAP_GCC_H
+
+#include <unordered_map>
+#include <cds/ref.h>
+
+namespace map2 {
+
+    template <typename Key, typename Value, typename Lock,
+        class Alloc = typename CDS_DEFAULT_ALLOCATOR::template rebind<std::pair<Key const, Value> >::other
+    >
+    class StdHashMap
+        : public std::unordered_map<
+            Key, Value
+            , std::hash<Key>
+            , std::equal_to<Key>
+            , Alloc
+        >
+    {
+    public:
+        Lock m_lock;
+        typedef cds::lock::scoped_lock<Lock> AutoLock;
+        typedef std::unordered_map<
+            Key, Value
+            , std::hash<Key>
+            , std::equal_to<Key>
+            , Alloc
+        >   base_class;
+    public:
+        typedef typename base_class::mapped_type value_type;
+        typedef size_t      item_counter;
+
+        StdHashMap( size_t nMapSize, size_t nLoadFactor )
+        {}
+
+        bool find( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::find( key ) != base_class::end();
+        }
+
+        bool insert( const Key& key, const Value& val )
+        {
+            AutoLock al( m_lock );
+            return base_class::insert( typename base_class::value_type(key, val)).second;
+        }
+
+        template <typename T, typename Func>
+        bool insert( const Key& key, const T& val, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( typename base_class::value_type(key, Value() ));
+            if ( pRet.second ) {
+                cds::unref(func)( pRet.first->second, val );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename T, typename Func>
+        std::pair<bool, bool> ensure( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( typename base_class::value_type( key, Value() ));
+            if ( pRet.second ) {
+                cds::unref(func)( true, *pRet.first );
+                return std::make_pair( true, true );
+            }
+            else {
+                cds::unref(func)( false, *pRet.first );
+                return std::make_pair( true, false );
+            }
+        }
+
+        bool erase( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::erase( key ) != 0;
+        }
+
+        template <typename T, typename Func>
+        bool erase( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            typename base_class::iterator it = base_class::find( key );
+            if ( it != base_class::end() ) {
+                cds::unref(func)( *it );
+                return base_class::erase( key ) != 0;
+            }
+            return false;
+        }
+
+        std::ostream& dump( std::ostream& stm ) { return stm; }
+    };
+}   // namespace map2
+
+#endif  // #ifndef __CDSUNIT_STD_HASH_MAP_GCC_H
diff --git a/tests/unit/map2/std_hash_map_vc.h b/tests/unit/map2/std_hash_map_vc.h
new file mode 100644 (file)
index 0000000..69b64d2
--- /dev/null
@@ -0,0 +1,87 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_HASH_MAP_VC_H
+#define __CDSUNIT_STD_HASH_MAP_VC_H
+
+#include <hash_map>
+#include <cds/ref.h>
+
+namespace map2 {
+    template <typename Key, typename Value, typename Lock, class Alloc = CDS_DEFAULT_ALLOCATOR>
+    class StdHashMap: public stdext::hash_map<Key, Value, stdext::hash_compare<Key, std::less<Key> >, Alloc>
+    {
+    public:
+        Lock m_lock;
+        typedef cds::lock::scoped_lock<Lock> AutoLock;
+        typedef stdext::hash_map<Key, Value, stdext::hash_compare<Key, std::less<Key> >, Alloc>   base_class;
+    public:
+        typedef typename base_class::mapped_type value_type;
+        typedef typename base_class::value_type  pair_type;
+        typedef size_t      item_counter;
+
+        StdHashMap( size_t nMapSize, size_t nLoadFactor )
+        {}
+
+        bool find( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::find( key ) != base_class::end();
+        }
+
+        bool insert( const Key& key, const Value& val )
+        {
+            AutoLock al( m_lock );
+            return base_class::insert( base_class::value_type(key, val)).second;
+        }
+
+        template <typename T, typename Func>
+        bool insert( const Key& key, const T& val, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<base_class::iterator, bool> pRet = base_class::insert( base_class::value_type(key, Value() ));
+            if ( pRet.second ) {
+                cds::unref(func)( pRet.first->second, val );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename T, typename Func>
+        std::pair<bool, bool> ensure( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<base_class::iterator, bool> pRet = base_class::insert( base_class::value_type(key, Value() ));
+            if ( pRet.second ) {
+                cds::unref(func)( true, *pRet.first );
+                return std::make_pair( true, true );
+            }
+            else {
+                cds::unref(func)( false, *pRet.first );
+                return std::make_pair( true, false );
+            }
+        }
+
+        bool erase( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::erase( key ) != 0;
+        }
+
+        template <typename T, typename Func>
+        bool erase( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            base_class::iterator it = base_class::find( key );
+            if ( it != base_class::end() ) {
+                cds::unref(func)( *it );
+                return base_class::erase( key ) != 0;
+            }
+            return false;
+        }
+
+
+        std::ostream& dump( std::ostream& stm ) { return stm; }
+    };
+}   // namespace map2
+
+#endif  // #ifndef __CDSUNIT_STD_HASH_MAP_VC_H
diff --git a/tests/unit/map2/std_map.h b/tests/unit/map2/std_map.h
new file mode 100644 (file)
index 0000000..d6b49e0
--- /dev/null
@@ -0,0 +1,14 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_MAP_H
+#define __CDSUNIT_STD_MAP_H
+
+#if CDS_COMPILER == CDS_COMPILER_MSVC
+#   include "map2/std_map_vc.h"
+#elif CDS_COMPILER == CDS_COMPILER_GCC || CDS_COMPILER == CDS_COMPILER_CLANG
+#   include "map2/std_map_gcc.h"
+#else
+#   error "std::map is undefined for this compiler"
+#endif
+
+#endif // #ifndef __CDSUNIT_STD_MAP_H
diff --git a/tests/unit/map2/std_map_gcc.h b/tests/unit/map2/std_map_gcc.h
new file mode 100644 (file)
index 0000000..0f2cedf
--- /dev/null
@@ -0,0 +1,89 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_MAP_GCC_H
+#define __CDSUNIT_STD_MAP_GCC_H
+
+#include <map>
+#include <cds/ref.h>
+
+namespace map2 {
+
+    template <typename Key, typename Value, typename Lock,
+        class Alloc = typename CDS_DEFAULT_ALLOCATOR::template rebind<std::pair<Key const, Value> >::other
+    >
+    class StdMap: public std::map<Key, Value, std::less<Key>, Alloc>
+    {
+        Lock m_lock;
+        typedef cds::lock::scoped_lock<Lock> AutoLock;
+        typedef std::map<Key, Value, std::less<Key>, Alloc> base_class;
+    public:
+        typedef typename base_class::mapped_type value_type;
+        typedef typename base_class::value_type  pair_type;
+        typedef size_t      item_counter;
+
+        StdMap( size_t nMapSize, size_t nLoadFactor )
+        {}
+
+        bool find( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::find( key ) != base_class::end();
+        }
+
+        bool insert( const Key& key, const Value& val )
+        {
+            AutoLock al( m_lock );
+            return base_class::insert( typename base_class::value_type(key, val)).second;
+        }
+
+        template <typename T, typename Func>
+        bool insert( const Key& key, const T& val, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( typename base_class::value_type(key, Value() ));
+            if ( pRet.second ) {
+                cds::unref(func)( pRet.first->second, val );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename T, typename Func>
+        std::pair<bool, bool> ensure( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( typename base_class::value_type(key, Value() ));
+            if ( pRet.second ) {
+                cds::unref(func)( true, *pRet.first );
+                return std::make_pair( true, true );
+            }
+            else {
+                cds::unref(func)( false, *pRet.first );
+                return std::make_pair( true, false );
+            }
+        }
+
+        bool erase( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::erase( key ) != 0;
+        }
+
+        template <typename T, typename Func>
+        bool erase( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            typename base_class::iterator it = base_class::find( key );
+            if ( it != base_class::end() ) {
+                cds::unref(func)( (*it) );
+                base_class::erase( it );
+                return true;
+            }
+            return false;
+        }
+
+        std::ostream& dump( std::ostream& stm ) { return stm; }
+    };
+}   // namespace map
+
+#endif  // #ifndef __CDSUNIT_STD_MAP_GCC_H
diff --git a/tests/unit/map2/std_map_vc.h b/tests/unit/map2/std_map_vc.h
new file mode 100644 (file)
index 0000000..dc2b78a
--- /dev/null
@@ -0,0 +1,87 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_MAP_VC_H
+#define __CDSUNIT_STD_MAP_VC_H
+
+#include <map>
+#include <cds/ref.h>
+
+namespace map2 {
+    template <typename Key, typename Value, typename Lock, class Alloc = CDS_DEFAULT_ALLOCATOR>
+    class StdMap: public std::map<Key, Value, std::less<Key>, Alloc>
+    {
+        Lock m_lock;
+        typedef cds::lock::scoped_lock<Lock> AutoLock;
+        typedef std::map<Key, Value, std::less<Key>, Alloc> base_class;
+    public:
+        typedef typename base_class::mapped_type value_type;
+        typedef typename base_class::value_type  pair_type;
+        typedef size_t      item_counter;
+
+        StdMap( size_t nMapSize, size_t nLoadFactor )
+        {}
+
+        bool find( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::find( key ) != base_class::end();
+        }
+
+        bool insert( const Key& key, const Value& val )
+        {
+            AutoLock al( m_lock );
+            return base_class::insert( base_class::value_type(key, val)).second;
+        }
+
+        template <typename T, typename Func>
+        bool insert( const Key& key, const T& val, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<base_class::iterator, bool> pRet = base_class::insert( base_class::value_type(key, Value() ));
+            if ( pRet.second ) {
+                cds::unref(func)( pRet.first->second, val );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename T, typename Func>
+        std::pair<bool, bool> ensure( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<base_class::iterator, bool> pRet = base_class::insert( base_class::value_type(key, Value() ));
+            if ( pRet.second ) {
+                cds::unref(func)( true, *pRet.first );
+                return std::make_pair( true, true );
+            }
+            else {
+                cds::unref(func)( false, *pRet.first );
+                return std::make_pair( true, false );
+            }
+        }
+
+        bool erase( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::erase( key ) != 0;
+        }
+
+        template <typename T, typename Func>
+        bool erase( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            base_class::iterator it = base_class::find( key );
+            if ( it != base_class::end() ) {
+                cds::unref(func)( *it );
+
+                base_class::erase( it );
+                return true;
+            }
+            return false;
+        }
+
+        std::ostream& dump( std::ostream& stm ) { return stm; }
+    };
+}
+
+#endif  // #ifndef __CDSUNIT_STD_MAP_VC_H
diff --git a/tests/unit/michael_alloc.cpp b/tests/unit/michael_alloc.cpp
new file mode 100644 (file)
index 0000000..404a6e3
--- /dev/null
@@ -0,0 +1,7 @@
+//$$CDS-header$$
+
+#include "michael_alloc.h"
+
+namespace memory {
+    michael_heap s_MichaelHeap;
+}
diff --git a/tests/unit/michael_alloc.h b/tests/unit/michael_alloc.h
new file mode 100644 (file)
index 0000000..a03a94d
--- /dev/null
@@ -0,0 +1,67 @@
+//$$CDS-header$$
+
+#ifndef __CDS_UNIT_MICHAEL_ALLOC_H
+#define __CDS_UNIT_MICHAEL_ALLOC_H
+
+#include <cds/memory/michael/allocator.h>
+#include <memory>
+
+namespace memory {
+
+    typedef cds::memory::michael::Heap<
+        cds::memory::michael::opt::check_bounds< cds::memory::michael::debug_bound_checking >
+    >    michael_heap;
+    extern michael_heap s_MichaelHeap;
+
+    template <class T>
+    class MichaelAllocator
+    {
+        typedef std::allocator<T>               std_allocator;
+    public:
+        // Declare typedefs from std::allocator
+        typedef typename std_allocator::const_pointer   const_pointer;
+        typedef typename std_allocator::pointer         pointer;
+        typedef typename std_allocator::const_reference const_reference;
+        typedef typename std_allocator::reference       reference;
+        typedef typename std_allocator::difference_type difference_type;
+        typedef typename std_allocator::size_type       size_type;
+        typedef typename std_allocator::value_type      value_type;
+
+        // Allocation function
+        pointer allocate( size_type _Count, const void* _Hint = NULL )
+        {
+            return reinterpret_cast<pointer>( s_MichaelHeap.alloc( sizeof(T) * _Count ));
+        }
+
+        // Deallocation function
+        void deallocate( pointer _Ptr, size_type _Count )
+        {
+            s_MichaelHeap.free( _Ptr );
+        }
+
+        pointer address( reference r ) const
+        {
+            return &r;
+        }
+        const_pointer address( const_reference r ) const
+        {
+            return &r;
+        }
+        void construct( pointer p, const T& val )
+        {
+            return new( p ) T( val );
+        }
+        void destroy( pointer p )
+        {
+            p->T::~T();
+        }
+
+        // Rebinding allocator to other type
+        template <class Other>
+        struct rebind {
+            typedef MichaelAllocator<Other> other;
+        };
+    };
+}   // namespace memory
+
+#endif
diff --git a/tests/unit/nonconcurrent_iterator_sequence.h b/tests/unit/nonconcurrent_iterator_sequence.h
new file mode 100644 (file)
index 0000000..0d45e43
--- /dev/null
@@ -0,0 +1,138 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_NONCONCURRENT_ITERATOR_SEQUENCE_H
+#define __UNIT_NONCONCURRENT_ITERATOR_SEQUENCE_H
+
+#include <cds/details/bounded_array.h>
+#include <cds/atomic.h>
+#include <algorithm>    // std::sort
+
+namespace map { namespace nonconcurrent_iterator {
+
+    class Sequence
+    {
+    public:
+        typedef int        TKey;
+        struct TValue {
+            TKey        keyControl    ;    // èñïîëüçóåòñÿ äëÿ êîíòðîëÿ, ÷òî äàííûå îòíîñÿòñÿ ê êëþ÷ó
+            int            nShuffle    ;    // ñëó÷àéíîå çíà÷åíèå, èñïîëüçóåìîå äëÿ ñîðòèðîâêè
+            TValue *    pOrigItem    ;    // óêàçàòåëü íà ýëåìåíò â ìàññèâå; òàê êàê ñïèñîê õðàíèò êîïèè,
+                                        // òî ñ ïîìîùüþ ýòîãî ïîëÿ îðãàíèçóåòñÿ äîñòóï ê èñõîäíîìó ýëåìåíòó
+
+            cds::atomics::item_counter<cds::membar_release>   nAccess        ;    // ñ÷åò÷èê äîñòóïà ïðè îáõîäå ñïèñêà ïî èòåðàòîðàì
+                                                // (Atomic, òàê êàê âîçìîæåí ïàðàëëåüíûé äîñòóï)
+
+            TValue()
+            {
+                ++nConstructCount;
+            }
+            TValue( const TValue& v )
+            {
+                memcpy( this, &v, sizeof(*this) );
+                ++nConstructCount;
+            }
+            ~TValue()
+            {
+                ++nDestructCount;
+            }
+        };
+
+        struct Data {
+            TKey    key;
+            TValue    value;
+        };
+
+    protected:
+        static size_t nConstructCount;
+        static size_t nDestructCount;
+
+    public:
+        typedef cds::details::BoundedArray<Data>        TDataArray;
+        typedef TDataArray::const_iterator              const_iterator;
+
+        TDataArray                                        arrData;
+
+        const_iterator begin() const    { return arrData.begin(); }
+        const_iterator end() const      { return arrData.end(); }
+
+    public:
+        Sequence( size_t nSize )
+            : arrData( nSize )
+        {}
+
+        static unsigned int Rand( unsigned int nMax )
+        {
+            double rnd = double( rand() ) / double( RAND_MAX );
+            unsigned int n = (unsigned int) (rnd * nMax);
+            return n < nMax ? n : (n-1);
+        }
+
+        void generateSequence()
+        {
+            // Ãåíåðèðóåì òåñòîâûé ìàññèâ äàííûõ. Ìàññèâ äîëæåí áûòü ïåðåìåøàí ñëó÷àéíûì îáðàçîì, ïîýòîìó
+            // â êà÷åñòâå çíà÷åíèÿ ïîëÿ value.nShuffle èñïîëüçóåì ñëó÷àéíîå, è ñîðòèðóåì ìàññèâ
+            // ïî ýòîìó ñëó÷àéíîìó çíà÷åíèþ
+
+            size_t nMax = arrData.capacity();
+            for ( size_t i = 0; i < nMax; ++i ) {
+                arrData[i].key = (unsigned int) i;
+                arrData[i].value.keyControl = (unsigned int) i;
+                arrData[i].value.nShuffle = Rand( (unsigned int) nMax );
+                arrData[i].value.pOrigItem = &(arrData[i].value);
+                arrData[i].value.nAccess.reset( cds::membar_relaxed::order );
+            }
+        }
+
+        void restoreLinks()
+        {
+            size_t nMax = arrData.capacity();
+            for ( size_t i = 0; i < nMax; ++i )
+                arrData[i].value.pOrigItem = &(arrData[i].value);
+        }
+
+        static bool sortValue( const Data& p1, const Data&p2 )
+        {
+            return p1.value.nShuffle < p2.value.nShuffle;
+        }
+
+        void makeRandomSortedSequence()
+        {
+            std::sort( arrData.begin(), arrData.end(), sortValue );
+            restoreLinks();
+        }
+
+        static bool sortAsc( const Data& p1, const Data&p2 )
+        {
+            return p1.key < p2.key;
+        }
+
+        void makeAscSortedSequence()
+        {
+            // Ñîðòèðóåò ìàññèâ â ïîðÿäêå âîçðàñòàíèÿ êëþ÷åé
+            std::sort( arrData.begin(), arrData.end(), sortAsc );
+            restoreLinks();
+        }
+
+        static bool sortDesc( const Data& p1, const Data&p2 )
+        {
+            return p2.key < p1.key;
+        }
+
+        void makeDescSortedSequence()
+        {
+            // Ñîðòèðóåò ìàññèâ â ïîðÿäêå óáûâàíèÿ êëþ÷åé
+            std::sort( arrData.begin(), arrData.end(), sortDesc );
+            restoreLinks();
+        }
+
+        void clearAccess()
+        {
+            size_t nMax = arrData.capacity();
+            for ( size_t i = 0; i < nMax; ++i )
+                arrData[i].value.nAccess.reset( cds::membar_relaxed::order );
+        }
+    };
+
+} } // namespace map::nonconcurrent_iterator
+
+#endif    // #ifndef __UNIT_NONCONCURRENT_ITERATOR_SEQUENCE_H
diff --git a/tests/unit/pqueue/ellen_bintree_pqueue.h b/tests/unit/pqueue/ellen_bintree_pqueue.h
new file mode 100644 (file)
index 0000000..9651d06
--- /dev/null
@@ -0,0 +1,117 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_ELLEN_BINTREE_PQUEUE_H
+#define __CDSUNIT_STD_ELLEN_BINTREE_PQUEUE_H
+
+#include <cds/container/ellen_bintree_set_hp.h>
+#include <cds/container/ellen_bintree_set_ptb.h>
+#include <cds/urcu/general_instant.h>
+#include <cds/urcu/general_buffered.h>
+#include <cds/urcu/general_threaded.h>
+#include <cds/urcu/signal_buffered.h>
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/ellen_bintree_set_rcu.h>
+
+namespace pqueue {
+
+    template <typename GC>
+    struct EllenBinTreePQueue_pop_max
+    {
+        template <typename T, typename Tree>
+        bool operator()( T& dest, Tree& container ) const
+        {
+            typename Tree::guarded_ptr gp;
+            bool bRet = container.extract_max( gp );
+            if ( bRet )
+                dest = *gp;
+            return bRet;
+        }
+    };
+
+    template <typename RCU>
+    struct EllenBinTreePQueue_pop_max< cds::urcu::gc<RCU> >
+    {
+        template <typename T, typename Tree>
+        bool operator()( T& dest, Tree& container ) const
+        {
+            typename Tree::exempt_ptr ep;
+            bool bRet = container.extract_max( ep );
+            if ( bRet )
+                dest = *ep;
+            return bRet;
+        }
+    };
+
+    template <typename GC>
+    struct EllenBinTreePQueue_pop_min
+    {
+        template <typename T, typename Tree>
+        bool operator()( T& dest, Tree& container ) const
+        {
+            typename Tree::guarded_ptr gp;
+            bool bRet = container.extract_min( gp );
+            if ( bRet )
+                dest = *gp;
+            return bRet;
+        }
+    };
+
+    template <typename RCU>
+    struct EllenBinTreePQueue_pop_min< cds::urcu::gc<RCU> >
+    {
+        template <typename T, typename Tree>
+        bool operator()( T& dest, Tree& container ) const
+        {
+            typename Tree::exempt_ptr ep;
+            bool bRet = container.extract_min( ep );
+            if ( bRet )
+                dest = *ep;
+            return bRet;
+        }
+    };
+
+    template <typename GC, typename Key, typename T, typename Traits, bool Max=true>
+    class EllenBinTreePQueue: protected cds::container::EllenBinTreeSet< GC, Key, T, Traits >
+    {
+        typedef cds::container::EllenBinTreeSet< GC, Key, T, Traits > base_class;
+        typedef T value_type;
+        template <typename GC2> friend struct EllenBinTreePQueue_pop_max;
+        template <typename GC2> friend struct EllenBinTreePQueue_pop_min;
+
+    public:
+        bool push( value_type const& val )
+        {
+            return base_class::insert( val );
+        }
+
+        bool pop( value_type& dest )
+        {
+            return Max ? EllenBinTreePQueue_pop_max< typename base_class::gc >()( dest, *this )
+                       : EllenBinTreePQueue_pop_min< typename base_class::gc >()( dest, *this );
+        }
+
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        typename base_class::stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+    };
+
+} // namespace pqueue
+
+
+#endif // #ifndef __CDSUNIT_STD_ELLEN_BINTREE_PQUEUE_H
diff --git a/tests/unit/pqueue/pop.cpp b/tests/unit/pqueue/pop.cpp
new file mode 100644 (file)
index 0000000..c7e6392
--- /dev/null
@@ -0,0 +1,240 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "pqueue/pqueue_item.h"
+#include "pqueue/pqueue_type.h"
+
+#include <vector>
+#include <algorithm>    // random_shuffle
+#include <cds/details/std/memory.h>
+
+namespace pqueue {
+
+#define TEST_CASE( Q ) void Q() { test< Types<pqueue::SimpleValue>::Q >(); }
+#define TEST_BOUNDED( Q ) void Q() { test_bounded< Types<pqueue::SimpleValue>::Q >(); }
+
+    namespace {
+        static size_t s_nThreadCount = 8;
+        static size_t s_nQueueSize = 2000000;
+    }
+} // namespace pqueue
+
+namespace pqueue {
+
+    class PQueue_Pop: public CppUnitMini::TestCase
+    {
+
+        template <class PQueue>
+        class Pusher: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Pusher( *this );
+            }
+        public:
+            PQueue&             m_Queue;
+            size_t              m_nPushError;
+
+            typedef std::vector<size_t> array_type;
+            array_type          m_arr;
+
+        public:
+            Pusher( CppUnitMini::ThreadPool& pool, PQueue& q )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+            {}
+            Pusher( Pusher& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+            {}
+
+            PQueue_Pop&  getTest()
+            {
+                return static_cast<PQueue_Pop&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPushError = 0;
+
+                for ( array_type::const_iterator it = m_arr.begin(); it != m_arr.end(); ++it ) {
+                    if ( !m_Queue.push( SimpleValue( *it ) ))
+                        ++m_nPushError;
+                }
+            }
+
+            void prepare( size_t nStart, size_t nEnd )
+            {
+                m_arr.reserve( nEnd - nStart );
+                for ( size_t i = nStart; i < nEnd; ++i )
+                    m_arr.push_back( i );
+                std::random_shuffle( m_arr.begin(), m_arr.end() );
+            }
+        };
+
+        template <class PQueue>
+        class Popper: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Popper( *this );
+            }
+        public:
+            PQueue&             m_Queue;
+            size_t              m_nPopError;
+            size_t              m_nPopSuccess;
+            size_t              m_nPopFailed;
+
+            typedef std::vector<size_t> array_type;
+            array_type          m_arr;
+
+        public:
+            Popper( CppUnitMini::ThreadPool& pool, PQueue& q )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+            {}
+            Popper( Popper& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+            {}
+
+            PQueue_Pop&  getTest()
+            {
+                return static_cast<PQueue_Pop&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPopError = 0;
+                m_nPopSuccess = 0;
+                m_nPopFailed = 0;
+
+                size_t nPrevKey;
+                SimpleValue val;
+                if ( m_Queue.pop( val )) {
+                    ++m_nPopSuccess;
+                    nPrevKey = val.key;
+
+                    while ( !m_Queue.empty() ) {
+                        if ( m_Queue.pop( val )) {
+                            ++m_nPopSuccess;
+                            if ( val.key >= nPrevKey )
+                                ++m_nPopError;
+                            nPrevKey = val.key;
+                        }
+                        else
+                            ++m_nPopFailed;
+                    }
+                }
+            }
+        };
+
+    protected:
+        template <class PQueue>
+        void test()
+        {
+            PQueue testQueue;
+            test_with( testQueue );
+        }
+
+        template <class PQueue>
+        void test_bounded()
+        {
+            std::unique_ptr<PQueue> pq( new PQueue(s_nQueueSize) );
+            test_with( *pq.get() );
+        }
+
+        template <class PQueue>
+        void test_with( PQueue& testQueue )
+        {
+            size_t const nThreadItemCount = s_nQueueSize / s_nThreadCount;
+
+            // push
+            {
+                CppUnitMini::ThreadPool pool( *this );
+                pool.add( new Pusher<PQueue>( pool, testQueue ), s_nThreadCount );
+
+                size_t nStart = 0;
+                for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                    Pusher<PQueue> * pThread = static_cast<Pusher<PQueue> *>(*it);
+                    pThread->prepare( nStart, nStart + nThreadItemCount );
+                    nStart += nThreadItemCount;
+                }
+
+                CPPUNIT_MSG( "   Push, thread count=" << s_nThreadCount << ", item count=" << nThreadItemCount * s_nThreadCount << " ..." );
+                pool.run();
+                CPPUNIT_MSG( "     Duration=" << pool.avgDuration() );
+            }
+
+            // pop
+            {
+                CppUnitMini::ThreadPool pool( *this );
+                pool.add( new Popper<PQueue>( pool, testQueue ), s_nThreadCount );
+
+                CPPUNIT_MSG( "   Pop, thread count=" << s_nThreadCount << ", item count=" << nThreadItemCount * s_nThreadCount << " ..." );
+                pool.run();
+                CPPUNIT_MSG( "     Duration=" << pool.avgDuration() );
+
+                // Analyze result
+                size_t nTotalPopped = 0;
+                size_t nTotalError = 0;
+                size_t nTotalFailed = 0;
+                for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                    Popper<PQueue> * pThread = static_cast<Popper<PQueue> *>(*it);
+
+                    nTotalPopped += pThread->m_nPopSuccess;
+                    nTotalError += pThread->m_nPopError;
+                    nTotalFailed += pThread->m_nPopFailed;
+                }
+
+                CPPUNIT_MSG( "   Total: popped=" << nTotalPopped << ", error=" << nTotalError << ", empty pop=" << nTotalFailed );
+                CPPUNIT_CHECK( nTotalPopped == nThreadItemCount * s_nThreadCount );
+                CPPUNIT_CHECK( nTotalError == 0 );
+            }
+
+            CPPUNIT_MSG( testQueue.statistics() );
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nThreadCount = cfg.getULong("ThreadCount", (unsigned long) s_nThreadCount );
+            s_nQueueSize = cfg.getULong("QueueSize", (unsigned long) s_nQueueSize );
+        }
+
+    protected:
+#include "pqueue/pqueue_defs.h"
+        CDSUNIT_DECLARE_MSPriorityQueue
+        CDSUNIT_DECLARE_EllenBinTree
+        CDSUNIT_DECLARE_SkipList
+        CDSUNIT_DECLARE_FCPriorityQueue
+        CDSUNIT_DECLARE_StdPQueue
+
+        CPPUNIT_TEST_SUITE_(PQueue_Pop, "PQueue_Push")
+            CDSUNIT_TEST_MSPriorityQueue
+            CDSUNIT_TEST_EllenBinTree
+            CDSUNIT_TEST_SkipList
+            CDSUNIT_TEST_FCPriorityQueue
+            CDUNIT_TEST_StdPQueue
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+} // namespace queue
+
+CPPUNIT_TEST_SUITE_REGISTRATION(pqueue::PQueue_Pop);
diff --git a/tests/unit/pqueue/pqueue_defs.h b/tests/unit/pqueue/pqueue_defs.h
new file mode 100644 (file)
index 0000000..5320d38
--- /dev/null
@@ -0,0 +1,178 @@
+//$$CDS-header$$
+
+#ifndef _CDSUNIT_PQUEUE_PQUEUE_DEFS_H
+#define _CDSUNIT_PQUEUE_PQUEUE_DEFS_H
+
+// MSPriorityQueue
+#define CDSUNIT_DECLARE_MSPriorityQueue \
+    TEST_BOUNDED(MSPriorityQueue_static_less)   \
+    TEST_BOUNDED(MSPriorityQueue_static_less_stat) \
+    TEST_BOUNDED(MSPriorityQueue_static_cmp)    \
+    TEST_BOUNDED(MSPriorityQueue_static_mutex)  \
+    TEST_BOUNDED(MSPriorityQueue_dyn_less)      \
+    TEST_BOUNDED(MSPriorityQueue_dyn_less_stat) \
+    TEST_BOUNDED(MSPriorityQueue_dyn_cmp)       \
+    TEST_BOUNDED(MSPriorityQueue_dyn_mutex)
+#define CDSUNIT_TEST_MSPriorityQueue    \
+    CPPUNIT_TEST(MSPriorityQueue_static_less)   \
+    CPPUNIT_TEST(MSPriorityQueue_static_less_stat) \
+    CPPUNIT_TEST(MSPriorityQueue_static_cmp)    \
+    CPPUNIT_TEST(MSPriorityQueue_static_mutex)  \
+    CPPUNIT_TEST(MSPriorityQueue_dyn_less)      \
+    CPPUNIT_TEST(MSPriorityQueue_dyn_less_stat) \
+    CPPUNIT_TEST(MSPriorityQueue_dyn_cmp)       \
+    CPPUNIT_TEST(MSPriorityQueue_dyn_mutex)
+
+
+// EllenBinTree
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#   define CDSUNIT_DECLARE_EllenBinTree_RCU_signal  \
+        TEST_CASE(EllenBinTree_RCU_shb_max) \
+        TEST_CASE(EllenBinTree_RCU_shb_max_stat) \
+        TEST_CASE(EllenBinTree_RCU_shb_min) \
+        TEST_CASE(EllenBinTree_RCU_shb_min_stat) \
+        TEST_CASE(EllenBinTree_RCU_sht_max) \
+        TEST_CASE(EllenBinTree_RCU_sht_max_stat) \
+        TEST_CASE(EllenBinTree_RCU_sht_min) \
+        TEST_CASE(EllenBinTree_RCU_sht_min_stat)
+#   define CDSUNIT_TEST_EllenBinTree_RCU_signal \
+        CPPUNIT_TEST(EllenBinTree_RCU_shb_max)  \
+        CPPUNIT_TEST(EllenBinTree_RCU_shb_max_stat)  \
+        CPPUNIT_TEST(EllenBinTree_RCU_shb_min)  \
+        CPPUNIT_TEST(EllenBinTree_RCU_shb_min_stat)  \
+        CPPUNIT_TEST(EllenBinTree_RCU_sht_max)  \
+        CPPUNIT_TEST(EllenBinTree_RCU_sht_max_stat)  \
+        CPPUNIT_TEST(EllenBinTree_RCU_sht_min) \
+        CPPUNIT_TEST(EllenBinTree_RCU_sht_min_stat)
+#else
+#   define CDSUNIT_DECLARE_EllenBinTree_RCU_signal
+#   define CDSUNIT_TEST_EllenBinTree_RCU_signal
+#endif
+
+#define CDSUNIT_DECLARE_EllenBinTree    \
+    TEST_CASE(EllenBinTree_HP_max)          \
+    TEST_CASE(EllenBinTree_HP_max_stat)     \
+    TEST_CASE(EllenBinTree_HP_min)          \
+    TEST_CASE(EllenBinTree_HP_min_stat)     \
+    TEST_CASE(EllenBinTree_PTB_max)         \
+    TEST_CASE(EllenBinTree_PTB_min)         \
+    TEST_CASE(EllenBinTree_RCU_gpi_max)     \
+    TEST_CASE(EllenBinTree_RCU_gpi_max_stat)     \
+    TEST_CASE(EllenBinTree_RCU_gpi_min)     \
+    TEST_CASE(EllenBinTree_RCU_gpi_min_stat)     \
+    TEST_CASE(EllenBinTree_RCU_gpb_max)     \
+    TEST_CASE(EllenBinTree_RCU_gpb_max_stat)     \
+    TEST_CASE(EllenBinTree_RCU_gpb_min)     \
+    TEST_CASE(EllenBinTree_RCU_gpb_min_stat)     \
+    TEST_CASE(EllenBinTree_RCU_gpt_max)     \
+    TEST_CASE(EllenBinTree_RCU_gpt_max_stat)     \
+    TEST_CASE(EllenBinTree_RCU_gpt_min)     \
+    TEST_CASE(EllenBinTree_RCU_gpt_min_stat)     \
+    CDSUNIT_DECLARE_EllenBinTree_RCU_signal
+#define CDSUNIT_TEST_EllenBinTree       \
+    CPPUNIT_TEST(EllenBinTree_HP_max)       \
+    CPPUNIT_TEST(EllenBinTree_HP_max_stat)  \
+    CPPUNIT_TEST(EllenBinTree_HP_min)       \
+    CPPUNIT_TEST(EllenBinTree_HP_min_stat)  \
+    CPPUNIT_TEST(EllenBinTree_PTB_max)      \
+    CPPUNIT_TEST(EllenBinTree_PTB_min)      \
+    /*CPPUNIT_TEST(EllenBinTree_RCU_gpi_max)*/  \
+    /*CPPUNIT_TEST(EllenBinTree_RCU_gpi_max_stat)*/  \
+    /*CPPUNIT_TEST(EllenBinTree_RCU_gpi_min)*/  \
+    /*CPPUNIT_TEST(EllenBinTree_RCU_gpi_min_stat)*/  \
+    CPPUNIT_TEST(EllenBinTree_RCU_gpb_max)  \
+    CPPUNIT_TEST(EllenBinTree_RCU_gpb_max_stat)  \
+    CPPUNIT_TEST(EllenBinTree_RCU_gpb_min)  \
+    CPPUNIT_TEST(EllenBinTree_RCU_gpb_min_stat)  \
+    CPPUNIT_TEST(EllenBinTree_RCU_gpt_max)  \
+    CPPUNIT_TEST(EllenBinTree_RCU_gpt_max_stat)  \
+    CPPUNIT_TEST(EllenBinTree_RCU_gpt_min)  \
+    CPPUNIT_TEST(EllenBinTree_RCU_gpt_min_stat)  \
+    CDSUNIT_TEST_EllenBinTree_RCU_signal
+
+
+// SkipList
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#   define CDSUNIT_DECLARE_SkipList_RCU_signal  \
+    TEST_CASE(SkipList_RCU_shb_max) \
+    TEST_CASE(SkipList_RCU_shb_min) \
+    TEST_CASE(SkipList_RCU_sht_max) \
+    TEST_CASE(SkipList_RCU_sht_min)
+#   define CDSUNIT_TEST_SkipList_RCU_signal \
+    CPPUNIT_TEST(SkipList_RCU_shb_max)  \
+    CPPUNIT_TEST(SkipList_RCU_shb_min)  \
+    CPPUNIT_TEST(SkipList_RCU_sht_max)  \
+    CPPUNIT_TEST(SkipList_RCU_sht_min)
+#else
+#   define CDSUNIT_DECLARE_SkipList_RCU_signal
+#   define CDSUNIT_TEST_SkipList_RCU_signal
+#endif
+
+#define CDSUNIT_DECLARE_SkipList    \
+    TEST_CASE(SkipList_HP_max)          \
+    TEST_CASE(SkipList_HP_max_stat)     \
+    TEST_CASE(SkipList_HP_min)          \
+    TEST_CASE(SkipList_HP_min_stat)     \
+    TEST_CASE(SkipList_HRC_max)         \
+    TEST_CASE(SkipList_HRC_min)         \
+    TEST_CASE(SkipList_PTB_max)         \
+    TEST_CASE(SkipList_PTB_min)         \
+    TEST_CASE(SkipList_RCU_gpi_max)     \
+    TEST_CASE(SkipList_RCU_gpi_min)     \
+    TEST_CASE(SkipList_RCU_gpb_max)     \
+    TEST_CASE(SkipList_RCU_gpb_min)     \
+    TEST_CASE(SkipList_RCU_gpt_max)     \
+    TEST_CASE(SkipList_RCU_gpt_min)     \
+    CDSUNIT_DECLARE_SkipList_RCU_signal
+#define CDSUNIT_TEST_SkipList       \
+    CPPUNIT_TEST(SkipList_HP_max)       \
+    CPPUNIT_TEST(SkipList_HP_max_stat)  \
+    CPPUNIT_TEST(SkipList_HP_min)       \
+    CPPUNIT_TEST(SkipList_HP_min_stat)  \
+    /*CPPUNIT_TEST(SkipList_HRC_max)*/      \
+    /*CPPUNIT_TEST(SkipList_HRC_min)*/      \
+    CPPUNIT_TEST(SkipList_PTB_max)      \
+    CPPUNIT_TEST(SkipList_PTB_min)      \
+    CPPUNIT_TEST(SkipList_RCU_gpi_max)  \
+    CPPUNIT_TEST(SkipList_RCU_gpi_min)  \
+    CPPUNIT_TEST(SkipList_RCU_gpb_max)  \
+    CPPUNIT_TEST(SkipList_RCU_gpb_min)  \
+    CPPUNIT_TEST(SkipList_RCU_gpt_max)  \
+    CPPUNIT_TEST(SkipList_RCU_gpt_min)  \
+    CDSUNIT_TEST_SkipList_RCU_signal
+
+// FCPriorityQueue
+#define CDSUNIT_DECLARE_FCPriorityQueue \
+    TEST_CASE(FCPQueue_vector)          \
+    TEST_CASE(FCPQueue_vector_stat)     \
+    TEST_CASE(FCPQueue_deque)           \
+    TEST_CASE(FCPQueue_deque_stat)      \
+    TEST_CASE(FCPQueue_boost_deque)          \
+    TEST_CASE(FCPQueue_boost_deque_stat)     \
+    TEST_CASE(FCPQueue_boost_stable_vector)  \
+    TEST_CASE(FCPQueue_boost_stable_vector_stat)
+
+#define CDSUNIT_TEST_FCPriorityQueue \
+    CPPUNIT_TEST(FCPQueue_vector)          \
+    CPPUNIT_TEST(FCPQueue_vector_stat)     \
+    CPPUNIT_TEST(FCPQueue_deque)           \
+    CPPUNIT_TEST(FCPQueue_deque_stat)      \
+    CPPUNIT_TEST(FCPQueue_boost_deque)          \
+    CPPUNIT_TEST(FCPQueue_boost_deque_stat)     \
+    CPPUNIT_TEST(FCPQueue_boost_stable_vector)  \
+    CPPUNIT_TEST(FCPQueue_boost_stable_vector_stat)
+
+// Std::priority_queue
+#define CDSUNIT_DECLARE_StdPQueue       \
+    TEST_CASE(StdPQueue_vector_spin)    \
+    TEST_CASE(StdPQueue_vector_mutex)   \
+    TEST_CASE(StdPQueue_deque_spin)     \
+    TEST_CASE(StdPQueue_deque_mutex)
+#define CDUNIT_TEST_StdPQueue           \
+    CPPUNIT_TEST(StdPQueue_vector_spin) \
+    CPPUNIT_TEST(StdPQueue_vector_mutex)\
+    CPPUNIT_TEST(StdPQueue_deque_spin)  \
+    CPPUNIT_TEST(StdPQueue_deque_mutex)
+
+
+#endif // #ifndef _CDSUNIT_PQUEUE_PQUEUE_DEFS_H
diff --git a/tests/unit/pqueue/pqueue_item.h b/tests/unit/pqueue/pqueue_item.h
new file mode 100644 (file)
index 0000000..5ce8453
--- /dev/null
@@ -0,0 +1,75 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_PQUEUE_ITEM_H
+#define __CDSUNIT_PQUEUE_ITEM_H
+
+namespace pqueue {
+    struct SimpleValue {
+        size_t      key;
+
+        typedef size_t  key_type;
+
+        struct key_extractor {
+            void operator()( key_type& k, SimpleValue const& s ) const
+            {
+                k = s.key;
+            }
+        };
+
+        SimpleValue(): key(0) {}
+        SimpleValue( size_t n ): key(n) {}
+    };
+}
+
+namespace std {
+    template <>
+    struct less<pqueue::SimpleValue>
+    {
+        bool operator()( pqueue::SimpleValue const& k1, pqueue::SimpleValue const& k2 ) const
+        {
+            return k1.key < k2.key;
+        }
+
+        bool operator()( pqueue::SimpleValue const& k1, size_t k2 ) const
+        {
+            return k1.key < k2;
+        }
+
+        bool operator()( size_t k1, pqueue::SimpleValue const& k2 ) const
+        {
+            return k1 < k2.key;
+        }
+
+        bool operator()( size_t k1, size_t k2 ) const
+        {
+            return k1 < k2;
+        }
+    };
+
+    template <>
+    struct greater<pqueue::SimpleValue>
+    {
+        bool operator()( pqueue::SimpleValue const& k1, pqueue::SimpleValue const& k2 ) const
+        {
+            return k1.key > k2.key;
+        }
+
+        bool operator()( pqueue::SimpleValue const& k1, size_t k2 ) const
+        {
+            return k1.key > k2;
+        }
+
+        bool operator()( size_t k1, pqueue::SimpleValue const& k2 ) const
+        {
+            return k1 > k2.key;
+        }
+
+        bool operator()( size_t k1, size_t k2 ) const
+        {
+            return k1 > k2;
+        }
+    };
+
+} // namespace std
+
+#endif // #ifndef __CDSUNIT_PQUEUE_ITEM_H
diff --git a/tests/unit/pqueue/pqueue_type.h b/tests/unit/pqueue/pqueue_type.h
new file mode 100644 (file)
index 0000000..7997861
--- /dev/null
@@ -0,0 +1,493 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_PQUEUE_TYPES_H
+#define __UNIT_PQUEUE_TYPES_H
+
+#include <cds/container/mspriority_queue.h>
+#include <cds/container/fcpriority_queue.h>
+
+#include "pqueue/std_pqueue.h"
+#include "pqueue/ellen_bintree_pqueue.h"
+#include "pqueue/skiplist_pqueue.h"
+
+#include <vector>
+#include <deque>
+#include <boost/container/stable_vector.hpp>
+#include <boost/container/deque.hpp>
+#include <cds/details/std/mutex.h>
+#include <cds/lock/spinlock.h>
+
+#include "print_ellenbintree_stat.h"
+#include "print_skip_list_stat.h"
+#include "print_mspriorityqueue_stat.h"
+
+namespace pqueue {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+    template <typename Value>
+    struct Types
+    {
+        static size_t const c_nBoundedCapacity = 1024 * 1024 * 16;
+
+        typedef std::less<Value>    less;
+
+        struct cmp {
+            int operator()( Value const& v1, Value const& v2 ) const
+            {
+                return less()( v1, v2 ) ? -1 : less()( v2, v1 ) ? 1 : 0;
+            }
+        };
+
+
+
+        // MSPriorityQueue
+        typedef cc::MSPriorityQueue< Value,
+            typename cc::mspriority_queue::make_traits<
+                co::buffer< co::v::static_buffer< char, c_nBoundedCapacity > >
+            >::type
+        > MSPriorityQueue_static_less;
+
+        typedef cc::MSPriorityQueue< Value,
+            typename cc::mspriority_queue::make_traits<
+                co::buffer< co::v::static_buffer< char, c_nBoundedCapacity > >
+                ,co::stat< cc::mspriority_queue::stat<> >
+            >::type
+        > MSPriorityQueue_static_less_stat;
+
+        typedef cc::MSPriorityQueue< Value,
+            typename cc::mspriority_queue::make_traits<
+                co::buffer< co::v::static_buffer< char, c_nBoundedCapacity > >
+                ,co::compare< cmp >
+            >::type
+        > MSPriorityQueue_static_cmp;
+
+        typedef cc::MSPriorityQueue< Value,
+            typename cc::mspriority_queue::make_traits<
+                co::buffer< co::v::static_buffer< char, c_nBoundedCapacity > >
+                ,co::lock_type<cds_std::mutex>
+            >::type
+        > MSPriorityQueue_static_mutex;
+
+        typedef cc::MSPriorityQueue< Value,
+            typename cc::mspriority_queue::make_traits<
+                co::buffer< co::v::dynamic_buffer< char > >
+            >::type
+        > MSPriorityQueue_dyn_less;
+
+        typedef cc::MSPriorityQueue< Value,
+            typename cc::mspriority_queue::make_traits<
+                co::buffer< co::v::dynamic_buffer< char > >
+                ,co::stat< cc::mspriority_queue::stat<> >
+            >::type
+        > MSPriorityQueue_dyn_less_stat;
+
+        typedef cc::MSPriorityQueue< Value,
+            typename cc::mspriority_queue::make_traits<
+                co::buffer< co::v::dynamic_buffer< char > >
+                ,co::compare< cmp >
+            >::type
+        > MSPriorityQueue_dyn_cmp;
+
+        typedef cc::MSPriorityQueue< Value,
+            typename cc::mspriority_queue::make_traits<
+                co::buffer< co::v::dynamic_buffer< char > >
+                ,co::lock_type<cds_std::mutex>
+            >::type
+        > MSPriorityQueue_dyn_mutex;
+
+
+        // Priority queue based on EllenBinTreeSet
+        typedef EllenBinTreePQueue< cds::gc::HP, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+            >::type
+        > EllenBinTree_HP_max;
+
+        typedef EllenBinTreePQueue< cds::gc::HP, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > EllenBinTree_HP_max_stat;
+
+        typedef EllenBinTreePQueue< cds::gc::HP, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+            >::type, false
+        > EllenBinTree_HP_min;
+
+        typedef EllenBinTreePQueue< cds::gc::HP, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type, false
+        > EllenBinTree_HP_min_stat;
+
+        typedef EllenBinTreePQueue< cds::gc::PTB, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+            >::type
+        > EllenBinTree_PTB_max;
+
+        typedef EllenBinTreePQueue< cds::gc::PTB, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+            >::type, false
+        > EllenBinTree_PTB_min;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_instant<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+            >::type
+        > EllenBinTree_RCU_gpi_max;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_instant<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > EllenBinTree_RCU_gpi_max_stat;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_instant<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+            >::type, false
+        > EllenBinTree_RCU_gpi_min;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_instant<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type, false
+        > EllenBinTree_RCU_gpi_min_stat;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_buffered<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+            >::type
+        > EllenBinTree_RCU_gpb_max;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_buffered<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > EllenBinTree_RCU_gpb_max_stat;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_buffered<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+            >::type, false
+        > EllenBinTree_RCU_gpb_min;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_buffered<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type, false
+        > EllenBinTree_RCU_gpb_min_stat;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_threaded<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+            >::type
+        > EllenBinTree_RCU_gpt_max;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_threaded<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > EllenBinTree_RCU_gpt_max_stat;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_threaded<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+            >::type, false
+        > EllenBinTree_RCU_gpt_min;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::general_threaded<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type, false
+        > EllenBinTree_RCU_gpt_min_stat;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::signal_buffered<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+            >::type
+        > EllenBinTree_RCU_shb_max;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::signal_buffered<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > EllenBinTree_RCU_shb_max_stat;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::signal_buffered<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+            >::type, false
+        > EllenBinTree_RCU_shb_min;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::signal_buffered<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type, false
+        > EllenBinTree_RCU_shb_min_stat;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::signal_threaded<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+            >::type
+        > EllenBinTree_RCU_sht_max;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::signal_threaded<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::less<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type
+        > EllenBinTree_RCU_sht_max_stat;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::signal_threaded<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+            >::type, false
+        > EllenBinTree_RCU_sht_min;
+
+        typedef EllenBinTreePQueue< cds::urcu::gc< cds::urcu::signal_threaded<> >, typename Value::key_type, Value,
+            typename cc::ellen_bintree::make_set_traits<
+                cc::ellen_bintree::key_extractor< typename Value::key_extractor >
+                ,cc::opt::less< std::greater<Value> >
+                ,co::stat< cc::ellen_bintree::stat<> >
+            >::type, false
+        > EllenBinTree_RCU_sht_min_stat;
+#endif
+
+        // Priority queue based on SkipListSet
+        typedef SkipListPQueue< cds::gc::HP, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::less<Value> >
+            >::type
+        > SkipList_HP_max;
+
+        typedef SkipListPQueue< cds::gc::HP, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::less<Value> >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > SkipList_HP_max_stat;
+
+        typedef SkipListPQueue< cds::gc::HP, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::greater<Value> >
+            >::type, false
+        > SkipList_HP_min;
+
+        typedef SkipListPQueue< cds::gc::HP, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::greater<Value> >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type, false
+        > SkipList_HP_min_stat;
+
+        typedef SkipListPQueue< cds::gc::HRC, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::less<Value> >
+            >::type
+        > SkipList_HRC_max;
+
+        typedef SkipListPQueue< cds::gc::HRC, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::greater<Value> >
+            >::type, false
+        > SkipList_HRC_min;
+
+        typedef SkipListPQueue< cds::gc::PTB, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::less<Value> >
+            >::type
+        > SkipList_PTB_max;
+
+        typedef SkipListPQueue< cds::gc::PTB, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::greater<Value> >
+            >::type, false
+        > SkipList_PTB_min;
+
+        typedef SkipListPQueue< cds::urcu::gc< cds::urcu::general_instant<> >, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::less<Value> >
+            >::type
+        > SkipList_RCU_gpi_max;
+
+        typedef SkipListPQueue< cds::urcu::gc< cds::urcu::general_instant<> >, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::greater<Value> >
+            >::type, false
+        > SkipList_RCU_gpi_min;
+
+        typedef SkipListPQueue< cds::urcu::gc< cds::urcu::general_buffered<> >, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::less<Value> >
+            >::type
+        > SkipList_RCU_gpb_max;
+
+        typedef SkipListPQueue< cds::urcu::gc< cds::urcu::general_buffered<> >, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::greater<Value> >
+            >::type, false
+        > SkipList_RCU_gpb_min;
+
+        typedef SkipListPQueue< cds::urcu::gc< cds::urcu::general_threaded<> >, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::less<Value> >
+            >::type
+        > SkipList_RCU_gpt_max;
+
+        typedef SkipListPQueue< cds::urcu::gc< cds::urcu::general_threaded<> >, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::greater<Value> >
+            >::type, false
+        > SkipList_RCU_gpt_min;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef SkipListPQueue< cds::urcu::gc< cds::urcu::signal_buffered<> >, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::less<Value> >
+            >::type
+        > SkipList_RCU_shb_max;
+
+        typedef SkipListPQueue< cds::urcu::gc< cds::urcu::signal_buffered<> >, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::greater<Value> >
+            >::type, false
+        > SkipList_RCU_shb_min;
+
+        typedef SkipListPQueue< cds::urcu::gc< cds::urcu::signal_threaded<> >, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::less<Value> >
+            >::type
+        > SkipList_RCU_sht_max;
+
+        typedef SkipListPQueue< cds::urcu::gc< cds::urcu::signal_threaded<> >, Value,
+            typename cc::skip_list::make_traits<
+                cc::opt::less< std::greater<Value> >
+            >::type, false
+        > SkipList_RCU_sht_min;
+#endif
+
+        // FCPriorityQueue
+        typedef cds::container::fcpqueue::make_traits<
+            cds::opt::stat< cds::container::fcpqueue::stat<> >
+        >::type traits_FCPQueue_stat;
+
+        typedef cds::container::FCPriorityQueue< Value >    FCPQueue_vector;
+        typedef cds::container::FCPriorityQueue< Value
+            ,std::priority_queue<Value>
+            ,traits_FCPQueue_stat
+        >    FCPQueue_vector_stat;
+
+        typedef cds::container::FCPriorityQueue< Value
+            ,std::priority_queue<Value, std::deque<Value> >
+        > FCPQueue_deque;
+        typedef cds::container::FCPriorityQueue< Value
+            ,std::priority_queue<Value, std::deque<Value> >
+            ,traits_FCPQueue_stat
+        > FCPQueue_deque_stat;
+
+        typedef cds::container::FCPriorityQueue< Value
+            ,std::priority_queue<Value, boost::container::deque<Value> >
+        > FCPQueue_boost_deque;
+        typedef cds::container::FCPriorityQueue< Value
+            ,std::priority_queue<Value, boost::container::deque<Value> >
+            ,traits_FCPQueue_stat
+        > FCPQueue_boost_deque_stat;
+
+        typedef cds::container::FCPriorityQueue< Value
+            ,std::priority_queue<Value, boost::container::stable_vector<Value> >
+        > FCPQueue_boost_stable_vector;
+        typedef cds::container::FCPriorityQueue< Value
+            ,std::priority_queue<Value, boost::container::stable_vector<Value> >
+            ,traits_FCPQueue_stat
+        > FCPQueue_boost_stable_vector_stat;
+
+        /// Standard priority_queue
+        typedef StdPQueue< Value, std::vector<Value>, cds::lock::Spin > StdPQueue_vector_spin;
+        typedef StdPQueue< Value, std::vector<Value>, cds_std::mutex >  StdPQueue_vector_mutex;
+        typedef StdPQueue< Value, std::deque<Value>,  cds::lock::Spin > StdPQueue_deque_spin;
+        typedef StdPQueue< Value, std::deque<Value>,  cds_std::mutex >  StdPQueue_deque_mutex;
+    };
+
+
+    template <typename Stat>
+    static inline void check_statistics( Stat const& s )
+    {}
+
+    static inline void check_statistics( cds::container::ellen_bintree::stat<> const& s )
+    {
+        CPPUNIT_CHECK_CURRENT( s.m_nInternalNodeCreated.get() == s.m_nInternalNodeDeleted.get() );
+        CPPUNIT_CHECK_CURRENT( s.m_nUpdateDescCreated.get() == s.m_nUpdateDescDeleted.get() );
+    }
+}   // namespace pqueue
+
+namespace std {
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::container::fcpqueue::empty_stat const& )
+    {
+        return o;
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::container::fcpqueue::stat<> const& s )
+    {
+        return o << "\tStatistics:\n"
+            << "\t              Push: " << s.m_nPush.get()         << "\n"
+            << "\t         Push move: " << s.m_nPushMove.get()     << "\n"
+            << "\t               Pop: " << s.m_nPop.get()          << "\n"
+            << "\t        Failed pop: " << s.m_nFailedPop.get()    << "\n"
+            << "\tFlat combining statistics:\n"
+            << "\t        Combining factor: " << s.combining_factor()         << "\n"
+            << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
+            << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
+            << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
+            << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
+            << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
+            << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
+            << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
+            << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
+            << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
+    }
+
+} // namespace std
+
+#endif // #ifndef __UNIT_PQUEUE_TYPES_H
diff --git a/tests/unit/pqueue/push.cpp b/tests/unit/pqueue/push.cpp
new file mode 100644 (file)
index 0000000..0c4c121
--- /dev/null
@@ -0,0 +1,199 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "pqueue/pqueue_item.h"
+#include "pqueue/pqueue_type.h"
+
+#include <vector>
+#include <algorithm>    // random_shuffle
+#include <cds/details/std/memory.h>
+
+namespace pqueue {
+
+#define TEST_CASE( Q ) void Q() { test< Types<pqueue::SimpleValue>::Q >(); }
+#define TEST_BOUNDED( Q ) void Q() { test_bounded< Types<pqueue::SimpleValue>::Q >(); }
+
+    namespace {
+        static size_t s_nThreadCount = 8;
+        static size_t s_nQueueSize = 2000000;
+    }
+} // namespace pqueue
+
+namespace pqueue {
+
+    class PQueue_Push: public CppUnitMini::TestCase
+    {
+        template <class PQueue>
+        class Pusher: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Pusher( *this );
+            }
+        public:
+            PQueue&             m_Queue;
+            size_t              m_nPushError;
+
+            typedef std::vector<size_t> array_type;
+            array_type          m_arr;
+
+        public:
+            Pusher( CppUnitMini::ThreadPool& pool, PQueue& q )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+            {}
+            Pusher( Pusher& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+            {}
+
+            PQueue_Push&  getTest()
+            {
+                return static_cast<PQueue_Push&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPushError = 0;
+
+                for ( array_type::const_iterator it = m_arr.begin(); it != m_arr.end(); ++it ) {
+                    if ( !m_Queue.push( SimpleValue( *it ) ))
+                        ++m_nPushError;
+                }
+            }
+
+            void prepare( size_t nStart, size_t nEnd )
+            {
+                m_arr.reserve( nEnd - nStart );
+                for ( size_t i = nStart; i < nEnd; ++i )
+                    m_arr.push_back( i );
+                std::random_shuffle( m_arr.begin(), m_arr.end() );
+            }
+        };
+
+    protected:
+        template <class PQueue>
+        void analyze( CppUnitMini::ThreadPool& pool, PQueue& testQueue  )
+        {
+            size_t nThreadItems = s_nQueueSize / s_nThreadCount;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Pusher<PQueue> * pThread = static_cast<Pusher<PQueue> *>(*it);
+                CPPUNIT_CHECK_EX( pThread->m_nPushError == 0, "Thread push error count=" << pThread->m_nPushError );
+            }
+            CPPUNIT_MSG( "     Duration=" << pool.avgDuration() );
+            CPPUNIT_ASSERT( !testQueue.empty() );
+
+            typedef std::vector<size_t> vector_type;
+            vector_type arr;
+            arr.reserve( s_nQueueSize );
+
+            cds::OS::Timer      timer;
+            CPPUNIT_MSG( "   Pop (single-threaded)..." );
+            size_t nPopped = 0;
+            SimpleValue val;
+            while ( testQueue.pop( val )) {
+                nPopped++;
+                arr.push_back( val.key );
+            }
+            CPPUNIT_MSG( "     Duration=" << timer.duration() );
+
+            CPPUNIT_CHECK( arr.size() == nThreadItems * s_nThreadCount );
+            vector_type::const_iterator it = arr.begin();
+            size_t nPrev = *it;
+            ++it;
+            size_t nErrCount = 0;
+            for ( vector_type::const_iterator itEnd = arr.end(); it != itEnd; ++it ) {
+                if ( nPrev - 1 != *it ) {
+                    if ( ++nErrCount < 10 ) {
+                        CPPUNIT_CHECK_EX( nPrev - 1 == *it, "Expected=" << nPrev - 1 << ", current=" << *it );
+                    }
+                }
+                nPrev = *it;
+            }
+
+            CPPUNIT_CHECK_EX( nErrCount == 0, "Error count=" << nErrCount );
+        }
+
+        template <class PQueue>
+        void test()
+        {
+            PQueue testQueue;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Pusher<PQueue>( pool, testQueue ), s_nThreadCount );
+
+            size_t nStart = 0;
+            size_t nThreadItemCount = s_nQueueSize / s_nThreadCount;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Pusher<PQueue> * pThread = static_cast<Pusher<PQueue> *>(*it);
+                pThread->prepare( nStart, nStart + nThreadItemCount );
+                nStart += nThreadItemCount;
+            }
+
+            CPPUNIT_MSG( "   Push test, thread count=" << s_nThreadCount << ", item count=" << nThreadItemCount * s_nThreadCount << " ..." );
+            pool.run();
+
+            analyze( pool, testQueue );
+
+            CPPUNIT_MSG( testQueue.statistics() );
+        }
+
+        template <class PQueue>
+        void test_bounded()
+        {
+            size_t nStart = 0;
+            size_t nThreadItemCount = s_nQueueSize / s_nThreadCount;
+
+            std::unique_ptr<PQueue> pq( new PQueue(s_nQueueSize) );
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Pusher<PQueue>( pool, *pq ), s_nThreadCount );
+
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Pusher<PQueue> * pThread = static_cast<Pusher<PQueue> *>(*it);
+                pThread->prepare( nStart, nStart + nThreadItemCount );
+                nStart += nThreadItemCount;
+            }
+
+            CPPUNIT_MSG( "   Push test, thread count=" << s_nThreadCount << ", item count=" << nThreadItemCount * s_nThreadCount << " ..." );
+            pool.run();
+
+            analyze( pool, *pq );
+
+            CPPUNIT_MSG( pq->statistics() );
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nThreadCount = cfg.getULong("ThreadCount", (unsigned long) s_nThreadCount );
+            s_nQueueSize = cfg.getULong("QueueSize", (unsigned long) s_nQueueSize );
+        }
+
+    protected:
+#include "pqueue/pqueue_defs.h"
+        CDSUNIT_DECLARE_MSPriorityQueue
+        CDSUNIT_DECLARE_EllenBinTree
+        CDSUNIT_DECLARE_SkipList
+        CDSUNIT_DECLARE_FCPriorityQueue
+        CDSUNIT_DECLARE_StdPQueue
+
+        CPPUNIT_TEST_SUITE(PQueue_Push)
+            CDSUNIT_TEST_MSPriorityQueue
+            CDSUNIT_TEST_EllenBinTree
+            CDSUNIT_TEST_SkipList
+            CDSUNIT_TEST_FCPriorityQueue
+            CDUNIT_TEST_StdPQueue
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+} // namespace queue
+
+CPPUNIT_TEST_SUITE_REGISTRATION(pqueue::PQueue_Push);
diff --git a/tests/unit/pqueue/push_pop.cpp b/tests/unit/pqueue/push_pop.cpp
new file mode 100644 (file)
index 0000000..84b69aa
--- /dev/null
@@ -0,0 +1,239 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "pqueue/pqueue_item.h"
+#include "pqueue/pqueue_type.h"
+
+#include <vector>
+#include <algorithm>    // random_shuffle
+#include <cds/details/std/memory.h>
+
+namespace pqueue {
+
+#define TEST_CASE( Q ) void Q() { test< Types<pqueue::SimpleValue>::Q >(); }
+#define TEST_BOUNDED( Q ) void Q() { test_bounded< Types<pqueue::SimpleValue>::Q >(); }
+
+    namespace {
+        static size_t s_nPushThreadCount = 4;
+        static size_t s_nPopThreadCount = 4;
+        static size_t s_nQueueSize = 2000000;
+    }
+} // namespace pqueue
+
+namespace pqueue {
+
+    class PQueue_PushPop: public CppUnitMini::TestCase
+    {
+
+        template <class PQueue>
+        class Pusher: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Pusher( *this );
+            }
+        public:
+            PQueue&             m_Queue;
+            size_t              m_nPushError;
+
+            typedef std::vector<size_t> array_type;
+            array_type          m_arr;
+
+        public:
+            Pusher( CppUnitMini::ThreadPool& pool, PQueue& q )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+            {}
+            Pusher( Pusher& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+            {}
+
+            PQueue_PushPop&  getTest()
+            {
+                return static_cast<PQueue_PushPop&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPushError = 0;
+
+                for ( array_type::const_iterator it = m_arr.begin(); it != m_arr.end(); ++it ) {
+                    if ( !m_Queue.push( SimpleValue( *it ) ))
+                        ++m_nPushError;
+                }
+
+                getTest().end_pusher();
+            }
+
+            void prepare( size_t nStart, size_t nEnd )
+            {
+                m_arr.reserve( nEnd - nStart );
+                for ( size_t i = nStart; i < nEnd; ++i )
+                    m_arr.push_back( i );
+                std::random_shuffle( m_arr.begin(), m_arr.end() );
+            }
+        };
+
+        template <class PQueue>
+        class Popper: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Popper( *this );
+            }
+        public:
+            PQueue&             m_Queue;
+            size_t              m_nPopSuccess;
+            size_t              m_nPopFailed;
+
+            typedef std::vector<size_t> array_type;
+            array_type          m_arr;
+
+        public:
+            Popper( CppUnitMini::ThreadPool& pool, PQueue& q )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+            {}
+            Popper( Popper& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+            {}
+
+            PQueue_PushPop&  getTest()
+            {
+                return static_cast<PQueue_PushPop&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPopSuccess = 0;
+                m_nPopFailed = 0;
+
+                SimpleValue val;
+                while ( getTest().pushing() || !m_Queue.empty() ) {
+                    if ( m_Queue.pop( val ))
+                        ++m_nPopSuccess;
+                    else
+                        ++m_nPopFailed;
+                }
+            }
+        };
+
+        size_t  m_nPusherCount;
+        void end_pusher()
+        {
+            --m_nPusherCount;
+        }
+        bool pushing() const
+        {
+            return m_nPusherCount != 0;
+        }
+
+    protected:
+        template <class PQueue>
+        void test()
+        {
+            PQueue testQueue;
+            test_with( testQueue );
+        }
+
+        template <class PQueue>
+        void test_bounded()
+        {
+            std::unique_ptr<PQueue> pq( new PQueue(s_nQueueSize) );
+            test_with( *pq.get() );
+        }
+
+        template <class PQueue>
+        void test_with( PQueue& testQueue )
+        {
+            size_t const nThreadItemCount = s_nQueueSize / s_nPushThreadCount;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Pusher<PQueue>( pool, testQueue ), s_nPushThreadCount );
+
+            size_t nStart = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Pusher<PQueue> * pThread = static_cast<Pusher<PQueue> *>(*it);
+                pThread->prepare( nStart, nStart + nThreadItemCount );
+                nStart += nThreadItemCount;
+            }
+
+            pool.add( new Popper<PQueue>( pool, testQueue ), s_nPopThreadCount );
+
+            m_nPusherCount = s_nPushThreadCount;
+            CPPUNIT_MSG( "   push thread count=" << s_nPushThreadCount << " pop thread count=" << s_nPopThreadCount
+                << ", item count=" << nThreadItemCount * s_nPushThreadCount << " ..." );
+            pool.run();
+            CPPUNIT_MSG( "     Duration=" << pool.avgDuration() );
+
+            // Analyze result
+            size_t nTotalPopped = 0;
+            size_t nPushFailed = 0;
+            size_t nPopFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Popper<PQueue> * pPopper = dynamic_cast<Popper<PQueue> *>(*it);
+                if ( pPopper ) {
+                    nTotalPopped += pPopper->m_nPopSuccess;
+                    nPopFailed += pPopper->m_nPopFailed;
+                }
+                else {
+                    Pusher<PQueue> * pPusher = dynamic_cast<Pusher<PQueue> *>(*it);
+                    assert( pPusher );
+                    nPushFailed += pPusher->m_nPushError;
+                }
+            }
+
+            CPPUNIT_MSG( "   Total: popped=" << nTotalPopped << ", empty pop=" << nPopFailed << ", push error=" << nPushFailed );
+            CPPUNIT_CHECK( nTotalPopped == nThreadItemCount * s_nPushThreadCount );
+            CPPUNIT_CHECK( nPushFailed == 0 );
+
+            check_statistics( testQueue.statistics() );
+            CPPUNIT_MSG( testQueue.statistics() );
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nPushThreadCount = cfg.getULong("PushThreadCount", (unsigned long) s_nPushThreadCount );
+            s_nPopThreadCount = cfg.getULong("PopThreadCount", (unsigned long) s_nPopThreadCount );
+            s_nQueueSize = cfg.getULong("QueueSize", (unsigned long) s_nQueueSize );
+        }
+
+    protected:
+#include "pqueue/pqueue_defs.h"
+        CDSUNIT_DECLARE_MSPriorityQueue
+        CDSUNIT_DECLARE_EllenBinTree
+        CDSUNIT_DECLARE_SkipList
+        CDSUNIT_DECLARE_FCPriorityQueue
+        CDSUNIT_DECLARE_StdPQueue
+
+        CPPUNIT_TEST_SUITE(PQueue_PushPop)
+            CDSUNIT_TEST_MSPriorityQueue
+            CDSUNIT_TEST_EllenBinTree
+            CDSUNIT_TEST_SkipList
+            CDSUNIT_TEST_FCPriorityQueue
+            CDUNIT_TEST_StdPQueue
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+} // namespace queue
+
+CPPUNIT_TEST_SUITE_REGISTRATION(pqueue::PQueue_PushPop);
diff --git a/tests/unit/pqueue/skiplist_pqueue.h b/tests/unit/pqueue/skiplist_pqueue.h
new file mode 100644 (file)
index 0000000..99bd9c2
--- /dev/null
@@ -0,0 +1,117 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_SKIPLIST_PQUEUE_H
+#define __CDSUNIT_SKIPLIST_PQUEUE_H
+
+#include <cds/container/skip_list_set_hp.h>
+#include <cds/container/skip_list_set_hrc.h>
+#include <cds/container/skip_list_set_ptb.h>
+#include <cds/urcu/general_instant.h>
+#include <cds/urcu/general_buffered.h>
+#include <cds/urcu/general_threaded.h>
+#include <cds/urcu/signal_buffered.h>
+#include <cds/urcu/signal_threaded.h>
+#include <cds/container/skip_list_set_rcu.h>
+
+namespace pqueue {
+
+    template <typename GC>
+    struct SkipListPQueue_pop_max
+    {
+        template <typename T, typename Set>
+        bool operator()( T& dest, Set& container ) const
+        {
+            typename Set::guarded_ptr gp;
+            bool bRet = container.extract_max( gp );
+            if ( bRet )
+                dest = *gp;
+            return bRet;
+        }
+    };
+
+    template <typename RCU>
+    struct SkipListPQueue_pop_max< cds::urcu::gc<RCU> >
+    {
+        template <typename T, typename Set>
+        bool operator()( T& dest, Set& container ) const
+        {
+            typename Set::exempt_ptr ep;
+            bool bRet = container.extract_max( ep );
+            if ( bRet )
+                dest = *ep;
+            return bRet;
+        }
+    };
+
+    template <typename GC>
+    struct SkipListPQueue_pop_min
+    {
+        template <typename T, typename Set>
+        bool operator()( T& dest, Set& container ) const
+        {
+            typename Set::guarded_ptr gp;
+            bool bRet = container.extract_min( gp );
+            if ( bRet )
+                dest = *gp;
+            return bRet;
+        }
+    };
+
+    template <typename RCU>
+    struct SkipListPQueue_pop_min< cds::urcu::gc<RCU> >
+    {
+        template <typename T, typename Set>
+        bool operator()( T& dest, Set& container ) const
+        {
+            typename Set::exempt_ptr ep;
+            bool bRet = container.extract_min( ep );
+            if ( bRet )
+                dest = *ep;
+            return bRet;
+        }
+    };
+
+    template <typename GC, typename T, typename Traits, bool Max=true>
+    class SkipListPQueue: protected cds::container::SkipListSet< GC, T, Traits >
+    {
+        typedef cds::container::SkipListSet< GC, T, Traits > base_class;
+        typedef T value_type;
+        template <typename GC2> friend struct SkipListPQueue_pop_max;
+        template <typename GC2> friend struct SkipListPQueue_pop_min;
+
+    public:
+        bool push( value_type const& val )
+        {
+            return base_class::insert( val );
+        }
+
+        bool pop( value_type& dest )
+        {
+            return Max ? SkipListPQueue_pop_max< typename base_class::gc >()( dest, *this )
+                       : SkipListPQueue_pop_min< typename base_class::gc >()( dest, *this );
+        }
+
+        void clear()
+        {
+            base_class::clear();
+        }
+
+        bool empty() const
+        {
+            return base_class::empty();
+        }
+
+        size_t size() const
+        {
+            return base_class::size();
+        }
+
+        typename base_class::stat const& statistics() const
+        {
+            return base_class::statistics();
+        }
+    };
+
+} // namespace pqueue
+
+#endif // #ifndef __CDSUNIT_SKIPLIST_PQUEUE_H
diff --git a/tests/unit/pqueue/std_pqueue.h b/tests/unit/pqueue/std_pqueue.h
new file mode 100644 (file)
index 0000000..85c19e6
--- /dev/null
@@ -0,0 +1,110 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_PQUEUE_H
+#define __CDSUNIT_STD_PQUEUE_H
+
+#include <queue>
+
+namespace pqueue {
+
+    struct dummy_stat {};
+
+    template <typename T, typename Container, typename Lock, typename Less=std::less<typename Container::value_type> >
+    class StdPQueue
+    {
+        typedef T value_type;
+        typedef std::priority_queue<value_type, Container, Less> pqueue_type;
+
+        pqueue_type     m_PQueue;
+        mutable Lock    m_Lock;
+
+        struct scoped_lock
+        {
+            Lock&   m_lock;
+
+            scoped_lock( Lock& l )
+                : m_lock(l)
+            {
+                l.lock();
+            }
+
+            ~scoped_lock()
+            {
+                m_lock.unlock();
+            }
+        };
+
+    public:
+        bool push( value_type const& val )
+        {
+            scoped_lock l( m_Lock );
+            m_PQueue.push( val );
+            return true;
+        }
+
+        bool pop( value_type& dest )
+        {
+            scoped_lock l( m_Lock );
+            if ( !m_PQueue.empty() ) {
+                dest = m_PQueue.top();
+                m_PQueue.pop();
+                return true;
+            }
+            return false;
+        }
+
+        template <typename Q, typename MoveFunc>
+        bool pop_with( Q& dest, MoveFunc f )
+        {
+            scoped_lock l( m_Lock );
+            if ( !m_PQueue.empty() ) {
+                f( dest, m_PQueue.top());
+                m_PQueue.pop();
+                return true;
+            }
+            return false;
+        }
+
+        void clear()
+        {
+            scoped_lock l( m_Lock );
+            while ( !m_PQueue.empty() )
+                m_PQueue.pop();
+        }
+
+        template <typename Func>
+        void clear_with( Func f )
+        {
+            scoped_lock l( m_Lock );
+            while ( !m_PQueue.empty() ) {
+                f( m_PQueue.top() );
+                m_PQueue.pop();
+            }
+        }
+
+        bool empty() const
+        {
+            return m_PQueue.empty();
+        }
+
+        size_t size() const
+        {
+            return m_PQueue.size();
+        }
+
+        dummy_stat statistics() const
+        {
+            return dummy_stat();
+        }
+    };
+
+} // namespace pqueue
+
+namespace std {
+    static inline ostream& operator <<( ostream& o, pqueue::dummy_stat )
+    {
+        return o;
+    }
+}
+
+#endif // #ifndef __CDSUNIT_STD_PQUEUE_H
diff --git a/tests/unit/print_cuckoo_stat.h b/tests/unit/print_cuckoo_stat.h
new file mode 100644 (file)
index 0000000..544e670
--- /dev/null
@@ -0,0 +1,89 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_PRINT_CUCKOO_STAT_H
+#define __UNIT_PRINT_CUCKOO_STAT_H
+
+#include <cds/intrusive/cuckoo_set.h>
+#include <ostream>
+
+namespace std {
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::cuckoo::striping_stat const& s )
+    {
+        return o << "\tStriping statistis [cds::intrusive::cuckoo::striping_stat]:\n"
+            << "\t\t    m_nCellLockCount: " << s.m_nCellLockCount.get()     << "\n"
+            << "\t\t m_nCellTryLockCount: " << s.m_nCellTryLockCount.get()  << "\n"
+            << "\t\t    m_nFullLockCount: " << s.m_nFullLockCount.get()     << "\n"
+            << "\t\t  m_nResizeLockCount: " << s.m_nResizeLockCount.get()   << "\n"
+            << "\t\t      m_nResizeCount: " << s.m_nResizeCount.get()       << "\n"
+;
+    }
+    static inline ostream& operator <<( ostream& o, cds::intrusive::cuckoo::empty_striping_stat const& s )
+    {
+        return o;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::cuckoo::refinable_stat const& s )
+    {
+        return o << "\tRefinable statistics [cds::intrusive::cuckoo::refinable_stat]:\n"
+            << "\t\t          m_nCellLockCount: " << s.m_nCellLockCount.get()           << "\n"
+            << "\t\t   m_nCellLockWaitResizing: " << s.m_nCellLockWaitResizing.get()    << "\n"
+            << "\t\t   m_nCellLockArrayChanged: " << s.m_nCellLockArrayChanged.get()    << "\n"
+            << "\t\t         m_nCellLockFailed: " << s.m_nCellLockFailed.get()          << "\n"
+            << "\t\t    m_nSecondCellLockCount: " << s.m_nSecondCellLockCount.get()     << "\n"
+            << "\t\t   m_nSecondCellLockFailed: " << s.m_nSecondCellLockFailed.get()    << "\n"
+            << "\t\t          m_nFullLockCount: " << s.m_nFullLockCount.get()           << "\n"
+            << "\t\t           m_nFullLockIter: " << s.m_nFullLockIter.get()            << "\n"
+            << "\t\t        m_nResizeLockCount: " << s.m_nResizeLockCount.get()         << "\n"
+            << "\t\t         m_nResizeLockIter: " << s.m_nResizeLockIter.get()          << "\n"
+            << "\t\t m_nResizeLockArrayChanged: " << s.m_nResizeLockArrayChanged.get()  << "\n"
+            << "\t\t            m_nResizeCount: " << s.m_nResizeCount.get()             << "\n"
+;
+    }
+    static inline ostream& operator <<( ostream& o, cds::intrusive::cuckoo::empty_refinable_stat const& s )
+    {
+        return o;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::cuckoo::stat const& s )
+    {
+        return o << "\tCuckoo stat [cds::intrusive::cuckoo::stat]:\n"
+            << "\t\t           m_nRelocateCallCount: " << s.m_nRelocateCallCount.get()              << "\n"
+            << "\t\t          m_nRelocateRoundCount: " << s.m_nRelocateRoundCount.get()             << "\n"
+            << "\t\t          m_nFalseRelocateCount: " << s.m_nFalseRelocateCount.get()             << "\n"
+            << "\t\t        m_nSuccessRelocateCount: " << s.m_nSuccessRelocateCount.get()           << "\n"
+            << "\t\t m_nRelocateAboveThresholdCount: " << s.m_nRelocateAboveThresholdCount.get()    << "\n"
+            << "\t\t         m_nFailedRelocateCount: " << s.m_nFailedRelocateCount.get()            << "\n"
+            << "\t\t             m_nResizeCallCount: " << s.m_nResizeCallCount.get()                << "\n"
+            << "\t\t            m_nFalseResizeCount: " << s.m_nFalseResizeCount.get()               << "\n"
+            << "\t\t       m_nResizeSuccessNodeMove: " << s.m_nResizeSuccessNodeMove.get()          << "\n"
+            << "\t\t          m_nResizeRelocateCall: " << s.m_nResizeRelocateCall.get()             << "\n"
+            << "\t\t               m_nInsertSuccess: " << s.m_nInsertSuccess.get()                  << "\n"
+            << "\t\t                m_nInsertFailed: " << s.m_nInsertFailed.get()                   << "\n"
+            << "\t\t           m_nInsertResizeCount: " << s.m_nInsertResizeCount.get()              << "\n"
+            << "\t\t         m_nInsertRelocateCount: " << s.m_nInsertRelocateCount.get()            << "\n"
+            << "\t\t         m_nInsertRelocateFault: " << s.m_nInsertRelocateFault.get()            << "\n"
+            << "\t\t            m_nEnsureExistCount: " << s.m_nEnsureExistCount.get()               << "\n"
+            << "\t\t          m_nEnsureSuccessCount: " << s.m_nEnsureSuccessCount.get()             << "\n"
+            << "\t\t           m_nEnsureResizeCount: " << s.m_nEnsureResizeCount.get()              << "\n"
+            << "\t\t         m_nEnsureRelocateCount: " << s.m_nEnsureRelocateCount.get()            << "\n"
+            << "\t\t         m_nEnsureRelocateFault: " << s.m_nEnsureRelocateFault.get()            << "\n"
+            << "\t\t               m_nUnlinkSuccess: " << s.m_nUnlinkSuccess.get()                  << "\n"
+            << "\t\t                m_nUnlinkFailed: " << s.m_nUnlinkFailed.get()                   << "\n"
+            << "\t\t                m_nEraseSuccess: " << s.m_nEraseSuccess.get()                   << "\n"
+            << "\t\t                 m_nEraseFailed: " << s.m_nEraseFailed.get()                    << "\n"
+            << "\t\t                 m_nFindSuccess: " << s.m_nFindSuccess.get()                    << "\n"
+            << "\t\t                  m_nFindFailed: " << s.m_nFindFailed.get()                     << "\n"
+            << "\t\t             m_nFindWithSuccess: " << s.m_nFindWithSuccess.get()                << "\n"
+            << "\t\t              m_nFindWithFailed: " << s.m_nFindWithFailed.get()                 << "\n"
+;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::cuckoo::empty_stat const& s )
+    {
+        return o;
+    }
+
+} // namespace std
+
+#endif // #ifndef __UNIT_PRINT_CUCKOO_STAT_H
diff --git a/tests/unit/print_deque_stat.h b/tests/unit/print_deque_stat.h
new file mode 100644 (file)
index 0000000..1c58381
--- /dev/null
@@ -0,0 +1,41 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_PRINT_DEQUE_STAT_H
+#define __UNIT_PRINT_DEQUE_STAT_H
+
+#include <cds/intrusive/michael_deque.h>
+#include <ostream>
+
+namespace std {
+
+    inline ostream& operator <<( ostream& o, cds::intrusive::deque_stat<> const& s )
+    {
+        return o << "\tStatistics:\n"
+            << "\t\t           Push front: " << s.m_PushFrontCount.get()              << "\n"
+            << "\t\t            Push back: " << s.m_PushBackCount.get()               << "\n"
+            << "\t\t            Pop front: " << s.m_PopFrontCount.get()               << "\n"
+            << "\t\t             Pop back: " << s.m_PopBackCount.get()                << "\n"
+            << "\t\tPush front contention: " << s.m_PushFrontContentionCount.get()    << "\n"
+            << "\t\t Push back contention: " << s.m_PushBackContentionCount.get()     << "\n"
+            << "\t\t Pop front contention: " << s.m_PopFrontContentionCount.get()     << "\n"
+            << "\t\t  Pop back contention: " << s.m_PopBackContentionCount.get()      << "\n"
+            << "\t\t            Pop empty: " << s.m_PopEmptyCount.get()               << "\n"
+;
+    }
+
+    inline ostream& operator <<( ostream& o, cds::intrusive::michael_deque::stat<> const& s )
+    {
+        return o << static_cast<cds::intrusive::deque_stat<> const&>( s )
+            << "\t\t      Stabilize front: " << s.m_StabilizeFrontCount.get() << "\n"
+            << "\t\t       Stabilize back: " << s.m_StabilizeBackCount.get()  << "\n"
+;
+    }
+
+    inline ostream& operator <<( ostream& o, cds::intrusive::michael_deque::dummy_stat const&  )
+    {
+        return o;
+    }
+
+}   // namespace std
+
+#endif // #ifndef __UNIT_PRINT_DEQUE_STAT_H
diff --git a/tests/unit/print_ellenbintree_stat.h b/tests/unit/print_ellenbintree_stat.h
new file mode 100644 (file)
index 0000000..19feff9
--- /dev/null
@@ -0,0 +1,50 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_PRINT_ELLENBINTREE_STAT_H
+#define __UNIT_PRINT_ELLENBINTREE_STAT_H
+
+#include "ellen_bintree_update_desc_pool.h"
+#include <ostream>
+
+namespace std {
+    static inline ostream& operator <<( ostream& o, cds::intrusive::ellen_bintree::empty_stat const& s )
+    {
+        return o;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::ellen_bintree::stat<> const& s )
+    {
+        return o << "\nEllenBinTree statistis [cds::intrusive::ellen_bintree::stat]:\n"
+            << "\t\t   Internal node allocated: " << ellen_bintree_pool::internal_node_counter::m_nAlloc.get() << "\n"
+            << "\t\t       Internal node freed: " << ellen_bintree_pool::internal_node_counter::m_nFree.get() << "\n"
+            << "\t\t    m_nInternalNodeCreated: " << s.m_nInternalNodeCreated.get()   << "\n"
+            << "\t\t    m_nInternalNodeDeleted: " << s.m_nInternalNodeDeleted.get()   << "\n"
+            << "\t\t      m_nUpdateDescCreated: " << s.m_nUpdateDescCreated.get()     << "\n"
+            << "\t\t      m_nUpdateDescDeleted: " << s.m_nUpdateDescDeleted.get()     << "\n"
+            << "\t\t          m_nInsertSuccess: " << s.m_nInsertSuccess.get()         << "\n"
+            << "\t\t           m_nInsertFailed: " << s.m_nInsertFailed.get()          << "\n"
+            << "\t\t          m_nInsertRetries: " << s.m_nInsertRetries.get()         << "\n"
+            << "\t\t            m_nEnsureExist: " << s.m_nEnsureExist.get()           << "\n"
+            << "\t\t              m_nEnsureNew: " << s.m_nEnsureNew.get()             << "\n"
+            << "\t\t          m_nEnsureRetries: " << s.m_nEnsureRetries.get()         << "\n"
+            << "\t\t           m_nEraseSuccess: " << s.m_nEraseSuccess.get()          << "\n"
+            << "\t\t            m_nEraseFailed: " << s.m_nEraseFailed.get()           << "\n"
+            << "\t\t           m_nEraseRetries: " << s.m_nEraseRetries.get()          << "\n"
+            << "\t\t            m_nFindSuccess: " << s.m_nFindSuccess.get()           << "\n"
+            << "\t\t             m_nFindFailed: " << s.m_nFindFailed.get()            << "\n"
+            << "\t\t      m_nExtractMinSuccess: " << s.m_nExtractMinSuccess.get()     << "\n"
+            << "\t\t       m_nExtractMinFailed: " << s.m_nExtractMinFailed.get()      << "\n"
+            << "\t\t      m_nExtractMinRetries: " << s.m_nExtractMinRetries.get()     << "\n"
+            << "\t\t      m_nExtractMaxSuccess: " << s.m_nExtractMaxSuccess.get()     << "\n"
+            << "\t\t       m_nExtractMaxFailed: " << s.m_nExtractMaxFailed.get()      << "\n"
+            << "\t\t      m_nExtractMaxRetries: " << s.m_nExtractMaxRetries.get()     << "\n"
+            << "\t\t            m_nSearchRetry: " << s.m_nSearchRetry.get()           << "\n"
+            << "\t\t             m_nHelpInsert: " << s.m_nHelpInsert.get()            << "\n"
+            << "\t\t             m_nHelpDelete: " << s.m_nHelpDelete.get()            << "\n"
+            << "\t\t               m_nHelpMark: " << s.m_nHelpMark.get()              << "\n"
+            << "\t\t       m_nHelpGuardSuccess: " << s.m_nHelpGuardSuccess.get()      << "\n"
+            << "\t\t        m_nHelpGuardFailed: " << s.m_nHelpGuardFailed.get()       << "\n";
+    }
+}
+
+#endif // #ifndef __UNIT_PRINT_ELLENBINTREE_STAT_H
diff --git a/tests/unit/print_mspriorityqueue_stat.h b/tests/unit/print_mspriorityqueue_stat.h
new file mode 100644 (file)
index 0000000..ba3571b
--- /dev/null
@@ -0,0 +1,26 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_PRINT_MSPRIORITYQUEUE_STAT_H
+#define __UNIT_PRINT_MSPRIORITYQUEUE_STAT_H
+
+#include <cds/container/mspriority_queue.h>
+
+namespace std {
+    static inline ostream& operator <<( ostream& o, cds::container::mspriority_queue::empty_stat const& s )
+    {
+        return o;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::container::mspriority_queue::stat<> const& s )
+    {
+        return o << "\nMSPriorityQueue statistis [cds::container::mspriority_queue::stat]:\n"
+            << "\t\t            Success push count: " << s.m_nPushCount.get() << "\n"
+            << "\t\t             Success pop count: " << s.m_nPopCount.get() << "\n"
+            << "\t\tFailed push count (full queue): " << s.m_nPushFailCount.get() << "\n"
+            << "\t\tFailed pop count (empty queue): " << s.m_nPopFailCount.get() << "\n"
+            << "\t\t          Heapify swap on push: " << s.m_nPushHeapifySwapCount.get() << "\n"
+            << "\t\t           Heapify swap on pop: " << s.m_nPopHeapifySwapCount.get() << "\n";
+    }
+}
+
+#endif // #ifndef __UNIT_PRINT_MSPRIORITYQUEUE_STAT_H
diff --git a/tests/unit/print_segmentedqueue_stat.h b/tests/unit/print_segmentedqueue_stat.h
new file mode 100644 (file)
index 0000000..5d9373e
--- /dev/null
@@ -0,0 +1,31 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_PRINT_SEGMENTEDQUEUE_STAT_H
+#define __UNIT_PRINT_SEGMENTEDQUEUE_STAT_H
+
+#include <ostream>
+
+namespace std {
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::segmented_queue::stat<> const& s )
+    {
+        return o << "\tStatistics:\n"
+            << "\t                    Push: " << s.m_nPush.get()           << "\n"
+            << "\t          Push populated: " << s.m_nPushPopulated.get()  << "\n"
+            << "\tPush failed (contention): " << s.m_nPushContended.get()  << "\n"
+            << "\t                     Pop: " << s.m_nPop.get()            << "\n"
+            << "\t               Pop empty: " << s.m_nPopEmpty.get()       << "\n"
+            << "\t Pop failed (contention): " << s.m_nPopContended.get()      << "\n"
+            << "\t Segment create requests: " << s.m_nCreateSegmentReq.get()  << "\n"
+            << "\t Segment delete requests: " << s.m_nDeleteSegmentReq.get()  << "\n"
+            << "\t         Segment created: " << s.m_nSegmentCreated.get()    << "\n"
+            << "\t         Segment deleted: " << s.m_nSegmentDeleted.get()    << "\n";
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::segmented_queue::empty_stat const& s )
+    {
+        return o;
+    }
+
+} // namespace std
+
+#endif // #ifndef __UNIT_PRINT_SEGMENTEDQUEUE_STAT_H
diff --git a/tests/unit/print_skip_list_stat.h b/tests/unit/print_skip_list_stat.h
new file mode 100644 (file)
index 0000000..4e8ec6f
--- /dev/null
@@ -0,0 +1,62 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_PRINT_SKIP_LIST_STAT_H
+#define __UNIT_PRINT_SKIP_LIST_STAT_H
+
+#include <cds/intrusive/skip_list_base.h>
+#include <ostream>
+
+namespace std {
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::skip_list::stat<> const& s )
+    {
+        o << "Skip-list stat [cds::intrusive::skip_list::stat]\n"
+            << "\t\t node height (add/delete):\n"
+;
+        for ( unsigned int i = 0; i < 9; ++i )
+            o << "\t\t\t[ " << (i + 1) << "]: " << s.m_nNodeHeightAdd[i].get() << '/' << s.m_nNodeHeightDel[i].get() << "\n";
+        for ( unsigned int i = 9; i < sizeof(s.m_nNodeHeightAdd) / sizeof(s.m_nNodeHeightAdd[0] ); ++i )
+            o << "\t\t\t[" << (i + 1) << "]: " << s.m_nNodeHeightAdd[i].get() << '/' << s.m_nNodeHeightDel[i].get() << "\n";
+
+        return o
+            << "\t\t          m_nInsertSuccess: " << s.m_nInsertSuccess.get()           << "\n"
+            << "\t\t           m_nInsertFailed: " << s.m_nInsertFailed.get()            << "\n"
+            << "\t\t          m_nInsertRetries: " << s.m_nInsertRetries.get()           << "\n"
+            << "\t\t            m_nEnsureExist: " << s.m_nEnsureExist.get()             << "\n"
+            << "\t\t              m_nEnsureNew: " << s.m_nEnsureNew.get()               << "\n"
+            << "\t\t          m_nUnlinkSuccess: " << s.m_nUnlinkSuccess.get()           << "\n"
+            << "\t\t           m_nUnlinkFailed: " << s.m_nUnlinkFailed.get()            << "\n"
+            << "\t\t         m_nExtractSuccess: " << s.m_nExtractSuccess.get()          << "\n"
+            << "\t\t          m_nExtractFailed: " << s.m_nExtractFailed.get()           << "\n"
+            << "\t\t         m_nExtractRetries: " << s.m_nExtractRetries.get()          << "\n"
+            << "\t\t      m_nExtractMinSuccess: " << s.m_nExtractMinSuccess.get()       << "\n"
+            << "\t\t       m_nExtractMinFailed: " << s.m_nExtractMinFailed.get()        << "\n"
+            << "\t\t      m_nExtractMinRetries: " << s.m_nExtractMinRetries.get()       << "\n"
+            << "\t\t      m_nExtractMaxSuccess: " << s.m_nExtractMaxSuccess.get()       << "\n"
+            << "\t\t       m_nExtractMaxFailed: " << s.m_nExtractMaxFailed.get()        << "\n"
+            << "\t\t      m_nExtractMaxRetries: " << s.m_nExtractMaxRetries.get()       << "\n"
+            << "\t\t           m_nEraseSuccess: " << s.m_nEraseSuccess.get()            << "\n"
+            << "\t\t            m_nEraseFailed: " << s.m_nEraseFailed.get()             << "\n"
+            << "\t\t        m_nFindFastSuccess: " << s.m_nFindFastSuccess.get()         << "\n"
+            << "\t\t         m_nFindFastFailed: " << s.m_nFindFastFailed.get()          << "\n"
+            << "\t\t        m_nFindSlowSuccess: " << s.m_nFindSlowSuccess.get()         << "\n"
+            << "\t\t         m_nFindSlowFailed: " << s.m_nFindSlowFailed.get()          << "\n"
+            << "\t\t    m_nRenewInsertPosition: " << s.m_nRenewInsertPosition.get()     << "\n"
+            << "\t\t m_nLogicDeleteWhileInsert: " << s.m_nLogicDeleteWhileInsert.get()  << "\n"
+            << "\t\t    m_nNotFoundWhileInsert: " << s.m_nNotFoundWhileInsert.get()     << "\n"
+            << "\t\t              m_nFastErase: " << s.m_nFastErase.get()               << "\n"
+            << "\t\t              m_nSlowErase: " << s.m_nSlowErase.get()               << "\n"
+            << "\t\t            m_nFastExtract: " << s.m_nFastExtract.get()             << "\n"
+            << "\t\t            m_nSlowExtract: " << s.m_nSlowExtract.get()             << "\n"
+            << "\t\t         m_nEraseWhileFind: " << s.m_nEraseWhileFind.get()          << "\n"
+            << "\t\t       m_nExtractWhileFind: " << s.m_nExtractWhileFind.get()        << "\n";
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::skip_list::empty_stat const& s )
+    {
+        return o;
+    }
+
+} // namespace std
+
+#endif // #ifndef __UNIT_PRINT_SKIP_LIST_STAT_H
diff --git a/tests/unit/queue/intrusive_queue_defs.h b/tests/unit/queue/intrusive_queue_defs.h
new file mode 100644 (file)
index 0000000..16d72fb
--- /dev/null
@@ -0,0 +1,213 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_INTRUSIVE_QUEUE_DEFS_H
+#define __CDSUNIT_INTRUSIVE_QUEUE_DEFS_H
+
+// MSQueue
+#define CDSUNIT_DECLARE_MSQueue \
+    TEST_CASE(MSQueue_HP,               cds::intrusive::single_link::node< cds::gc::HP > ) \
+    TEST_CASE(MSQueue_HP_ic,            cds::intrusive::single_link::node< cds::gc::HP > ) \
+    TEST_CASE(MSQueue_HP_stat,          cds::intrusive::single_link::node< cds::gc::HP > ) \
+    TEST_CASE(MSQueue_HP_seqcst,        cds::intrusive::single_link::node< cds::gc::HP > ) \
+    TEST_CASE(MSQueue_HRC,              cds::intrusive::single_link::node< cds::gc::HRC > ) \
+    TEST_CASE(MSQueue_HRC_ic,           cds::intrusive::single_link::node< cds::gc::HRC > ) \
+    TEST_CASE(MSQueue_HRC_stat,         cds::intrusive::single_link::node< cds::gc::HRC > ) \
+    TEST_CASE(MSQueue_HRC_seqcst,       cds::intrusive::single_link::node< cds::gc::HRC > ) \
+    TEST_CASE(MSQueue_PTB,              cds::intrusive::single_link::node< cds::gc::PTB > ) \
+    TEST_CASE(MSQueue_PTB_ic,           cds::intrusive::single_link::node< cds::gc::PTB > ) \
+    TEST_CASE(MSQueue_PTB_stat,         cds::intrusive::single_link::node< cds::gc::PTB > ) \
+    TEST_CASE(MSQueue_PTB_seqcst,       cds::intrusive::single_link::node< cds::gc::PTB > )
+
+#define CDSUNIT_TEST_MSQueue \
+    CPPUNIT_TEST(MSQueue_HP) \
+    CPPUNIT_TEST(MSQueue_HP_ic) \
+    CPPUNIT_TEST(MSQueue_HP_stat) \
+    CPPUNIT_TEST(MSQueue_HP_seqcst) \
+    /*CPPUNIT_TEST(MSQueue_HRC)*/ \
+    /*CPPUNIT_TEST(MSQueue_HRC_ic)*/ \
+    /*CPPUNIT_TEST(MSQueue_HRC_stat)*/ \
+    /*CPPUNIT_TEST(MSQueue_HRC_seqcst)*/ \
+    CPPUNIT_TEST(MSQueue_PTB) \
+    CPPUNIT_TEST(MSQueue_PTB_ic) \
+    CPPUNIT_TEST(MSQueue_PTB_stat) \
+    CPPUNIT_TEST(MSQueue_PTB_seqcst)
+
+// MoirQueue
+#define CDSUNIT_DECLARE_MoirQueue \
+    TEST_CASE(MoirQueue_HP,               cds::intrusive::single_link::node< cds::gc::HP > ) \
+    TEST_CASE(MoirQueue_HP_ic,            cds::intrusive::single_link::node< cds::gc::HP > ) \
+    TEST_CASE(MoirQueue_HP_stat,          cds::intrusive::single_link::node< cds::gc::HP > ) \
+    TEST_CASE(MoirQueue_HP_seqcst,        cds::intrusive::single_link::node< cds::gc::HP > ) \
+    TEST_CASE(MoirQueue_HRC,              cds::intrusive::single_link::node< cds::gc::HRC > ) \
+    TEST_CASE(MoirQueue_HRC_ic,           cds::intrusive::single_link::node< cds::gc::HRC > ) \
+    TEST_CASE(MoirQueue_HRC_stat,         cds::intrusive::single_link::node< cds::gc::HRC > ) \
+    TEST_CASE(MoirQueue_HRC_seqcst,       cds::intrusive::single_link::node< cds::gc::HRC > ) \
+    TEST_CASE(MoirQueue_PTB,              cds::intrusive::single_link::node< cds::gc::PTB > ) \
+    TEST_CASE(MoirQueue_PTB_ic,           cds::intrusive::single_link::node< cds::gc::PTB > ) \
+    TEST_CASE(MoirQueue_PTB_stat,         cds::intrusive::single_link::node< cds::gc::PTB > ) \
+    TEST_CASE(MoirQueue_PTB_seqcst,       cds::intrusive::single_link::node< cds::gc::PTB > )
+
+#define CDSUNIT_TEST_MoirQueue \
+    CPPUNIT_TEST(MoirQueue_HP) \
+    CPPUNIT_TEST(MoirQueue_HP_ic) \
+    CPPUNIT_TEST(MoirQueue_HP_stat) \
+    CPPUNIT_TEST(MoirQueue_HP_seqcst) \
+    /*CPPUNIT_TEST(MoirQueue_HRC)*/ \
+    /*CPPUNIT_TEST(MoirQueue_HRC_ic)*/ \
+    /*CPPUNIT_TEST(MoirQueue_HRC_stat)*/ \
+    /*CPPUNIT_TEST(MoirQueue_HRC_seqcst)*/ \
+    CPPUNIT_TEST(MoirQueue_PTB) \
+    CPPUNIT_TEST(MoirQueue_PTB_ic) \
+    CPPUNIT_TEST(MoirQueue_PTB_stat) \
+    CPPUNIT_TEST(MoirQueue_PTB_seqcst)
+
+
+// OptimisticQueue
+#define CDSUNIT_DECLARE_OptimisticQueue \
+    TEST_CASE(OptimisticQueue_HP,               cds::intrusive::optimistic_queue::node< cds::gc::HP > ) \
+    TEST_CASE(OptimisticQueue_HP_ic,            cds::intrusive::optimistic_queue::node< cds::gc::HP > ) \
+    TEST_CASE(OptimisticQueue_HP_stat,          cds::intrusive::optimistic_queue::node< cds::gc::HP > ) \
+    TEST_CASE(OptimisticQueue_HP_seqcst,        cds::intrusive::optimistic_queue::node< cds::gc::HP > ) \
+    TEST_CASE(OptimisticQueue_PTB,              cds::intrusive::optimistic_queue::node< cds::gc::PTB > ) \
+    TEST_CASE(OptimisticQueue_PTB_ic,           cds::intrusive::optimistic_queue::node< cds::gc::PTB > ) \
+    TEST_CASE(OptimisticQueue_PTB_stat,         cds::intrusive::optimistic_queue::node< cds::gc::PTB > ) \
+    TEST_CASE(OptimisticQueue_PTB_seqcst,       cds::intrusive::optimistic_queue::node< cds::gc::PTB > )
+
+#define CDSUNIT_TEST_OptimisticQueue \
+    CPPUNIT_TEST(OptimisticQueue_HP) \
+    CPPUNIT_TEST(OptimisticQueue_HP_ic) \
+    CPPUNIT_TEST(OptimisticQueue_HP_stat) \
+    CPPUNIT_TEST(OptimisticQueue_HP_seqcst) \
+    CPPUNIT_TEST(OptimisticQueue_PTB) \
+    CPPUNIT_TEST(OptimisticQueue_PTB_ic) \
+    CPPUNIT_TEST(OptimisticQueue_PTB_stat) \
+    CPPUNIT_TEST(OptimisticQueue_PTB_seqcst)
+
+
+// BasketQueue
+#define CDSUNIT_DECLARE_BasketQueue \
+    TEST_CASE(BasketQueue_HP,               cds::intrusive::basket_queue::node< cds::gc::HP > ) \
+    TEST_CASE(BasketQueue_HP_ic,            cds::intrusive::basket_queue::node< cds::gc::HP > ) \
+    TEST_CASE(BasketQueue_HP_stat,          cds::intrusive::basket_queue::node< cds::gc::HP > ) \
+    TEST_CASE(BasketQueue_HP_seqcst,        cds::intrusive::basket_queue::node< cds::gc::HP > ) \
+    TEST_CASE(BasketQueue_HRC,              cds::intrusive::basket_queue::node< cds::gc::HRC > ) \
+    TEST_CASE(BasketQueue_HRC_ic,           cds::intrusive::basket_queue::node< cds::gc::HRC > ) \
+    TEST_CASE(BasketQueue_HRC_stat,         cds::intrusive::basket_queue::node< cds::gc::HRC > ) \
+    TEST_CASE(BasketQueue_HRC_seqcst,       cds::intrusive::basket_queue::node< cds::gc::HRC > ) \
+    TEST_CASE(BasketQueue_PTB,              cds::intrusive::basket_queue::node< cds::gc::PTB > ) \
+    TEST_CASE(BasketQueue_PTB_ic,           cds::intrusive::basket_queue::node< cds::gc::PTB > ) \
+    TEST_CASE(BasketQueue_PTB_stat,         cds::intrusive::basket_queue::node< cds::gc::PTB > ) \
+    TEST_CASE(BasketQueue_PTB_seqcst,       cds::intrusive::basket_queue::node< cds::gc::PTB > )
+
+#define CDSUNIT_TEST_BasketQueue \
+    CPPUNIT_TEST(BasketQueue_HP) \
+    CPPUNIT_TEST(BasketQueue_HP_ic) \
+    CPPUNIT_TEST(BasketQueue_HP_stat) \
+    CPPUNIT_TEST(BasketQueue_HP_seqcst) \
+    /*CPPUNIT_TEST(BasketQueue_HRC)*/ \
+    /*CPPUNIT_TEST(BasketQueue_HRC_ic)*/ \
+    /*CPPUNIT_TEST(BasketQueue_HRC_stat)*/ \
+    /*CPPUNIT_TEST(BasketQueue_HRC_seqcst)*/ \
+    CPPUNIT_TEST(BasketQueue_PTB) \
+    CPPUNIT_TEST(BasketQueue_PTB_ic) \
+    CPPUNIT_TEST(BasketQueue_PTB_stat) \
+    CPPUNIT_TEST(BasketQueue_PTB_seqcst)
+
+
+// MichaelDeque
+#define CDSUNIT_DECLARE_MichaelDeque \
+    TEST_CASE(MichaelDequeL_HP,               cds::intrusive::michael_deque::node< cds::gc::HP > ) \
+    TEST_CASE(MichaelDequeL_HP_ic,            cds::intrusive::michael_deque::node< cds::gc::HP > ) \
+    TEST_CASE(MichaelDequeL_HP_stat,          cds::intrusive::michael_deque::node< cds::gc::HP > ) \
+    TEST_CASE(MichaelDequeL_PTB,              cds::intrusive::michael_deque::node< cds::gc::PTB > ) \
+    TEST_CASE(MichaelDequeL_PTB_ic,           cds::intrusive::michael_deque::node< cds::gc::PTB > ) \
+    TEST_CASE(MichaelDequeL_PTB_stat,         cds::intrusive::michael_deque::node< cds::gc::PTB > ) \
+    TEST_CASE(MichaelDequeR_HP,               cds::intrusive::michael_deque::node< cds::gc::HP > ) \
+    TEST_CASE(MichaelDequeR_HP_ic,            cds::intrusive::michael_deque::node< cds::gc::HP > ) \
+    TEST_CASE(MichaelDequeR_HP_stat,          cds::intrusive::michael_deque::node< cds::gc::HP > ) \
+    TEST_CASE(MichaelDequeR_PTB,              cds::intrusive::michael_deque::node< cds::gc::PTB > ) \
+    TEST_CASE(MichaelDequeR_PTB_ic,           cds::intrusive::michael_deque::node< cds::gc::PTB > ) \
+    TEST_CASE(MichaelDequeR_PTB_stat,         cds::intrusive::michael_deque::node< cds::gc::PTB > )
+
+#define CDSUNIT_TEST_MichaelDeque \
+    CPPUNIT_TEST(MichaelDequeL_HP) \
+    CPPUNIT_TEST(MichaelDequeL_HP_ic) \
+    CPPUNIT_TEST(MichaelDequeL_HP_stat) \
+    CPPUNIT_TEST(MichaelDequeL_PTB) \
+    CPPUNIT_TEST(MichaelDequeL_PTB_ic) \
+    CPPUNIT_TEST(MichaelDequeL_PTB_stat) \
+    CPPUNIT_TEST(MichaelDequeR_HP) \
+    CPPUNIT_TEST(MichaelDequeR_HP_ic) \
+    CPPUNIT_TEST(MichaelDequeR_HP_stat) \
+    CPPUNIT_TEST(MichaelDequeR_PTB) \
+    CPPUNIT_TEST(MichaelDequeR_PTB_ic) \
+    CPPUNIT_TEST(MichaelDequeR_PTB_stat)
+
+
+// TsigasCycleQueue
+#define CDSUNIT_DECLARE_TsigasCycleQueue \
+    TEST_BOUNDED(TsigasCycleQueue_dyn) \
+    TEST_BOUNDED(TsigasCycleQueue_dyn_ic)
+
+#define CDSUNIT_TEST_TsigasCycleQueue \
+    CPPUNIT_TEST(TsigasCycleQueue_dyn) \
+    CPPUNIT_TEST(TsigasCycleQueue_dyn_ic)
+
+
+// VyukovMPMCCycleQueue
+#define CDSUNIT_DECLARE_VyukovMPMCCycleQueue \
+    TEST_BOUNDED(VyukovMPMCCycleQueue_dyn) \
+    TEST_BOUNDED(VyukovMPMCCycleQueue_dyn_ic)
+
+#define CDSUNIT_TEST_VyukovMPMCCycleQueue \
+    CPPUNIT_TEST(VyukovMPMCCycleQueue_dyn) \
+    CPPUNIT_TEST(VyukovMPMCCycleQueue_dyn_ic)
+
+
+// FCQueue
+#define CDSUNIT_DECLARE_FCQueue \
+    TEST_FCQUEUE(FCQueue_list_delay2, boost::intrusive::list_base_hook<> ) \
+    TEST_FCQUEUE(FCQueue_list_delay2_elimination, boost::intrusive::list_base_hook<> ) \
+    TEST_FCQUEUE(FCQueue_list_delay2_elimination_stat, boost::intrusive::list_base_hook<> ) \
+    TEST_FCQUEUE(FCQueue_list_expbackoff_elimination, boost::intrusive::list_base_hook<> ) \
+    TEST_FCQUEUE(FCQueue_list_expbackoff_elimination_stat, boost::intrusive::list_base_hook<> )
+
+#define CDSUNIT_TEST_FCQueue \
+    CPPUNIT_TEST(FCQueue_list_delay2) \
+    CPPUNIT_TEST(FCQueue_list_delay2_elimination) \
+    CPPUNIT_TEST(FCQueue_list_delay2_elimination_stat) \
+    CPPUNIT_TEST(FCQueue_list_expbackoff_elimination) \
+    CPPUNIT_TEST(FCQueue_list_expbackoff_elimination_stat)
+
+// SegmentedQueue
+#define CDSUNIT_DECLARE_SegmentedQueue \
+    TEST_SEGMENTED( SegmentedQueue_HP_spin ) \
+    TEST_SEGMENTED( SegmentedQueue_HP_spin_stat ) \
+    TEST_SEGMENTED( SegmentedQueue_HP_mutex ) \
+    TEST_SEGMENTED( SegmentedQueue_HP_mutex_stat ) \
+    TEST_SEGMENTED( SegmentedQueue_PTB_spin ) \
+    TEST_SEGMENTED( SegmentedQueue_PTB_spin_stat ) \
+    TEST_SEGMENTED( SegmentedQueue_PTB_mutex ) \
+    TEST_SEGMENTED( SegmentedQueue_PTB_mutex_stat )
+
+#define CDSUNIT_TEST_SegmentedQueue \
+    CPPUNIT_TEST( SegmentedQueue_HP_spin ) \
+    CPPUNIT_TEST( SegmentedQueue_HP_spin_stat ) \
+    CPPUNIT_TEST( SegmentedQueue_HP_mutex ) \
+    CPPUNIT_TEST( SegmentedQueue_HP_mutex_stat ) \
+    CPPUNIT_TEST( SegmentedQueue_PTB_spin ) \
+    CPPUNIT_TEST( SegmentedQueue_PTB_spin_stat ) \
+    CPPUNIT_TEST( SegmentedQueue_PTB_mutex ) \
+    CPPUNIT_TEST( SegmentedQueue_PTB_mutex_stat )
+
+
+// BoostSList
+#define CDSUNIT_DECLARE_BoostSList \
+    TEST_BOOST( BoostSList_mutex, boost::intrusive::slist_base_hook<> ) \
+    TEST_BOOST( BoostSList_spin, boost::intrusive::slist_base_hook<> )
+
+#define CDSUNIT_TEST_BoostSList \
+    CPPUNIT_TEST( BoostSList_mutex ) \
+    CPPUNIT_TEST( BoostSList_spin )
+
+#endif // #ifndef __CDSUNIT_INTRUSIVE_QUEUE_DEFS_H
diff --git a/tests/unit/queue/intrusive_queue_reader_writer.cpp b/tests/unit/queue/intrusive_queue_reader_writer.cpp
new file mode 100644 (file)
index 0000000..8f3c8f6
--- /dev/null
@@ -0,0 +1,462 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "queue/intrusive_queue_type.h"
+#include "queue/intrusive_queue_defs.h"
+#include <vector>
+#include <algorithm>
+
+// Multi-threaded random queue test
+namespace queue {
+
+#define TEST_CASE( Q, HOOK )    void Q() { test< Types< Value<HOOK> >::Q >(); }
+#define TEST_BOUNDED( Q )       void Q() { test_bounded< Types< Value<> >::Q >(); }
+#define TEST_FCQUEUE( Q, HOOK ) void Q() { test_fcqueue< Types< Value<HOOK> >::Q >(); }
+#define TEST_SEGMENTED( Q )     void Q() { test_segmented< Types< Value<> >::Q >(); }
+#define TEST_BOOST( Q, HOOK )   void Q() { test_boost< Types< Value<HOOK> >::Q >(); }
+
+    namespace {
+        static size_t s_nReaderThreadCount = 4;
+        static size_t s_nWriterThreadCount = 4;
+        static size_t s_nQueueSize = 4000000;
+        static unsigned int s_nFCPassCount = 8;
+        static unsigned int s_nFCCompactFactor = 64;
+
+        struct empty {};
+
+        template <typename Base = empty >
+        struct Value: public Base
+        {
+            size_t      nNo;
+            size_t      nWriterNo;
+            size_t      nConsumer;
+        };
+    }
+
+    class IntrusiveQueue_ReaderWriter: public CppUnitMini::TestCase
+    {
+        template <class Queue>
+        class Producer: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Producer( *this );
+            }
+        public:
+            Queue&              m_Queue;
+            double              m_fTime;
+            size_t              m_nPushFailed;
+
+            // Interval in m_arrValue
+            typename Queue::value_type *       m_pStart;
+            typename Queue::value_type *       m_pEnd;
+
+        public:
+            Producer( CppUnitMini::ThreadPool& pool, Queue& q )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+            {}
+            Producer( Producer& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+            {}
+
+            IntrusiveQueue_ReaderWriter&  getTest()
+            {
+                return static_cast<IntrusiveQueue_ReaderWriter&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPushFailed = 0;
+
+                m_fTime = m_Timer.duration();
+
+                size_t i = 0;
+                for ( typename Queue::value_type * p = m_pStart; p < m_pEnd; ) {
+                    p->nNo = i;
+                    p->nWriterNo = m_nThreadNo;
+                    if ( m_Queue.push( *p )) {
+                        ++p;
+                        ++i;
+                    }
+                    else
+                        ++m_nPushFailed;
+                }
+
+                m_fTime = m_Timer.duration() - m_fTime;
+                getTest().m_nProducerCount.fetch_sub( 1, CDS_ATOMIC::memory_order_release );
+            }
+        };
+
+        template <class Queue>
+        class Consumer: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Consumer( *this );
+            }
+        public:
+            Queue&              m_Queue;
+            double              m_fTime;
+            size_t              m_nPopEmpty;
+            size_t              m_nPopped;
+            size_t              m_nBadWriter;
+
+            typedef std::vector<size_t> TPoppedData;
+            typedef std::vector<size_t>::iterator       data_iterator;
+            typedef std::vector<size_t>::const_iterator const_data_iterator;
+
+            std::vector<TPoppedData>        m_WriterData;
+
+        private:
+            void initPoppedData()
+            {
+                const size_t nWriterCount = s_nWriterThreadCount;
+                const size_t nWriterPushCount = getTest().m_nThreadPushCount;
+                m_WriterData.resize( nWriterCount );
+                for ( size_t i = 0; i < nWriterCount; ++i )
+                    m_WriterData[i].reserve( nWriterPushCount );
+            }
+
+        public:
+            Consumer( CppUnitMini::ThreadPool& pool, Queue& q )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+            {
+                initPoppedData();
+            }
+            Consumer( Consumer& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+            {
+                initPoppedData();
+            }
+
+            IntrusiveQueue_ReaderWriter&  getTest()
+            {
+                return static_cast<IntrusiveQueue_ReaderWriter&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPopEmpty = 0;
+                m_nPopped = 0;
+                m_nBadWriter = 0;
+                const size_t nTotalWriters = s_nWriterThreadCount;
+
+                m_fTime = m_Timer.duration();
+
+                while ( true ) {
+                    typename Queue::value_type * p = m_Queue.pop();
+                    if ( p ) {
+                        p->nConsumer = m_nThreadNo;
+                        ++m_nPopped;
+                        if ( p->nWriterNo < nTotalWriters )
+                            m_WriterData[ p->nWriterNo ].push_back( p->nNo );
+                        else
+                            ++m_nBadWriter;
+                    }
+                    else {
+                        ++m_nPopEmpty;
+                        if ( getTest().m_nProducerCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 && m_Queue.empty() )
+                            break;
+                    }
+                }
+
+                m_fTime = m_Timer.duration() - m_fTime;
+            }
+        };
+
+        template <typename T>
+        class value_array
+        {
+            T * m_pArr;
+        public:
+            value_array( size_t nSize )
+                : m_pArr( new T[nSize] )
+            {}
+
+            ~value_array()
+            {
+                delete [] m_pArr;
+            }
+
+            T * get() const { return m_pArr; }
+        };
+
+
+    protected:
+        size_t                  m_nThreadPushCount;
+        CDS_ATOMIC::atomic<size_t>     m_nProducerCount;
+        static CDS_CONSTEXPR_CONST size_t c_nBadConsumer = 0xbadc0ffe;
+
+    protected:
+        template <class Queue>
+        void analyze( CppUnitMini::ThreadPool& pool, Queue& testQueue, size_t nLeftOffset, size_t nRightOffset )
+        {
+            typedef Consumer<Queue> Reader;
+            typedef Producer<Queue> Writer;
+            typedef typename Reader::const_data_iterator    ReaderIterator;
+
+            size_t nPostTestPops = 0;
+            while ( testQueue.pop() )
+                ++nPostTestPops;
+
+            double fTimeWriter = 0;
+            double fTimeReader = 0;
+            size_t nTotalPops = 0;
+            size_t nPopFalse = 0;
+            size_t nPoppedItems = 0;
+            size_t nPushFailed = 0;
+
+            std::vector< Reader * > arrReaders;
+
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Reader * pReader = dynamic_cast<Reader *>( *it );
+                if ( pReader ) {
+                    fTimeReader += pReader->m_fTime;
+                    nTotalPops += pReader->m_nPopped;
+                    nPopFalse += pReader->m_nPopEmpty;
+                    arrReaders.push_back( pReader );
+                    CPPUNIT_CHECK_EX( pReader->m_nBadWriter == 0, "reader " << pReader->m_nThreadNo << " bad writer event count=" << pReader->m_nBadWriter );
+
+                    size_t nPopped = 0;
+                    for ( size_t n = 0; n < s_nWriterThreadCount; ++n )
+                        nPopped += pReader->m_WriterData[n].size();
+
+                    CPPUNIT_MSG( "    Reader " << pReader->m_nThreadNo - s_nWriterThreadCount << " popped count=" << nPopped );
+                    nPoppedItems += nPopped;
+                }
+                else {
+                    Writer * pWriter = dynamic_cast<Writer *>( *it );
+                    CPPUNIT_ASSERT( pWriter != NULL );
+                    fTimeWriter += pWriter->m_fTime;
+                    nPushFailed += pWriter->m_nPushFailed;
+                    if ( !boost::is_base_of<cds::bounded_container, Queue>::value ) {
+                        CPPUNIT_CHECK_EX( pWriter->m_nPushFailed == 0,
+                            "writer " << pWriter->m_nThreadNo << " push failed count=" << pWriter->m_nPushFailed );
+                    }
+                }
+            }
+            CPPUNIT_CHECK_EX( nTotalPops == nPoppedItems, "nTotalPops=" << nTotalPops << ", nPoppedItems=" << nPoppedItems );
+
+            CPPUNIT_MSG( "    Readers: duration=" << fTimeReader / s_nReaderThreadCount << ", success pop=" << nTotalPops << ", failed pops=" << nPopFalse );
+            CPPUNIT_MSG( "    Writers: duration=" << fTimeWriter / s_nWriterThreadCount << ", failed push=" << nPushFailed );
+
+            size_t nQueueSize = m_nThreadPushCount * s_nWriterThreadCount;
+            CPPUNIT_CHECK_EX( nTotalPops + nPostTestPops == nQueueSize, "popped=" << nTotalPops + nPostTestPops << " must be " << nQueueSize );
+            CPPUNIT_CHECK( testQueue.empty() );
+
+            // Test that all items have been popped
+            // Test FIFO order
+            CPPUNIT_MSG( "   Test consistency of popped sequence..." );
+            size_t nErrors = 0;
+            for ( size_t nWriter = 0; nWriter < s_nWriterThreadCount; ++nWriter ) {
+                std::vector<size_t> arrData;
+                arrData.reserve( m_nThreadPushCount );
+                nErrors = 0;
+                for ( size_t nReader = 0; nReader < arrReaders.size(); ++nReader ) {
+                    ReaderIterator it = arrReaders[nReader]->m_WriterData[nWriter].begin();
+                    ReaderIterator itEnd = arrReaders[nReader]->m_WriterData[nWriter].end();
+                    if ( it != itEnd ) {
+                        ReaderIterator itPrev = it;
+                        for ( ++it; it != itEnd; ++it ) {
+                            CPPUNIT_CHECK_EX( *itPrev < *it + nRightOffset,
+                                "Reader " << nReader << ", Writer " << nWriter << ": prev=" << *itPrev << ", cur=" << *it );
+                            if ( ++nErrors > 10 )
+                                return;
+                            itPrev = it;
+                        }
+                    }
+
+                    for ( it = arrReaders[nReader]->m_WriterData[nWriter].begin(); it != itEnd; ++it )
+                        arrData.push_back( *it );
+                }
+                std::sort( arrData.begin(), arrData.end() );
+                nErrors = 0;
+                for ( size_t i=1; i < arrData.size(); ++i ) {
+                    if ( arrData[i-1] + 1 != arrData[i] ) {
+                        CPPUNIT_CHECK_EX( arrData[i-1] + 1 == arrData[i], "Writer " << nWriter << ": [" << (i-1) << "]=" << arrData[i-1] << ", [" << i << "]=" << arrData[i] );
+                        if ( ++nErrors > 10 )
+                            return;
+                    }
+                }
+
+                CPPUNIT_CHECK_EX( arrData[0] == 0, "Writer " << nWriter << "[0] != 0" );
+                CPPUNIT_CHECK_EX( arrData[arrData.size() - 1] == m_nThreadPushCount - 1, "Writer " << nWriter << "[last] != " << m_nThreadPushCount - 1 );
+            }
+        }
+
+        template <class Queue>
+        void test_with( Queue& testQueue, value_array<typename Queue::value_type>& arrValue, size_t nLeftOffset, size_t nRightOffset )
+        {
+            m_nThreadPushCount = s_nQueueSize / s_nWriterThreadCount;
+            CPPUNIT_MSG( "    reader count=" << s_nReaderThreadCount << " writer count=" << s_nWriterThreadCount
+                << " item count=" << m_nThreadPushCount * s_nWriterThreadCount << "..." );
+
+            typename Queue::value_type * pValStart = arrValue.get();
+            typename Queue::value_type * pValEnd = pValStart + s_nQueueSize;
+
+            CppUnitMini::ThreadPool pool( *this );
+
+            m_nProducerCount.store( s_nWriterThreadCount, CDS_ATOMIC::memory_order_release );
+
+            // Writers must be first
+            pool.add( new Producer<Queue>( pool, testQueue ), s_nWriterThreadCount );
+            {
+                for ( typename Queue::value_type * it = pValStart; it != pValEnd; ++it ) {
+                    it->nNo = 0;
+                    it->nWriterNo = 0;
+                    it->nConsumer = c_nBadConsumer;
+                }
+
+                typename Queue::value_type * pStart = pValStart;
+                for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                    static_cast<Producer<Queue>* >( *it )->m_pStart = pStart;
+                    pStart += m_nThreadPushCount;
+                    static_cast<Producer<Queue>* >( *it )->m_pEnd = pStart;
+                }
+            }
+            pool.add( new Consumer<Queue>( pool, testQueue ), s_nReaderThreadCount );
+
+            pool.run();
+
+            // Check that all values have been dequeued
+            {
+                size_t nBadConsumerCount = 0;
+                size_t nQueueSize = m_nThreadPushCount * s_nWriterThreadCount;
+                typename Queue::value_type * pEnd = pValStart + nQueueSize;
+                for ( typename Queue::value_type * it = pValStart; it != pEnd; ++it  ) {
+                    if ( it->nConsumer == c_nBadConsumer )
+                        ++nBadConsumerCount;
+                }
+                CPPUNIT_CHECK_EX( nBadConsumerCount == 0, "nBadConsumerCount=" << nBadConsumerCount );
+            }
+
+            analyze( pool, testQueue, nLeftOffset, nRightOffset );
+            CPPUNIT_MSG( testQueue.statistics() );
+        }
+
+        template <typename Queue>
+        void test()
+        {
+            value_array<typename Queue::value_type> arrValue( s_nQueueSize );
+            {
+                Queue q;
+                test_with(q, arrValue, 0, 0);
+            }
+            Queue::gc::force_dispose();
+        }
+
+        template <typename Queue>
+        void test_boost()
+        {
+            value_array<typename Queue::value_type> arrValue( s_nQueueSize );
+            {
+                Queue q;
+                test_with(q, arrValue, 0, 0);
+            }
+        }
+
+        template <typename Queue>
+        void test_bounded()
+        {
+            value_array<typename Queue::value_type> arrValue( s_nQueueSize );
+            Queue q;
+            test_with(q, arrValue, 0, 0);
+        }
+
+        template <typename Queue>
+        void test_fcqueue()
+        {
+            value_array<typename Queue::value_type> arrValue( s_nQueueSize );
+            CPPUNIT_MSG( "Combining pass count: " << s_nFCPassCount << ", compact factor: " << s_nFCCompactFactor );
+            Queue q( s_nFCCompactFactor, s_nFCPassCount );
+            test_with(q, arrValue, 0, 0);
+        }
+
+        template <typename Queue>
+        void test_segmented()
+        {
+            value_array<typename Queue::value_type> arrValue( s_nQueueSize );
+            for ( size_t nSegmentSize = 4; nSegmentSize <= 256; nSegmentSize *= 4 ) {
+                CPPUNIT_MSG( "Segment size: " << nSegmentSize );
+                {
+                    Queue q( nSegmentSize );
+                    test_with( q, arrValue, nSegmentSize * 2, nSegmentSize );
+                }
+                Queue::gc::force_dispose();
+            }
+        }
+
+        template <typename Queue>
+        void test_spqueue()
+        {
+            value_array<typename Queue::value_type> arrValue( s_nQueueSize );
+            for ( size_t nArraySize = 2; nArraySize <= 64; nArraySize *= 2 ) {
+                CPPUNIT_MSG( "Array size: " << nArraySize );
+                {
+                    Queue q( nArraySize );
+                    test_with( q, arrValue, 0, 0 );
+                }
+                Queue::gc::force_dispose();
+            }
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nReaderThreadCount = cfg.getULong("ReaderCount", 4 );
+            s_nWriterThreadCount = cfg.getULong("WriterCount", 4 );
+            s_nQueueSize = cfg.getULong("QueueSize", 10000000 );
+            s_nFCPassCount = cfg.getUInt("FCPassCount", 8);
+            s_nFCCompactFactor = cfg.getUInt("FCCompactFactor", 64);
+        }
+
+    protected:
+        CDSUNIT_DECLARE_MSQueue
+        CDSUNIT_DECLARE_MoirQueue
+        CDSUNIT_DECLARE_OptimisticQueue
+        CDSUNIT_DECLARE_BasketQueue
+        CDSUNIT_DECLARE_MichaelDeque
+        CDSUNIT_DECLARE_FCQueue
+        CDSUNIT_DECLARE_SegmentedQueue
+        CDSUNIT_DECLARE_TsigasCycleQueue
+        CDSUNIT_DECLARE_VyukovMPMCCycleQueue
+        CDSUNIT_DECLARE_BoostSList
+
+
+        CPPUNIT_TEST_SUITE(IntrusiveQueue_ReaderWriter)
+            CDSUNIT_TEST_MSQueue
+            CDSUNIT_TEST_MoirQueue
+            CDSUNIT_TEST_OptimisticQueue
+            CDSUNIT_TEST_BasketQueue
+            CDSUNIT_TEST_MichaelDeque
+            CDSUNIT_TEST_FCQueue
+            CDSUNIT_TEST_SegmentedQueue
+            CDSUNIT_TEST_TsigasCycleQueue
+            CDSUNIT_TEST_VyukovMPMCCycleQueue
+            CDSUNIT_TEST_BoostSList
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+} // namespace queue
+
+CPPUNIT_TEST_SUITE_REGISTRATION(queue::IntrusiveQueue_ReaderWriter);
diff --git a/tests/unit/queue/intrusive_queue_type.h b/tests/unit/queue/intrusive_queue_type.h
new file mode 100644 (file)
index 0000000..39ad1da
--- /dev/null
@@ -0,0 +1,691 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H
+#define __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H
+
+#include <cds/intrusive/msqueue.h>
+#include <cds/intrusive/moir_queue.h>
+#include <cds/intrusive/optimistic_queue.h>
+#include <cds/intrusive/tsigas_cycle_queue.h>
+#include <cds/intrusive/vyukov_mpmc_cycle_queue.h>
+#include <cds/intrusive/basket_queue.h>
+#include <cds/intrusive/fcqueue.h>
+#include <cds/intrusive/michael_deque.h>
+#include <cds/intrusive/segmented_queue.h>
+
+#include <cds/gc/hp.h>
+#include <cds/gc/hrc.h>
+#include <cds/gc/ptb.h>
+
+#include <boost/intrusive/slist.hpp>
+
+#include "print_deque_stat.h"
+#include "print_segmentedqueue_stat.h"
+
+namespace queue {
+
+    namespace details {
+        struct empty_stat {};
+
+        // MichaelDeque, push right/pop left
+        template <typename GC, typename T, CDS_DECL_OPTIONS10>
+        class MichaelDequeR: public cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10>
+        {
+            typedef cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10> base_class;
+        public:
+            MichaelDequeR( size_t nMaxItemCount )
+                : base_class( (unsigned int) nMaxItemCount, 4 )
+            {}
+            MichaelDequeR()
+                : base_class( 64 * 1024, 4 )
+            {}
+
+            bool push( T& v )
+            {
+                return base_class::push_back( v );
+            }
+            bool enqueue( T& v )
+            {
+                return push( v );
+            }
+
+            T * pop()
+            {
+                return base_class::pop_front();
+            }
+            T * deque()
+            {
+                return pop();
+            }
+        };
+
+        // MichaelDeque, push left/pop right
+        template <typename GC, typename T, CDS_DECL_OPTIONS10>
+        class MichaelDequeL: public cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10>
+        {
+            typedef cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10> base_class;
+        public:
+            MichaelDequeL( size_t nMaxItemCount )
+                : base_class( (unsigned int) nMaxItemCount, 4 )
+            {}
+            MichaelDequeL()
+                : base_class( 64 * 1024, 4 )
+            {}
+
+            bool push( T& v )
+            {
+                return base_class::push_front( v );
+            }
+            bool enqueue( T& v )
+            {
+                return push( v );
+            }
+
+            T * pop()
+            {
+                return base_class::pop_back();
+            }
+            T * deque()
+            {
+                return pop();
+            }
+        };
+
+        template <typename T, typename Lock=cds_std::mutex>
+        class BoostSList
+        {
+            typedef boost::intrusive::slist< T, boost::intrusive::cache_last<true> >    slist_type;
+            typedef Lock lock_type;
+            typedef cds_std::lock_guard<lock_type> lock_guard;
+
+            slist_type  m_List;
+            mutable lock_type m_Lock;
+        public:
+            typedef T value_type;
+
+        public:
+            bool push( value_type& v )
+            {
+                lock_guard l( m_Lock );
+                m_List.push_back( v );
+                return true;
+            }
+
+            bool enqueue( value_type& v )
+            {
+                return push( v );
+            }
+
+            value_type * pop()
+            {
+                lock_guard l( m_Lock );
+                if ( m_List.empty() )
+                    return cds::null_ptr<T *>();
+                value_type& v = m_List.front();
+                m_List.pop_front();
+                return &v;
+            }
+            value_type * deque()
+            {
+                return pop();
+            }
+
+            bool empty() const
+            {
+                lock_guard l( m_Lock );
+                return m_List.empty();
+            }
+
+            size_t size() const
+            {
+                lock_guard l( m_Lock );
+                return m_List.size();
+            }
+
+            empty_stat statistics() const
+            {
+                return empty_stat();
+            }
+        };
+    }
+
+    template <typename T>
+    struct Types {
+
+        // MSQueue
+        typedef cds::intrusive::MSQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+        >   MSQueue_HP;
+
+        typedef cds::intrusive::MSQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MSQueue_HP_seqcst;
+
+        typedef cds::intrusive::MSQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+        >   MSQueue_HRC;
+
+        typedef cds::intrusive::MSQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MSQueue_HRC_seqcst;
+
+        typedef cds::intrusive::MSQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+        >   MSQueue_PTB;
+
+        typedef cds::intrusive::MSQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MSQueue_PTB_seqcst;
+
+        // MSQueue + item counter
+        typedef cds::intrusive::MSQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MSQueue_HP_ic;
+
+        typedef cds::intrusive::MSQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MSQueue_HRC_ic;
+
+        typedef cds::intrusive::MSQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MSQueue_PTB_ic;
+
+        // MSQueue + stat
+        typedef cds::intrusive::MSQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MSQueue_HP_stat;
+
+        typedef cds::intrusive::MSQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MSQueue_HRC_stat;
+
+        typedef cds::intrusive::MSQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MSQueue_PTB_stat;
+
+
+        // MoirQueue
+        typedef cds::intrusive::MoirQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+        >   MoirQueue_HP;
+
+        typedef cds::intrusive::MoirQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MoirQueue_HP_seqcst;
+
+        typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+        >   MoirQueue_HRC;
+
+        typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MoirQueue_HRC_seqcst;
+
+        typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+        >   MoirQueue_PTB;
+
+        typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MoirQueue_PTB_seqcst;
+
+        // MoirQueue + item counter
+        typedef cds::intrusive::MoirQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MoirQueue_HP_ic;
+
+        typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MoirQueue_HRC_ic;
+
+        typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MoirQueue_PTB_ic;
+
+        // MoirQueue + stat
+        typedef cds::intrusive::MoirQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MoirQueue_HP_stat;
+
+        typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MoirQueue_HRC_stat;
+
+        typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MoirQueue_PTB_stat;
+
+        // OptimisticQueue
+        typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+        >   OptimisticQueue_HP;
+
+        typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   OptimisticQueue_HP_seqcst;
+
+        typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
+        >   OptimisticQueue_PTB;
+
+        typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   OptimisticQueue_PTB_seqcst;
+
+
+        // OptimisticQueue + item counter
+        typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   OptimisticQueue_HP_ic;
+
+        typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   OptimisticQueue_PTB_ic;
+
+        // OptimisticQueue + stat
+        typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   OptimisticQueue_HP_stat;
+
+        typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   OptimisticQueue_PTB_stat;
+
+        // TsigasCycleQueue
+        class TsigasCycleQueue_dyn
+            : public cds::intrusive::TsigasCycleQueue< T
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+            >
+        {
+            typedef cds::intrusive::TsigasCycleQueue< T
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+            > base_class;
+        public:
+            TsigasCycleQueue_dyn()
+                : base_class( 1024 * 64 )
+            {}
+
+            TsigasCycleQueue_dyn( size_t nCapacity )
+                : base_class( nCapacity )
+            {}
+
+            cds::opt::none statistics() const
+            {
+                return cds::opt::none();
+            }
+        };
+
+        class TsigasCycleQueue_dyn_ic
+            : public cds::intrusive::TsigasCycleQueue< T
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        {
+            typedef cds::intrusive::TsigasCycleQueue< T
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            > base_class;
+        public:
+            TsigasCycleQueue_dyn_ic()
+                : base_class( 1024 * 64 )
+            {}
+            TsigasCycleQueue_dyn_ic( size_t nCapacity )
+                : base_class( nCapacity )
+            {}
+
+            cds::opt::none statistics() const
+            {
+                return cds::opt::none();
+            }
+        };
+
+        // VyukovMPMCCycleQueue
+        class VyukovMPMCCycleQueue_dyn
+            : public cds::intrusive::VyukovMPMCCycleQueue< T
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+            >
+        {
+            typedef cds::intrusive::VyukovMPMCCycleQueue< T
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+            > base_class;
+        public:
+            VyukovMPMCCycleQueue_dyn()
+                : base_class( 1024 * 64 )
+            {}
+            VyukovMPMCCycleQueue_dyn( size_t nCapacity )
+                : base_class( nCapacity )
+            {}
+
+            cds::opt::none statistics() const
+            {
+                return cds::opt::none();
+            }
+        };
+
+        class VyukovMPMCCycleQueue_dyn_ic
+            : public cds::intrusive::VyukovMPMCCycleQueue< T
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        {
+            typedef cds::intrusive::VyukovMPMCCycleQueue< T
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            > base_class;
+        public:
+            VyukovMPMCCycleQueue_dyn_ic()
+                : base_class( 1024 * 64 )
+            {}
+            VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
+                : base_class( nCapacity )
+            {}
+
+            cds::opt::none statistics() const
+            {
+                return cds::opt::none();
+            }
+        };
+
+
+        // MichaelDeque
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+        >    MichaelDequeR_HP;
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >    MichaelDequeR_HP_ic;
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
+        >    MichaelDequeR_HP_stat;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+        >    MichaelDequeR_PTB;
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >    MichaelDequeR_PTB_ic;
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
+        >    MichaelDequeR_PTB_stat;
+
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+        >    MichaelDequeL_HP;
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >    MichaelDequeL_HP_ic;
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
+        >    MichaelDequeL_HP_stat;
+
+
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+        >    MichaelDequeL_PTB;
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >    MichaelDequeL_PTB_ic;
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
+        >    MichaelDequeL_PTB_stat;
+
+        // BasketQueue
+        typedef cds::intrusive::BasketQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+        >   BasketQueue_HP;
+
+        typedef cds::intrusive::BasketQueue<cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   BasketQueue_HP_seqcst;
+
+        typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
+        >   BasketQueue_HRC;
+
+        typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   BasketQueue_HRC_seqcst;
+
+        typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
+        >   BasketQueue_PTB;
+
+        typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   BasketQueue_PTB_seqcst;
+
+        // BasketQueue + item counter
+        typedef cds::intrusive::BasketQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   BasketQueue_HP_ic;
+
+        typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   BasketQueue_HRC_ic;
+
+        typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   BasketQueue_PTB_ic;
+
+        // BasketQueue + stat
+        typedef cds::intrusive::BasketQueue< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   BasketQueue_HP_stat;
+
+        typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   BasketQueue_HRC_stat;
+
+        typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   BasketQueue_PTB_stat;
+
+        // FCQueue
+        class traits_FCQueue_delay2:
+            public cds::intrusive::fcqueue::make_traits<
+                cds::opt::back_off< cds::backoff::delay_of<2> >
+            >::type
+        {};
+        class traits_FCQueue_delay2_elimination:
+            public cds::intrusive::fcqueue::make_traits<
+                cds::opt::back_off< cds::backoff::delay_of<2> >
+                ,cds::opt::enable_elimination< true >
+            >::type
+        {};
+        class traits_FCQueue_delay2_elimination_stat:
+            public cds::intrusive::fcqueue::make_traits<
+                cds::opt::back_off< cds::backoff::delay_of<2> >
+                ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
+                ,cds::opt::enable_elimination< true >
+            >::type
+        {};
+        class traits_FCQueue_expbackoff_elimination:
+            public cds::intrusive::fcqueue::make_traits<
+                cds::opt::enable_elimination< true >
+                ,cds::opt::elimination_backoff< cds::backoff::Default >
+            >::type
+        {};
+        class traits_FCQueue_expbackoff_elimination_stat:
+            public cds::intrusive::fcqueue::make_traits<
+                cds::opt::enable_elimination< true >
+                ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
+                ,cds::opt::elimination_backoff< cds::backoff::Default >
+            >::type
+        {};
+
+        typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
+        typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
+        typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
+        typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
+        typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
+
+        // SegmentedQueue
+        class traits_SegmentedQueue_spin_stat:
+            public cds::intrusive::segmented_queue::make_traits<
+                cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
+            >::type
+        {};
+        class traits_SegmentedQueue_mutex_stat:
+            public cds::intrusive::segmented_queue::make_traits<
+                cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
+                ,cds::opt::lock_type< cds_std::mutex >
+            >::type
+        {};
+        class traits_SegmentedQueue_mutex:
+            public cds::intrusive::segmented_queue::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        {};
+
+        typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T >  SegmentedQueue_HP_spin;
+        typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
+        typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
+        typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
+
+        typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T >  SegmentedQueue_PTB_spin;
+        typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_PTB_spin_stat;
+        typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex >  SegmentedQueue_PTB_mutex;
+        typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_PTB_mutex_stat;
+
+        // Boost SList
+        typedef details::BoostSList< T, cds_std::mutex >    BoostSList_mutex;
+        typedef details::BoostSList< T, cds::lock::Spin >   BoostSList_spin;
+    };
+}
+
+
+// *********************************************
+// Queue statistics
+namespace std {
+
+    // cds::intrusive::queue_stat
+    template <typename Counter>
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_stat<Counter> const& s )
+    {
+        return o
+            << "\tStatistics:\n"
+            << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
+            << "\t\t      Enqueue race: " << s.m_EnqueueRace.get()  << "\n"
+            << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
+            << "\t\t      Dequeue race: " << s.m_DequeueRace.get()  << "\n"
+            << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
+            << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n"
+;
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_dummy_stat const& s )
+    {
+        return o;
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
+    {
+        return o;
+    }
+
+    // cds::intrusive::optimistic_queue::stat
+    template <typename Counter>
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
+    {
+        return o
+            << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
+            << "\t\t"
+            << "\t\t    fix list call: " << s.m_FixListCount.get() << "\n";
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
+    {
+        return o;
+    }
+
+    // cds::intrusive::basket_queue::stat
+    template <typename Counter>
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
+    {
+        return o
+            << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
+            << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
+            << "\t\t    Add basket count: " << s.m_AddBasketCount.get() << "\n";
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
+    {
+        return o;
+    }
+
+    // cds::intrusive::fcqueue::stat
+    template <typename Counter>
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
+    {
+            return o << "\tStatistics:\n"
+                << "\t                    Push: " << s.m_nEnqueue.get()           << "\n"
+                << "\t                     Pop: " << s.m_nDequeue.get()           << "\n"
+                << "\t               FailedPop: " << s.m_nFailedDeq.get()         << "\n"
+                << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
+                << "\tFlat combining statistics:\n"
+                << "\t        Combining factor: " << s.combining_factor()         << "\n"
+                << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
+                << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
+                << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
+                << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
+                << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
+                << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
+                << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
+                << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
+                << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& s )
+    {
+        return o;
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& s )
+    {
+        return o;
+    }
+
+} // namespace std
+
+#endif // #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H
diff --git a/tests/unit/queue/queue_defs.h b/tests/unit/queue/queue_defs.h
new file mode 100644 (file)
index 0000000..34d24d0
--- /dev/null
@@ -0,0 +1,308 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_QUEUE_DEFS_H
+#define __CDSUNIT_QUEUE_DEFS_H
+
+// MoirQueue
+#define CDSUNIT_DECLARE_MoirQueue( ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_HP, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_HP_michaelAlloc, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_HP_seqcst, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_HP_ic, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_HP_stat, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_HRC, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_HRC_michaelAlloc, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_HRC_seqcst, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_HRC_ic, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_HRC_stat, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_PTB, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_PTB_michaelAlloc, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_PTB_seqcst, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_PTB_ic, ITEM_TYPE ) \
+    TEST_CASE( MoirQueue_PTB_stat, ITEM_TYPE )
+
+#define CDSUNIT_TEST_MoirQueue \
+    CPPUNIT_TEST(MoirQueue_HP) \
+    CPPUNIT_TEST(MoirQueue_HP_michaelAlloc) \
+    CPPUNIT_TEST(MoirQueue_HP_seqcst) \
+    CPPUNIT_TEST(MoirQueue_HP_ic) \
+    CPPUNIT_TEST(MoirQueue_HP_stat) \
+    CPPUNIT_TEST(MoirQueue_HRC) \
+    CPPUNIT_TEST(MoirQueue_HRC_michaelAlloc) \
+    CPPUNIT_TEST(MoirQueue_HRC_seqcst) \
+    CPPUNIT_TEST(MoirQueue_HRC_ic) \
+    CPPUNIT_TEST(MoirQueue_HRC_stat) \
+    CPPUNIT_TEST(MoirQueue_PTB) \
+    CPPUNIT_TEST(MoirQueue_PTB_michaelAlloc) \
+    CPPUNIT_TEST(MoirQueue_PTB_seqcst) \
+    CPPUNIT_TEST(MoirQueue_PTB_ic) \
+    CPPUNIT_TEST(MoirQueue_PTB_stat)
+
+// MSQueue
+#define CDSUNIT_DECLARE_MSQueue( ITEM_TYPE ) \
+    TEST_CASE( MSQueue_HP, ITEM_TYPE  ) \
+    TEST_CASE( MSQueue_HP_michaelAlloc, ITEM_TYPE  ) \
+    TEST_CASE( MSQueue_HP_seqcst, ITEM_TYPE  ) \
+    TEST_CASE( MSQueue_HP_ic, ITEM_TYPE  ) \
+    TEST_CASE( MSQueue_HP_stat, ITEM_TYPE  ) \
+    TEST_CASE( MSQueue_HRC, ITEM_TYPE ) \
+    TEST_CASE( MSQueue_HRC_michaelAlloc, ITEM_TYPE ) \
+    TEST_CASE( MSQueue_HRC_seqcst, ITEM_TYPE ) \
+    TEST_CASE( MSQueue_HRC_ic, ITEM_TYPE ) \
+    TEST_CASE( MSQueue_HRC_stat, ITEM_TYPE ) \
+    TEST_CASE( MSQueue_PTB, ITEM_TYPE ) \
+    TEST_CASE( MSQueue_PTB_michaelAlloc, ITEM_TYPE ) \
+    TEST_CASE( MSQueue_PTB_seqcst, ITEM_TYPE ) \
+    TEST_CASE( MSQueue_PTB_ic, ITEM_TYPE ) \
+    TEST_CASE( MSQueue_PTB_stat, ITEM_TYPE )
+
+#define CDSUNIT_TEST_MSQueue \
+    CPPUNIT_TEST(MSQueue_HP) \
+    CPPUNIT_TEST(MSQueue_HP_michaelAlloc) \
+    CPPUNIT_TEST(MSQueue_HP_seqcst) \
+    CPPUNIT_TEST(MSQueue_HP_ic) \
+    CPPUNIT_TEST(MSQueue_HP_stat) \
+    CPPUNIT_TEST(MSQueue_HRC) \
+    CPPUNIT_TEST(MSQueue_HRC_michaelAlloc) \
+    CPPUNIT_TEST(MSQueue_HRC_seqcst) \
+    CPPUNIT_TEST(MSQueue_HRC_ic) \
+    CPPUNIT_TEST(MSQueue_HRC_stat) \
+    CPPUNIT_TEST(MSQueue_PTB) \
+    CPPUNIT_TEST(MSQueue_PTB_michaelAlloc) \
+    CPPUNIT_TEST(MSQueue_PTB_seqcst) \
+    CPPUNIT_TEST(MSQueue_PTB_ic) \
+    CPPUNIT_TEST(MSQueue_PTB_stat)
+
+
+// OptimisticQueue
+#define CDSUNIT_DECLARE_OptimisticQueue( ITEM_TYPE ) \
+    TEST_CASE(OptimisticQueue_HP, ITEM_TYPE ) \
+    TEST_CASE(OptimisticQueue_HP_michaelAlloc, ITEM_TYPE ) \
+    TEST_CASE(OptimisticQueue_HP_seqcst, ITEM_TYPE ) \
+    TEST_CASE(OptimisticQueue_HP_ic, ITEM_TYPE ) \
+    TEST_CASE(OptimisticQueue_HP_stat, ITEM_TYPE ) \
+    TEST_CASE(OptimisticQueue_PTB, ITEM_TYPE ) \
+    TEST_CASE(OptimisticQueue_PTB_michaelAlloc, ITEM_TYPE ) \
+    TEST_CASE(OptimisticQueue_PTB_seqcst, ITEM_TYPE ) \
+    TEST_CASE(OptimisticQueue_PTB_ic, ITEM_TYPE ) \
+    TEST_CASE(OptimisticQueue_PTB_stat, ITEM_TYPE )
+
+#define CDSUNIT_TEST_OptimisticQueue \
+    CPPUNIT_TEST(OptimisticQueue_HP) \
+    CPPUNIT_TEST(OptimisticQueue_HP_michaelAlloc) \
+    CPPUNIT_TEST(OptimisticQueue_HP_seqcst) \
+    CPPUNIT_TEST(OptimisticQueue_HP_ic) \
+    CPPUNIT_TEST(OptimisticQueue_HP_stat) \
+    CPPUNIT_TEST(OptimisticQueue_PTB) \
+    CPPUNIT_TEST(OptimisticQueue_PTB_michaelAlloc) \
+    CPPUNIT_TEST(OptimisticQueue_PTB_seqcst) \
+    CPPUNIT_TEST(OptimisticQueue_PTB_ic) \
+    CPPUNIT_TEST(OptimisticQueue_PTB_stat)
+
+
+// BasketQueue
+#define CDSUNIT_DECLARE_BasketQueue( ITEM_TYPE ) \
+    TEST_CASE( BasketQueue_HP, ITEM_TYPE  ) \
+    TEST_CASE( BasketQueue_HP_michaelAlloc, ITEM_TYPE ) \
+    TEST_CASE( BasketQueue_HP_seqcst, ITEM_TYPE  ) \
+    TEST_CASE( BasketQueue_HP_ic, ITEM_TYPE  ) \
+    TEST_CASE( BasketQueue_HP_stat, ITEM_TYPE  ) \
+    TEST_CASE( BasketQueue_HRC, ITEM_TYPE ) \
+    TEST_CASE( BasketQueue_HRC_michaelAlloc, ITEM_TYPE ) \
+    TEST_CASE( BasketQueue_HRC_seqcst, ITEM_TYPE ) \
+    TEST_CASE( BasketQueue_HRC_ic, ITEM_TYPE ) \
+    TEST_CASE( BasketQueue_HRC_stat, ITEM_TYPE ) \
+    TEST_CASE( BasketQueue_PTB, ITEM_TYPE ) \
+    TEST_CASE( BasketQueue_PTB_michaelAlloc, ITEM_TYPE ) \
+    TEST_CASE( BasketQueue_PTB_seqcst, ITEM_TYPE ) \
+    TEST_CASE( BasketQueue_PTB_ic, ITEM_TYPE ) \
+    TEST_CASE( BasketQueue_PTB_stat, ITEM_TYPE )
+
+#define CDSUNIT_TEST_BasketQueue \
+    CPPUNIT_TEST(BasketQueue_HP) \
+    CPPUNIT_TEST(BasketQueue_HP_michaelAlloc) \
+    CPPUNIT_TEST(BasketQueue_HP_seqcst) \
+    CPPUNIT_TEST(BasketQueue_HP_ic) \
+    CPPUNIT_TEST(BasketQueue_HP_stat) \
+    CPPUNIT_TEST(BasketQueue_HRC) \
+    CPPUNIT_TEST(BasketQueue_HRC_michaelAlloc) \
+    CPPUNIT_TEST(BasketQueue_HRC_seqcst) \
+    CPPUNIT_TEST(BasketQueue_HRC_ic) \
+    CPPUNIT_TEST(BasketQueue_HRC_stat) \
+    CPPUNIT_TEST(BasketQueue_PTB) \
+    CPPUNIT_TEST(BasketQueue_PTB_michaelAlloc) \
+    CPPUNIT_TEST(BasketQueue_PTB_seqcst) \
+    CPPUNIT_TEST(BasketQueue_PTB_ic) \
+    CPPUNIT_TEST(BasketQueue_PTB_stat)
+
+
+// FCQueue
+#define CDSUNIT_DECLARE_FCQueue( ITEM_TYPE ) \
+    TEST_CASE( FCQueue_deque, ITEM_TYPE ) \
+    TEST_CASE( FCQueue_deque_elimination, ITEM_TYPE ) \
+    TEST_CASE( FCQueue_deque_elimination_stat, ITEM_TYPE ) \
+    TEST_CASE( FCQueue_list, ITEM_TYPE ) \
+    TEST_CASE( FCQueue_list_elimination, ITEM_TYPE ) \
+    TEST_CASE( FCQueue_list_elimination_stat, ITEM_TYPE )
+
+#define CDSUNIT_TEST_FCQueue \
+    CPPUNIT_TEST( FCQueue_deque) \
+    CPPUNIT_TEST( FCQueue_deque_elimination) \
+    CPPUNIT_TEST( FCQueue_deque_elimination_stat) \
+    CPPUNIT_TEST( FCQueue_list) \
+    CPPUNIT_TEST( FCQueue_list_elimination) \
+    CPPUNIT_TEST( FCQueue_list_elimination_stat)
+
+
+// FCDeque
+#define CDSUNIT_DECLARE_FCDeque( ITEM_TYPE ) \
+    TEST_CASE( FCDequeL_default, ITEM_TYPE ) \
+    TEST_CASE( FCDequeL_mutex, ITEM_TYPE ) \
+    TEST_CASE( FCDequeL_stat, ITEM_TYPE ) \
+    TEST_CASE( FCDequeL_elimination, ITEM_TYPE ) \
+    TEST_CASE( FCDequeL_elimination_stat, ITEM_TYPE ) \
+    TEST_CASE( FCDequeL_boost, ITEM_TYPE ) \
+    TEST_CASE( FCDequeL_boost_stat, ITEM_TYPE ) \
+    TEST_CASE( FCDequeL_boost_elimination, ITEM_TYPE ) \
+    TEST_CASE( FCDequeL_boost_elimination_stat, ITEM_TYPE ) \
+    TEST_CASE( FCDequeR_default, ITEM_TYPE ) \
+    TEST_CASE( FCDequeR_mutex, ITEM_TYPE ) \
+    TEST_CASE( FCDequeR_stat, ITEM_TYPE ) \
+    TEST_CASE( FCDequeR_elimination, ITEM_TYPE ) \
+    TEST_CASE( FCDequeR_elimination_stat, ITEM_TYPE ) \
+    TEST_CASE( FCDequeR_boost, ITEM_TYPE ) \
+    TEST_CASE( FCDequeR_boost_stat, ITEM_TYPE ) \
+    TEST_CASE( FCDequeR_boost_elimination, ITEM_TYPE ) \
+    TEST_CASE( FCDequeR_boost_elimination_stat, ITEM_TYPE )
+
+#define CDSUNIT_TEST_FCDeque \
+    CPPUNIT_TEST( FCDequeL_default ) \
+    CPPUNIT_TEST( FCDequeL_mutex ) \
+    CPPUNIT_TEST( FCDequeL_stat ) \
+    CPPUNIT_TEST( FCDequeL_elimination ) \
+    CPPUNIT_TEST( FCDequeL_elimination_stat ) \
+    CPPUNIT_TEST( FCDequeL_boost ) \
+    CPPUNIT_TEST( FCDequeL_boost_stat ) \
+    CPPUNIT_TEST( FCDequeL_boost_elimination ) \
+    CPPUNIT_TEST( FCDequeL_boost_elimination_stat ) \
+    CPPUNIT_TEST( FCDequeR_default ) \
+    CPPUNIT_TEST( FCDequeR_mutex ) \
+    CPPUNIT_TEST( FCDequeR_stat ) \
+    CPPUNIT_TEST( FCDequeR_elimination ) \
+    CPPUNIT_TEST( FCDequeR_elimination_stat ) \
+    CPPUNIT_TEST( FCDequeR_boost ) \
+    CPPUNIT_TEST( FCDequeR_boost_stat ) \
+    CPPUNIT_TEST( FCDequeR_boost_elimination ) \
+    CPPUNIT_TEST( FCDequeR_boost_elimination_stat )
+
+
+// RWQueue
+#define CDSUNIT_DECLARE_RWQueue( ITEM_TYPE ) \
+    TEST_CASE( RWQueue_Spin, ITEM_TYPE ) \
+    TEST_CASE( RWQueue_Spin_ic, ITEM_TYPE ) \
+    TEST_CASE( RWQueue_Spin_stat, ITEM_TYPE )
+
+#define CDSUNIT_TEST_RWQueue \
+    CPPUNIT_TEST(RWQueue_Spin) \
+    CPPUNIT_TEST(RWQueue_Spin_ic) \
+    CPPUNIT_TEST(RWQueue_Spin_stat)
+
+
+// MichalDeque
+#define CDSUNIT_DECLARE_MichaelDeque( ITEM_TYPE ) \
+    TEST_BOUNDED(MichaelDequeL_HP, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeL_HP_ic, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeL_HP_michaelAlloc, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeL_HP_stat, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeL_PTB, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeL_PTB_ic, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeL_PTB_michaelAlloc, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeL_PTB_stat, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeR_HP, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeR_HP_ic, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeR_HP_michaelAlloc, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeR_HP_stat, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeR_PTB, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeR_PTB_ic, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeR_PTB_michaelAlloc, ITEM_TYPE) \
+    TEST_BOUNDED(MichaelDequeR_PTB_stat, ITEM_TYPE)
+
+#define CDSUNIT_TEST_MichaelDeque \
+    CPPUNIT_TEST(MichaelDequeL_HP ) \
+    CPPUNIT_TEST(MichaelDequeL_HP_ic ) \
+    CPPUNIT_TEST(MichaelDequeL_HP_michaelAlloc ) \
+    CPPUNIT_TEST(MichaelDequeL_HP_stat ) \
+    CPPUNIT_TEST(MichaelDequeL_PTB ) \
+    CPPUNIT_TEST(MichaelDequeL_PTB_ic ) \
+    CPPUNIT_TEST(MichaelDequeL_PTB_michaelAlloc ) \
+    CPPUNIT_TEST(MichaelDequeL_PTB_stat ) \
+    CPPUNIT_TEST(MichaelDequeR_HP ) \
+    CPPUNIT_TEST(MichaelDequeR_HP_ic ) \
+    CPPUNIT_TEST(MichaelDequeR_HP_michaelAlloc ) \
+    CPPUNIT_TEST(MichaelDequeR_HP_stat ) \
+    CPPUNIT_TEST(MichaelDequeR_PTB ) \
+    CPPUNIT_TEST(MichaelDequeR_PTB_ic ) \
+    CPPUNIT_TEST(MichaelDequeR_PTB_michaelAlloc ) \
+    CPPUNIT_TEST(MichaelDequeR_PTB_stat )
+
+
+// TsigasCycleQueue
+#define CDSUNIT_DECLARE_TsigasCysleQueue( ITEM_TYPE ) \
+    TEST_BOUNDED(TsigasCycleQueue_dyn, ITEM_TYPE) \
+    TEST_BOUNDED(TsigasCycleQueue_dyn_michaelAlloc, ITEM_TYPE) \
+    TEST_BOUNDED(TsigasCycleQueue_dyn_ic, ITEM_TYPE)
+
+#define CDSUNIT_TEST_TsigasCysleQueue \
+    CPPUNIT_TEST(TsigasCycleQueue_dyn) \
+    CPPUNIT_TEST(TsigasCycleQueue_dyn_michaelAlloc) \
+    CPPUNIT_TEST(TsigasCycleQueue_dyn_ic)
+
+
+// VyukovMPMCCycleQueue
+#define CDSUNIT_DECLARE_VyukovMPMCCycleQueue( ITEM_TYPE ) \
+    TEST_BOUNDED(VyukovMPMCCycleQueue_dyn, ITEM_TYPE) \
+    TEST_BOUNDED(VyukovMPMCCycleQueue_dyn_michaelAlloc, ITEM_TYPE) \
+    TEST_BOUNDED(VyukovMPMCCycleQueue_dyn_ic, ITEM_TYPE)
+
+#define CDSUNIT_TEST_VyukovMPMCCycleQueue \
+    CPPUNIT_TEST(VyukovMPMCCycleQueue_dyn) \
+    CPPUNIT_TEST(VyukovMPMCCycleQueue_dyn_michaelAlloc) \
+    CPPUNIT_TEST(VyukovMPMCCycleQueue_dyn_ic)
+
+// SegmentedQueue
+#define CDSUNIT_DECLARE_SegmentedQueue( ITEM_TYPE ) \
+    TEST_SEGMENTED( SegmentedQueue_HP_spin, ITEM_TYPE ) \
+    TEST_SEGMENTED( SegmentedQueue_HP_spin_stat, ITEM_TYPE ) \
+    TEST_SEGMENTED( SegmentedQueue_HP_mutex, ITEM_TYPE ) \
+    TEST_SEGMENTED( SegmentedQueue_HP_mutex_stat, ITEM_TYPE ) \
+    TEST_SEGMENTED( SegmentedQueue_PTB_spin, ITEM_TYPE ) \
+    TEST_SEGMENTED( SegmentedQueue_PTB_spin_stat, ITEM_TYPE ) \
+    TEST_SEGMENTED( SegmentedQueue_PTB_mutex, ITEM_TYPE ) \
+    TEST_SEGMENTED( SegmentedQueue_PTB_mutex_stat, ITEM_TYPE )
+
+#define CDSUNIT_TEST_SegmentedQueue \
+    CPPUNIT_TEST( SegmentedQueue_HP_spin ) \
+    CPPUNIT_TEST( SegmentedQueue_HP_spin_stat ) \
+    CPPUNIT_TEST( SegmentedQueue_HP_mutex ) \
+    CPPUNIT_TEST( SegmentedQueue_HP_mutex_stat ) \
+    CPPUNIT_TEST( SegmentedQueue_PTB_spin ) \
+    CPPUNIT_TEST( SegmentedQueue_PTB_spin_stat ) \
+    CPPUNIT_TEST( SegmentedQueue_PTB_mutex ) \
+    CPPUNIT_TEST( SegmentedQueue_PTB_mutex_stat )
+
+
+// std::queue
+#define CDSUNIT_DECLARE_StdQueue( ITEM_TYPE ) \
+    TEST_CASE( StdQueue_deque_Spinlock, ITEM_TYPE ) \
+    TEST_CASE( StdQueue_list_Spinlock, ITEM_TYPE ) \
+    TEST_CASE( StdQueue_deque_BoostMutex, ITEM_TYPE ) \
+    TEST_CASE( StdQueue_list_BoostMutex, ITEM_TYPE )
+
+#define CDSUNIT_TEST_StdQueue \
+    CPPUNIT_TEST(StdQueue_deque_Spinlock) \
+    CPPUNIT_TEST(StdQueue_list_Spinlock) \
+    CPPUNIT_TEST(StdQueue_deque_BoostMutex) \
+    CPPUNIT_TEST(StdQueue_list_BoostMutex)
+
+
+#endif // #ifndef __CDSUNIT_QUEUE_DEFS_H
diff --git a/tests/unit/queue/queue_pop.cpp b/tests/unit/queue/queue_pop.cpp
new file mode 100644 (file)
index 0000000..43843ac
--- /dev/null
@@ -0,0 +1,229 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "queue/queue_type.h"
+#include "queue/queue_defs.h"
+
+// Multi-threaded queue test for pop operation
+namespace queue {
+
+#define TEST_CASE( Q, V )       void Q() { test< Types<V>::Q >(); }
+#define TEST_BOUNDED( Q, V )    void Q() { test_bounded< Types<V>::Q >(); }
+#define TEST_SEGMENTED( Q, V )  void Q() { test_segmented< Types<V>::Q >(); }
+
+    namespace ns_Queue_Pop {
+        static size_t s_nThreadCount = 8;
+        static size_t s_nQueueSize = 20000000 ;   // no more than 20 million records
+
+        struct SimpleValue {
+            size_t    nNo;
+
+            SimpleValue(): nNo(0) {}
+            SimpleValue( size_t n ): nNo(n) {}
+            size_t getNo() const { return  nNo; }
+        };
+    }
+    using namespace ns_Queue_Pop;
+
+    class Queue_Pop: public CppUnitMini::TestCase
+    {
+        template <class Queue>
+        class Thread: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Thread( *this );
+            }
+        public:
+            Queue&              m_Queue;
+            double              m_fTime;
+            long *              m_arr;
+            size_t              m_nPopCount;
+
+        public:
+            Thread( CppUnitMini::ThreadPool& pool, Queue& q )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+            {
+                m_arr = new long[s_nQueueSize];
+            }
+            Thread( Thread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+            {
+                m_arr = new long[s_nQueueSize];
+            }
+            ~Thread()
+            {
+                delete [] m_arr;
+            }
+
+            Queue_Pop&  getTest()
+            {
+                return reinterpret_cast<Queue_Pop&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+                memset(m_arr, 0, sizeof(m_arr[0]) * s_nQueueSize );
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_fTime = m_Timer.duration();
+
+                typedef typename Queue::value_type value_type;
+                value_type value = value_type();
+                size_t nPopCount = 0;
+                while ( m_Queue.pop( value ) ) {
+                    ++m_arr[ value.getNo() ];
+                    ++nPopCount;
+                }
+                m_nPopCount = nPopCount;
+
+                m_fTime = m_Timer.duration() - m_fTime;
+            }
+        };
+
+    protected:
+
+        template <class Queue>
+        void analyze( CppUnitMini::ThreadPool& pool, Queue& testQueue  )
+        {
+            size_t * arr = new size_t[ s_nQueueSize ];
+            memset(arr, 0, sizeof(arr[0]) * s_nQueueSize );
+
+            double fTime = 0;
+            size_t nTotalPops = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Thread<Queue> * pThread = reinterpret_cast<Thread<Queue> *>(*it);
+                for ( size_t i = 0; i < s_nQueueSize; ++i )
+                    arr[i] += pThread->m_arr[i];
+                nTotalPops += pThread->m_nPopCount;
+                fTime += pThread->m_fTime;
+            }
+            CPPUNIT_MSG( "     Duration=" << (fTime / s_nThreadCount) );
+            CPPUNIT_CHECK_EX( nTotalPops == s_nQueueSize, "Total pop=" << nTotalPops << ", queue size=" << s_nQueueSize);
+            CPPUNIT_CHECK( testQueue.empty() )
+
+            size_t nError = 0;
+            for ( size_t i = 0; i < s_nQueueSize; ++i ) {
+                if ( arr[i] != 1 ) {
+                    CPPUNIT_MSG( "   ERROR: Item " << i << " has not been popped" );
+                    CPPUNIT_ASSERT( ++nError <= 10 );
+                }
+            }
+
+            delete [] arr;
+        }
+
+        template <class Queue>
+        void test()
+        {
+            Queue testQueue;
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread<Queue>( pool, testQueue ), s_nThreadCount );
+
+            CPPUNIT_MSG( "   Create queue size =" << s_nQueueSize << " ...");
+            cds::OS::Timer      timer;
+            for ( size_t i = 0; i < s_nQueueSize; ++i )
+                testQueue.push( i );
+            CPPUNIT_MSG( "     Duration=" << timer.duration() );
+
+            CPPUNIT_MSG( "   Pop test, thread count=" << s_nThreadCount << " ...");
+            pool.run();
+
+            analyze( pool, testQueue );
+
+            CPPUNIT_MSG( testQueue.statistics() );
+        }
+
+        template <class Queue>
+        void test_bounded()
+        {
+            Queue testQueue( s_nQueueSize );
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread<Queue>( pool, testQueue ), s_nThreadCount );
+
+            CPPUNIT_MSG( "   Create queue size =" << s_nQueueSize << " ...");
+            cds::OS::Timer      timer;
+            for ( size_t i = 0; i < s_nQueueSize; ++i )
+                testQueue.push( i );
+            CPPUNIT_MSG( "     Duration=" << timer.duration() );
+
+            CPPUNIT_MSG( "   Pop test, thread count=" << s_nThreadCount << " ...");
+            pool.run();
+
+            analyze( pool, testQueue );
+
+            CPPUNIT_MSG( testQueue.statistics() );
+        }
+
+        template <class Queue>
+        void test_segmented()
+        {
+            for ( size_t nSegmentSize = 4; nSegmentSize <= 256; nSegmentSize *= 4 ) {
+                CPPUNIT_MSG( "Segment size: " << nSegmentSize );
+
+                Queue testQueue( nSegmentSize );
+                CppUnitMini::ThreadPool pool( *this );
+                pool.add( new Thread<Queue>( pool, testQueue ), s_nThreadCount );
+
+                CPPUNIT_MSG( "   Create queue size =" << s_nQueueSize << " ...");
+                cds::OS::Timer      timer;
+                for ( size_t i = 0; i < s_nQueueSize; ++i )
+                    testQueue.push( i );
+                CPPUNIT_MSG( "     Duration=" << timer.duration() );
+
+                CPPUNIT_MSG( "   Pop test, thread count=" << s_nThreadCount << " ...");
+                pool.run();
+
+                analyze( pool, testQueue );
+
+                CPPUNIT_MSG( testQueue.statistics() );
+            }
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nThreadCount = cfg.getULong("ThreadCount", 8 );
+            s_nQueueSize = cfg.getULong("QueueSize", 20000000 );
+        }
+
+    protected:
+        CDSUNIT_DECLARE_MoirQueue( SimpleValue )
+        CDSUNIT_DECLARE_MSQueue( SimpleValue )
+        CDSUNIT_DECLARE_OptimisticQueue( SimpleValue )
+        CDSUNIT_DECLARE_BasketQueue( SimpleValue )
+        CDSUNIT_DECLARE_FCQueue( SimpleValue )
+        CDSUNIT_DECLARE_FCDeque( SimpleValue )
+        CDSUNIT_DECLARE_SegmentedQueue( SimpleValue )
+        CDSUNIT_DECLARE_RWQueue( SimpleValue )
+        CDSUNIT_DECLARE_MichaelDeque( SimpleValue )
+        CDSUNIT_DECLARE_TsigasCysleQueue( SimpleValue )
+        CDSUNIT_DECLARE_VyukovMPMCCycleQueue( SimpleValue )
+        CDSUNIT_DECLARE_StdQueue( SimpleValue )
+
+        CPPUNIT_TEST_SUITE(Queue_Pop)
+            CDSUNIT_TEST_MoirQueue
+            CDSUNIT_TEST_MSQueue
+            CDSUNIT_TEST_OptimisticQueue
+            CDSUNIT_TEST_BasketQueue
+            CDSUNIT_TEST_FCQueue
+            CDSUNIT_TEST_FCDeque
+            CDSUNIT_TEST_SegmentedQueue
+            CDSUNIT_TEST_RWQueue
+            CDSUNIT_TEST_MichaelDeque
+            CDSUNIT_TEST_TsigasCysleQueue
+            CDSUNIT_TEST_VyukovMPMCCycleQueue
+            CDSUNIT_TEST_StdQueue
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+} // namespace queue
+
+CPPUNIT_TEST_SUITE_REGISTRATION(queue::Queue_Pop);
diff --git a/tests/unit/queue/queue_push.cpp b/tests/unit/queue/queue_push.cpp
new file mode 100644 (file)
index 0000000..7922978
--- /dev/null
@@ -0,0 +1,240 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "queue/queue_type.h"
+#include "queue/queue_defs.h"
+
+
+// Multi-threaded queue test for push operation
+namespace queue {
+
+#define TEST_CASE( Q, V )       void Q() { test< Types<V>::Q >(); }
+#define TEST_BOUNDED( Q, V )    void Q() { test_bounded< Types<V>::Q >(); }
+#define TEST_SEGMENTED( Q, V )  void Q() { test_segmented< Types<V>::Q >(); }
+
+    namespace ns_Queue_Push {
+        static size_t s_nThreadCount = 8;
+        static size_t s_nQueueSize = 20000000 ;   // no more than 20 million records
+
+        struct SimpleValue {
+            size_t      nNo;
+
+            SimpleValue(): nNo(0) {}
+            SimpleValue( size_t n ): nNo(n) {}
+            size_t getNo() const { return  nNo; }
+        };
+    }
+    using namespace ns_Queue_Push;
+
+    class Queue_Push: public CppUnitMini::TestCase
+    {
+        template <class Queue>
+        class Thread: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Thread( *this );
+            }
+        public:
+            Queue&              m_Queue;
+            double              m_fTime;
+            size_t              m_nStartItem;
+            size_t              m_nEndItem;
+            size_t              m_nPushError;
+
+        public:
+            Thread( CppUnitMini::ThreadPool& pool, Queue& q )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+            {}
+            Thread( Thread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+            {}
+
+            Queue_Push&  getTest()
+            {
+                return reinterpret_cast<Queue_Push&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_fTime = m_Timer.duration();
+
+                m_nPushError = 0;
+                for ( size_t nItem = m_nStartItem; nItem < m_nEndItem; ++nItem ) {
+                    if ( !m_Queue.push( nItem ))
+                        ++m_nPushError;
+                }
+
+                m_fTime = m_Timer.duration() - m_fTime;
+            }
+        };
+
+    protected:
+        template <class Queue>
+        void analyze( CppUnitMini::ThreadPool& pool, Queue& testQueue  )
+        {
+            size_t nThreadItems = s_nQueueSize / s_nThreadCount;
+            double fTime = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Thread<Queue> * pThread = reinterpret_cast<Thread<Queue> *>(*it);
+                fTime += pThread->m_fTime;
+                if ( pThread->m_nPushError != 0 )
+                    CPPUNIT_MSG("     ERROR: thread push error count=" << pThread->m_nPushError );
+            }
+            CPPUNIT_MSG( "     Duration=" << (fTime / s_nThreadCount) );
+            CPPUNIT_CHECK( !testQueue.empty() )
+
+            size_t * arr = new size_t[ s_nQueueSize ];
+            memset(arr, 0, sizeof(arr[0]) * s_nQueueSize );
+
+            cds::OS::Timer      timer;
+            CPPUNIT_MSG( "   Pop (single-threaded)..." );
+            size_t nPopped = 0;
+            SimpleValue val = SimpleValue();
+            while ( testQueue.pop( val )) {
+                nPopped++;
+                ++arr[ val.getNo() ];
+            }
+            CPPUNIT_MSG( "     Duration=" << timer.duration() );
+
+            size_t nTotalItems = nThreadItems * s_nThreadCount;
+            size_t nError = 0;
+            for ( size_t i = 0; i < nTotalItems; ++i ) {
+                if ( arr[i] != 1 ) {
+                    CPPUNIT_MSG( "   ERROR: Item " << i << " has not been pushed" );
+                    CPPUNIT_ASSERT( ++nError <= 10 );
+                }
+            }
+
+            delete [] arr;
+        }
+
+        template <class Queue>
+        void test()
+        {
+            Queue testQueue;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread<Queue>( pool, testQueue ), s_nThreadCount );
+
+            size_t nStart = 0;
+            size_t nThreadItemCount = s_nQueueSize / s_nThreadCount;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Thread<Queue> * pThread = reinterpret_cast<Thread<Queue> *>(*it);
+                pThread->m_nStartItem = nStart;
+                nStart += nThreadItemCount;
+                pThread->m_nEndItem = nStart;
+            }
+
+            CPPUNIT_MSG( "   Push test, thread count=" << s_nThreadCount << " ...");
+            pool.run();
+
+            analyze( pool, testQueue );
+
+            CPPUNIT_MSG( testQueue.statistics() );
+        }
+
+        template <class Queue>
+        void test_bounded()
+        {
+            size_t nStart = 0;
+            size_t nThreadItemCount = s_nQueueSize / s_nThreadCount;
+
+            Queue testQueue( s_nQueueSize );
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread<Queue>( pool, testQueue ), s_nThreadCount );
+
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Thread<Queue> * pThread = reinterpret_cast<Thread<Queue> *>(*it);
+                pThread->m_nStartItem = nStart;
+                nStart += nThreadItemCount;
+                pThread->m_nEndItem = nStart;
+            }
+
+            CPPUNIT_MSG( "   Push test, thread count=" << s_nThreadCount << " ...");
+            pool.run();
+
+            analyze( pool, testQueue );
+
+            CPPUNIT_MSG( testQueue.statistics() );
+        }
+
+        template <class Queue>
+        void test_segmented()
+        {
+            CPPUNIT_MSG( "   Push test, thread count=" << s_nThreadCount << " ...");
+            for ( size_t nSegmentSize = 4; nSegmentSize <= 256; nSegmentSize *= 4 ) {
+                CPPUNIT_MSG( "Segment size: " << nSegmentSize );
+
+                Queue testQueue( nSegmentSize );
+
+                CppUnitMini::ThreadPool pool( *this );
+                pool.add( new Thread<Queue>( pool, testQueue ), s_nThreadCount );
+
+                size_t nStart = 0;
+                size_t nThreadItemCount = s_nQueueSize / s_nThreadCount;
+                for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                    Thread<Queue> * pThread = reinterpret_cast<Thread<Queue> *>(*it);
+                    pThread->m_nStartItem = nStart;
+                    nStart += nThreadItemCount;
+                    pThread->m_nEndItem = nStart;
+                }
+
+                pool.run();
+
+                analyze( pool, testQueue );
+
+                CPPUNIT_MSG( testQueue.statistics() );
+            }
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nThreadCount = cfg.getULong("ThreadCount", 8 );
+            s_nQueueSize = cfg.getULong("QueueSize", 20000000 );
+        }
+
+    protected:
+        CDSUNIT_DECLARE_MoirQueue( SimpleValue )
+        CDSUNIT_DECLARE_MSQueue( SimpleValue )
+        CDSUNIT_DECLARE_OptimisticQueue( SimpleValue )
+        CDSUNIT_DECLARE_BasketQueue( SimpleValue )
+        CDSUNIT_DECLARE_FCQueue( SimpleValue )
+        CDSUNIT_DECLARE_FCDeque( SimpleValue )
+        CDSUNIT_DECLARE_SegmentedQueue( SimpleValue )
+        CDSUNIT_DECLARE_RWQueue( SimpleValue )
+        CDSUNIT_DECLARE_MichaelDeque( SimpleValue )
+        CDSUNIT_DECLARE_TsigasCysleQueue( SimpleValue )
+        CDSUNIT_DECLARE_VyukovMPMCCycleQueue( SimpleValue )
+        CDSUNIT_DECLARE_StdQueue( SimpleValue )
+
+        CPPUNIT_TEST_SUITE(Queue_Push)
+            CDSUNIT_TEST_MoirQueue
+            CDSUNIT_TEST_MSQueue
+            CDSUNIT_TEST_OptimisticQueue
+            CDSUNIT_TEST_BasketQueue
+            CDSUNIT_TEST_FCQueue
+            CDSUNIT_TEST_FCDeque
+            CDSUNIT_TEST_SegmentedQueue
+            CDSUNIT_TEST_RWQueue
+            CDSUNIT_TEST_MichaelDeque
+            CDSUNIT_TEST_TsigasCysleQueue
+            CDSUNIT_TEST_VyukovMPMCCycleQueue
+            CDSUNIT_TEST_StdQueue
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+} // namespace queue
+
+CPPUNIT_TEST_SUITE_REGISTRATION(queue::Queue_Push);
diff --git a/tests/unit/queue/queue_random.cpp b/tests/unit/queue/queue_random.cpp
new file mode 100644 (file)
index 0000000..a9b7067
--- /dev/null
@@ -0,0 +1,301 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "queue/queue_type.h"
+#include "queue/queue_defs.h"
+
+
+#include <vector>
+#include <boost/type_traits/is_base_of.hpp>
+
+// Multi-threaded queue test for random push/pop operation
+namespace queue {
+
+#define TEST_CASE( Q, V )       void Q() { test< Types<V>::Q >(); }
+#define TEST_BOUNDED( Q, V )    TEST_CASE( Q, V )
+#define TEST_SEGMENTED( Q, V )  void Q() { test_segmented< Types< V >::Q >(); }
+
+    namespace ns_Queue_Random {
+        static size_t s_nThreadCount = 16;
+        static size_t s_nQueueSize = 10000000;
+
+        struct SimpleValue {
+            size_t      nNo;
+            size_t      nThread;
+
+            SimpleValue() {}
+            SimpleValue( size_t n ): nNo(n) {}
+            size_t getNo() const { return  nNo; }
+        };
+    }
+
+    using namespace ns_Queue_Random;
+
+    class Queue_Random: public CppUnitMini::TestCase
+    {
+        typedef CppUnitMini::TestCase base_class;
+
+        template <class Queue>
+        class Thread: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Thread( *this );
+            }
+        public:
+            Queue&              m_Queue;
+            double              m_fTime;
+
+            size_t  m_nPushCount;
+            size_t  m_nPopCount;
+            size_t  m_nEmptyPop;
+
+            size_t  m_nUndefWriter;
+            size_t  m_nRepeatValue;
+            size_t  m_nPushError        ;    // push error count
+
+            std::vector<size_t> m_arrLastRead;
+            std::vector<size_t> m_arrPopCountPerThread;
+
+            size_t const m_nSpread;
+
+        public:
+            Thread( CppUnitMini::ThreadPool& pool, Queue& q, size_t nSpread = 0 )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+                , m_nSpread( nSpread )
+            {}
+            Thread( Thread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+                , m_nSpread( src.m_nSpread )
+            {}
+
+            Queue_Random&  getTest()
+            {
+                return reinterpret_cast<Queue_Random&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+                m_nPushCount =
+                    m_nPopCount =
+                    m_nEmptyPop =
+                    m_nUndefWriter =
+                    m_nRepeatValue =
+                    m_nPushError = 0;
+
+                m_arrLastRead.resize( s_nThreadCount, 0 );
+                m_arrPopCountPerThread.resize( s_nThreadCount, 0 );
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                size_t const nThreadCount = s_nThreadCount;
+                size_t const nTotalPush = getTest().m_nThreadPushCount;
+
+                SimpleValue node;
+
+                m_fTime = m_Timer.duration();
+
+                bool bNextPop = false;
+                while ( m_nPushCount < nTotalPush ) {
+                    if ( !bNextPop && (rand() & 3) != 3 ) {
+                        // push
+                        node.nThread = m_nThreadNo;
+                        node.nNo = ++m_nPushCount;
+                        if ( !m_Queue.push( node )) {
+                            ++m_nPushError;
+                            --m_nPushCount;
+                        }
+
+                    }
+                    else {
+                        // pop
+                        pop( nThreadCount );
+                        bNextPop = false;
+                    }
+                }
+
+                size_t nPopLoop = 0;
+                while ( !m_Queue.empty() && nPopLoop < 1000000 ) {
+                    if ( pop( nThreadCount ) )
+                        nPopLoop = 0;
+                    else
+                        ++nPopLoop;
+                }
+
+
+                m_fTime = m_Timer.duration() - m_fTime;
+            }
+
+            bool pop( size_t nThreadCount )
+            {
+                SimpleValue node;
+                node.nThread = -1;
+                node.nNo = -1;
+                if ( m_Queue.pop( node )) {
+                    ++m_nPopCount;
+                    if ( node.nThread < nThreadCount ) {
+                        m_arrPopCountPerThread[ node.nThread ] += 1;
+                        if ( m_nSpread ) {
+                            if ( m_arrLastRead[ node.nThread ] > node.nNo ) {
+                                if ( m_arrLastRead[ node.nThread ] - node.nNo > m_nSpread )
+                                    ++m_nRepeatValue;
+                            }
+                            else if ( m_arrLastRead[ node.nThread ] == node.nNo )
+                                ++m_nRepeatValue;
+                            m_arrLastRead[ node.nThread ] = node.nNo;
+                        }
+                        else {
+                            if ( m_arrLastRead[ node.nThread ] < node.nNo ) {
+                                m_arrLastRead[ node.nThread ] = node.nNo;
+                            }
+                            else
+                                ++m_nRepeatValue;
+                        }
+
+                        //if ( node.nNo < m_Test.m_nPushCount )
+                        //    m_Test.m_pRead[ node.nWriter ][ node.nNo ] = node.nNo;
+                    }
+                    else {
+                        ++m_nUndefWriter;
+                    }
+                }
+                else {
+                    ++m_nEmptyPop;
+                    return false;
+                }
+                return true;
+            }
+        };
+
+    protected:
+        size_t  m_nThreadPushCount;
+
+    protected:
+        template <class Queue>
+        void analyze( CppUnitMini::ThreadPool& pool, Queue& testQueue  )
+        {
+            CPPUNIT_CHECK( testQueue.empty() );
+
+            std::vector< size_t > arrPushCount;
+            arrPushCount.resize( s_nThreadCount, 0 );
+
+            size_t nPushTotal = 0;
+            size_t nPopTotal  = 0;
+            double fTime = 0;
+            size_t nPushError = 0;
+
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Thread<Queue> * pThread = static_cast<Thread<Queue> *>( *it );
+                CPPUNIT_CHECK( pThread->m_nUndefWriter == 0 );
+                CPPUNIT_CHECK_EX( pThread->m_nRepeatValue == 0, "nRepeatValue=" << pThread->m_nRepeatValue );
+                if ( !boost::is_base_of<cds::bounded_container, Queue>::value ) {
+                    CPPUNIT_CHECK( pThread->m_nPushError == 0 );
+                }
+                else
+                    nPushError += pThread->m_nPushError;
+
+                arrPushCount[ pThread->m_nThreadNo ] += pThread->m_nPushCount;
+
+                nPushTotal += pThread->m_nPushCount;
+                nPopTotal += pThread->m_nPopCount;
+                fTime += pThread->m_fTime;
+            }
+
+            CPPUNIT_MSG( "     Duration=" << (fTime /= s_nThreadCount) );
+            if ( boost::is_base_of<cds::bounded_container, Queue>::value ) {
+                CPPUNIT_MSG( "         push error (when queue is full)=" << nPushError );
+            }
+
+            size_t nTotalItems = m_nThreadPushCount * s_nThreadCount;
+
+            CPPUNIT_CHECK_EX( nPushTotal == nTotalItems, "nPushTotal=" << nPushTotal << ", nTotalItems=" << nTotalItems );
+            CPPUNIT_CHECK_EX( nPopTotal == nTotalItems, "nPopTotal=" << nPopTotal << ", nTotalItems=" << nTotalItems );
+
+            for ( size_t i = 0; i < s_nThreadCount; ++i )
+                CPPUNIT_CHECK( arrPushCount[i] == m_nThreadPushCount );
+        }
+
+        template <class Queue>
+        void test()
+        {
+            CPPUNIT_MSG( "Random push/pop test\n    thread count=" << s_nThreadCount << ", push count=" << s_nQueueSize << " ..." );
+
+            m_nThreadPushCount = s_nQueueSize / s_nThreadCount;
+
+            Queue testQueue;
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread<Queue>( pool, testQueue ), s_nThreadCount );
+
+            pool.run();
+
+            analyze( pool, testQueue );
+            CPPUNIT_MSG( testQueue.statistics() );
+        }
+
+        template <class Queue>
+        void test_segmented()
+        {
+            CPPUNIT_MSG( "Random push/pop test\n    thread count=" << s_nThreadCount << ", push count=" << s_nQueueSize << " ..." );
+
+            m_nThreadPushCount = s_nQueueSize / s_nThreadCount;
+
+            for ( size_t nSegmentSize = 4; nSegmentSize <= 256; nSegmentSize *= 4 ) {
+                CPPUNIT_MSG( "Segment size: " << nSegmentSize );
+
+                Queue testQueue( nSegmentSize );
+                CppUnitMini::ThreadPool pool( *this );
+                pool.add( new Thread<Queue>( pool, testQueue, nSegmentSize * 2 ), s_nThreadCount );
+
+                pool.run();
+
+                analyze( pool, testQueue );
+                CPPUNIT_MSG( testQueue.statistics() );
+            }
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nThreadCount = cfg.getULong("ThreadCount", 8 );
+            s_nQueueSize = cfg.getULong("QueueSize", 20000000 );
+        }
+
+    protected:
+        CDSUNIT_DECLARE_MoirQueue( SimpleValue )
+        CDSUNIT_DECLARE_MSQueue( SimpleValue )
+        CDSUNIT_DECLARE_OptimisticQueue( SimpleValue )
+        CDSUNIT_DECLARE_BasketQueue( SimpleValue )
+        CDSUNIT_DECLARE_FCQueue( SimpleValue )
+        CDSUNIT_DECLARE_FCDeque( SimpleValue )
+        CDSUNIT_DECLARE_SegmentedQueue( SimpleValue )
+        CDSUNIT_DECLARE_RWQueue( SimpleValue )
+        CDSUNIT_DECLARE_MichaelDeque( SimpleValue )
+        CDSUNIT_DECLARE_TsigasCysleQueue( SimpleValue )
+        CDSUNIT_DECLARE_VyukovMPMCCycleQueue( SimpleValue )
+        CDSUNIT_DECLARE_StdQueue( SimpleValue )
+
+        CPPUNIT_TEST_SUITE(Queue_Random)
+            CDSUNIT_TEST_MoirQueue
+            CDSUNIT_TEST_MSQueue
+            CDSUNIT_TEST_OptimisticQueue
+            CDSUNIT_TEST_BasketQueue
+            CDSUNIT_TEST_FCQueue
+            CDSUNIT_TEST_FCDeque
+            CDSUNIT_TEST_SegmentedQueue
+            CDSUNIT_TEST_RWQueue
+            CDSUNIT_TEST_MichaelDeque
+            CDSUNIT_TEST_TsigasCysleQueue
+            CDSUNIT_TEST_VyukovMPMCCycleQueue
+            CDSUNIT_TEST_StdQueue
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+} // namespace queue
+
+CPPUNIT_TEST_SUITE_REGISTRATION(queue::Queue_Random);
diff --git a/tests/unit/queue/queue_reader_writer.cpp b/tests/unit/queue/queue_reader_writer.cpp
new file mode 100644 (file)
index 0000000..2b9511f
--- /dev/null
@@ -0,0 +1,368 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "queue/queue_type.h"
+#include "queue/queue_defs.h"
+
+#include <vector>
+#include <algorithm>
+
+// Multi-threaded random queue test
+namespace queue {
+
+#define TEST_CASE( Q, V )       void Q() { test< Types<V>::Q >(); }
+#define TEST_BOUNDED( Q, V )    TEST_CASE( Q, V )
+#define TEST_SEGMENTED( Q, V )  void Q() { test_segmented< Types< V >::Q >(); }
+
+    namespace {
+        static size_t s_nReaderThreadCount = 4;
+        static size_t s_nWriterThreadCount = 4;
+        static size_t s_nQueueSize = 4000000;
+
+        struct Value {
+            size_t      nNo;
+            size_t      nWriterNo;
+        };
+    }
+
+    class Queue_ReaderWriter: public CppUnitMini::TestCase
+    {
+        template <class Queue>
+        class WriterThread: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new WriterThread( *this );
+            }
+        public:
+            Queue&              m_Queue;
+            double              m_fTime;
+            size_t              m_nPushFailed;
+
+        public:
+            WriterThread( CppUnitMini::ThreadPool& pool, Queue& q )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+            {}
+            WriterThread( WriterThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+            {}
+
+            Queue_ReaderWriter&  getTest()
+            {
+                return reinterpret_cast<Queue_ReaderWriter&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                size_t nPushCount = getTest().m_nThreadPushCount;
+                Value v;
+                v.nWriterNo = m_nThreadNo;
+                v.nNo = 0;
+                m_nPushFailed = 0;
+
+                m_fTime = m_Timer.duration();
+
+                while ( v.nNo < nPushCount ) {
+                    if ( m_Queue.push( v ))
+                        ++v.nNo;
+                    else
+                        ++m_nPushFailed;
+                }
+
+                m_fTime = m_Timer.duration() - m_fTime;
+                getTest().m_nWriterDone.fetch_add( 1 );
+            }
+        };
+
+        template <class Queue>
+        class ReaderThread: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new ReaderThread( *this );
+            }
+        public:
+            Queue&              m_Queue;
+            double              m_fTime;
+            size_t              m_nPopEmpty;
+            size_t              m_nPopped;
+            size_t              m_nBadWriter;
+
+            typedef std::vector<size_t> TPoppedData;
+            typedef std::vector<size_t>::iterator       data_iterator;
+            typedef std::vector<size_t>::const_iterator const_data_iterator;
+
+            std::vector<TPoppedData>        m_WriterData;
+
+        private:
+            void initPoppedData()
+            {
+                const size_t nWriterCount = s_nWriterThreadCount;
+                const size_t nWriterPushCount = getTest().m_nThreadPushCount;
+                m_WriterData.resize( nWriterCount );
+                for ( size_t i = 0; i < nWriterCount; ++i )
+                    m_WriterData[i].reserve( nWriterPushCount );
+            }
+
+        public:
+            ReaderThread( CppUnitMini::ThreadPool& pool, Queue& q )
+                : CppUnitMini::TestThread( pool )
+                , m_Queue( q )
+            {
+                initPoppedData();
+            }
+            ReaderThread( ReaderThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Queue( src.m_Queue )
+            {
+                initPoppedData();
+            }
+
+            Queue_ReaderWriter&  getTest()
+            {
+                return reinterpret_cast<Queue_ReaderWriter&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPopEmpty = 0;
+                m_nPopped = 0;
+                m_nBadWriter = 0;
+                const size_t nTotalWriters = s_nWriterThreadCount;
+                Value v;
+
+                m_fTime = m_Timer.duration();
+
+                while ( true ) {
+                    if ( m_Queue.pop( v ) ) {
+                        ++m_nPopped;
+                        if ( /*v.nWriterNo >= 0 &&*/ v.nWriterNo < nTotalWriters )
+                            m_WriterData[ v.nWriterNo ].push_back( v.nNo );
+                        else
+                            ++m_nBadWriter;
+                    }
+                    else
+                        ++m_nPopEmpty;
+
+                    if ( m_Queue.empty() ) {
+                        if ( getTest().m_nWriterDone.load() >= nTotalWriters ) {
+                            if ( m_Queue.empty() )
+                                    break;
+                        }
+                    }
+                }
+
+                m_fTime = m_Timer.duration() - m_fTime;
+            }
+        };
+
+    protected:
+        size_t                  m_nThreadPushCount;
+        CDS_ATOMIC::atomic<size_t>     m_nWriterDone;
+
+    protected:
+        template <class Queue>
+        void analyze( CppUnitMini::ThreadPool& pool, Queue& testQueue, size_t nLeftOffset = 0, size_t nRightOffset = 0  )
+        {
+            typedef ReaderThread<Queue> Reader;
+            typedef WriterThread<Queue> Writer;
+            typedef typename Reader::const_data_iterator    ReaderIterator;
+
+            size_t nPostTestPops = 0;
+            {
+                Value v;
+                while ( testQueue.pop( v ))
+                    ++nPostTestPops;
+            }
+
+            double fTimeWriter = 0;
+            double fTimeReader = 0;
+            size_t nTotalPops = 0;
+            size_t nPopFalse = 0;
+            size_t nPoppedItems = 0;
+            size_t nPushFailed = 0;
+
+            std::vector< Reader * > arrReaders;
+
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Reader * pReader = dynamic_cast<Reader *>( *it );
+                if ( pReader ) {
+                    fTimeReader += pReader->m_fTime;
+                    nTotalPops += pReader->m_nPopped;
+                    nPopFalse += pReader->m_nPopEmpty;
+                    arrReaders.push_back( pReader );
+                    CPPUNIT_CHECK_EX( pReader->m_nBadWriter == 0, "reader " << pReader->m_nThreadNo << " bad writer event count=" << pReader->m_nBadWriter );
+
+                    size_t nPopped = 0;
+                    for ( size_t n = 0; n < s_nWriterThreadCount; ++n )
+                        nPopped += pReader->m_WriterData[n].size();
+
+                    CPPUNIT_MSG( "    Reader " << pReader->m_nThreadNo - s_nWriterThreadCount << " popped count=" << nPopped );
+                    nPoppedItems += nPopped;
+                }
+                else {
+                    Writer * pWriter = dynamic_cast<Writer *>( *it );
+                    CPPUNIT_ASSERT( pWriter != NULL );
+                    fTimeWriter += pWriter->m_fTime;
+                    nPushFailed += pWriter->m_nPushFailed;
+                    if ( !boost::is_base_of<cds::bounded_container, Queue>::value ) {
+                        CPPUNIT_CHECK_EX( pWriter->m_nPushFailed == 0,
+                            "writer " << pWriter->m_nThreadNo << " push failed count=" << pWriter->m_nPushFailed );
+                    }
+                }
+            }
+            CPPUNIT_CHECK_EX( nTotalPops == nPoppedItems, "nTotalPops=" << nTotalPops << ", nPoppedItems=" << nPoppedItems );
+
+            CPPUNIT_MSG( "    Readers: duration=" << fTimeReader / s_nReaderThreadCount << ", success pop=" << nTotalPops << ", failed pops=" << nPopFalse );
+            CPPUNIT_MSG( "    Writers: duration=" << fTimeWriter / s_nWriterThreadCount << ", failed push=" << nPushFailed );
+
+            size_t nQueueSize = m_nThreadPushCount * s_nWriterThreadCount;
+            CPPUNIT_CHECK_EX( nTotalPops + nPostTestPops == nQueueSize, "popped=" << nTotalPops + nPostTestPops << " must be " << nQueueSize );
+            CPPUNIT_CHECK( testQueue.empty() );
+
+            // Test that all items have been popped
+            CPPUNIT_MSG( "   Test consistency of popped sequence..." );
+            size_t nErrors = 0;
+            for ( size_t nWriter = 0; nWriter < s_nWriterThreadCount; ++nWriter ) {
+                std::vector<size_t> arrData;
+                arrData.reserve( m_nThreadPushCount );
+                nErrors = 0;
+                for ( size_t nReader = 0; nReader < arrReaders.size(); ++nReader ) {
+                    ReaderIterator it = arrReaders[nReader]->m_WriterData[nWriter].begin();
+                    ReaderIterator itEnd = arrReaders[nReader]->m_WriterData[nWriter].end();
+                    if ( it != itEnd ) {
+                        ReaderIterator itPrev = it;
+                        for ( ++it; it != itEnd; ++it ) {
+                            CPPUNIT_CHECK_EX( *itPrev < *it + nRightOffset, "Reader " << nReader << ", Writer " << nWriter << ": prev=" << *itPrev << ", cur=" << *it );
+                            if ( ++nErrors > 10 )
+                                return;
+                            itPrev = it;
+                        }
+                    }
+
+                    for ( it = arrReaders[nReader]->m_WriterData[nWriter].begin(); it != itEnd; ++it )
+                        arrData.push_back( *it );
+                }
+                std::sort( arrData.begin(), arrData.end() );
+                nErrors = 0;
+                for ( size_t i=1; i < arrData.size(); ++i ) {
+                    if ( arrData[i-1] + 1 != arrData[i] ) {
+                        CPPUNIT_CHECK_EX( arrData[i-1] + 1 == arrData[i], "Writer " << nWriter << ": [" << (i-1) << "]=" << arrData[i-1] << ", [" << i << "]=" << arrData[i] );
+                        if ( ++nErrors > 10 )
+                            return;
+                    }
+                }
+
+                CPPUNIT_CHECK_EX( arrData[0] == 0, "Writer " << nWriter << "[0] != 0" );
+                CPPUNIT_CHECK_EX( arrData[arrData.size() - 1] == m_nThreadPushCount - 1, "Writer " << nWriter << "[last] != " << m_nThreadPushCount - 1 );
+            }
+        }
+
+        template <class Queue>
+        void test()
+        {
+            m_nThreadPushCount = s_nQueueSize / s_nWriterThreadCount;
+            CPPUNIT_MSG( "    reader count=" << s_nReaderThreadCount << " writer count=" << s_nWriterThreadCount
+                << " item count=" << m_nThreadPushCount * s_nWriterThreadCount << "..." );
+
+            Queue testQueue;
+            CppUnitMini::ThreadPool pool( *this );
+
+            m_nWriterDone.store( 0 );
+
+            // Writers must be first
+            pool.add( new WriterThread<Queue>( pool, testQueue ), s_nWriterThreadCount );
+            pool.add( new ReaderThread<Queue>( pool, testQueue ), s_nReaderThreadCount );
+
+            //CPPUNIT_MSG( "   Reader/Writer test, reader count=" << s_nReaderThreadCount << " writer count=" << s_nWriterThreadCount << "..." );
+            pool.run();
+
+            analyze( pool, testQueue );
+            CPPUNIT_MSG( testQueue.statistics() );
+        }
+
+        template <class Queue>
+        void test_segmented()
+        {
+            m_nThreadPushCount = s_nQueueSize / s_nWriterThreadCount;
+            CPPUNIT_MSG( "    reader count=" << s_nReaderThreadCount << " writer count=" << s_nWriterThreadCount
+                << " item count=" << m_nThreadPushCount * s_nWriterThreadCount << "..." );
+
+            for ( size_t nSegmentSize = 4; nSegmentSize <= 256; nSegmentSize *= 4 ) {
+                CPPUNIT_MSG( "Segment size: " << nSegmentSize );
+
+                Queue q( nSegmentSize );
+                CppUnitMini::ThreadPool pool( *this );
+
+                m_nWriterDone.store( 0 );
+
+                // Writers must be first
+                pool.add( new WriterThread<Queue>( pool, q ), s_nWriterThreadCount );
+                pool.add( new ReaderThread<Queue>( pool, q ), s_nReaderThreadCount );
+
+                pool.run();
+
+                analyze( pool, q, nSegmentSize * 2, nSegmentSize );
+                CPPUNIT_MSG( q.statistics() );
+            }
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nReaderThreadCount = cfg.getULong("ReaderCount", 4 );
+            s_nWriterThreadCount = cfg.getULong("WriterCount", 4 );
+            s_nQueueSize = cfg.getULong("QueueSize", 10000000 );
+        }
+
+    protected:
+        CDSUNIT_DECLARE_MoirQueue( Value )
+        CDSUNIT_DECLARE_MSQueue( Value )
+        CDSUNIT_DECLARE_OptimisticQueue( Value )
+        CDSUNIT_DECLARE_BasketQueue( Value )
+        CDSUNIT_DECLARE_FCQueue( Value )
+        CDSUNIT_DECLARE_FCDeque( Value )
+        CDSUNIT_DECLARE_SegmentedQueue( Value )
+        CDSUNIT_DECLARE_RWQueue( Value )
+        CDSUNIT_DECLARE_MichaelDeque( Value )
+        CDSUNIT_DECLARE_TsigasCysleQueue( Value )
+        CDSUNIT_DECLARE_VyukovMPMCCycleQueue( Value )
+        CDSUNIT_DECLARE_StdQueue( Value )
+
+        CPPUNIT_TEST_SUITE(Queue_ReaderWriter)
+            CDSUNIT_TEST_MoirQueue
+            CDSUNIT_TEST_MSQueue
+            CDSUNIT_TEST_OptimisticQueue
+            CDSUNIT_TEST_BasketQueue
+            CDSUNIT_TEST_FCQueue
+            CDSUNIT_TEST_FCDeque
+            CDSUNIT_TEST_SegmentedQueue
+            CDSUNIT_TEST_RWQueue
+            CDSUNIT_TEST_MichaelDeque
+            CDSUNIT_TEST_TsigasCysleQueue
+            CDSUNIT_TEST_VyukovMPMCCycleQueue
+            CDSUNIT_TEST_StdQueue
+        CPPUNIT_TEST_SUITE_END();
+    };
+
+} // namespace queue
+
+CPPUNIT_TEST_SUITE_REGISTRATION(queue::Queue_ReaderWriter);
diff --git a/tests/unit/queue/queue_type.h b/tests/unit/queue/queue_type.h
new file mode 100644 (file)
index 0000000..7585e5b
--- /dev/null
@@ -0,0 +1,895 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_QUEUE_TYPES_H
+#define __CDSUNIT_QUEUE_TYPES_H
+
+#include <cds/container/msqueue.h>
+#include <cds/container/moir_queue.h>
+#include <cds/container/rwqueue.h>
+#include <cds/container/optimistic_queue.h>
+#include <cds/container/tsigas_cycle_queue.h>
+#include <cds/container/vyukov_mpmc_cycle_queue.h>
+#include <cds/container/basket_queue.h>
+#include <cds/container/fcqueue.h>
+#include <cds/container/fcdeque.h>
+#include <cds/container/michael_deque.h>
+#include <cds/container/segmented_queue.h>
+
+#include <cds/gc/hp.h>
+#include <cds/gc/hrc.h>
+#include <cds/gc/ptb.h>
+
+#include "queue/std_queue.h"
+#include "lock/win32_lock.h"
+#include "michael_alloc.h"
+#include "print_deque_stat.h"
+#include "print_segmentedqueue_stat.h"
+
+#include <boost/container/deque.hpp>
+
+namespace queue {
+
+    namespace details {
+        // MichaelDeque, push right/pop left
+        template <typename GC, typename T, CDS_DECL_OPTIONS7>
+        class MichaelDequeR: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
+        {
+            typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
+        public:
+            MichaelDequeR( size_t nMaxItemCount )
+                : base_class( (unsigned int) nMaxItemCount, 4 )
+            {}
+            MichaelDequeR()
+                : base_class( 64 * 1024, 4 )
+            {}
+
+            bool push( T const& v )
+            {
+                return base_class::push_back( v );
+            }
+            bool enqueue( T const& v )
+            {
+                return push( v );
+            }
+
+            bool pop( T& v )
+            {
+                return base_class::pop_front( v );
+            }
+            bool deque( T& v )
+            {
+                return pop(v);
+            }
+        };
+
+        // MichaelDeque, push left/pop right
+        template <typename GC, typename T, CDS_DECL_OPTIONS7>
+        class MichaelDequeL: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
+        {
+            typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
+        public:
+            MichaelDequeL( size_t nMaxItemCount )
+                : base_class( (unsigned int) nMaxItemCount, 4 )
+            {}
+            MichaelDequeL()
+                : base_class( 64 * 1024, 4 )
+            {}
+
+            bool push( T const& v )
+            {
+                return base_class::push_front( v );
+            }
+            bool enqueue( T const& v )
+            {
+                return push( v );
+            }
+
+            bool pop( T& v )
+            {
+                return base_class::pop_back( v );
+            }
+            bool deque( T& v )
+            {
+                return pop(v);
+            }
+        };
+
+        template <typename T, typename Traits=cds::container::fcdeque::type_traits, class Deque=std::deque<T> >
+        class FCDequeL: public cds::container::FCDeque<T, Deque, Traits >
+        {
+            typedef cds::container::FCDeque<T, Deque, Traits > base_class;
+        public:
+            FCDequeL()
+            {}
+
+            FCDequeL(
+                unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
+                ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
+                )
+                : base_class( nCompactFactor, nCombinePassCount )
+            {}
+
+            bool push( T const& v )
+            {
+                return base_class::push_front( v );
+            }
+            bool enqueue( T const& v )
+            {
+                return push( v );
+            }
+
+            bool pop( T& v )
+            {
+                return base_class::pop_back( v );
+            }
+            bool deque( T& v )
+            {
+                return pop(v);
+            }
+        };
+
+        template <typename T, typename Traits=cds::container::fcdeque::type_traits, class Deque = std::deque<T> >
+        class FCDequeR: public cds::container::FCDeque<T, Deque, Traits >
+        {
+            typedef cds::container::FCDeque<T, Deque, Traits > base_class;
+        public:
+            FCDequeR()
+            {}
+
+            FCDequeR(
+                unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
+                ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
+                )
+                : base_class( nCompactFactor, nCombinePassCount )
+            {}
+
+            bool push( T const& v )
+            {
+                return base_class::push_back( v );
+            }
+            bool enqueue( T const& v )
+            {
+                return push( v );
+            }
+
+            bool pop( T& v )
+            {
+                return base_class::pop_front( v );
+            }
+            bool deque( T& v )
+            {
+                return pop(v);
+            }
+        };
+
+    }
+
+    template <typename Value>
+    struct Types {
+
+        // MSQueue
+        typedef cds::container::MSQueue<
+            cds::gc::HP , Value
+        >   MSQueue_HP;
+
+        typedef cds::container::MSQueue<
+            cds::gc::HP , Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >   MSQueue_HP_michaelAlloc;
+
+        typedef cds::container::MSQueue<
+            cds::gc::HP, Value
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MSQueue_HP_seqcst;
+
+        typedef cds::container::MSQueue< cds::gc::HRC,
+            Value
+        >   MSQueue_HRC;
+
+        typedef cds::container::MSQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >   MSQueue_HRC_michaelAlloc;
+
+        typedef cds::container::MSQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MSQueue_HRC_seqcst;
+
+        typedef cds::container::MSQueue< cds::gc::PTB,
+            Value
+        >   MSQueue_PTB;
+
+        typedef cds::container::MSQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >   MSQueue_PTB_michaelAlloc;
+
+        typedef cds::container::MSQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MSQueue_PTB_seqcst;
+
+        // MSQueue + item counter
+        typedef cds::container::MSQueue< cds::gc::HP,
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MSQueue_HP_ic;
+
+        typedef cds::container::MSQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MSQueue_HRC_ic;
+
+        typedef cds::container::MSQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MSQueue_PTB_ic;
+
+        // MSQueue + stat
+        typedef cds::container::MSQueue< cds::gc::HP,
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MSQueue_HP_stat;
+
+        typedef cds::container::MSQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MSQueue_HRC_stat;
+
+        typedef cds::container::MSQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MSQueue_PTB_stat;
+
+
+        // MoirQueue
+        typedef cds::container::MoirQueue< cds::gc::HP,
+            Value
+        >   MoirQueue_HP;
+
+        typedef cds::container::MoirQueue< cds::gc::HP,
+            Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >   MoirQueue_HP_michaelAlloc;
+
+        typedef cds::container::MoirQueue< cds::gc::HP,
+            Value
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MoirQueue_HP_seqcst;
+
+        typedef cds::container::MoirQueue< cds::gc::HRC,
+            Value
+        >   MoirQueue_HRC;
+
+        typedef cds::container::MoirQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >   MoirQueue_HRC_michaelAlloc;
+
+        typedef cds::container::MoirQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MoirQueue_HRC_seqcst;
+
+        typedef cds::container::MoirQueue< cds::gc::PTB,
+            Value
+        >   MoirQueue_PTB;
+
+        typedef cds::container::MoirQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >   MoirQueue_PTB_michaelAlloc;
+
+        typedef cds::container::MoirQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   MoirQueue_PTB_seqcst;
+
+        // MoirQueue + item counter
+        typedef cds::container::MoirQueue< cds::gc::HP,
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MoirQueue_HP_ic;
+
+        typedef cds::container::MoirQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MoirQueue_HRC_ic;
+
+        typedef cds::container::MoirQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   MoirQueue_PTB_ic;
+
+        // MoirQueue + stat
+        typedef cds::container::MoirQueue< cds::gc::HP,
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MoirQueue_HP_stat;
+
+        typedef cds::container::MoirQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MoirQueue_HRC_stat;
+
+        typedef cds::container::MoirQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   MoirQueue_PTB_stat;
+
+        // OptimisticQueue
+        typedef cds::container::OptimisticQueue< cds::gc::HP,
+            Value
+        >   OptimisticQueue_HP;
+
+        typedef cds::container::OptimisticQueue< cds::gc::HP,
+            Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >   OptimisticQueue_HP_michaelAlloc;
+
+        typedef cds::container::OptimisticQueue< cds::gc::HP,
+            Value
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   OptimisticQueue_HP_seqcst;
+
+        typedef cds::container::OptimisticQueue< cds::gc::PTB,
+            Value
+        >   OptimisticQueue_PTB;
+
+        typedef cds::container::OptimisticQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >   OptimisticQueue_PTB_michaelAlloc;
+
+        typedef cds::container::OptimisticQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   OptimisticQueue_PTB_seqcst;
+
+
+        // OptimisticQueue + item counter
+        typedef cds::container::OptimisticQueue< cds::gc::HP,
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   OptimisticQueue_HP_ic;
+
+        typedef cds::container::OptimisticQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   OptimisticQueue_PTB_ic;
+
+        // OptimisticQueue + stat
+        typedef cds::container::OptimisticQueue< cds::gc::HP,
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   OptimisticQueue_HP_stat;
+
+        typedef cds::container::OptimisticQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   OptimisticQueue_PTB_stat;
+
+        // TsigasCycleQueue
+        class TsigasCycleQueue_dyn
+            : public cds::container::TsigasCycleQueue<
+                Value
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+            >
+        {
+            typedef cds::container::TsigasCycleQueue<
+                Value
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+            > base_class;
+        public:
+            TsigasCycleQueue_dyn()
+                : base_class( 1024 * 64 )
+            {}
+
+            TsigasCycleQueue_dyn( size_t nCapacity )
+                : base_class( nCapacity )
+            {}
+
+            cds::opt::none statistics() const
+            {
+                return cds::opt::none();
+            }
+        };
+
+        class TsigasCycleQueue_dyn_michaelAlloc
+            : public cds::container::TsigasCycleQueue<
+                Value
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+                ,cds::opt::allocator< memory::MichaelAllocator<int> >
+            >
+        {
+            typedef cds::container::TsigasCycleQueue<
+                Value
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+                ,cds::opt::allocator< memory::MichaelAllocator<int> >
+            > base_class;
+        public:
+            TsigasCycleQueue_dyn_michaelAlloc()
+                : base_class( 1024 * 64 )
+            {}
+
+            TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
+                : base_class( nCapacity )
+            {}
+
+            cds::opt::none statistics() const
+            {
+                return cds::opt::none();
+            }
+        };
+
+        class TsigasCycleQueue_dyn_ic
+            : public cds::container::TsigasCycleQueue<
+                Value
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        {
+            typedef cds::container::TsigasCycleQueue<
+                Value
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            > base_class;
+        public:
+            TsigasCycleQueue_dyn_ic()
+                : base_class( 1024 * 64 )
+            {}
+            TsigasCycleQueue_dyn_ic( size_t nCapacity )
+                : base_class( nCapacity )
+            {}
+
+            cds::opt::none statistics() const
+            {
+                return cds::opt::none();
+            }
+        };
+
+        // VyukovMPMCCycleQueue
+        class VyukovMPMCCycleQueue_dyn
+            : public cds::container::VyukovMPMCCycleQueue<
+                Value
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+            >
+        {
+            typedef cds::container::VyukovMPMCCycleQueue<
+                Value
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+            > base_class;
+        public:
+            VyukovMPMCCycleQueue_dyn()
+                : base_class( 1024 * 64 )
+            {}
+            VyukovMPMCCycleQueue_dyn( size_t nCapacity )
+                : base_class( nCapacity )
+            {}
+
+            cds::opt::none statistics() const
+            {
+                return cds::opt::none();
+            }
+        };
+
+        class VyukovMPMCCycleQueue_dyn_michaelAlloc
+            : public cds::container::VyukovMPMCCycleQueue<
+            Value
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
+            >
+        {
+            typedef cds::container::VyukovMPMCCycleQueue<
+                Value
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
+            > base_class;
+        public:
+            VyukovMPMCCycleQueue_dyn_michaelAlloc()
+                : base_class( 1024 * 64 )
+            {}
+            VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
+                : base_class( nCapacity )
+            {}
+
+            cds::opt::none statistics() const
+            {
+                return cds::opt::none();
+            }
+        };
+
+        class VyukovMPMCCycleQueue_dyn_ic
+            : public cds::container::VyukovMPMCCycleQueue<
+                Value
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            >
+        {
+            typedef cds::container::VyukovMPMCCycleQueue<
+                Value
+                ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
+                ,cds::opt::item_counter< cds::atomicity::item_counter >
+            > base_class;
+        public:
+            VyukovMPMCCycleQueue_dyn_ic()
+                : base_class( 1024 * 64 )
+            {}
+            VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
+                : base_class( nCapacity )
+            {}
+
+            cds::opt::none statistics() const
+            {
+                return cds::opt::none();
+            }
+        };
+
+
+        // MichaelDeque
+        typedef details::MichaelDequeR< cds::gc::HP, Value >    MichaelDequeR_HP;
+        typedef details::MichaelDequeR< cds::gc::HP, Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >    MichaelDequeR_HP_ic;
+        typedef details::MichaelDequeR< cds::gc::HP, Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >    MichaelDequeR_HP_michaelAlloc;
+        typedef details::MichaelDequeR< cds::gc::HP, Value
+            ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
+        >    MichaelDequeR_HP_stat;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, Value >    MichaelDequeR_PTB;
+        typedef details::MichaelDequeR< cds::gc::PTB, Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >    MichaelDequeR_PTB_ic;
+        typedef details::MichaelDequeR< cds::gc::PTB, Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >    MichaelDequeR_PTB_michaelAlloc;
+        typedef details::MichaelDequeR< cds::gc::PTB, Value
+            ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
+        >    MichaelDequeR_PTB_stat;
+
+        typedef details::MichaelDequeL< cds::gc::HP, Value >    MichaelDequeL_HP;
+        typedef details::MichaelDequeL< cds::gc::HP, Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >    MichaelDequeL_HP_ic;
+        typedef details::MichaelDequeL< cds::gc::HP, Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >    MichaelDequeL_HP_michaelAlloc;
+        typedef details::MichaelDequeL< cds::gc::HP, Value
+            ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
+        >    MichaelDequeL_HP_stat;
+
+
+        typedef details::MichaelDequeL< cds::gc::PTB, Value >    MichaelDequeL_PTB;
+        typedef details::MichaelDequeL< cds::gc::PTB, Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >    MichaelDequeL_PTB_ic;
+        typedef details::MichaelDequeL< cds::gc::PTB, Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >    MichaelDequeL_PTB_michaelAlloc;
+        typedef details::MichaelDequeL< cds::gc::PTB, Value
+            ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
+        >    MichaelDequeL_PTB_stat;
+
+        // BasketQueue
+        typedef cds::container::BasketQueue<
+            cds::gc::HP , Value
+        >   BasketQueue_HP;
+
+        typedef cds::container::BasketQueue<
+            cds::gc::HP , Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >   BasketQueue_HP_michaelAlloc;
+
+        typedef cds::container::BasketQueue<
+            cds::gc::HP, Value
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   BasketQueue_HP_seqcst;
+
+        typedef cds::container::BasketQueue< cds::gc::HRC,
+            Value
+        >   BasketQueue_HRC;
+
+        typedef cds::container::BasketQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >   BasketQueue_HRC_michaelAlloc;
+
+        typedef cds::container::BasketQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   BasketQueue_HRC_seqcst;
+
+        typedef cds::container::BasketQueue< cds::gc::PTB,
+            Value
+        >   BasketQueue_PTB;
+
+        typedef cds::container::BasketQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::allocator< memory::MichaelAllocator<int> >
+        >   BasketQueue_PTB_michaelAlloc;
+
+        typedef cds::container::BasketQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
+        >   BasketQueue_PTB_seqcst;
+
+        // BasketQueue + item counter
+        typedef cds::container::BasketQueue< cds::gc::HP,
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   BasketQueue_HP_ic;
+
+        typedef cds::container::BasketQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   BasketQueue_HRC_ic;
+
+        typedef cds::container::BasketQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        >   BasketQueue_PTB_ic;
+
+        // BasketQueue + stat
+        typedef cds::container::BasketQueue< cds::gc::HP,
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   BasketQueue_HP_stat;
+
+        typedef cds::container::BasketQueue< cds::gc::HRC,
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   BasketQueue_HRC_stat;
+
+        typedef cds::container::BasketQueue< cds::gc::PTB,
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        >   BasketQueue_PTB_stat;
+
+
+        // RWQueue
+        typedef cds::container::RWQueue<
+            Value
+        > RWQueue_Spin;
+
+        typedef cds::container::RWQueue<
+            Value
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        > RWQueue_Spin_ic;
+
+        typedef cds::container::RWQueue<
+            Value
+            ,cds::opt::stat< cds::intrusive::queue_stat<> >
+        > RWQueue_Spin_stat;
+
+        // FCQueue
+        class traits_FCQueue_elimination:
+            public cds::container::fcqueue::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        {};
+        class traits_FCQueue_elimination_stat:
+            public cds::container::fcqueue::make_traits<
+                cds::opt::enable_elimination< true >
+                ,cds::opt::stat< cds::container::fcqueue::stat<> >
+            >::type
+        {};
+
+        typedef cds::container::FCQueue< Value > FCQueue_deque;
+        typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
+        typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
+
+        typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
+        typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
+        typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
+
+
+   // FCDeque
+        struct traits_FCDeque_stat:
+            public cds::container::fcdeque::make_traits<
+                cds::opt::stat< cds::container::fcdeque::stat<> >
+            >::type
+        {};
+        struct traits_FCDeque_elimination:
+            public cds::container::fcdeque::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        {};
+        struct traits_FCDeque_elimination_stat:
+            public cds::container::fcdeque::make_traits<
+                cds::opt::stat< cds::container::fcdeque::stat<> >,
+                cds::opt::enable_elimination< true >
+            >::type
+        {};
+        struct traits_FCDeque_mutex:
+            public cds::container::fcdeque::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        {};
+
+        typedef details::FCDequeL< Value > FCDequeL_default;
+        typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
+        typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
+        typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
+        typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
+
+        typedef details::FCDequeL< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeL_boost;
+        typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
+        typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
+        typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
+
+        typedef details::FCDequeR< Value > FCDequeR_default;
+        typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
+        typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
+        typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
+        typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
+
+        typedef details::FCDequeR< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeR_boost;
+        typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
+        typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
+        typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
+
+        typedef StdQueue_deque<Value>               StdQueue_deque_Spinlock;
+        typedef StdQueue_list<Value>                StdQueue_list_Spinlock;
+        typedef StdQueue_deque<Value, cds_std::mutex> StdQueue_deque_BoostMutex;
+        typedef StdQueue_list<Value, cds_std::mutex>  StdQueue_list_BoostMutex;
+#ifdef UNIT_LOCK_WIN_CS
+        typedef StdQueue_deque<Value, lock::win::CS>    StdQueue_deque_WinCS;
+        typedef StdQueue_list<Value, lock::win::CS>     StdQueue_list_WinCS;
+        typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
+        typedef StdQueue_list<Value, lock::win::Mutex>  StdQueue_list_WinMutex;
+#endif
+
+        // SegmentedQueue
+        class traits_SegmentedQueue_spin_stat:
+            public cds::container::segmented_queue::make_traits<
+                cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
+            >::type
+        {};
+        class traits_SegmentedQueue_mutex_stat:
+            public cds::container::segmented_queue::make_traits<
+                cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
+                ,cds::opt::lock_type< cds_std::mutex >
+            >::type
+        {};
+        class traits_SegmentedQueue_mutex:
+            public cds::container::segmented_queue::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        {};
+
+        typedef cds::container::SegmentedQueue< cds::gc::HP, Value >  SegmentedQueue_HP_spin;
+        typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
+        typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
+        typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
+
+        typedef cds::container::SegmentedQueue< cds::gc::PTB, Value >  SegmentedQueue_PTB_spin;
+        typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_PTB_spin_stat;
+        typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_PTB_mutex;
+        typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_PTB_mutex_stat;
+
+
+    };
+}
+
+
+// *********************************************
+// Queue statistics
+namespace std {
+
+    // cds::intrusive::queue_stat
+    template <typename Counter>
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_stat<Counter> const& s )
+    {
+        return o
+            << "\tStatistics:\n"
+            << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
+            << "\t\t      Enqueue race: " << s.m_EnqueueRace.get()  << "\n"
+            << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
+            << "\t\t      Dequeue race: " << s.m_DequeueRace.get()  << "\n"
+            << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
+            << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n"
+;
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_dummy_stat const& s )
+    {
+        return o;
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
+    {
+        return o;
+    }
+
+    // cds::intrusive::optimistic_queue::stat
+    template <typename Counter>
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
+    {
+        return o
+            << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
+            << "\t\t"
+            << "\t\t    fix list call: " << s.m_FixListCount.get() << "\n";
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
+    {
+        return o;
+    }
+
+    // cds::intrusive::basket_queue::stat
+    template <typename Counter>
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
+    {
+        return o
+            << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
+            << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
+            << "\t\t    Add basket count: " << s.m_AddBasketCount.get() << "\n";
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
+    {
+        return o;
+    }
+
+    // cds::container::fcqueue::stat
+    template <typename Counter>
+    static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
+    {
+            return o << "\tStatistics:\n"
+                << "\t                    Push: " << s.m_nEnqueue.get()           << "\n"
+                << "\t                PushMove: " << s.m_nEnqMove.get()           << "\n"
+                << "\t                     Pop: " << s.m_nDequeue.get()           << "\n"
+                << "\t               FailedPop: " << s.m_nFailedDeq.get()         << "\n"
+                << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
+                << "\tFlat combining statistics:\n"
+                << "\t        Combining factor: " << s.combining_factor()         << "\n"
+                << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
+                << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
+                << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
+                << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
+                << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
+                << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
+                << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
+                << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
+                << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
+    }
+
+    static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& s )
+    {
+        return o;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
+    {
+        return o;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
+    {
+        return o << "\tStatistics:\n"
+            << "\t              Push front: " << s.m_nPushFront.get()         << "\n"
+            << "\t         Push front move: " << s.m_nPushFrontMove.get()     << "\n"
+            << "\t               Push back: " << s.m_nPushBack.get()          << "\n"
+            << "\t          Push back move: " << s.m_nPushBackMove.get()      << "\n"
+            << "\t               Pop front: " << s.m_nPopFront.get()          << "\n"
+            << "\t        Failed pop front: " << s.m_nFailedPopFront.get()    << "\n"
+            << "\t                Pop back: " << s.m_nPopBack.get()           << "\n"
+            << "\t         Failed pop back: " << s.m_nFailedPopBack.get()     << "\n"
+            << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
+            << "\tFlat combining statistics:\n"
+            << "\t        Combining factor: " << s.combining_factor()         << "\n"
+            << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
+            << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
+            << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
+            << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
+            << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
+            << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
+            << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
+            << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
+            << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
+    }
+
+}
+
+#endif // #ifndef __CDSUNIT_QUEUE_TYPES_H
diff --git a/tests/unit/queue/std_queue.h b/tests/unit/queue/std_queue.h
new file mode 100644 (file)
index 0000000..6ac385b
--- /dev/null
@@ -0,0 +1,53 @@
+//$$CDS-header$$
+
+#ifndef __UNIT_QUEUE_STD_QUEUE_H
+#define __UNIT_QUEUE_STD_QUEUE_H
+
+#include <queue>
+#include <cds/lock/spinlock.h>
+
+namespace queue {
+
+    template <typename T, class Container, class Lock = cds::lock::Spin >
+    class StdQueue: public std::queue<T, Container >
+    {
+        typedef std::queue<T, Container >   base_class;
+        Lock    m_Locker;
+
+    public:
+        bool enqueue( const T& data )
+        {
+            cds::lock::scoped_lock<Lock> a(m_Locker);
+
+            base_class::push( data );
+            return true;
+        }
+        bool push( const T& data )  { return enqueue( data ) ; }
+        bool dequeue( T& data )
+        {
+            cds::lock::scoped_lock<Lock> a(m_Locker);
+            if ( base_class::empty() )
+                return false;
+
+            data = base_class::front();
+            base_class::pop();
+            return true;
+        }
+        bool pop( T& data )         { return dequeue( data ) ; }
+
+        cds::opt::none statistics() const
+        {
+            return cds::opt::none();
+        }
+    };
+
+    template <typename T, class Lock = cds::lock::Spin >
+    class StdQueue_deque: public StdQueue<T, std::deque<T>, Lock >
+    {};
+
+    template <typename T, class Lock = cds::lock::Spin >
+    class StdQueue_list: public StdQueue<T, std::list<T>, Lock >
+    {};
+}
+
+#endif // #ifndef __UNIT_QUEUE_STD_QUEUE_H
diff --git a/tests/unit/set2/set_defs.h b/tests/unit/set2/set_defs.h
new file mode 100644 (file)
index 0000000..31cdb63
--- /dev/null
@@ -0,0 +1,521 @@
+//$$CDS-header$$
+
+#ifndef _CDSUNIT_SET2_SET_DEFS_H
+#define _CDSUNIT_SET2_SET_DEFS_H
+
+#define CDSUNIT_DECLARE_StdSet \
+    TEST_SET(StdSet_Spin) \
+    TEST_SET(StdHashSet_Spin)
+#define CDSUNIT_TEST_StdSet \
+    CPPUNIT_TEST(StdSet_Spin) \
+    CPPUNIT_TEST(StdHashSet_Spin)
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#   define CDSUNIT_DECLARE_MichaelSet_RCU_signal  \
+    TEST_SET_EXTRACT(MichaelSet_RCU_SHB_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_RCU_SHB_less_michaelAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_RCU_SHT_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_RCU_SHT_less_michaelAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_SHB_less_michaelAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_SHT_less_michaelAlloc)
+
+#   define CDSUNIT_TEST_MichaelSet_RCU_signal  \
+    CPPUNIT_TEST(MichaelSet_RCU_SHB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_RCU_SHB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelSet_RCU_SHT_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_RCU_SHT_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_RCU_SHB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_RCU_SHT_less_michaelAlloc)
+#else
+#   define CDSUNIT_DECLARE_MichaelSet_RCU_signal
+#   define CDSUNIT_TEST_MichaelSet_RCU_signal
+#endif
+
+
+#define CDSUNIT_DECLARE_MichaelSet  \
+    TEST_SET_EXTRACT(MichaelSet_HP_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_HP_less_michaelAlloc) \
+    /*TEST_SET_EXTRACT(MichaelSet_HRC_cmp_stdAlloc)*/ \
+    /*TEST_SET_EXTRACT(MichaelSet_HRC_less_michaelAlloc)*/ \
+    TEST_SET_EXTRACT(MichaelSet_PTB_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_PTB_less_michaelAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_RCU_GPI_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_RCU_GPI_less_michaelAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_RCU_GPB_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_RCU_GPB_less_michaelAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_RCU_GPT_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_RCU_GPT_less_michaelAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_HP_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_HP_less_michaelAlloc) \
+    /*TEST_SET_EXTRACT(MichaelSet_Lazy_HRC_cmp_stdAlloc)*/ \
+    /*TEST_SET_EXTRACT(MichaelSet_Lazy_HRC_less_michaelAlloc)*/ \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_PTB_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_PTB_less_michaelAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPI_less_michaelAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPB_less_michaelAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPT_less_michaelAlloc) \
+    CDSUNIT_DECLARE_MichaelSet_RCU_signal
+
+#define CDSUNIT_TEST_MichaelSet  \
+    CPPUNIT_TEST(MichaelSet_HP_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_HP_less_michaelAlloc) \
+    /*CPPUNIT_TEST(MichaelSet_HRC_cmp_stdAlloc)*/ \
+    /*CPPUNIT_TEST(MichaelSet_HRC_less_michaelAlloc)*/ \
+    CPPUNIT_TEST(MichaelSet_PTB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_PTB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelSet_RCU_GPI_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_RCU_GPI_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelSet_RCU_GPB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_RCU_GPB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelSet_RCU_GPT_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_RCU_GPT_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_HP_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_HP_less_michaelAlloc) \
+    /*CPPUNIT_TEST(MichaelSet_Lazy_HRC_cmp_stdAlloc)*/ \
+    /*CPPUNIT_TEST(MichaelSet_Lazy_HRC_less_michaelAlloc)*/ \
+    CPPUNIT_TEST(MichaelSet_Lazy_PTB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_PTB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_RCU_GPI_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_RCU_GPB_less_michaelAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc) \
+    CPPUNIT_TEST(MichaelSet_Lazy_RCU_GPT_less_michaelAlloc) \
+    CDSUNIT_TEST_MichaelSet_RCU_signal
+
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#   define CDSUNIT_DECLARE_SplitList_RCU_signal  \
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHB_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHB_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHB_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHB_st_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHT_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHT_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHT_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHT_st_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHB_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHB_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHB_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHB_st_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHT_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHT_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHT_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHT_st_less)
+
+#   define CDSUNIT_TEST_SplitList_RCU_signal  \
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHB_st_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHT_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHT_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHT_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_SHT_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHB_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHT_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHT_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHT_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_SHT_st_less)
+
+#else
+#   define CDSUNIT_DECLARE_SplitList_RCU_signal
+#   define CDSUNIT_TEST_SplitList_RCU_signal
+#endif
+
+#define CDSUNIT_DECLARE_SplitList  \
+    TEST_SET_EXTRACT(SplitList_Michael_HP_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_HP_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_HP_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_HP_st_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_HRC_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_HRC_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_HRC_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_HRC_st_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_PTB_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_PTB_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_PTB_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_PTB_st_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPI_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPI_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPI_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPI_st_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPB_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPB_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPB_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPB_st_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPT_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPT_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPT_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPT_st_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_HP_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_HP_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_HP_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_HP_st_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_HRC_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_HRC_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_HRC_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_HRC_st_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_PTB_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_PTB_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_PTB_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_PTB_st_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPI_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPI_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPI_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPI_st_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPB_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPB_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPB_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPB_st_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPT_dyn_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPT_st_cmp)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPT_dyn_less)\
+    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPT_st_less)\
+    CDSUNIT_DECLARE_SplitList_RCU_signal
+
+#define CDSUNIT_TEST_SplitList  \
+    CPPUNIT_TEST(SplitList_Michael_HP_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_HP_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_HP_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_HP_st_less)\
+    /*CPPUNIT_TEST(SplitList_Michael_HRC_dyn_cmp)*/\
+    /*CPPUNIT_TEST(SplitList_Michael_HRC_st_cmp)*/\
+    /*CPPUNIT_TEST(SplitList_Michael_HRC_dyn_less)*/\
+    /*CPPUNIT_TEST(SplitList_Michael_HRC_st_less)*/\
+    CPPUNIT_TEST(SplitList_Michael_PTB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_PTB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_PTB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_PTB_st_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPI_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPI_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPI_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPI_st_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPB_st_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPT_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPT_st_cmp)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPT_dyn_less)\
+    CPPUNIT_TEST(SplitList_Michael_RCU_GPT_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_HP_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_HP_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_HP_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_HP_st_less)\
+    /*CPPUNIT_TEST(SplitList_Lazy_HRC_dyn_cmp)*/\
+    /*CPPUNIT_TEST(SplitList_Lazy_HRC_st_cmp)*/\
+    /*CPPUNIT_TEST(SplitList_Lazy_HRC_dyn_less)*/\
+    /*CPPUNIT_TEST(SplitList_Lazy_HRC_st_less)*/\
+    CPPUNIT_TEST(SplitList_Lazy_PTB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_PTB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_PTB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_PTB_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPI_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPI_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPI_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPI_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPB_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPB_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPB_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPB_st_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPT_dyn_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPT_st_cmp)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPT_dyn_less)\
+    CPPUNIT_TEST(SplitList_Lazy_RCU_GPT_st_less)\
+    CDSUNIT_TEST_SplitList_RCU_signal
+
+
+#define CDSUNIT_DECLARE_CuckooSet \
+    TEST_SET(CuckooStripedSet_list_unord)\
+    TEST_SET(CuckooStripedSet_list_unord_stat)\
+    TEST_SET(CuckooStripedSet_list_ord)\
+    TEST_SET(CuckooStripedSet_list_ord_stat)\
+    TEST_SET(CuckooStripedSet_vector_unord)\
+    TEST_SET(CuckooStripedSet_vector_ord)\
+    TEST_SET(CuckooStripedSet_vector_unord_stat)\
+    TEST_SET(CuckooStripedSet_vector_ord_stat)\
+    TEST_SET(CuckooRefinableSet_list_unord)\
+    TEST_SET(CuckooRefinableSet_list_ord)\
+    TEST_SET(CuckooRefinableSet_list_unord_stat)\
+    TEST_SET(CuckooRefinableSet_list_ord_stat)\
+    TEST_SET(CuckooRefinableSet_vector_unord)\
+    TEST_SET(CuckooRefinableSet_vector_unord_stat)\
+    TEST_SET(CuckooRefinableSet_vector_ord) \
+    TEST_SET(CuckooRefinableSet_vector_ord_stat) \
+    TEST_SET(CuckooStripedSet_list_unord_storehash)\
+    TEST_SET(CuckooStripedSet_list_ord_storehash)\
+    TEST_SET(CuckooStripedSet_vector_unord_storehash)\
+    TEST_SET(CuckooStripedSet_vector_ord_storehash)\
+    TEST_SET(CuckooRefinableSet_list_unord_storehash)\
+    TEST_SET(CuckooRefinableSet_list_ord_storehash)\
+    TEST_SET(CuckooRefinableSet_vector_unord_storehash)\
+    TEST_SET(CuckooRefinableSet_vector_ord_storehash)
+
+
+#define CDSUNIT_TEST_CuckooSet \
+    CPPUNIT_TEST(CuckooStripedSet_list_unord)\
+    CPPUNIT_TEST(CuckooStripedSet_list_unord_stat)\
+    CPPUNIT_TEST(CuckooStripedSet_list_unord_storehash)\
+    CPPUNIT_TEST(CuckooStripedSet_list_ord)\
+    CPPUNIT_TEST(CuckooStripedSet_list_ord_stat)\
+    CPPUNIT_TEST(CuckooStripedSet_list_ord_storehash)\
+    CPPUNIT_TEST(CuckooStripedSet_vector_unord)\
+    CPPUNIT_TEST(CuckooStripedSet_vector_unord_stat)\
+    CPPUNIT_TEST(CuckooStripedSet_vector_unord_storehash)\
+    CPPUNIT_TEST(CuckooStripedSet_vector_ord)\
+    CPPUNIT_TEST(CuckooStripedSet_vector_ord_stat)\
+    CPPUNIT_TEST(CuckooStripedSet_vector_ord_storehash)\
+    CPPUNIT_TEST(CuckooRefinableSet_list_unord)\
+    CPPUNIT_TEST(CuckooRefinableSet_list_unord_stat)\
+    CPPUNIT_TEST(CuckooRefinableSet_list_unord_storehash)\
+    CPPUNIT_TEST(CuckooRefinableSet_list_ord)\
+    CPPUNIT_TEST(CuckooRefinableSet_list_ord_stat)\
+    CPPUNIT_TEST(CuckooRefinableSet_list_ord_storehash)\
+    CPPUNIT_TEST(CuckooRefinableSet_vector_unord)\
+    CPPUNIT_TEST(CuckooRefinableSet_vector_unord_stat)\
+    CPPUNIT_TEST(CuckooRefinableSet_vector_unord_storehash)\
+    CPPUNIT_TEST(CuckooRefinableSet_vector_ord) \
+    CPPUNIT_TEST(CuckooRefinableSet_vector_ord_stat) \
+    CPPUNIT_TEST(CuckooRefinableSet_vector_ord_storehash)
+
+
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#   define CDSUNIT_DECLARE_SkipListSet_RCU_signal \
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_shb_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_shb_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_shb_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_shb_cmp_xorshift_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_sht_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_sht_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_sht_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_sht_cmp_xorshift_stat)
+
+#   define CDSUNIT_TEST_SkipListSet_RCU_signal \
+    CPPUNIT_TEST(SkipListSet_rcu_shb_less_pascal)\
+    CPPUNIT_TEST(SkipListSet_rcu_shb_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListSet_rcu_shb_less_xorshift)\
+    CPPUNIT_TEST(SkipListSet_rcu_shb_cmp_xorshift_stat)\
+    CPPUNIT_TEST(SkipListSet_rcu_sht_less_pascal)\
+    CPPUNIT_TEST(SkipListSet_rcu_sht_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListSet_rcu_sht_less_xorshift)\
+    CPPUNIT_TEST(SkipListSet_rcu_sht_cmp_xorshift_stat)
+
+#else
+#   define CDSUNIT_DECLARE_SkipListSet_RCU_signal
+#   define CDSUNIT_TEST_SkipListSet_RCU_signal
+#endif
+
+#define CDSUNIT_DECLARE_SkipListSet \
+    TEST_SET_NOLF_EXTRACT(SkipListSet_hp_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_hp_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_hp_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_hp_cmp_xorshift_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_hrc_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_hrc_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_hrc_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_hrc_cmp_xorshift_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_ptb_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_ptb_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_ptb_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_ptb_cmp_xorshift_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpi_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpi_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpi_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpi_cmp_xorshift_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpb_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpb_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpb_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpb_cmp_xorshift_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpt_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpt_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpt_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpt_cmp_xorshift_stat)\
+    CDSUNIT_DECLARE_SkipListSet_RCU_signal
+
+#define CDSUNIT_TEST_SkipListSet \
+    CPPUNIT_TEST(SkipListSet_hp_less_pascal)\
+    CPPUNIT_TEST(SkipListSet_hp_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListSet_hp_less_xorshift)\
+    CPPUNIT_TEST(SkipListSet_hp_cmp_xorshift_stat)\
+    /*CPPUNIT_TEST(SkipListSet_hrc_less_pascal)*/\
+    /*CPPUNIT_TEST(SkipListSet_hrc_cmp_pascal_stat)*/\
+    /*CPPUNIT_TEST(SkipListSet_hrc_less_xorshift)*/\
+    /*CPPUNIT_TEST(SkipListSet_hrc_cmp_xorshift_stat)*/\
+    CPPUNIT_TEST(SkipListSet_ptb_less_pascal)\
+    CPPUNIT_TEST(SkipListSet_ptb_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListSet_ptb_less_xorshift)\
+    CPPUNIT_TEST(SkipListSet_ptb_cmp_xorshift_stat)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpi_less_pascal)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpi_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpi_less_xorshift)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpi_cmp_xorshift_stat)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpb_less_pascal)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpb_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpb_less_xorshift)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpb_cmp_xorshift_stat)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpt_less_pascal)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpt_cmp_pascal_stat)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpt_less_xorshift)\
+    CPPUNIT_TEST(SkipListSet_rcu_gpt_cmp_xorshift_stat)\
+    CDSUNIT_TEST_SkipListSet_RCU_signal
+
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+#   define CDSUNIT_DECLARE_EllenBinTreeSet_RCU_signal \
+        TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_shb)\
+        TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_shb_stat)\
+        TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_sht)\
+        TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_sht_stat)
+
+#   define CDSUNIT_TEST_EllenBinTreeSet_RCU_signal \
+        CPPUNIT_TEST(EllenBinTreeSet_rcu_shb)\
+        CPPUNIT_TEST(EllenBinTreeSet_rcu_shb_stat)\
+        CPPUNIT_TEST(EllenBinTreeSet_rcu_sht)\
+        CPPUNIT_TEST(EllenBinTreeSet_rcu_sht_stat)
+#else
+#   define CDSUNIT_DECLARE_EllenBinTreeSet_RCU_signal
+#   define CDSUNIT_TEST_EllenBinTreeSet_RCU_signal
+#endif
+
+#define CDSUNIT_DECLARE_EllenBinTreeSet \
+    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_hp)\
+    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_hp_stat)\
+    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_ptb)\
+    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_ptb_stat)\
+    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpi)\
+    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpi_stat)\
+    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpb)\
+    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpb_stat)\
+    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpt)\
+    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpt_stat)\
+    CDSUNIT_DECLARE_EllenBinTreeSet_RCU_signal
+
+#define CDSUNIT_TEST_EllenBinTreeSet \
+    CPPUNIT_TEST(EllenBinTreeSet_hp)\
+    CPPUNIT_TEST(EllenBinTreeSet_hp_stat)\
+    CPPUNIT_TEST(EllenBinTreeSet_ptb)\
+    CPPUNIT_TEST(EllenBinTreeSet_ptb_stat)\
+    CPPUNIT_TEST(EllenBinTreeSet_rcu_gpi)\
+    /*CPPUNIT_TEST(EllenBinTreeSet_rcu_gpi_stat)*/\
+    CPPUNIT_TEST(EllenBinTreeSet_rcu_gpb)\
+    CPPUNIT_TEST(EllenBinTreeSet_rcu_gpb_stat)\
+    CPPUNIT_TEST(EllenBinTreeSet_rcu_gpt)\
+    CPPUNIT_TEST(EllenBinTreeSet_rcu_gpt_stat)\
+    CDSUNIT_TEST_EllenBinTreeSet_RCU_signal
+
+
+
+#define CDSUNIT_DECLARE_StripedSet_common \
+    TEST_SET(StripedSet_list) \
+    TEST_SET(StripedSet_vector) \
+    TEST_SET(StripedSet_set) \
+    TEST_SET(StripedSet_hashset) \
+    TEST_SET(StripedSet_boost_unordered_set)
+#define CDSUNIT_TEST_StripedSet_common \
+    CPPUNIT_TEST(StripedSet_list) \
+    CPPUNIT_TEST(StripedSet_vector) \
+    CPPUNIT_TEST(StripedSet_set) \
+    CPPUNIT_TEST(StripedSet_hashset) \
+    CPPUNIT_TEST(StripedSet_boost_unordered_set)
+
+#if BOOST_VERSION >= 104800
+#   define CDSUNIT_DECLARE_StripedSet_boost_container \
+    TEST_SET(StripedSet_boost_list) \
+    TEST_SET(StripedSet_boost_slist) \
+    TEST_SET(StripedSet_boost_vector) \
+    TEST_SET(StripedSet_boost_stable_vector) \
+    TEST_SET(StripedSet_boost_set)
+#   define CDSUNIT_TEST_StripedSet_boost_container \
+    CPPUNIT_TEST(StripedSet_boost_list) \
+    CPPUNIT_TEST(StripedSet_boost_slist) \
+    CPPUNIT_TEST(StripedSet_boost_vector) \
+    CPPUNIT_TEST(StripedSet_boost_stable_vector) \
+    CPPUNIT_TEST(StripedSet_boost_set)
+#else
+#   define CDSUNIT_DECLARE_StripedSet_boost_container
+#   define CDSUNIT_TEST_StripedSet_boost_container
+#endif
+
+#if BOOST_VERSION >= 104800 && defined(CDS_UNIT_SET_TYPES_ENABLE_BOOST_FLAT_CONTAINERS)
+#   define CDSUNIT_DECLARE_StripedSet_boost_flat_container \
+    TEST_SET(StripedSet_boost_flat_set)
+#   define CDSUNIT_TEST_StripedSet_boost_flat_container \
+    CPPUNIT_TEST(StripedSet_boost_flat_set)
+#else
+#   define CDSUNIT_DECLARE_StripedSet_boost_flat_container
+#   define CDSUNIT_TEST_StripedSet_boost_flat_container
+#endif
+
+#define CDSUNIT_DECLARE_StripedSet \
+    CDSUNIT_DECLARE_StripedSet_common \
+    CDSUNIT_DECLARE_StripedSet_boost_container \
+    CDSUNIT_DECLARE_StripedSet_boost_flat_container
+#define CDSUNIT_TEST_StripedSet \
+    CDSUNIT_TEST_StripedSet_common \
+    CDSUNIT_TEST_StripedSet_boost_container \
+    CDSUNIT_TEST_StripedSet_boost_flat_container
+
+
+#define CDSUNIT_DECLARE_RefinableSet_common \
+    TEST_SET(RefinableSet_list) \
+    TEST_SET(RefinableSet_vector) \
+    TEST_SET(RefinableSet_set) \
+    TEST_SET(RefinableSet_hashset) \
+    TEST_SET(RefinableSet_boost_unordered_set)
+#define CDSUNIT_TEST_RefinableSet_common \
+    CPPUNIT_TEST(RefinableSet_list) \
+    CPPUNIT_TEST(RefinableSet_vector) \
+    CPPUNIT_TEST(RefinableSet_set) \
+    CPPUNIT_TEST(RefinableSet_hashset) \
+    CPPUNIT_TEST(RefinableSet_boost_unordered_set)
+
+#if BOOST_VERSION >= 104800
+#   define CDSUNIT_DECLARE_RefinableSet_boost_container \
+    TEST_SET(RefinableSet_boost_list) \
+    TEST_SET(RefinableSet_boost_slist) \
+    TEST_SET(RefinableSet_boost_vector) \
+    TEST_SET(RefinableSet_boost_stable_vector) \
+    TEST_SET(RefinableSet_boost_set)
+#   define CDSUNIT_TEST_RefinableSet_boost_container \
+    CPPUNIT_TEST(RefinableSet_boost_list) \
+    CPPUNIT_TEST(RefinableSet_boost_slist) \
+    CPPUNIT_TEST(RefinableSet_boost_vector) \
+    CPPUNIT_TEST(RefinableSet_boost_stable_vector) \
+    CPPUNIT_TEST(RefinableSet_boost_set)
+#else
+#   define CDSUNIT_DECLARE_RefinableSet_boost_container
+#   define CDSUNIT_TEST_RefinableSet_boost_container
+#endif
+
+#if BOOST_VERSION >= 104800 && defined(CDS_UNIT_SET_TYPES_ENABLE_BOOST_FLAT_CONTAINERS)
+#   define CDSUNIT_DECLARE_RefinableSet_boost_flat_container \
+    TEST_SET(RefinableSet_boost_flat_set)
+#   define CDSUNIT_TEST_RefinableSet_boost_flat_container \
+    CPPUNIT_TEST(RefinableSet_boost_flat_set)
+#else
+#   define CDSUNIT_DECLARE_RefinableSet_boost_flat_container
+#   define CDSUNIT_TEST_RefinableSet_boost_flat_container
+#endif
+
+#define CDSUNIT_DECLARE_RefinableSet \
+    CDSUNIT_DECLARE_RefinableSet_common \
+    CDSUNIT_DECLARE_RefinableSet_boost_container \
+    CDSUNIT_DECLARE_RefinableSet_boost_flat_container
+#define CDSUNIT_TEST_RefinableSet \
+    CDSUNIT_TEST_RefinableSet_common \
+    CDSUNIT_TEST_RefinableSet_boost_container \
+    CDSUNIT_TEST_RefinableSet_boost_flat_container
+
+#endif // #ifndef _CDSUNIT_SET2_SET_DEFS_H
diff --git a/tests/unit/set2/set_delodd.cpp b/tests/unit/set2/set_delodd.cpp
new file mode 100644 (file)
index 0000000..b4d9298
--- /dev/null
@@ -0,0 +1,783 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "set2/set_types.h"
+#include <algorithm> // random_shuffle
+
+namespace set2 {
+
+#    define TEST_SET(X)         void X() { test<SetTypes<key_type, value_type>::X >()    ; }
+#    define TEST_SET_EXTRACT(X) void X() { test_extract<SetTypes<key_type, value_type>::X >()    ; }
+#    define TEST_SET_NOLF(X)    void X() { test_nolf<SetTypes<key_type, value_type>::X >()    ; }
+#    define TEST_SET_NOLF_EXTRACT(X)    void X() { test_nolf_extract<SetTypes<key_type, value_type>::X >()    ; }
+
+    namespace {
+        static size_t  c_nSetSize = 1000000         ;  // max set size
+        static size_t  c_nInsThreadCount = 4        ;  // insert thread count
+        static size_t  c_nDelThreadCount = 4        ;  // delete thread count
+        static size_t  c_nExtractThreadCount = 4    ;  // extract thread count
+        static size_t  c_nMaxLoadFactor = 8         ;  // maximum load factor
+        static bool    c_bPrintGCState = true;
+    }
+
+    namespace {
+        struct key_thread
+        {
+            size_t  nKey;
+            size_t  nThread;
+
+            key_thread( size_t key, size_t threadNo )
+                : nKey( key )
+                , nThread( threadNo )
+            {}
+
+            key_thread()
+            {}
+        };
+
+        typedef SetTypes<key_thread, size_t>::key_val     key_value_pair;
+    }
+
+    template <>
+    struct cmp<key_thread> {
+        int operator ()(key_thread const& k1, key_thread const& k2) const
+        {
+            if ( k1.nKey < k2.nKey )
+                return -1;
+            if ( k1.nKey > k2.nKey )
+                return 1;
+            if ( k1.nThread < k2.nThread )
+                return -1;
+            if ( k1.nThread > k2.nThread )
+                return 1;
+            return 0;
+        }
+        int operator ()(key_thread const& k1, size_t k2) const
+        {
+            if ( k1.nKey < k2 )
+                return -1;
+            if ( k1.nKey > k2 )
+                return 1;
+            return 0;
+        }
+        int operator ()(size_t k1, key_thread const& k2) const
+        {
+            if ( k1 < k2.nKey )
+                return -1;
+            if ( k1 > k2.nKey )
+                return 1;
+            return 0;
+        }
+    };
+
+} // namespace set2
+
+namespace std {
+    template <>
+    struct less<set2::key_thread>
+    {
+        bool operator()(set2::key_thread const& k1, set2::key_thread const& k2) const
+        {
+            if ( k1.nKey <= k2.nKey )
+                return k1.nKey < k2.nKey || k1.nThread < k2.nThread;
+            return false;
+        }
+    };
+} // namespace std
+
+CDS_BEGIN_STD_HASH_NAMESPACE
+    template <>
+    struct hash<set2::key_thread>
+    {
+        typedef size_t              result_type;
+        typedef set2::key_thread    argument_type;
+
+        size_t operator()(set2::key_thread const& k) const
+        {
+            return CDS_STD_HASH_NAMESPACE::hash<size_t>()( k.nKey );
+        }
+        size_t operator()(size_t k) const
+        {
+            return CDS_STD_HASH_NAMESPACE::hash<size_t>()( k );
+        }
+    };
+CDS_END_STD_HASH_NAMESPACE
+
+namespace boost {
+    inline size_t hash_value( set2::key_thread const& k )
+    {
+        return CDS_STD_HASH_NAMESPACE::hash<size_t>()( k.nKey );
+    }
+
+    template <>
+    struct hash<set2::key_thread>
+    {
+        typedef size_t              result_type;
+        typedef set2::key_thread    argument_type;
+
+        size_t operator()(set2::key_thread const& k) const
+        {
+            return boost::hash<size_t>()( k.nKey );
+        }
+        size_t operator()(size_t k) const
+        {
+            return boost::hash<size_t>()( k );
+        }
+    };
+} // namespace boost
+
+
+namespace set2 {
+
+    template <typename Set>
+    static inline void check_before_clear( Set& s )
+    {}
+
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void check_before_clear( cds::container::EllenBinTreeSet<GC, Key, T, Traits>& s )
+    {
+        CPPUNIT_CHECK_CURRENT( s.check_consistency() );
+    }
+
+    class Set_DelOdd: public CppUnitMini::TestCase
+    {
+        std::vector<size_t>     m_arrData;
+
+    protected:
+        typedef key_thread  key_type;
+        typedef size_t      value_type;
+
+        CDS_ATOMIC::atomic<size_t>      m_nInsThreadCount;
+
+        // Inserts keys from [0..N)
+        template <class Set>
+        class InsertThread: public CppUnitMini::TestThread
+        {
+            Set&     m_Set;
+
+            virtual InsertThread *    clone()
+            {
+                return new InsertThread( *this );
+            }
+
+            struct ensure_func
+            {
+                template <typename Q>
+                void operator()( bool bNew, key_value_pair const&, Q const& )
+                {}
+            };
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+
+        public:
+            InsertThread( CppUnitMini::ThreadPool& pool, Set& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Set( rMap )
+            {}
+            InsertThread( InsertThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Set( src.m_Set )
+            {}
+
+            Set_DelOdd&  getTest()
+            {
+                return reinterpret_cast<Set_DelOdd&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rSet = m_Set;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed = 0;
+
+                std::vector<size_t>& arrData = getTest().m_arrData;
+                for ( size_t i = 0; i < arrData.size(); ++i ) {
+                    if ( rSet.insert( key_type( arrData[i], m_nThreadNo )))
+                        ++m_nInsertSuccess;
+                    else
+                        ++m_nInsertFailed;
+                }
+
+                ensure_func f;
+                for ( size_t i = arrData.size() - 1; i > 0; --i ) {
+                    if ( arrData[i] & 1 ) {
+                        rSet.ensure( key_type( arrData[i], m_nThreadNo ), f );
+                    }
+                }
+
+                getTest().m_nInsThreadCount.fetch_sub( 1, CDS_ATOMIC::memory_order_release );
+            }
+        };
+
+        struct key_equal {
+            bool operator()( key_type const& k1, key_type const& k2 ) const
+            {
+                return k1.nKey == k2.nKey;
+            }
+            bool operator()( size_t k1, key_type const& k2 ) const
+            {
+                return k1 == k2.nKey;
+            }
+            bool operator()( key_type const& k1, size_t k2 ) const
+            {
+                return k1.nKey == k2;
+            }
+            bool operator ()( key_value_pair const& k1, key_value_pair const& k2 ) const
+            {
+                return operator()( k1.key, k2.key );
+            }
+            bool operator ()( key_value_pair const& k1, key_type const& k2 ) const
+            {
+                return operator()( k1.key, k2 );
+            }
+            bool operator ()( key_type const& k1, key_value_pair const& k2 ) const
+            {
+                return operator()( k1, k2.key );
+            }
+            bool operator ()( key_value_pair const& k1, size_t k2 ) const
+            {
+                return operator()( k1.key, k2 );
+            }
+            bool operator ()( size_t k1, key_value_pair const& k2 ) const
+            {
+                return operator()( k1, k2.key );
+            }
+        };
+
+        struct key_less {
+            bool operator()( key_type const& k1, key_type const& k2 ) const
+            {
+                return k1.nKey < k2.nKey;
+            }
+            bool operator()( size_t k1, key_type const& k2 ) const
+            {
+                return k1 < k2.nKey;
+            }
+            bool operator()( key_type const& k1, size_t k2 ) const
+            {
+                return k1.nKey < k2;
+            }
+            bool operator ()( key_value_pair const& k1, key_value_pair const& k2 ) const
+            {
+                return operator()( k1.key, k2.key );
+            }
+            bool operator ()( key_value_pair const& k1, key_type const& k2 ) const
+            {
+                return operator()( k1.key, k2 );
+            }
+            bool operator ()( key_type const& k1, key_value_pair const& k2 ) const
+            {
+                return operator()( k1, k2.key );
+            }
+            bool operator ()( key_value_pair const& k1, size_t k2 ) const
+            {
+                return operator()( k1.key, k2 );
+            }
+            bool operator ()( size_t k1, key_value_pair const& k2 ) const
+            {
+                return operator()( k1, k2.key );
+            }
+
+            typedef key_equal   equal_to;
+        };
+
+        // Deletes odd keys from [0..N)
+        template <class Set>
+        class DeleteThread: public CppUnitMini::TestThread
+        {
+            Set&     m_Set;
+
+            virtual DeleteThread *    clone()
+            {
+                return new DeleteThread( *this );
+            }
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+        public:
+            DeleteThread( CppUnitMini::ThreadPool& pool, Set& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Set( rMap )
+            {}
+            DeleteThread( DeleteThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Set( src.m_Set )
+            {}
+
+            Set_DelOdd&  getTest()
+            {
+                return reinterpret_cast<Set_DelOdd&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rSet = m_Set;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                std::vector<size_t>& arrData = getTest().m_arrData;
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = 0; i < arrData.size(); ++i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( rSet.erase_with( arrData[i], key_less() ))
+                                    ++m_nDeleteSuccess;
+                                else
+                                    ++m_nDeleteFailed;
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+                else {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = arrData.size() - 1; i > 0; --i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( rSet.erase_with( arrData[i], key_less() ))
+                                    ++m_nDeleteSuccess;
+                                else
+                                    ++m_nDeleteFailed;
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+            }
+        };
+
+        // Extracts odd keys from [0..N)
+        template <typename GC, class Set>
+        class ExtractThread: public CppUnitMini::TestThread
+        {
+            Set&     m_Set;
+
+            virtual ExtractThread *    clone()
+            {
+                return new ExtractThread( *this );
+            }
+        public:
+            size_t  m_nExtractSuccess;
+            size_t  m_nExtractFailed;
+
+        public:
+            ExtractThread( CppUnitMini::ThreadPool& pool, Set& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Set( rMap )
+            {}
+            ExtractThread( ExtractThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Set( src.m_Set )
+            {}
+
+            Set_DelOdd&  getTest()
+            {
+                return reinterpret_cast<Set_DelOdd&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rSet = m_Set;
+
+                m_nExtractSuccess =
+                    m_nExtractFailed = 0;
+
+                typename Set::guarded_ptr gp;
+
+                std::vector<size_t>& arrData = getTest().m_arrData;
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = 0; i < arrData.size(); ++i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( rSet.extract_with( gp, arrData[i], key_less() ))
+                                    ++m_nExtractSuccess;
+                                else
+                                    ++m_nExtractFailed;
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+                else {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = arrData.size() - 1; i > 0; --i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( rSet.extract_with( gp, arrData[i], key_less() ))
+                                    ++m_nExtractSuccess;
+                                else
+                                    ++m_nExtractFailed;
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+            }
+        };
+
+        template <typename RCU, class Set>
+        class ExtractThread< cds::urcu::gc<RCU>, Set >: public CppUnitMini::TestThread
+        {
+            Set&     m_Set;
+
+            virtual ExtractThread *    clone()
+            {
+                return new ExtractThread( *this );
+            }
+        public:
+            size_t  m_nExtractSuccess;
+            size_t  m_nExtractFailed;
+
+        public:
+            ExtractThread( CppUnitMini::ThreadPool& pool, Set& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Set( rMap )
+            {}
+            ExtractThread( ExtractThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Set( src.m_Set )
+            {}
+
+            Set_DelOdd&  getTest()
+            {
+                return reinterpret_cast<Set_DelOdd&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rSet = m_Set;
+
+                m_nExtractSuccess =
+                    m_nExtractFailed = 0;
+
+                typename Set::exempt_ptr xp;
+
+                std::vector<size_t>& arrData = getTest().m_arrData;
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = 0; i < arrData.size(); ++i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( Set::c_bExtractLockExternal ) {
+                                    typename Set::rcu_lock l;
+                                    if ( rSet.extract_with( xp, arrData[i], key_less() ))
+                                        ++m_nExtractSuccess;
+                                    else
+                                        ++m_nExtractFailed;
+                                }
+                                else {
+                                    if ( rSet.extract_with( xp, arrData[i], key_less() ))
+                                        ++m_nExtractSuccess;
+                                    else
+                                        ++m_nExtractFailed;
+                                }
+                                xp.release();
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+                else {
+                    for ( size_t k = 0; k < c_nInsThreadCount; ++k ) {
+                        for ( size_t i = arrData.size() - 1; i > 0; --i ) {
+                            if ( arrData[i] & 1 ) {
+                                if ( Set::c_bExtractLockExternal ) {
+                                    typename Set::rcu_lock l;
+                                    if ( rSet.extract_with( xp, arrData[i], key_less() ))
+                                        ++m_nExtractSuccess;
+                                    else
+                                        ++m_nExtractFailed;
+                                }
+                                else {
+                                    if ( rSet.extract_with( xp, arrData[i], key_less() ))
+                                        ++m_nExtractSuccess;
+                                    else
+                                        ++m_nExtractFailed;
+                                }
+                                xp.release();
+                            }
+                        }
+                        if ( getTest().m_nInsThreadCount.load( CDS_ATOMIC::memory_order_acquire ) == 0 )
+                            break;
+                    }
+                }
+            }
+        };
+
+    protected:
+        template <class Set>
+        void do_test( size_t nLoadFactor )
+        {
+            Set  testSet( c_nSetSize, nLoadFactor );
+            do_test_with( testSet );
+            analyze( testSet );
+        }
+
+        template <class Set>
+        void do_test_extract( size_t nLoadFactor )
+        {
+            Set  testSet( c_nSetSize, nLoadFactor );
+            do_test_extract_with( testSet );
+            analyze( testSet );
+        }
+
+        template <class Set>
+        void do_test_with( Set& testSet )
+        {
+            typedef InsertThread<Set> insert_thread;
+            typedef DeleteThread<Set> delete_thread;
+
+            m_nInsThreadCount.store( c_nInsThreadCount, CDS_ATOMIC::memory_order_release );
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new insert_thread( pool, testSet ), c_nInsThreadCount );
+            pool.add( new delete_thread( pool, testSet ), c_nDelThreadCount ? c_nDelThreadCount : cds::OS::topology::processor_count());
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                insert_thread * pThread = dynamic_cast<insert_thread *>( *it );
+                if ( pThread ) {
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                }
+                else {
+                    delete_thread * p = static_cast<delete_thread *>( *it );
+                    nDeleteSuccess += p->m_nDeleteSuccess;
+                    nDeleteFailed += p->m_nDeleteFailed;
+                }
+            }
+
+            CPPUNIT_CHECK( nInsertSuccess == c_nSetSize * c_nInsThreadCount );
+            CPPUNIT_CHECK( nInsertFailed == 0 );
+
+            CPPUNIT_MSG( "  Totals (success/failed): \n\t"
+                      << "      Insert=" << nInsertSuccess << '/' << nInsertFailed << "\n\t"
+                      << "      Delete=" << nDeleteSuccess << '/' << nDeleteFailed << "\n\t"
+            );
+        }
+
+        template <class Set>
+        void do_test_extract_with( Set& testSet )
+        {
+            typedef InsertThread<Set> insert_thread;
+            typedef DeleteThread<Set> delete_thread;
+            typedef ExtractThread< typename Set::gc, Set > extract_thread;
+
+            m_nInsThreadCount.store( c_nInsThreadCount, CDS_ATOMIC::memory_order_release );
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new insert_thread( pool, testSet ), c_nInsThreadCount );
+            if ( c_nDelThreadCount )
+                pool.add( new delete_thread( pool, testSet ), c_nDelThreadCount );
+            if ( c_nExtractThreadCount )
+                pool.add( new extract_thread( pool, testSet ), c_nExtractThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            size_t nExtractSuccess = 0;
+            size_t nExtractFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                insert_thread * pThread = dynamic_cast<insert_thread *>( *it );
+                if ( pThread ) {
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                }
+                else {
+                    delete_thread * p = dynamic_cast<delete_thread *>( *it );
+                    if ( p ) {
+                        nDeleteSuccess += p->m_nDeleteSuccess;
+                        nDeleteFailed += p->m_nDeleteFailed;
+                    }
+                    else {
+                        extract_thread * pExt = dynamic_cast<extract_thread *>( *it );
+                        assert( pExt );
+                        nExtractSuccess += pExt->m_nExtractSuccess;
+                        nExtractFailed += pExt->m_nExtractFailed;
+                    }
+                }
+            }
+
+            CPPUNIT_CHECK( nInsertSuccess == c_nSetSize * c_nInsThreadCount );
+            CPPUNIT_CHECK( nInsertFailed == 0 );
+
+            CPPUNIT_MSG( "  Totals (success/failed): \n\t"
+                << "      Insert=" << nInsertSuccess << '/' << nInsertFailed << "\n\t"
+                << "      Delete=" << nDeleteSuccess << '/' << nDeleteFailed << "\n\t"
+                << "      Extract=" << nExtractSuccess << '/' << nExtractFailed << "\n\t"
+                );
+        }
+
+        template <typename Set>
+        void analyze( Set& testSet )
+        {
+            // All even keys must be in the set
+            {
+                CPPUNIT_MSG( "  Check even keys..." );
+                size_t nErrorCount = 0;
+                for ( size_t n = 0; n < c_nSetSize; n +=2 ) {
+                    for ( size_t i = 0; i < c_nInsThreadCount; ++i ) {
+                        if ( !testSet.find( key_type(n, i) ) ) {
+                            if ( ++nErrorCount < 10 ) {
+                                CPPUNIT_MSG( "key " << n << "-" << i << " is not found!");
+                            }
+                        }
+                    }
+                }
+                CPPUNIT_CHECK_EX( nErrorCount == 0, "Totals: " << nErrorCount << " keys is not found");
+            }
+
+            check_before_clear( testSet );
+
+            CPPUNIT_MSG( "  Clear map (single-threaded)..." );
+            cds::OS::Timer    timer;
+            testSet.clear();
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+            CPPUNIT_CHECK_EX( testSet.empty(), ((long long) testSet.size()) );
+
+            additional_check( testSet );
+            print_stat( testSet );
+            additional_cleanup( testSet );
+        }
+
+        template <class Set>
+        void test()
+        {
+            CPPUNIT_MSG( "Insert thread count=" << c_nInsThreadCount
+                << " delete thread count=" << c_nDelThreadCount
+                << " set size=" << c_nSetSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                do_test<Set>( nLoadFactor );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class Set>
+        void test_extract()
+        {
+            CPPUNIT_MSG( "Insert thread count=" << c_nInsThreadCount
+                << " delete thread count=" << c_nDelThreadCount
+                << " extract thread count=" << c_nExtractThreadCount
+                << " set size=" << c_nSetSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+                do_test_extract<Set>( nLoadFactor );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class Set>
+        void test_nolf()
+        {
+            CPPUNIT_MSG( "Insert thread count=" << c_nInsThreadCount
+                << " delete thread count=" << c_nDelThreadCount
+                << " set size=" << c_nSetSize
+                );
+
+            {
+                Set s;
+                do_test_with( s );
+                analyze( s );
+            }
+
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        template <class Set>
+        void test_nolf_extract()
+        {
+            CPPUNIT_MSG( "Insert thread count=" << c_nInsThreadCount
+                << " delete thread count=" << c_nDelThreadCount
+                << " extract thread count=" << c_nExtractThreadCount
+                << " set size=" << c_nSetSize
+                );
+
+            {
+                Set s;
+                do_test_extract_with( s );
+                analyze( s );
+            }
+
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nSetSize = cfg.getULong("MapSize", static_cast<unsigned long>(c_nSetSize) );
+            c_nInsThreadCount = cfg.getULong("InsThreadCount", static_cast<unsigned long>(c_nInsThreadCount) );
+            c_nDelThreadCount = cfg.getULong("DelThreadCount", static_cast<unsigned long>(c_nDelThreadCount) );
+            c_nExtractThreadCount = cfg.getULong("ExtractThreadCount", static_cast<unsigned long>(c_nExtractThreadCount) );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", static_cast<unsigned long>(c_nMaxLoadFactor) );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+
+            if ( c_nInsThreadCount == 0 )
+                c_nInsThreadCount = cds::OS::topology::processor_count();
+            if ( c_nDelThreadCount == 0 && c_nExtractThreadCount == 0 ) {
+                c_nExtractThreadCount = cds::OS::topology::processor_count() / 2;
+                c_nDelThreadCount = cds::OS::topology::processor_count() - c_nExtractThreadCount;
+            }
+
+            m_arrData.resize( c_nSetSize );
+            for ( size_t i = 0; i < c_nSetSize; ++i )
+                m_arrData[i] = i;
+            std::random_shuffle( m_arrData.begin(), m_arrData.end() );
+        }
+
+#   include "set2/set_defs.h"
+        CDSUNIT_DECLARE_MichaelSet
+        CDSUNIT_DECLARE_SplitList
+        //CDSUNIT_DECLARE_StripedSet
+        //CDSUNIT_DECLARE_RefinableSet
+        CDSUNIT_DECLARE_CuckooSet
+        CDSUNIT_DECLARE_SkipListSet
+        CDSUNIT_DECLARE_EllenBinTreeSet
+        //CDSUNIT_DECLARE_StdSet
+
+        CPPUNIT_TEST_SUITE_( Set_DelOdd, "Map_DelOdd" )
+            CDSUNIT_TEST_MichaelSet
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SkipListSet
+            CDSUNIT_TEST_EllenBinTreeSet
+            //CDSUNIT_TEST_StripedSet
+            //CDSUNIT_TEST_RefinableSet
+            CDSUNIT_TEST_CuckooSet
+            //CDSUNIT_TEST_StdSet
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Set_DelOdd );
+} // namespace set2
diff --git a/tests/unit/set2/set_insdel_func.cpp b/tests/unit/set2/set_insdel_func.cpp
new file mode 100644 (file)
index 0000000..cb72e34
--- /dev/null
@@ -0,0 +1,22 @@
+//$$CDS-header$$
+
+#include "set2/set_insdel_func.h"
+
+namespace set2 {
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Set_InsDel_func );
+
+    size_t  Set_InsDel_func::c_nMapSize = 1000000    ;  // map size
+    size_t  Set_InsDel_func::c_nInsertThreadCount = 4;  // count of insertion thread
+    size_t  Set_InsDel_func::c_nDeleteThreadCount = 4;  // count of deletion thread
+    size_t  Set_InsDel_func::c_nEnsureThreadCount = 4;  // count of ensure thread
+    size_t  Set_InsDel_func::c_nThreadPassCount = 4  ;  // pass count for each thread
+    size_t  Set_InsDel_func::c_nMaxLoadFactor = 8    ;  // maximum load factor
+    bool    Set_InsDel_func::c_bPrintGCState = true;
+
+
+    CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_MichaelSet )
+        CDSUNIT_TEST_MichaelSet
+    CPPUNIT_TEST_SUITE_END_PART()
+
+} // namespace set2
diff --git a/tests/unit/set2/set_insdel_func.h b/tests/unit/set2/set_insdel_func.h
new file mode 100644 (file)
index 0000000..1f0bdf7
--- /dev/null
@@ -0,0 +1,583 @@
+//$$CDS-header$$
+
+#include "set2/set_types.h"
+#include "cppunit/thread.h"
+
+#include <cds/lock/spinlock.h>
+#include <vector>
+#include <boost/ref.hpp>
+
+namespace set2 {
+
+#   define TEST_SET(X)          void X() { test<SetTypes<key_type, value_type>::X >()    ; }
+#   define TEST_SET_EXTRACT(X)  TEST_SET(X)
+#   define TEST_SET_NOLF(X)     void X() { test_nolf<SetTypes<key_type, value_type>::X >()    ; }
+#   define TEST_SET_NOLF_EXTRACT(X) TEST_SET_NOLF(X)
+
+    class Set_InsDel_func: public CppUnitMini::TestCase
+    {
+        static size_t  c_nMapSize           ;  // map size
+        static size_t  c_nInsertThreadCount ;  // count of insertion thread
+        static size_t  c_nDeleteThreadCount ;  // count of deletion thread
+        static size_t  c_nEnsureThreadCount ;  // count of ensure thread
+        static size_t  c_nThreadPassCount   ;  // pass count for each thread
+        static size_t  c_nMaxLoadFactor     ;  // maximum load factor
+        static bool    c_bPrintGCState;
+
+        typedef size_t  key_type;
+        struct value_type {
+            size_t      nKey;
+            size_t      nData;
+            CDS_ATOMIC::atomic<size_t> nEnsureCall;
+            bool volatile   bInitialized;
+            cds::OS::ThreadId          threadId     ;   // insert thread id
+
+            typedef cds::lock::Spinlock< cds::backoff::pause >   lock_type;
+            mutable lock_type   m_access;
+
+            value_type()
+                : nKey(0)
+                , nData(0)
+                , nEnsureCall(0)
+                , bInitialized( false )
+                , threadId( cds::OS::getCurrentThreadId() )
+            {}
+
+            value_type( value_type const& s )
+                : nKey(s.nKey)
+                , nData(s.nData)
+                , nEnsureCall(s.nEnsureCall.load(CDS_ATOMIC::memory_order_relaxed))
+                , bInitialized( s.bInitialized )
+                , threadId( cds::OS::getCurrentThreadId() )
+            {}
+
+            // boost::container::flat_map requires operator =
+            value_type& operator=( value_type const& v )
+            {
+                nKey = v.nKey;
+                nData = v.nData;
+                nEnsureCall.store( v.nEnsureCall.load(CDS_ATOMIC::memory_order_relaxed), CDS_ATOMIC::memory_order_relaxed );
+                bInitialized = v.bInitialized;
+
+                return *this;
+            }
+
+        };
+
+
+        size_t *    m_pKeyFirst;
+        size_t *    m_pKeyLast;
+        size_t *    m_pKeyArr;
+
+        template <class Set>
+        class Inserter: public CppUnitMini::TestThread
+        {
+            Set&     m_Set;
+            typedef typename Set::value_type keyval_type;
+
+            virtual Inserter *    clone()
+            {
+                return new Inserter( *this );
+            }
+
+            struct insert_functor {
+                size_t nTestFunctorRef;
+
+                insert_functor()
+                    : nTestFunctorRef(0)
+                {}
+
+                void operator()( keyval_type& val )
+                {
+                    cds::lock::scoped_lock< typename value_type::lock_type>    ac( val.val.m_access );
+
+                    val.val.nKey  = val.key;
+                    val.val.nData = val.key * 8;
+
+                    ++nTestFunctorRef;
+                    val.val.bInitialized = true;
+                }
+            };
+
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+
+            size_t  m_nTestFunctorRef;
+
+        public:
+            Inserter( CppUnitMini::ThreadPool& pool, Set& rSet )
+                : CppUnitMini::TestThread( pool )
+                , m_Set( rSet )
+            {}
+            Inserter( Inserter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Set( src.m_Set )
+            {}
+
+            Set_InsDel_func&  getTest()
+            {
+                return reinterpret_cast<Set_InsDel_func&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rSet = m_Set;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed =
+                    m_nTestFunctorRef = 0;
+
+                size_t * pKeyFirst = getTest().m_pKeyFirst;
+                size_t * pKeyLast = getTest().m_pKeyLast;
+
+                // func is passed by reference
+                insert_functor  func;
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t * p = pKeyFirst; p < pKeyLast; ++p ) {
+                            if ( rSet.insert( *p, cds::ref(func) ) )
+                                ++m_nInsertSuccess;
+                            else
+                                ++m_nInsertFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t * p = pKeyLast - 1; p >= pKeyFirst; --p ) {
+                            if ( rSet.insert( *p, cds::ref(func) ) )
+                                ++m_nInsertSuccess;
+                            else
+                                ++m_nInsertFailed;
+                        }
+                    }
+                }
+
+                m_nTestFunctorRef = func.nTestFunctorRef;
+            }
+        };
+
+        template <class Set>
+        class Ensurer: public CppUnitMini::TestThread
+        {
+            Set&     m_Set;
+            typedef typename Set::value_type keyval_type;
+
+            virtual Ensurer *    clone()
+            {
+                return new Ensurer( *this );
+            }
+
+            struct ensure_functor {
+                size_t  nCreated;
+                size_t  nModified;
+
+                ensure_functor()
+                    : nCreated(0)
+                    , nModified(0)
+                {}
+
+                void operator()( bool bNew, keyval_type& val, size_t nKey )
+                {
+                    cds::lock::scoped_lock<typename value_type::lock_type>    ac( val.val.m_access );
+                    if ( !val.val.bInitialized )
+                    {
+                        val.val.nKey = val.key;
+                        val.val.nData = val.key * 8;
+                        val.val.bInitialized = true;
+                    }
+
+                    if ( bNew ) {
+                        ++nCreated;
+                    }
+                    else {
+                        val.val.nEnsureCall.fetch_add( 1, CDS_ATOMIC::memory_order_relaxed );
+                        ++nModified;
+                    }
+                }
+            private:
+                ensure_functor(const ensure_functor& );
+            };
+
+        public:
+            size_t  m_nEnsureFailed;
+            size_t  m_nEnsureCreated;
+            size_t  m_nEnsureExisted;
+            size_t  m_nFunctorCreated;
+            size_t  m_nFunctorModified;
+
+        public:
+            Ensurer( CppUnitMini::ThreadPool& pool, Set& rSet )
+                : CppUnitMini::TestThread( pool )
+                , m_Set( rSet )
+            {}
+            Ensurer( Ensurer& src )
+                : CppUnitMini::TestThread( src )
+                , m_Set( src.m_Set )
+            {}
+
+            Set_InsDel_func&  getTest()
+            {
+                return reinterpret_cast<Set_InsDel_func&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rSet = m_Set;
+
+                m_nEnsureCreated =
+                    m_nEnsureExisted =
+                    m_nEnsureFailed = 0;
+
+                size_t * pKeyFirst = getTest().m_pKeyFirst;
+                size_t * pKeyLast = getTest().m_pKeyLast;
+
+                ensure_functor func;
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t * p = pKeyFirst; p < pKeyLast; ++p ) {
+                            std::pair<bool, bool> ret = rSet.ensure( *p, cds::ref( func ) );
+                            if ( ret.first  ) {
+                                if ( ret.second )
+                                    ++m_nEnsureCreated;
+                                else
+                                    ++m_nEnsureExisted;
+                            }
+                            else
+                                ++m_nEnsureFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t * p = pKeyLast - 1 ; p >= pKeyFirst; --p ) {
+                            std::pair<bool, bool> ret = rSet.ensure( *p, cds::ref( func ) );
+                            if ( ret.first  ) {
+                                if ( ret.second )
+                                    ++m_nEnsureCreated;
+                                else
+                                    ++m_nEnsureExisted;
+                            }
+                            else
+                                ++m_nEnsureFailed;
+                        }
+                    }
+                }
+
+                m_nFunctorCreated = func.nCreated;
+                m_nFunctorModified = func.nModified;
+            }
+        };
+
+        template <class Set>
+        class Deleter: public CppUnitMini::TestThread
+        {
+            Set&     m_Set;
+            typedef typename Set::value_type keyval_type;
+
+            virtual Deleter *    clone()
+            {
+                return new Deleter( *this );
+            }
+
+            struct value_container
+            {
+                size_t      nKeyExpected;
+
+                size_t      nSuccessItem;
+                size_t      nFailedItem;
+
+                value_container()
+                    : nSuccessItem(0)
+                    , nFailedItem(0)
+                {}
+            };
+
+            struct erase_functor {
+                value_container     m_cnt;
+
+                void operator ()( keyval_type const& itm )
+                {
+                    keyval_type& item = const_cast<keyval_type&>(itm);
+                    while ( true ) {
+                        bool bBkoff = false;
+                        {
+                            cds::lock::scoped_lock< typename value_type::lock_type>    ac( item.val.m_access );
+                            if ( item.val.bInitialized ) {
+                                if ( m_cnt.nKeyExpected == item.val.nKey && m_cnt.nKeyExpected * 8 == item.val.nData )
+                                    ++m_cnt.nSuccessItem;
+                                else
+                                    ++m_cnt.nFailedItem;
+                                item.val.nData++;
+                                item.val.nKey = 0;
+                                break;
+                            }
+                            else
+                                bBkoff = true;
+                        }
+                        if ( bBkoff )
+                            cds::backoff::yield()();
+                    }
+                }
+            };
+
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+            size_t  m_nValueSuccess;
+            size_t  m_nValueFailed;
+
+        public:
+            Deleter( CppUnitMini::ThreadPool& pool, Set& rSet )
+                : CppUnitMini::TestThread( pool )
+                , m_Set( rSet )
+            {}
+            Deleter( Deleter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Set( src.m_Set )
+            {}
+
+            Set_InsDel_func&  getTest()
+            {
+                return reinterpret_cast<Set_InsDel_func&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rSet = m_Set;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                size_t * pKeyFirst = getTest().m_pKeyFirst;
+                size_t * pKeyLast = getTest().m_pKeyLast;
+
+                erase_functor   func;
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t * p = pKeyFirst; p < pKeyLast; ++p ) {
+                            func.m_cnt.nKeyExpected = *p;
+                            if ( rSet.erase( *p, cds::ref(func) ))
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t * p = pKeyLast - 1; p >= pKeyFirst; --p ) {
+                            func.m_cnt.nKeyExpected = *p;
+                            if ( rSet.erase( *p, cds::ref(func) ))
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+
+                m_nValueSuccess = func.m_cnt.nSuccessItem;
+                m_nValueFailed = func.m_cnt.nFailedItem;
+            }
+        };
+
+    protected:
+        template <class Set>
+        void do_test( size_t nLoadFactor )
+        {
+            CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+
+            Set  testSet( c_nMapSize, nLoadFactor );
+            do_test_with( testSet );
+        }
+
+        template <class Set>
+        void do_test_with( Set& testSet )
+        {
+            typedef Inserter<Set>       InserterThread;
+            typedef Deleter<Set>        DeleterThread;
+            typedef Ensurer<Set>        EnsurerThread;
+
+            m_pKeyArr = new size_t[ c_nMapSize ];
+            m_pKeyFirst = m_pKeyArr;
+            m_pKeyLast = m_pKeyFirst + c_nMapSize;
+            for ( size_t i = 0; i < c_nMapSize; ++i )
+                m_pKeyArr[i] = i;
+            std::random_shuffle( m_pKeyFirst, m_pKeyLast );
+
+            cds::OS::Timer    timer;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new InserterThread( pool, testSet ), c_nInsertThreadCount );
+            pool.add( new DeleterThread( pool, testSet ), c_nDeleteThreadCount );
+            pool.add( new EnsurerThread( pool, testSet ), c_nEnsureThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            delete [] m_pKeyArr;
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            size_t nDelValueSuccess = 0;
+            size_t nDelValueFailed = 0;
+            size_t nEnsureFailed = 0;
+            size_t nEnsureCreated = 0;
+            size_t nEnsureModified = 0;
+            size_t nEnsFuncCreated = 0;
+            size_t nEnsFuncModified = 0;
+            size_t nTestFunctorRef = 0;
+
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                InserterThread * pThread = dynamic_cast<InserterThread *>( *it );
+                if ( pThread ) {
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                    nTestFunctorRef += pThread->m_nTestFunctorRef;
+                }
+                else {
+                    DeleterThread * p = dynamic_cast<DeleterThread *>( *it );
+                    if ( p ) {
+                        nDeleteSuccess += p->m_nDeleteSuccess;
+                        nDeleteFailed += p->m_nDeleteFailed;
+                        nDelValueSuccess += p->m_nValueSuccess;
+                        nDelValueFailed += p->m_nValueFailed;
+                    }
+                    else {
+                        EnsurerThread * pEns = static_cast<EnsurerThread *>( *it );
+                        nEnsureCreated += pEns->m_nEnsureCreated;
+                        nEnsureModified += pEns->m_nEnsureExisted;
+                        nEnsureFailed += pEns->m_nEnsureFailed;
+                        nEnsFuncCreated += pEns->m_nFunctorCreated;
+                        nEnsFuncModified += pEns->m_nFunctorModified;
+                    }
+                }
+            }
+
+            CPPUNIT_MSG(
+                   "    Totals: Ins succ=" << nInsertSuccess
+                << " Del succ=" << nDeleteSuccess << "\n"
+                << "          : Ins fail=" << nInsertFailed
+                << " Del fail=" << nDeleteFailed << "\n"
+                << "          : Ensure succ=" << (nEnsureCreated + nEnsureModified) << " fail=" << nEnsureFailed
+                << " create=" << nEnsureCreated << " modify=" << nEnsureModified << "\n"
+                << "          Set size=" << testSet.size()
+                );
+
+            CPPUNIT_CHECK_EX( nDelValueFailed == 0, "Functor del failed=" << nDelValueFailed );
+            CPPUNIT_CHECK_EX( nDelValueSuccess == nDeleteSuccess,  "Delete success=" << nDeleteSuccess << " functor=" << nDelValueSuccess );
+
+            CPPUNIT_CHECK( nEnsureFailed == 0 );
+
+            CPPUNIT_CHECK_EX( nEnsureCreated == nEnsFuncCreated, "Ensure created=" << nEnsureCreated << " functor=" << nEnsFuncCreated );
+            CPPUNIT_CHECK_EX( nEnsureModified == nEnsFuncModified, "Ensure modified=" << nEnsureModified << " functor=" << nEnsFuncModified );
+
+            // nTestFunctorRef is call count of insert functor
+            CPPUNIT_CHECK_EX( nTestFunctorRef == nInsertSuccess, "nInsertSuccess=" << nInsertSuccess << " functor nTestFunctorRef=" << nTestFunctorRef );
+
+            CPPUNIT_MSG( "  Clear set (single-threaded)..." );
+            timer.reset();
+            testSet.clear();
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+            CPPUNIT_CHECK( testSet.empty() );
+
+            additional_check( testSet );
+            print_stat(  testSet  );
+
+            additional_cleanup( testSet );
+        }
+
+        template <class Set>
+        void test()
+        {
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " ensure=" << c_nEnsureThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " map size=" << c_nMapSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                do_test<Set>( nLoadFactor );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class Set>
+        void test_nolf()
+        {
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " ensure=" << c_nEnsureThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " map size=" << c_nMapSize
+                );
+
+            Set s;
+            do_test_with( s );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nInsertThreadCount = cfg.getULong("InsertThreadCount", 4 );
+            c_nDeleteThreadCount = cfg.getULong("DeleteThreadCount", 4 );
+            c_nEnsureThreadCount = cfg.getULong("EnsureThreadCount", 4 );
+            c_nThreadPassCount = cfg.getULong("ThreadPassCount", 4 );
+            c_nMapSize = cfg.getULong("MapSize", 1000000 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+        }
+
+        void run_MichaelSet(const char *in_name, bool invert = false);
+        void run_SplitList(const char *in_name, bool invert = false);
+        void run_StripedSet(const char *in_name, bool invert = false);
+        void run_RefinableSet(const char *in_name, bool invert = false);
+        void run_CuckooSet(const char *in_name, bool invert = false);
+        void run_SkipListSet(const char *in_name, bool invert = false);
+        void run_EllenBinTreeSet(const char *in_name, bool invert = false);
+
+        typedef CppUnitMini::TestCase Base;
+        virtual void myRun(const char *in_name, bool invert = false)
+        {
+            setUpParams( m_Cfg.get( "Map_InsDel_func" ));
+
+            run_MichaelSet(in_name, invert);
+            run_SplitList(in_name, invert);
+            run_SkipListSet(in_name, invert);
+            run_EllenBinTreeSet(in_name, invert);
+            run_StripedSet(in_name, invert);
+            run_RefinableSet(in_name, invert);
+            run_CuckooSet(in_name, invert);
+
+            endTestCase();
+        }
+
+
+#   include "set2/set_defs.h"
+    CDSUNIT_DECLARE_MichaelSet
+    CDSUNIT_DECLARE_SplitList
+    CDSUNIT_DECLARE_StripedSet
+    CDSUNIT_DECLARE_RefinableSet
+    CDSUNIT_DECLARE_CuckooSet
+    CDSUNIT_DECLARE_SkipListSet
+    CDSUNIT_DECLARE_EllenBinTreeSet
+
+    };
+} // namespace set2
diff --git a/tests/unit/set2/set_insdel_func2.cpp b/tests/unit/set2/set_insdel_func2.cpp
new file mode 100644 (file)
index 0000000..fc77c6e
--- /dev/null
@@ -0,0 +1,10 @@
+//$$CDS-header$$
+
+#include "set2/set_insdel_func.h"
+
+namespace set2 {
+    CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_SplitList )
+        CDSUNIT_TEST_SplitList
+    CPPUNIT_TEST_SUITE_END_PART()
+
+} // namespace set2
diff --git a/tests/unit/set2/set_insdel_func3.cpp b/tests/unit/set2/set_insdel_func3.cpp
new file mode 100644 (file)
index 0000000..3a2765a
--- /dev/null
@@ -0,0 +1,10 @@
+//$$CDS-header$$
+
+#include "set2/set_insdel_func.h"
+
+namespace set2 {
+    CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_SkipListSet )
+        CDSUNIT_TEST_SkipListSet
+    CPPUNIT_TEST_SUITE_END_PART()
+
+} // namespace set2
diff --git a/tests/unit/set2/set_insdel_func4.cpp b/tests/unit/set2/set_insdel_func4.cpp
new file mode 100644 (file)
index 0000000..f1951ab
--- /dev/null
@@ -0,0 +1,11 @@
+//$$CDS-header$$
+
+#include "set2/set_insdel_func.h"
+
+namespace set2 {
+
+    CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_StripedSet )
+        CDSUNIT_TEST_StripedSet
+    CPPUNIT_TEST_SUITE_END_PART()
+
+} // namespace set2
diff --git a/tests/unit/set2/set_insdel_func5.cpp b/tests/unit/set2/set_insdel_func5.cpp
new file mode 100644 (file)
index 0000000..ac6ef50
--- /dev/null
@@ -0,0 +1,10 @@
+//$$CDS-header$$
+
+#include "set2/set_insdel_func.h"
+
+namespace set2 {
+    CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_RefinableSet )
+        CDSUNIT_TEST_RefinableSet
+    CPPUNIT_TEST_SUITE_END_PART()
+
+} // namespace set2
diff --git a/tests/unit/set2/set_insdel_func6.cpp b/tests/unit/set2/set_insdel_func6.cpp
new file mode 100644 (file)
index 0000000..5db7020
--- /dev/null
@@ -0,0 +1,10 @@
+//$$CDS-header$$
+
+#include "set2/set_insdel_func.h"
+
+namespace set2 {
+    CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_CuckooSet )
+        CDSUNIT_TEST_CuckooSet
+    CPPUNIT_TEST_SUITE_END_PART()
+
+} // namespace set2
diff --git a/tests/unit/set2/set_insdel_func7.cpp b/tests/unit/set2/set_insdel_func7.cpp
new file mode 100644 (file)
index 0000000..d711857
--- /dev/null
@@ -0,0 +1,10 @@
+//$$CDS-header$$
+
+#include "set2/set_insdel_func.h"
+
+namespace set2 {
+    CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_EllenBinTreeSet )
+        CDSUNIT_TEST_EllenBinTreeSet
+    CPPUNIT_TEST_SUITE_END_PART()
+
+} // namespace set2
diff --git a/tests/unit/set2/set_insdel_string.cpp b/tests/unit/set2/set_insdel_string.cpp
new file mode 100644 (file)
index 0000000..4b11791
--- /dev/null
@@ -0,0 +1,558 @@
+//$$CDS-header$$
+
+#include "set2/set_types.h"
+#include "cppunit/thread.h"
+
+#include <vector>
+
+namespace set2 {
+
+#   define TEST_SET(X)          void X() { test<SetTypes<key_type, value_type>::X >(); }
+#   define TEST_SET_EXTRACT(X)  void X() { test_extract<SetTypes<key_type, value_type>::X >(); }
+#   define TEST_SET_NOLF(X)     void X() { test_nolf<SetTypes<key_type, value_type>::X >(); }
+#   define TEST_SET_NOLF_EXTRACT(X) void X() { test_nolf_extract<SetTypes<key_type, value_type>::X >(); }
+
+    namespace {
+        static size_t  c_nMapSize = 1000000    ;  // set size
+        static size_t  c_nInsertThreadCount = 4;  // count of insertion thread
+        static size_t  c_nDeleteThreadCount = 4;  // count of deletion thread
+        static size_t  c_nThreadPassCount = 4  ;  // pass count for each thread
+        static size_t  c_nMaxLoadFactor = 8    ;  // maximum load factor
+        static bool    c_bPrintGCState = true;
+    }
+
+    class Set_InsDel_string: public CppUnitMini::TestCase
+    {
+        typedef std::string key_type;
+        typedef size_t      value_type;
+
+        const std::vector<std::string> *  m_parrString;
+
+        template <class Set>
+        class Inserter: public CppUnitMini::TestThread
+        {
+            Set&     m_Set;
+            typedef typename Set::value_type    keyval_type;
+
+            virtual Inserter *    clone()
+            {
+                return new Inserter( *this );
+            }
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+
+        public:
+            Inserter( CppUnitMini::ThreadPool& pool, Set& rSet )
+                : CppUnitMini::TestThread( pool )
+                , m_Set( rSet )
+            {}
+            Inserter( Inserter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Set( src.m_Set )
+            {}
+
+            Set_InsDel_string&  getTest()
+            {
+                return reinterpret_cast<Set_InsDel_string&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rSet = m_Set;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed = 0;
+
+                const std::vector<std::string>& arrString = *getTest().m_parrString;
+                size_t nArrSize = arrString.size();
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = 0; nItem < c_nMapSize; ++nItem ) {
+                            if ( rSet.insert( keyval_type(arrString[nItem % nArrSize], nItem * 8) ) )
+                                ++m_nInsertSuccess;
+                            else
+                                ++m_nInsertFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = c_nMapSize; nItem > 0; --nItem ) {
+                            if ( rSet.insert( keyval_type( arrString[nItem % nArrSize], nItem * 8) ) )
+                                ++m_nInsertSuccess;
+                            else
+                                ++m_nInsertFailed;
+                        }
+                    }
+                }
+            }
+        };
+
+        template <class Set>
+        class Deleter: public CppUnitMini::TestThread
+        {
+            Set&     m_Set;
+
+            virtual Deleter *    clone()
+            {
+                return new Deleter( *this );
+            }
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+        public:
+            Deleter( CppUnitMini::ThreadPool& pool, Set& rSet )
+                : CppUnitMini::TestThread( pool )
+                , m_Set( rSet )
+            {}
+            Deleter( Deleter& src )
+                : CppUnitMini::TestThread( src )
+                , m_Set( src.m_Set )
+            {}
+
+            Set_InsDel_string&  getTest()
+            {
+                return reinterpret_cast<Set_InsDel_string&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rSet = m_Set;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                const std::vector<std::string>& arrString = *getTest().m_parrString;
+                size_t nArrSize = arrString.size();
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = 0; nItem < c_nMapSize; ++nItem ) {
+                            if ( rSet.erase( arrString[nItem % nArrSize] ) )
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = c_nMapSize; nItem > 0; --nItem ) {
+                            if ( rSet.erase( arrString[nItem % nArrSize] ) )
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+            }
+        };
+
+        template <typename GC, class Set>
+        class Extractor: public CppUnitMini::TestThread
+        {
+            Set&     m_Set;
+
+            virtual Extractor *    clone()
+            {
+                return new Extractor( *this );
+            }
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+        public:
+            Extractor( CppUnitMini::ThreadPool& pool, Set& rSet )
+                : CppUnitMini::TestThread( pool )
+                , m_Set( rSet )
+            {}
+            Extractor( Extractor& src )
+                : CppUnitMini::TestThread( src )
+                , m_Set( src.m_Set )
+            {}
+
+            Set_InsDel_string&  getTest()
+            {
+                return reinterpret_cast<Set_InsDel_string&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rSet = m_Set;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                typename Set::guarded_ptr gp;
+
+                const std::vector<std::string>& arrString = *getTest().m_parrString;
+                size_t nArrSize = arrString.size();
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = 0; nItem < c_nMapSize; ++nItem ) {
+                            if ( rSet.extract( gp, arrString[nItem % nArrSize] ) )
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = c_nMapSize; nItem > 0; --nItem ) {
+                            if ( rSet.extract( gp, arrString[nItem % nArrSize] ) )
+                                ++m_nDeleteSuccess;
+                            else
+                                ++m_nDeleteFailed;
+                        }
+                    }
+                }
+            }
+        };
+
+        template <typename RCU, class Set>
+        class Extractor<cds::urcu::gc<RCU>, Set >: public CppUnitMini::TestThread
+        {
+            Set&     m_Set;
+
+            virtual Extractor *    clone()
+            {
+                return new Extractor( *this );
+            }
+        public:
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+
+        public:
+            Extractor( CppUnitMini::ThreadPool& pool, Set& rSet )
+                : CppUnitMini::TestThread( pool )
+                , m_Set( rSet )
+            {}
+            Extractor( Extractor& src )
+                : CppUnitMini::TestThread( src )
+                , m_Set( src.m_Set )
+            {}
+
+            Set_InsDel_string&  getTest()
+            {
+                return reinterpret_cast<Set_InsDel_string&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rSet = m_Set;
+
+                m_nDeleteSuccess =
+                    m_nDeleteFailed = 0;
+
+                typename Set::exempt_ptr xp;
+
+                const std::vector<std::string>& arrString = *getTest().m_parrString;
+                size_t nArrSize = arrString.size();
+
+                if ( m_nThreadNo & 1 ) {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = 0; nItem < c_nMapSize; ++nItem ) {
+                            if ( Set::c_bExtractLockExternal ) {
+                                {
+                                    typename Set::rcu_lock l;
+                                    if ( rSet.extract( xp, arrString[nItem % nArrSize] ) )
+                                        ++m_nDeleteSuccess;
+                                    else
+                                        ++m_nDeleteFailed;
+                                }
+                                xp.release();
+                            }
+                            else {
+                                if ( rSet.extract( xp, arrString[nItem % nArrSize] ) ) {
+                                    ++m_nDeleteSuccess;
+                                    xp.release();
+                                }
+                                else
+                                    ++m_nDeleteFailed;
+                            }
+                        }
+                    }
+                }
+                else {
+                    for ( size_t nPass = 0; nPass < c_nThreadPassCount; ++nPass ) {
+                        for ( size_t nItem = c_nMapSize; nItem > 0; --nItem ) {
+                            if ( Set::c_bExtractLockExternal ) {
+                                {
+                                    typename Set::rcu_lock l;
+                                    if ( rSet.extract( xp, arrString[nItem % nArrSize] ) )
+                                        ++m_nDeleteSuccess;
+                                    else
+                                        ++m_nDeleteFailed;
+                                }
+                                xp.release();
+                            }
+                            else {
+                                if ( rSet.extract( xp, arrString[nItem % nArrSize] ) ) {
+                                    ++m_nDeleteSuccess;
+                                    xp.release();
+                                }
+                                else
+                                    ++m_nDeleteFailed;
+                            }
+                        }
+                    }
+                }
+            }
+        };
+
+    protected:
+
+        template <class Set>
+        void do_test( size_t nLoadFactor )
+        {
+            CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+
+            Set  testSet( c_nMapSize, nLoadFactor );
+            do_test_with( testSet );
+        }
+
+        template <class Set>
+        void do_test_extract( size_t nLoadFactor )
+        {
+            CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+
+            Set  testSet( c_nMapSize, nLoadFactor );
+            do_test_extract_with( testSet );
+        }
+
+        template <class Set>
+        void do_test_with( Set& testSet )
+        {
+            typedef Inserter<Set>       InserterThread;
+            typedef Deleter<Set>        DeleterThread;
+            cds::OS::Timer    timer;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new InserterThread( pool, testSet ), c_nInsertThreadCount );
+            pool.add( new DeleterThread( pool, testSet ), c_nDeleteThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                InserterThread * pThread = dynamic_cast<InserterThread *>( *it );
+                if ( pThread ) {
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                }
+                else {
+                    DeleterThread * p = static_cast<DeleterThread *>( *it );
+                    nDeleteSuccess += p->m_nDeleteSuccess;
+                    nDeleteFailed += p->m_nDeleteFailed;
+                }
+            }
+
+            CPPUNIT_MSG( "    Totals: Ins succ=" << nInsertSuccess
+                << " Del succ=" << nDeleteSuccess << "\n"
+                      << "          : Ins fail=" << nInsertFailed
+                << " Del fail=" << nDeleteFailed
+                << " Set size=" << testSet.size()
+                );
+
+
+            CPPUNIT_MSG( "  Clear set (single-threaded)..." );
+            timer.reset();
+            for ( size_t i = 0; i < m_parrString->size(); ++i )
+                testSet.erase( (*m_parrString)[i] );
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+            CPPUNIT_ASSERT( testSet.empty() );
+
+            additional_check( testSet );
+            print_stat(  testSet  );
+            additional_cleanup( testSet );
+        }
+
+        template <class Set>
+        void do_test_extract_with( Set& testSet )
+        {
+            typedef Inserter<Set>       InserterThread;
+            typedef Deleter<Set>        DeleterThread;
+            typedef Extractor<typename Set::gc, Set> ExtractThread;
+
+            size_t nDelThreadCount = c_nDeleteThreadCount / 2;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new InserterThread( pool, testSet ), c_nInsertThreadCount );
+            pool.add( new DeleterThread( pool, testSet ), nDelThreadCount );
+            pool.add( new ExtractThread( pool, testSet ), c_nDeleteThreadCount - nDelThreadCount );
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            size_t nExtractSuccess = 0;
+            size_t nExtractFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                InserterThread * pThread = dynamic_cast<InserterThread *>( *it );
+                if ( pThread ) {
+                    nInsertSuccess += pThread->m_nInsertSuccess;
+                    nInsertFailed += pThread->m_nInsertFailed;
+                }
+                else {
+                    DeleterThread * p = dynamic_cast<DeleterThread *>( *it );
+                    if ( p ) {
+                        nDeleteSuccess += p->m_nDeleteSuccess;
+                        nDeleteFailed += p->m_nDeleteFailed;
+                    }
+                    else {
+                        ExtractThread * pExtract = dynamic_cast<ExtractThread *>( *it );
+                        assert( pExtract );
+                        nExtractSuccess += pExtract->m_nDeleteSuccess;
+                        nExtractFailed += pExtract->m_nDeleteFailed;
+                    }
+                }
+            }
+
+            CPPUNIT_MSG( "    Totals: Ins succ=" << nInsertSuccess
+                << " Del succ=" << nDeleteSuccess
+                << " Extract succ= " << nExtractSuccess << "\n"
+                << "          : Ins fail=" << nInsertFailed
+                << " Del fail=" << nDeleteFailed
+                << " Extract fail=" << nExtractFailed
+                << " Set size=" << testSet.size()
+                );
+
+
+            CPPUNIT_MSG( "  Clear set (single-threaded)..." );
+            cds::OS::Timer    timer;
+            for ( size_t i = 0; i < m_parrString->size(); ++i )
+                testSet.erase( (*m_parrString)[i] );
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+            CPPUNIT_ASSERT( testSet.empty() );
+
+            additional_check( testSet );
+            print_stat(  testSet  );
+            additional_cleanup( testSet );
+        }
+
+        template <class Set>
+        void test()
+        {
+            m_parrString = &CppUnitMini::TestCase::getTestStrings();
+
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " set size=" << c_nMapSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                do_test<Set>( nLoadFactor );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class Set>
+        void test_extract()
+        {
+            m_parrString = &CppUnitMini::TestCase::getTestStrings();
+
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " set size=" << c_nMapSize
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                do_test_extract<Set>( nLoadFactor );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class Set>
+        void test_nolf()
+        {
+            m_parrString = &CppUnitMini::TestCase::getTestStrings();
+
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " set size=" << c_nMapSize
+                );
+
+            Set s;
+            do_test_with( s );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        template <class Set>
+        void test_nolf_extract()
+        {
+            m_parrString = &CppUnitMini::TestCase::getTestStrings();
+
+            CPPUNIT_MSG( "Thread count: insert=" << c_nInsertThreadCount
+                << " delete=" << c_nDeleteThreadCount
+                << " pass count=" << c_nThreadPassCount
+                << " set size=" << c_nMapSize
+                );
+
+            Set s;
+            do_test_extract_with( s );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nInsertThreadCount = cfg.getULong("InsertThreadCount", 4 );
+            c_nDeleteThreadCount = cfg.getULong("DeleteThreadCount", 4 );
+            c_nThreadPassCount = cfg.getULong("ThreadPassCount", 4 );
+            c_nMapSize = cfg.getULong("MapSize", 1000000 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+        }
+
+#   include "set2/set_defs.h"
+        CDSUNIT_DECLARE_MichaelSet
+        CDSUNIT_DECLARE_SplitList
+        CDSUNIT_DECLARE_StripedSet
+        CDSUNIT_DECLARE_RefinableSet
+        CDSUNIT_DECLARE_CuckooSet
+        CDSUNIT_DECLARE_SkipListSet
+        CDSUNIT_DECLARE_EllenBinTreeSet
+        CDSUNIT_DECLARE_StdSet
+
+        CPPUNIT_TEST_SUITE_( Set_InsDel_string, "Map_InsDel_string" )
+            CDSUNIT_TEST_MichaelSet
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SkipListSet
+            CDSUNIT_TEST_EllenBinTreeSet
+            CDSUNIT_TEST_StripedSet
+            CDSUNIT_TEST_RefinableSet
+            CDSUNIT_TEST_CuckooSet
+            CDSUNIT_TEST_StdSet
+        CPPUNIT_TEST_SUITE_END()
+
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Set_InsDel_string );
+} // namespace set2
diff --git a/tests/unit/set2/set_insdelfind.cpp b/tests/unit/set2/set_insdelfind.cpp
new file mode 100644 (file)
index 0000000..05f3bff
--- /dev/null
@@ -0,0 +1,276 @@
+//$$CDS-header$$
+
+#include "set2/set_types.h"
+#include "cppunit/thread.h"
+#include <algorithm> // random_shuffle
+
+namespace set2 {
+
+#   define TEST_SET(X)          void X() { test<SetTypes<key_type, value_type>::X >()    ; }
+#   define TEST_SET_EXTRACT(X)  TEST_SET(X)
+#   define TEST_SET_NOLF(X)    void X() { test_nolf<SetTypes<key_type, value_type>::X >()    ; }
+#   define TEST_SET_NOLF_EXTRACT(X) TEST_SET_NOLF(X)
+
+    namespace {
+        static size_t  c_nInitialMapSize = 500000   ;  // initial map size
+        static size_t  c_nThreadCount = 8           ;  // thread count
+        static size_t  c_nMaxLoadFactor = 8         ;  // maximum load factor
+        static unsigned int c_nInsertPercentage = 5;
+        static unsigned int c_nDeletePercentage = 5;
+        static unsigned int c_nDuration = 30        ;  // test duration, seconds
+        static bool    c_bPrintGCState = true;
+    }
+
+    class Set_InsDelFind: public CppUnitMini::TestCase
+    {
+    public:
+        enum actions
+        {
+            do_find,
+            do_insert,
+            do_delete
+        };
+        static const unsigned int c_nShuffleSize = 100;
+        actions m_arrShuffle[c_nShuffleSize];
+
+    protected:
+        typedef size_t  key_type;
+        typedef size_t  value_type;
+
+        template <class Set>
+        class WorkThread: public CppUnitMini::TestThread
+        {
+            Set&     m_Map;
+
+            virtual WorkThread *    clone()
+            {
+                return new WorkThread( *this );
+            }
+        public:
+            size_t  m_nInsertSuccess;
+            size_t  m_nInsertFailed;
+            size_t  m_nDeleteSuccess;
+            size_t  m_nDeleteFailed;
+            size_t  m_nFindSuccess;
+            size_t  m_nFindFailed;
+
+        public:
+            WorkThread( CppUnitMini::ThreadPool& pool, Set& rMap )
+                : CppUnitMini::TestThread( pool )
+                , m_Map( rMap )
+            {}
+            WorkThread( WorkThread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Map( src.m_Map )
+            {}
+
+            Set_InsDelFind&  getTest()
+            {
+                return reinterpret_cast<Set_InsDelFind&>( m_Pool.m_Test );
+            }
+
+            virtual void init() { cds::threading::Manager::attachThread()   ; }
+            virtual void fini() { cds::threading::Manager::detachThread()   ; }
+
+            virtual void test()
+            {
+                Set& rMap = m_Map;
+
+                m_nInsertSuccess =
+                    m_nInsertFailed =
+                    m_nDeleteSuccess =
+                    m_nDeleteFailed =
+                    m_nFindSuccess =
+                    m_nFindFailed = 0;
+
+                actions * pAct = getTest().m_arrShuffle;
+                unsigned int i = 0;
+                size_t const nNormalize = size_t(-1) / (c_nInitialMapSize * 2);
+
+                size_t nRand = 0;
+                while ( !time_elapsed() ) {
+                    nRand = cds::bitop::RandXorShift(nRand);
+                    size_t n = nRand / nNormalize;
+                    switch ( pAct[i] ) {
+                    case do_find:
+                        if ( rMap.find( n ))
+                            ++m_nFindSuccess;
+                        else
+                            ++m_nFindFailed;
+                        break;
+                    case do_insert:
+                        if ( rMap.insert( n ))
+                            ++m_nInsertSuccess;
+                        else
+                            ++m_nInsertFailed;
+                        break;
+                    case do_delete:
+                        if ( rMap.erase( n ))
+                            ++m_nDeleteSuccess;
+                        else
+                            ++m_nDeleteFailed;
+                        break;
+                    }
+
+                    if ( ++i >= c_nShuffleSize )
+                        i = 0;
+                }
+            }
+        };
+
+    protected:
+        template <class Set>
+        void do_test( size_t nLoadFactor )
+        {
+            CPPUNIT_MSG( "Load factor=" << nLoadFactor );
+
+            Set  testSet( c_nInitialMapSize, nLoadFactor );
+            do_test_with( testSet );
+        }
+
+        template <class Set>
+        void do_test_with( Set& testSet )
+        {
+            typedef WorkThread<Set> work_thread;
+
+            // fill map - only odd number
+            {
+                size_t * pInitArr = new size_t[ c_nInitialMapSize ];
+                size_t * pEnd = pInitArr + c_nInitialMapSize;
+                for ( size_t i = 0; i < c_nInitialMapSize; ++i )
+                    pInitArr[i] = i * 2 + 1;
+                std::random_shuffle( pInitArr, pEnd );
+                for ( size_t * p = pInitArr; p < pEnd; ++p )
+                    testSet.insert( typename Set::value_type( *p, *p ) );
+                delete [] pInitArr;
+            }
+
+            cds::OS::Timer    timer;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new work_thread( pool, testSet ), c_nThreadCount );
+            pool.run( c_nDuration );
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            size_t nInsertSuccess = 0;
+            size_t nInsertFailed = 0;
+            size_t nDeleteSuccess = 0;
+            size_t nDeleteFailed = 0;
+            size_t nFindSuccess = 0;
+            size_t nFindFailed = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                work_thread * pThread = static_cast<work_thread *>( *it );
+                assert( pThread != NULL );
+                nInsertSuccess += pThread->m_nInsertSuccess;
+                nInsertFailed += pThread->m_nInsertFailed;
+                nDeleteSuccess += pThread->m_nDeleteSuccess;
+                nDeleteFailed += pThread->m_nDeleteFailed;
+                nFindSuccess += pThread->m_nFindSuccess;
+                nFindFailed += pThread->m_nFindFailed;
+            }
+
+            CPPUNIT_MSG( "  Totals (success/failed): \n\t"
+                      << "      Insert=" << nInsertSuccess << '/' << nInsertFailed << "\n\t"
+                      << "      Delete=" << nDeleteSuccess << '/' << nDeleteFailed << "\n\t"
+                      << "        Find=" << nFindSuccess   << '/' << nFindFailed   << "\n\t"
+                      << "       Speed=" << (nFindSuccess + nFindFailed) / c_nDuration << " find/sec\n\t"
+                      << "             " << (nInsertSuccess + nDeleteSuccess) / c_nDuration << " modify/sec\n\t"
+                      << "      Set size=" << testSet.size()
+                );
+
+
+            CPPUNIT_MSG( "  Clear map (single-threaded)..." );
+            timer.reset();
+            testSet.clear();
+            CPPUNIT_MSG( "   Duration=" << timer.duration() );
+            CPPUNIT_CHECK_EX( testSet.empty(), ((long long) testSet.size()) );
+
+            additional_check( testSet );
+            print_stat( testSet );
+            additional_cleanup( testSet );
+        }
+
+        template <class Set>
+        void test()
+        {
+            CPPUNIT_MSG( "Thread count=" << c_nThreadCount
+                << " initial map size=" << c_nInitialMapSize
+                << " insert=" << c_nInsertPercentage << '%'
+                << " delete=" << c_nDeletePercentage << '%'
+                << " duration=" << c_nDuration << "s"
+                );
+
+            for ( size_t nLoadFactor = 1; nLoadFactor <= c_nMaxLoadFactor; nLoadFactor *= 2 ) {
+                do_test<Set>( nLoadFactor );
+                if ( c_bPrintGCState )
+                    print_gc_state();
+            }
+        }
+
+        template <class Set>
+        void test_nolf()
+        {
+            CPPUNIT_MSG( "Thread count=" << c_nThreadCount
+                << " initial map size=" << c_nInitialMapSize
+                << " insert=" << c_nInsertPercentage << '%'
+                << " delete=" << c_nDeletePercentage << '%'
+                << " duration=" << c_nDuration << "s"
+                );
+
+            Set s;
+            do_test_with( s );
+            //CPPUNIT_MSG( s.statistics() );
+            if ( c_bPrintGCState )
+                print_gc_state();
+        }
+
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            c_nInitialMapSize = cfg.getULong("InitialMapSize", 500000 );
+            c_nThreadCount = cfg.getULong("ThreadCount", 8 );
+            c_nMaxLoadFactor = cfg.getULong("MaxLoadFactor", 8 );
+            c_nInsertPercentage = cfg.getUInt("InsertPercentage", 5 );
+            c_nDeletePercentage = cfg.getUInt("DeletePercentage", 5 );
+            c_nDuration = cfg.getUInt("Duration", 30 );
+            c_bPrintGCState = cfg.getBool("PrintGCStateFlag", true );
+
+            if ( c_nThreadCount == 0 )
+                c_nThreadCount = cds::OS::topology::processor_count() * 2;
+
+            CPPUNIT_ASSERT( c_nInsertPercentage + c_nDeletePercentage <= 100 );
+
+            actions * pFirst = m_arrShuffle;
+            actions * pLast = m_arrShuffle + c_nInsertPercentage;
+            std::fill( pFirst, pLast, do_insert );
+            pFirst = pLast;
+            pLast += c_nDeletePercentage;
+            std::fill( pFirst, pLast, do_delete );
+            pFirst = pLast;
+            pLast = m_arrShuffle + sizeof(m_arrShuffle)/sizeof(m_arrShuffle[0]);
+            std::fill( pFirst, pLast, do_find );
+            std::random_shuffle( m_arrShuffle, pLast );
+        }
+
+#   include "set2/set_defs.h"
+        CDSUNIT_DECLARE_MichaelSet
+        CDSUNIT_DECLARE_SplitList
+        CDSUNIT_DECLARE_StripedSet
+        CDSUNIT_DECLARE_RefinableSet
+        CDSUNIT_DECLARE_CuckooSet
+        CDSUNIT_DECLARE_SkipListSet
+        CDSUNIT_DECLARE_EllenBinTreeSet
+        CDSUNIT_DECLARE_StdSet
+
+        CPPUNIT_TEST_SUITE_( Set_InsDelFind, "Map_InsDelFind" )
+            CDSUNIT_TEST_MichaelSet
+            CDSUNIT_TEST_SplitList
+            CDSUNIT_TEST_SkipListSet
+            CDSUNIT_TEST_EllenBinTreeSet
+            CDSUNIT_TEST_StripedSet
+            CDSUNIT_TEST_RefinableSet
+            CDSUNIT_TEST_CuckooSet
+            CDSUNIT_TEST_StdSet
+        CPPUNIT_TEST_SUITE_END()
+    };
+
+    CPPUNIT_TEST_SUITE_REGISTRATION( Set_InsDelFind );
+} // namespace set2
diff --git a/tests/unit/set2/set_types.h b/tests/unit/set2/set_types.h
new file mode 100644 (file)
index 0000000..8f0d8af
--- /dev/null
@@ -0,0 +1,4800 @@
+//$$CDS-header$$
+
+#ifndef _CDSUNIT_SET2_SET_TYPES_H
+#define _CDSUNIT_SET2_SET_TYPES_H
+
+#include <cds/urcu/general_instant.h>
+#include <cds/urcu/general_buffered.h>
+#include <cds/urcu/general_threaded.h>
+#include <cds/urcu/signal_buffered.h>
+#include <cds/urcu/signal_threaded.h>
+
+#include <cds/container/michael_list_hp.h>
+#include <cds/container/michael_list_hrc.h>
+#include <cds/container/michael_list_ptb.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/lazy_list_hp.h>
+#include <cds/container/lazy_list_hrc.h>
+#include <cds/container/lazy_list_ptb.h>
+#include <cds/container/lazy_list_rcu.h>
+
+#include <cds/container/michael_set.h>
+#include <cds/container/michael_set_rcu.h>
+
+#include <cds/container/split_list_set.h>
+#include <cds/container/split_list_set_rcu.h>
+
+#include <cds/container/cuckoo_set.h>
+
+#include <cds/container/skip_list_set_hp.h>
+#include <cds/container/skip_list_set_hrc.h>
+#include <cds/container/skip_list_set_ptb.h>
+#include <cds/container/skip_list_set_rcu.h>
+
+#include <cds/container/ellen_bintree_set_rcu.h>
+#include <cds/container/ellen_bintree_set_hp.h>
+#include <cds/container/ellen_bintree_set_ptb.h>
+
+#include <cds/container/striped_set/std_list.h>
+#include <cds/container/striped_set/std_vector.h>
+#include <cds/container/striped_set/std_set.h>
+#include <cds/container/striped_set/std_hash_set.h>
+#include <cds/container/striped_set/boost_unordered_set.h>
+
+#include <boost/version.hpp>
+#if BOOST_VERSION >= 104800
+#   include <cds/container/striped_set/boost_slist.h>
+#   include <cds/container/striped_set/boost_list.h>
+#   include <cds/container/striped_set/boost_vector.h>
+#   include <cds/container/striped_set/boost_stable_vector.h>
+#   include <cds/container/striped_set/boost_set.h>
+//#   if !(CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION >= 1700)
+//#       define CDS_UNIT_MAP_TYPES_ENABLE_BOOST_FLAT_CONTAINERS
+#       include <cds/container/striped_set/boost_flat_set.h>
+//#   endif
+#endif
+#include <cds/container/striped_set.h>
+
+#include <cds/lock/spinlock.h>
+#include <boost/functional/hash/hash.hpp>
+
+#include "cppunit/cppunit_mini.h"
+#include "lock/nolock.h"
+#include "set2/std_set.h"
+#include "set2/std_hash_set.h"
+#include "michael_alloc.h"
+#include "print_cuckoo_stat.h"
+#include "print_skip_list_stat.h"
+#include "print_ellenbintree_stat.h"
+#include "ellen_bintree_update_desc_pool.h"
+
+namespace set2 {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+    typedef cds::urcu::gc< cds::urcu::general_instant<> >   rcu_gpi;
+    typedef cds::urcu::gc< cds::urcu::general_buffered<> >  rcu_gpb;
+    typedef cds::urcu::gc< cds::urcu::general_threaded<> >  rcu_gpt;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    typedef cds::urcu::gc< cds::urcu::signal_buffered<> >  rcu_shb;
+    typedef cds::urcu::gc< cds::urcu::signal_threaded<> >  rcu_sht;
+#endif
+
+    template <typename V, CDS_DECL_OPTIONS10>
+    class CuckooStripedSet:
+        public cc::CuckooSet< V,
+            typename cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::striping<> >
+                ,CDS_OPTIONS10
+            >::type
+        >
+    {
+    public:
+        typedef typename cc::cuckoo::make_traits<
+            co::mutex_policy< cc::cuckoo::striping<> >
+            ,CDS_OPTIONS10
+        >::type cuckoo_traits;
+
+        typedef cc::CuckooSet< V, cuckoo_traits > cuckoo_base_class;
+
+    public:
+        CuckooStripedSet( size_t nCapacity, size_t nLoadFactor )
+            : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int) 4 )
+        {}
+
+        template <typename Q, typename Pred>
+        bool erase_with( Q const& key, Pred pred )
+        {
+            return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
+        }
+    };
+
+    template <typename V, CDS_DECL_OPTIONS10>
+    class CuckooRefinableSet:
+        public cc::CuckooSet< V,
+            typename cc::cuckoo::make_traits<
+                co::mutex_policy< cc::cuckoo::refinable<> >
+                ,CDS_OPTIONS10
+            >::type
+        >
+    {
+    public:
+        typedef typename cc::cuckoo::make_traits<
+            co::mutex_policy< cc::cuckoo::refinable<> >
+            ,CDS_OPTIONS10
+        >::type cuckoo_traits;
+
+        typedef cc::CuckooSet< V, cuckoo_traits > cuckoo_base_class;
+
+    public:
+        CuckooRefinableSet( size_t nCapacity, size_t nLoadFactor )
+            : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int) 4 )
+        {}
+
+        template <typename Q, typename Pred>
+        bool erase_with( Q const& key, Pred pred )
+        {
+            return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
+        }
+    };
+
+    template <typename Key>
+    struct cmp {
+        int operator ()(Key const& k1, Key const& k2) const
+        {
+            if ( std::less<Key>( k1, k2 ) )
+                return -1;
+            return std::less<Key>( k2, k1 ) ? 1 : 0;
+        }
+    };
+
+#define CDSUNIT_INT_COMPARE(t)  template <> struct cmp<t> { int operator()( t k1, t k2 ){ return (int)(k1 - k2); } }
+    CDSUNIT_INT_COMPARE(char);
+    CDSUNIT_INT_COMPARE(unsigned char);
+    CDSUNIT_INT_COMPARE(int);
+    CDSUNIT_INT_COMPARE(unsigned int);
+    CDSUNIT_INT_COMPARE(long);
+    CDSUNIT_INT_COMPARE(unsigned long);
+    CDSUNIT_INT_COMPARE(long long);
+    CDSUNIT_INT_COMPARE(unsigned long long);
+#undef CDSUNIT_INT_COMPARE
+
+    template <>
+    struct cmp<std::string>
+    {
+        int operator()(std::string const& s1, std::string const& s2)
+        {
+            return s1.compare( s2 );
+        }
+        int operator()(std::string const& s1, char const * s2)
+        {
+            return s1.compare( s2 );
+        }
+        int operator()(char const * s1, std::string const& s2)
+        {
+            return -s2.compare( s1 );
+        }
+    };
+
+    template <typename Key, typename Value>
+    struct SetTypes {
+
+        typedef Key     key_type;
+        typedef Value   value_type;
+
+        struct key_val {
+            key_type    key;
+            value_type  val;
+
+            /*explicit*/ key_val( key_type const& k ): key(k), val() {}
+            key_val( key_type const& k, value_type const& v ): key(k), val(v) {}
+
+            template <typename K>
+            /*explicit*/ key_val( K const& k ): key(k) {}
+
+            template <typename K, typename T>
+            key_val( K const& k, T const& v ): key(k), val(v) {}
+        };
+
+        typedef co::v::hash<key_type>   key_hash;
+        typedef std::less<key_type>     key_less;
+        typedef cmp<key_type>           key_compare;
+
+        struct less {
+            bool operator()( key_val const& k1, key_val const& k2 ) const
+            {
+                return key_less()( k1.key, k2.key );
+            }
+            bool operator()( key_type const& k1, key_val const& k2 ) const
+            {
+                return key_less()( k1, k2.key );
+            }
+            bool operator()( key_val const& k1, key_type const& k2 ) const
+            {
+                return key_less()( k1.key, k2 );
+            }
+        };
+
+        struct compare {
+            int operator()( key_val const& k1, key_val const& k2 ) const
+            {
+                return key_compare()( k1.key, k2.key );
+            }
+            int operator()( key_type const& k1, key_val const& k2 ) const
+            {
+                return key_compare()( k1, k2.key );
+            }
+            int operator()( key_val const& k1, key_type const& k2 ) const
+            {
+                return key_compare()( k1.key, k2 );
+            }
+        };
+
+        struct equal_to {
+            bool operator()( key_val const& k1, key_val const& k2 ) const
+            {
+                return key_compare()( k1.key, k2.key ) == 0;
+            }
+            bool operator()( key_type const& k1, key_val const& k2 ) const
+            {
+                return key_compare()( k1, k2.key ) == 0;
+            }
+            bool operator()( key_val const& k1, key_type const& k2 ) const
+            {
+                return key_compare()( k1.key, k2 ) == 0;
+            }
+        };
+
+
+        struct hash: public key_hash
+        {
+            size_t operator()( key_val const& v ) const
+            {
+                return key_hash::operator()( v.key );
+            }
+            size_t operator()( key_type const& key ) const
+            {
+                return key_hash::operator()( key );
+            }
+            template <typename Q>
+            size_t operator()( Q const& k ) const
+            {
+                return key_hash::operator()( k );
+            }
+        };
+
+        struct hash2: public hash
+        {
+            size_t operator()( key_val const& k ) const
+            {
+                size_t seed = ~hash::operator ()( k );
+                boost::hash_combine( seed, k.key );
+                return seed;
+            }
+            size_t operator()( key_type const& k ) const
+            {
+                size_t seed = ~hash::operator ()( k );
+                boost::hash_combine( seed, k );
+                return seed;
+            }
+            template <typename Q>
+            size_t operator()( Q const& k ) const
+            {
+                return key_hash::operator()( k );
+            }
+        };
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600
+        struct hash_less: public stdext::hash_compare< key_type, std::less<key_type> >
+        {
+            typedef stdext::hash_compare< key_type, std::less<key_type> > base_class;
+            size_t operator()(const key_val& kv) const
+            {
+                return hash()(kv);
+            }
+            size_t operator()(const key_type& k ) const
+            {
+                return hash()(k);
+            }
+
+            bool operator()(const key_val& kv1, const key_val& kv2) const
+            {
+                return less()( kv1, kv2 );
+            }
+            bool operator()(const key_type& k1, const key_val& kv2) const
+            {
+                return less()( k1, kv2 );
+            }
+            bool operator()(const key_val& kv1, const key_type& k2) const
+            {
+                return less()( kv1, k2 );
+            }
+        };
+#endif
+
+        // ***************************************************************************
+        // MichaelList
+
+        typedef cc::MichaelList< cds::gc::HP, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_HP_cmp_stdAlloc;
+
+        typedef cc::MichaelList< cds::gc::HP, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_HP_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< cds::gc::HP, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_HP_cmp_michaelAlloc;
+
+        typedef cc::MichaelList< cds::gc::HP, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_HP_less_stdAlloc;
+
+        typedef cc::MichaelList< cds::gc::HP, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_HP_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< cds::gc::HP, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_HP_less_michaelAlloc;
+
+        typedef cc::MichaelList< cds::gc::HRC, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_HRC_cmp_stdAlloc;
+
+        typedef cc::MichaelList< cds::gc::HRC, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_HRC_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< cds::gc::HRC, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_HRC_cmp_michaelAlloc;
+
+        typedef cc::MichaelList< cds::gc::HRC, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_HRC_less_stdAlloc;
+
+        typedef cc::MichaelList< cds::gc::HRC, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_HRC_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< cds::gc::HRC, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_HRC_less_michaelAlloc;
+
+        typedef cc::MichaelList< cds::gc::PTB, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_PTB_cmp_stdAlloc;
+
+        typedef cc::MichaelList< cds::gc::PTB, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_PTB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< cds::gc::PTB, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_PTB_cmp_michaelAlloc;
+
+        typedef cc::MichaelList< cds::gc::PTB, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_PTB_less_stdAlloc;
+
+        typedef cc::MichaelList< cds::gc::PTB, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_PTB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< cds::gc::PTB, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_PTB_less_michaelAlloc;
+
+
+        typedef cc::MichaelList< rcu_gpi, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_RCU_GPI_cmp_stdAlloc;
+
+        typedef cc::MichaelList< rcu_gpi, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPI_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< rcu_gpi, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPI_cmp_michaelAlloc;
+
+        typedef cc::MichaelList< rcu_gpi, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_RCU_GPI_less_stdAlloc;
+
+        typedef cc::MichaelList< rcu_gpi, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPI_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< rcu_gpi, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPI_less_michaelAlloc;
+
+
+        typedef cc::MichaelList< rcu_gpb, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_RCU_GPB_cmp_stdAlloc;
+
+        typedef cc::MichaelList< rcu_gpb, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< rcu_gpb, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPB_cmp_michaelAlloc;
+
+        typedef cc::MichaelList< rcu_gpb, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_RCU_GPB_less_stdAlloc;
+
+        typedef cc::MichaelList< rcu_gpb, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< rcu_gpb, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPB_less_michaelAlloc;
+
+
+        typedef cc::MichaelList< rcu_gpt, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_RCU_GPT_cmp_stdAlloc;
+
+        typedef cc::MichaelList< rcu_gpt, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< rcu_gpt, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPT_cmp_michaelAlloc;
+
+        typedef cc::MichaelList< rcu_gpt, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_RCU_GPT_less_stdAlloc;
+
+        typedef cc::MichaelList< rcu_gpt, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_GPT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< rcu_gpt, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_GPT_less_michaelAlloc;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_shb, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_RCU_SHB_cmp_stdAlloc;
+
+        typedef cc::MichaelList< rcu_shb, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_SHB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< rcu_shb, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_SHB_cmp_michaelAlloc;
+
+        typedef cc::MichaelList< rcu_shb, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_RCU_SHB_less_stdAlloc;
+
+        typedef cc::MichaelList< rcu_shb, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_SHB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< rcu_shb, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_SHB_less_michaelAlloc;
+
+
+        typedef cc::MichaelList< rcu_sht, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   MichaelList_RCU_SHT_cmp_stdAlloc;
+
+        typedef cc::MichaelList< rcu_sht, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_SHT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< rcu_sht, key_val,
+            typename cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_SHT_cmp_michaelAlloc;
+
+        typedef cc::MichaelList< rcu_sht, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        >   MichaelList_RCU_SHT_less_stdAlloc;
+
+        typedef cc::MichaelList< rcu_sht, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   MichaelList_RCU_SHT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelList< rcu_sht, key_val,
+            typename cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelList_RCU_SHT_less_michaelAlloc;
+#endif
+
+        // ***************************************************************************
+        // MichaelHashSet based on MichaelList
+
+        typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_HP_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_HP_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_HP_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_HP_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_HP_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_HP_less_michaelAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, MichaelList_HRC_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_HRC_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, MichaelList_HRC_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_HRC_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, MichaelList_HRC_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_HRC_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, MichaelList_HRC_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_HRC_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, MichaelList_HRC_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_HRC_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, MichaelList_HRC_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_HRC_less_michaelAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, MichaelList_PTB_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_PTB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, MichaelList_PTB_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_PTB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, MichaelList_PTB_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_PTB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, MichaelList_PTB_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_PTB_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, MichaelList_PTB_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_PTB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, MichaelList_PTB_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_PTB_less_michaelAlloc;
+
+        // general_instant RCU
+        typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPI_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPI_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_RCU_GPI_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPI_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPI_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_RCU_GPI_less_michaelAlloc;
+
+        // general_buffered RCU
+        typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_RCU_GPB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPB_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_RCU_GPB_less_michaelAlloc;
+
+        // general_threaded RCU
+        typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPT_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_RCU_GPT_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPT_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_GPT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_RCU_GPT_less_michaelAlloc;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // signal_buffered RCU
+        typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_SHB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_SHB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_RCU_SHB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_SHB_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_SHB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_RCU_SHB_less_michaelAlloc;
+
+        // signal_threaded RCU
+        typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_SHT_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_SHT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_RCU_SHT_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_SHT_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_RCU_SHT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_RCU_SHT_less_michaelAlloc;
+
+#endif
+
+        // ***************************************************************************
+        // LazyList
+
+        typedef cc::LazyList< cds::gc::HP, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_HP_cmp_stdAlloc;
+
+        typedef cc::LazyList< cds::gc::HP, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_HP_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyList< cds::gc::HP, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_HP_cmp_michaelAlloc;
+
+        typedef cc::LazyList< cds::gc::HP, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_HP_less_stdAlloc;
+
+        typedef cc::LazyList< cds::gc::HP, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_HP_less_stdAlloc_seqcst;
+
+        typedef cc::LazyList< cds::gc::HP, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_HP_less_michaelAlloc;
+
+        typedef cc::LazyList< cds::gc::HRC, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_HRC_cmp_stdAlloc;
+
+        typedef cc::LazyList< cds::gc::HRC, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_HRC_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyList< cds::gc::HRC, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_HRC_cmp_michaelAlloc;
+
+        typedef cc::LazyList< cds::gc::HRC, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_HRC_less_stdAlloc;
+
+        typedef cc::LazyList< cds::gc::HRC, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_HRC_less_stdAlloc_seqcst;
+
+        typedef cc::LazyList< cds::gc::HRC, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_HRC_less_michaelAlloc;
+
+        typedef cc::LazyList< cds::gc::PTB, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_PTB_cmp_stdAlloc;
+
+        typedef cc::LazyList< cds::gc::PTB, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_PTB_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyList< cds::gc::PTB, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_PTB_cmp_michaelAlloc;
+
+        typedef cc::LazyList< cds::gc::PTB, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_PTB_less_stdAlloc;
+
+        typedef cc::LazyList< cds::gc::PTB, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_PTB_less_stdAlloc_seqcst;
+
+        typedef cc::LazyList< cds::gc::PTB, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_PTB_less_michaelAlloc;
+
+        // RCU
+        typedef cc::LazyList< rcu_gpi, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_RCU_GPI_cmp_stdAlloc;
+
+        typedef cc::LazyList< rcu_gpi, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPI_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyList< rcu_gpi, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPI_cmp_michaelAlloc;
+
+        typedef cc::LazyList< rcu_gpi, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_RCU_GPI_less_stdAlloc;
+
+        typedef cc::LazyList< rcu_gpi, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPI_less_stdAlloc_seqcst;
+
+        typedef cc::LazyList< rcu_gpi, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPI_less_michaelAlloc;
+
+        typedef cc::LazyList< rcu_gpb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_RCU_GPB_cmp_stdAlloc;
+
+        typedef cc::LazyList< rcu_gpb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPB_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyList< rcu_gpb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPB_cmp_michaelAlloc;
+
+        typedef cc::LazyList< rcu_gpb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_RCU_GPB_less_stdAlloc;
+
+        typedef cc::LazyList< rcu_gpb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPB_less_stdAlloc_seqcst;
+
+        typedef cc::LazyList< rcu_gpb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPB_less_michaelAlloc;
+
+        //
+        typedef cc::LazyList< rcu_gpt, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_RCU_GPT_cmp_stdAlloc;
+
+        typedef cc::LazyList< rcu_gpt, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPT_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyList< rcu_gpt, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPT_cmp_michaelAlloc;
+
+        typedef cc::LazyList< rcu_gpt, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_RCU_GPT_less_stdAlloc;
+
+        typedef cc::LazyList< rcu_gpt, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_GPT_less_stdAlloc_seqcst;
+
+        typedef cc::LazyList< rcu_gpt, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_GPT_less_michaelAlloc;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_shb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_RCU_SHB_cmp_stdAlloc;
+
+        typedef cc::LazyList< rcu_shb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_SHB_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyList< rcu_shb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_SHB_cmp_michaelAlloc;
+
+        typedef cc::LazyList< rcu_shb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_RCU_SHB_less_stdAlloc;
+
+        typedef cc::LazyList< rcu_shb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_SHB_less_stdAlloc_seqcst;
+
+        typedef cc::LazyList< rcu_shb, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_SHB_less_michaelAlloc;
+
+        //
+        typedef cc::LazyList< rcu_sht, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        >   LazyList_RCU_SHT_cmp_stdAlloc;
+
+        typedef cc::LazyList< rcu_sht, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_SHT_cmp_stdAlloc_seqcst;
+
+        typedef cc::LazyList< rcu_sht, key_val,
+            typename cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_SHT_cmp_michaelAlloc;
+
+        typedef cc::LazyList< rcu_sht, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        >   LazyList_RCU_SHT_less_stdAlloc;
+
+        typedef cc::LazyList< rcu_sht, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        >   LazyList_RCU_SHT_less_stdAlloc_seqcst;
+
+        typedef cc::LazyList< rcu_sht, key_val,
+            typename cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   LazyList_RCU_SHT_less_michaelAlloc;
+
+#endif
+
+        // ***************************************************************************
+        // MichaelHashSet based on LazyList
+
+        typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_HP_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_HP_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_HP_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_HP_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_HP_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_HP_less_michaelAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, LazyList_HRC_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_HRC_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, LazyList_HRC_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_HRC_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, LazyList_HRC_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_HRC_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, LazyList_HRC_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_HRC_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, LazyList_HRC_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_HRC_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::HRC, LazyList_HRC_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_HRC_less_michaelAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, LazyList_PTB_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_PTB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, LazyList_PTB_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_PTB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, LazyList_PTB_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_PTB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, LazyList_PTB_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_PTB_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, LazyList_PTB_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_PTB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< cds::gc::PTB, LazyList_PTB_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_PTB_less_michaelAlloc;
+
+        // RCU
+        typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPI_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPI_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPI_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPI_less_michaelAlloc;
+
+
+        typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPB_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPB_less_michaelAlloc;
+
+
+        typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPT_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPT_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_RCU_GPT_less_michaelAlloc;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHB_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHB_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHB_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHB_less_michaelAlloc;
+
+
+        typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_cmp_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHT_cmp_michaelAlloc;
+
+        typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_stdAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHT_less_stdAlloc;
+
+        typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_stdAlloc_seqcst,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHT_less_stdAlloc_seqcst;
+
+        typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_michaelAlloc,
+            typename cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        >   MichaelSet_Lazy_RCU_SHT_less_michaelAlloc;
+#endif
+
+        // ***************************************************************************
+        // SplitListSet based on MichaelList
+
+        // HP
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HP_dyn_cmp;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HP_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HP_st_cmp;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HP_st_cmp_seqcst;
+
+        //HP + less
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HP_dyn_less;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HP_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HP_st_less;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HP_st_less_seqcst;
+
+        // HRC
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_dyn_cmp;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_st_cmp;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_st_cmp_seqcst;
+
+        // HRC + less
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_dyn_less;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_st_less;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_HRC_st_less_seqcst;
+
+        // PTB
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_dyn_cmp;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_st_cmp;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_st_cmp_seqcst;
+
+        // PTB + less
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_dyn_less;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_st_less;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_PTB_st_less_seqcst;
+
+        // RCU
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_dyn_cmp;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_st_cmp;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_st_cmp_seqcst;
+
+        // RCU_GPI + less
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_dyn_less;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_st_less;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPI_st_less_seqcst;
+
+
+        //
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_dyn_cmp;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_st_cmp;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_st_cmp_seqcst;
+
+        // RCU_GPB + less
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_dyn_less;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_st_less;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPB_st_less_seqcst;
+
+        //
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_dyn_cmp;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_st_cmp;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_st_cmp_seqcst;
+
+        // RCU_GPT + less
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_dyn_less;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_st_less;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_GPT_st_less_seqcst;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_dyn_cmp;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_st_cmp;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_st_cmp_seqcst;
+
+        // RCU_SHB + less
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_dyn_less;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_st_less;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHB_st_less_seqcst;
+
+        //
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_dyn_cmp;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_st_cmp;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_st_cmp_seqcst;
+
+        // RCU_SHT + less
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_dyn_less;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_st_less;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Michael_RCU_SHT_st_less_seqcst;
+#endif
+
+        // ***************************************************************************
+        // SplitListSet based on LazyList
+
+        // HP
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_dyn_cmp;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_st_cmp;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_st_cmp_seqcst;
+
+
+        // HP + less
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_dyn_less;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_st_less;
+
+        typedef cc::SplitListSet< cds::gc::HP, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HP_st_less_seqcst;
+
+        // HRC
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_dyn_cmp;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_st_cmp;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_st_cmp_seqcst;
+
+        // HRC + less
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_dyn_less;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_st_less;
+
+        typedef cc::SplitListSet< cds::gc::HRC, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_HRC_st_less_seqcst;
+
+
+        // PTB
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_dyn_cmp;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_st_cmp;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_st_cmp_seqcst;
+
+        // PTB + less
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_dyn_less;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_st_less;
+
+        typedef cc::SplitListSet< cds::gc::PTB, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_PTB_st_less_seqcst;
+
+
+        // RCU
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_dyn_cmp;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_st_cmp;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
+
+        // RCU_GPI + less
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_dyn_less;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_st_less;
+
+        typedef cc::SplitListSet< rcu_gpi, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPI_st_less_seqcst;
+
+        //
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_dyn_cmp;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_st_cmp;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
+
+        // RCU_GPB + less
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_dyn_less;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_st_less;
+
+        typedef cc::SplitListSet< rcu_gpb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPB_st_less_seqcst;
+
+        //
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_dyn_cmp;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_st_cmp;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
+
+        // RCU_GPT + less
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_dyn_less;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_st_less;
+
+        typedef cc::SplitListSet< rcu_gpt, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_GPT_st_less_seqcst;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_dyn_cmp;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_st_cmp;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
+
+        // RCU_SHB + less
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_dyn_less;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_st_less;
+
+        typedef cc::SplitListSet< rcu_shb, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHB_st_less_seqcst;
+
+        //
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_dyn_cmp;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_st_cmp;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
+
+        // RCU_SHT + less
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_dyn_less;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_st_less;
+
+        typedef cc::SplitListSet< rcu_sht, key_val,
+            typename cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        > SplitList_Lazy_RCU_SHT_st_less_seqcst;
+
+#endif
+        // ***************************************************************************
+        // StripedSet
+
+        // for sequential containers
+        template <class BucketEntry, CDS_DECL_OPTIONS7>
+        class StripedHashSet_seq:
+            public cc::StripedSet< BucketEntry,
+                co::mutex_policy< cc::striped_set::striping<> >
+                ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                , CDS_OPTIONS7
+            >
+        {
+            typedef cc::StripedSet< BucketEntry,
+                co::mutex_policy< cc::striped_set::striping<> >
+                ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                , CDS_OPTIONS7
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            StripedHashSet_seq( size_t nCapacity, size_t nLoadFactor )
+                : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
+            {}
+
+            template <typename Q, typename Less>
+            bool erase_with( Q const& v, Less pred )
+            {
+                return base_class::erase( v );
+            }
+        };
+
+        // for non-sequential ordered containers
+        template <class BucketEntry, CDS_DECL_OPTIONS7>
+        class StripedHashSet_ord:
+            public cc::StripedSet< BucketEntry,
+                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::striping<> >
+                , CDS_OPTIONS7
+            >
+        {
+            typedef cc::StripedSet< BucketEntry,
+               co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::striping<> >
+                , CDS_OPTIONS7
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            StripedHashSet_ord( size_t nCapacity, size_t nLoadFactor )
+                : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
+            {}
+
+            template <typename Q, typename Less>
+            bool erase_with( Q const& v, Less pred )
+            {
+                return base_class::erase( v );
+            }
+        };
+
+        typedef StripedHashSet_seq<
+            std::list< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_list;
+
+        typedef StripedHashSet_seq<
+            std::vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_vector;
+
+#if BOOST_VERSION >= 104800
+        typedef StripedHashSet_seq<
+            boost::container::slist< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_boost_slist;
+
+        typedef StripedHashSet_seq<
+            boost::container::list< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_boost_list;
+
+        typedef StripedHashSet_seq<
+            boost::container::vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_boost_vector;
+
+        typedef StripedHashSet_seq<
+            boost::container::stable_vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_boost_stable_vector;
+#endif
+
+        typedef StripedHashSet_ord<
+            std::set< key_val, less >
+            , co::hash< hash2 >
+        > StripedSet_set;
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600
+        typedef StripedHashSet_ord<
+            stdext::hash_set< key_val, hash_less >
+            , co::hash< hash2 >
+        > StripedSet_hashset;
+#else
+        typedef StripedHashSet_ord<
+            std::unordered_set< key_val, hash, equal_to >
+            , co::hash< hash2 >
+        > StripedSet_hashset;
+#endif
+
+#if BOOST_VERSION >= 104800
+        typedef StripedHashSet_ord<
+            boost::container::set< key_val, less >
+            , co::hash< hash2 >
+        > StripedSet_boost_set;
+
+        typedef StripedHashSet_ord<
+            boost::container::flat_set< key_val, less >
+            , co::hash< hash2 >
+        > StripedSet_boost_flat_set;
+#endif
+
+        typedef StripedHashSet_ord<
+            boost::unordered_set< key_val, hash, equal_to >
+            , co::hash< hash2 >
+        > StripedSet_boost_unordered_set;
+
+
+
+        // ***************************************************************************
+        // RefinableSet
+
+        // for sequential containers
+        template <class BucketEntry, CDS_DECL_OPTIONS7>
+        class RefinableHashSet_seq:
+            public cc::StripedSet< BucketEntry,
+            co::mutex_policy< cc::striped_set::refinable<> >
+            ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+            , CDS_OPTIONS7
+            >
+        {
+            typedef cc::StripedSet< BucketEntry,
+                co::mutex_policy< cc::striped_set::refinable<> >
+                ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                , CDS_OPTIONS7
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            RefinableHashSet_seq( size_t nCapacity, size_t nLoadFactor )
+                : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
+            {}
+
+            template <typename Q, typename Less>
+            bool erase_with( Q const& v, Less pred )
+            {
+                return base_class::erase( v );
+            }
+        };
+
+        // for non-sequential ordered containers
+        template <class BucketEntry, CDS_DECL_OPTIONS7>
+        class RefinableHashSet_ord:
+            public cc::StripedSet< BucketEntry,
+                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , CDS_OPTIONS7
+            >
+        {
+            typedef cc::StripedSet< BucketEntry,
+                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , CDS_OPTIONS7
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            RefinableHashSet_ord( size_t nCapacity, size_t nLoadFactor )
+                : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
+            {}
+
+            template <typename Q, typename Less>
+            bool erase_with( Q const& v, Less pred )
+            {
+                return base_class::erase( v );
+            }
+        };
+
+        typedef RefinableHashSet_seq<
+            std::list< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_list;
+
+        typedef RefinableHashSet_seq<
+            std::vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_vector;
+
+#if BOOST_VERSION >= 104800
+        typedef RefinableHashSet_seq<
+            boost::container::slist< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_boost_slist;
+
+        typedef RefinableHashSet_seq<
+            boost::container::list< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_boost_list;
+
+        typedef RefinableHashSet_seq<
+            boost::container::vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_boost_vector;
+
+        typedef RefinableHashSet_seq<
+            boost::container::stable_vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_boost_stable_vector;
+#endif
+
+        typedef RefinableHashSet_ord<
+            std::set< key_val, less >
+            , co::hash< hash2 >
+        > RefinableSet_set;
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER < 1600
+        typedef RefinableHashSet_ord<
+            stdext::hash_set< key_val, hash_less >
+            , co::hash< hash2 >
+        > RefinableSet_hashset;
+#else
+        typedef RefinableHashSet_ord<
+            std::unordered_set< key_val, hash, equal_to >
+            , co::hash< hash2 >
+        > RefinableSet_hashset;
+#endif
+
+#if BOOST_VERSION >= 104800
+        typedef RefinableHashSet_ord<
+            boost::container::set< key_val, less >
+            , co::hash< hash2 >
+        > RefinableSet_boost_set;
+
+        typedef RefinableHashSet_ord<
+            boost::container::flat_set< key_val, less >
+            , co::hash< hash2 >
+        > RefinableSet_boost_flat_set;
+#endif
+
+        typedef RefinableHashSet_ord<
+            boost::unordered_set< key_val, hash, equal_to >
+            , co::hash< hash2 >
+        > RefinableSet_boost_unordered_set;
+
+
+
+        // ***************************************************************************
+        // CuckooSet
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooStripedSet_list_unord;
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooStripedSet_list_unord_stat;
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooStripedSet_list_unord_storehash;
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooStripedSet_list_ord;
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooStripedSet_list_ord_stat;
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooStripedSet_list_ord_storehash;
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooStripedSet_vector_unord;
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooStripedSet_vector_unord_stat;
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooStripedSet_vector_unord_storehash;
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooStripedSet_vector_ord;
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooStripedSet_vector_ord_stat;
+
+        typedef CuckooStripedSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooStripedSet_vector_ord_storehash;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooRefinableSet_list_unord;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooRefinableSet_list_unord_stat;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooRefinableSet_list_unord_storehash;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooRefinableSet_list_ord;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooRefinableSet_list_ord_stat;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::list >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooRefinableSet_list_ord_storehash;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooRefinableSet_vector_unord;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooRefinableSet_vector_unord_stat;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::equal_to< equal_to >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooRefinableSet_vector_unord_storehash;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+        > CuckooRefinableSet_vector_ord;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,co::stat< cc::cuckoo::stat >
+        > CuckooRefinableSet_vector_ord_stat;
+
+        typedef CuckooRefinableSet< key_val,
+            cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+            ,co::compare< compare >
+            ,co::hash< std::tuple< hash, hash2 > >
+            ,cc::cuckoo::store_hash< true >
+        > CuckooRefinableSet_vector_ord_storehash;
+
+
+        // ***************************************************************************
+        // SkipListSet - HP
+
+        class traits_SkipListSet_hp_less_pascal: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_less_pascal > SkipListSet_hp_less_pascal;
+
+        class traits_SkipListSet_hp_less_pascal_seqcst: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_less_pascal_seqcst > SkipListSet_hp_less_pascal_seqcst;
+
+        class traits_SkipListSet_hp_less_pascal_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_less_pascal_stat > SkipListSet_hp_less_pascal_stat;
+
+        class traits_SkipListSet_hp_cmp_pascal: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_cmp_pascal > SkipListSet_hp_cmp_pascal;
+
+        class traits_SkipListSet_hp_cmp_pascal_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_cmp_pascal_stat > SkipListSet_hp_cmp_pascal_stat;
+
+        class traits_SkipListSet_hp_less_xorshift: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_less_xorshift > SkipListSet_hp_less_xorshift;
+
+        class traits_SkipListSet_hp_less_xorshift_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_less_xorshift_stat > SkipListSet_hp_less_xorshift_stat;
+
+        class traits_SkipListSet_hp_cmp_xorshift: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_cmp_xorshift > SkipListSet_hp_cmp_xorshift;
+
+        class traits_SkipListSet_hp_cmp_xorshift_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_cmp_xorshift_stat > SkipListSet_hp_cmp_xorshift_stat;
+
+        // ***************************************************************************
+        // SkipListSet - HRC
+
+        typedef cc::SkipListSet< cds::gc::HRC, key_val,
+            typename cc::skip_list::make_traits <
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            >::type
+        > SkipListSet_hrc_less_pascal;
+
+        typedef cc::SkipListSet< cds::gc::HRC, key_val,
+            typename cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > SkipListSet_hrc_less_pascal_seqcst;
+
+        typedef cc::SkipListSet< cds::gc::HRC, key_val,
+            typename cc::skip_list::make_traits <
+                co::less< less >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > SkipListSet_hrc_less_pascal_stat;
+
+        typedef cc::SkipListSet< cds::gc::HRC, key_val,
+            typename cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > SkipListSet_hrc_cmp_pascal;
+
+        typedef cc::SkipListSet< cds::gc::HRC, key_val,
+            typename cc::skip_list::make_traits <
+                co::compare< compare >
+                ,co::item_counter< cds::atomicity::item_counter >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+            >::type
+        > SkipListSet_hrc_cmp_pascal_stat;
+
+        typedef cc::SkipListSet< cds::gc::HRC, key_val,
+            typename cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > SkipListSet_hrc_less_xorshift;
+
+        typedef cc::SkipListSet< cds::gc::HRC, key_val,
+            typename cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > SkipListSet_hrc_less_xorshift_stat;
+
+        typedef cc::SkipListSet< cds::gc::HRC, key_val,
+            typename cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > SkipListSet_hrc_cmp_xorshift;
+
+        typedef cc::SkipListSet< cds::gc::HRC, key_val,
+            typename cc::skip_list::make_traits <
+                co::compare< compare >
+                ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        > SkipListSet_hrc_cmp_xorshift_stat;
+
+        // ***************************************************************************
+        // SkipListSet - PTB
+
+        class traits_SkipListSet_ptb_less_pascal: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::PTB, key_val, traits_SkipListSet_ptb_less_pascal > SkipListSet_ptb_less_pascal;
+
+        class traits_SkipListSet_ptb_less_pascal_seqcst: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::memory_model< co::v::sequential_consistent >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::PTB, key_val, traits_SkipListSet_ptb_less_pascal_seqcst > SkipListSet_ptb_less_pascal_seqcst;
+
+        class traits_SkipListSet_ptb_less_pascal_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::PTB, key_val, traits_SkipListSet_ptb_less_pascal_stat > SkipListSet_ptb_less_pascal_stat;
+
+        class traits_SkipListSet_ptb_cmp_pascal: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::PTB, key_val, traits_SkipListSet_ptb_cmp_pascal > SkipListSet_ptb_cmp_pascal;
+
+        class traits_SkipListSet_ptb_cmp_pascal_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::PTB, key_val, traits_SkipListSet_ptb_cmp_pascal_stat > SkipListSet_ptb_cmp_pascal_stat;
+
+        class traits_SkipListSet_ptb_less_xorshift: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::PTB, key_val, traits_SkipListSet_ptb_less_xorshift > SkipListSet_ptb_less_xorshift;
+
+        class traits_SkipListSet_ptb_less_xorshift_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::PTB, key_val, traits_SkipListSet_ptb_less_xorshift_stat > SkipListSet_ptb_less_xorshift_stat;
+
+        class traits_SkipListSet_ptb_cmp_xorshift: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::PTB, key_val, traits_SkipListSet_ptb_cmp_xorshift> SkipListSet_ptb_cmp_xorshift;
+
+        class traits_SkipListSet_ptb_cmp_xorshift_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::PTB, key_val, traits_SkipListSet_ptb_cmp_xorshift_stat > SkipListSet_ptb_cmp_xorshift_stat;
+
+
+        // ***************************************************************************
+        // SkipListSet - RCU general_instant
+
+        class traits_SkipListSet_rcu_gpi_less_pascal: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_less_pascal > SkipListSet_rcu_gpi_less_pascal;
+
+        class traits_SkipListSet_rcu_gpi_less_pascal_seqcst: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::memory_model< co::v::sequential_consistent >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_less_pascal_seqcst > SkipListSet_rcu_gpi_less_pascal_seqcst;
+
+        class traits_SkipListSet_rcu_gpi_less_pascal_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_less_pascal_stat > SkipListSet_rcu_gpi_less_pascal_stat;
+
+        class traits_SkipListSet_rcu_gpi_cmp_pascal: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_cmp_pascal > SkipListSet_rcu_gpi_cmp_pascal;
+
+        class traits_SkipListSet_rcu_gpi_cmp_pascal_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_cmp_pascal_stat > SkipListSet_rcu_gpi_cmp_pascal_stat;
+
+        class traits_SkipListSet_rcu_gpi_less_xorshift: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_less_xorshift > SkipListSet_rcu_gpi_less_xorshift;
+
+        class traits_SkipListSet_rcu_gpi_less_xorshift_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_less_xorshift_stat > SkipListSet_rcu_gpi_less_xorshift_stat;
+
+        class traits_SkipListSet_rcu_gpi_cmp_xorshift: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_cmp_xorshift > SkipListSet_rcu_gpi_cmp_xorshift;
+
+        class traits_SkipListSet_rcu_gpi_cmp_xorshift_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_cmp_xorshift_stat > SkipListSet_rcu_gpi_cmp_xorshift_stat;
+
+
+        // ***************************************************************************
+        // SkipListSet - RCU general_buffered
+
+        class traits_SkipListSet_rcu_gpb_less_pascal: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_less_pascal > SkipListSet_rcu_gpb_less_pascal;
+
+        class traits_SkipListSet_rcu_gpb_less_pascal_seqcst: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::memory_model< co::v::sequential_consistent >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_less_pascal_seqcst > SkipListSet_rcu_gpb_less_pascal_seqcst;
+
+        class traits_SkipListSet_rcu_gpb_less_pascal_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_less_pascal_stat > SkipListSet_rcu_gpb_less_pascal_stat;
+
+        class traits_SkipListSet_rcu_gpb_cmp_pascal: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_cmp_pascal > SkipListSet_rcu_gpb_cmp_pascal;
+
+        class traits_SkipListSet_rcu_gpb_cmp_pascal_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_cmp_pascal_stat > SkipListSet_rcu_gpb_cmp_pascal_stat;
+
+        class traits_SkipListSet_rcu_gpb_less_xorshift: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_less_xorshift > SkipListSet_rcu_gpb_less_xorshift;
+
+        class traits_SkipListSet_rcu_gpb_less_xorshift_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_less_xorshift_stat > SkipListSet_rcu_gpb_less_xorshift_stat;
+
+        class traits_SkipListSet_rcu_gpb_cmp_xorshift: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_cmp_xorshift > SkipListSet_rcu_gpb_cmp_xorshift;
+
+        class traits_SkipListSet_rcu_gpb_cmp_xorshift_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_cmp_xorshift_stat > SkipListSet_rcu_gpb_cmp_xorshift_stat;
+
+        // ***************************************************************************
+        // SkipListSet - RCU general_threaded
+
+        class traits_SkipListSet_rcu_gpt_less_pascal: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_less_pascal > SkipListSet_rcu_gpt_less_pascal;
+
+        class traits_SkipListSet_rcu_gpt_less_pascal_seqcst: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::memory_model< co::v::sequential_consistent >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_less_pascal_seqcst > SkipListSet_rcu_gpt_less_pascal_seqcst;
+
+        class traits_SkipListSet_rcu_gpt_less_pascal_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_less_pascal_stat > SkipListSet_rcu_gpt_less_pascal_stat;
+
+        class traits_SkipListSet_rcu_gpt_cmp_pascal: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_cmp_pascal > SkipListSet_rcu_gpt_cmp_pascal;
+
+        class traits_SkipListSet_rcu_gpt_cmp_pascal_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_cmp_pascal_stat > SkipListSet_rcu_gpt_cmp_pascal_stat;
+
+        class traits_SkipListSet_rcu_gpt_less_xorshift: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_less_xorshift > SkipListSet_rcu_gpt_less_xorshift;
+
+        class traits_SkipListSet_rcu_gpt_less_xorshift_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_less_xorshift_stat > SkipListSet_rcu_gpt_less_xorshift_stat;
+
+        class traits_SkipListSet_rcu_gpt_cmp_xorshift: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_cmp_xorshift > SkipListSet_rcu_gpt_cmp_xorshift;
+
+        class traits_SkipListSet_rcu_gpt_cmp_xorshift_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_cmp_xorshift_stat > SkipListSet_rcu_gpt_cmp_xorshift_stat;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        // ***************************************************************************
+        // SkipListSet - RCU signal_buffered
+
+        class traits_SkipListSet_rcu_shb_less_pascal: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_less_pascal > SkipListSet_rcu_shb_less_pascal;
+
+        class traits_SkipListSet_rcu_shb_less_pascal_seqcst: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::memory_model< co::v::sequential_consistent >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_less_pascal_seqcst > SkipListSet_rcu_shb_less_pascal_seqcst;
+
+        class traits_SkipListSet_rcu_shb_less_pascal_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_less_pascal_stat > SkipListSet_rcu_shb_less_pascal_stat;
+
+        class traits_SkipListSet_rcu_shb_cmp_pascal: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_cmp_pascal > SkipListSet_rcu_shb_cmp_pascal;
+
+        class traits_SkipListSet_rcu_shb_cmp_pascal_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_cmp_pascal_stat > SkipListSet_rcu_shb_cmp_pascal_stat;
+
+        class traits_SkipListSet_rcu_shb_less_xorshift: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_less_xorshift > SkipListSet_rcu_shb_less_xorshift;
+
+        class traits_SkipListSet_rcu_shb_less_xorshift_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_less_xorshift_stat > SkipListSet_rcu_shb_less_xorshift_stat;
+
+        class traits_SkipListSet_rcu_shb_cmp_xorshift: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_cmp_xorshift > SkipListSet_rcu_shb_cmp_xorshift;
+
+        class traits_SkipListSet_rcu_shb_cmp_xorshift_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_cmp_xorshift_stat > SkipListSet_rcu_shb_cmp_xorshift_stat;
+
+        // ***************************************************************************
+        // SkipListSet - RCU signal_threaded
+
+        class traits_SkipListSet_rcu_sht_less_pascal: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_less_pascal > SkipListSet_rcu_sht_less_pascal;
+
+        class traits_SkipListSet_rcu_sht_less_pascal_seqcst: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::memory_model< co::v::sequential_consistent >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_less_pascal_seqcst > SkipListSet_rcu_sht_less_pascal_seqcst;
+
+        class traits_SkipListSet_rcu_sht_less_pascal_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_less_pascal_stat > SkipListSet_rcu_sht_less_pascal_stat;
+
+        class traits_SkipListSet_rcu_sht_cmp_pascal: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_cmp_pascal > SkipListSet_rcu_sht_cmp_pascal;
+
+        class traits_SkipListSet_rcu_sht_cmp_pascal_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_cmp_pascal_stat > SkipListSet_rcu_sht_cmp_pascal_stat;
+
+        class traits_SkipListSet_rcu_sht_less_xorshift: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_less_xorshift > SkipListSet_rcu_sht_less_xorshift;
+
+        class traits_SkipListSet_rcu_sht_less_xorshift_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_less_xorshift_stat > SkipListSet_rcu_sht_less_xorshift_stat;
+
+        class traits_SkipListSet_rcu_sht_cmp_xorshift: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,co::item_counter< cds::atomicity::item_counter >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_cmp_xorshift > SkipListSet_rcu_sht_cmp_xorshift;
+
+        class traits_SkipListSet_rcu_sht_cmp_xorshift_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_cmp_xorshift_stat > SkipListSet_rcu_sht_cmp_xorshift_stat;
+#endif
+
+        // ***************************************************************************
+        // EllenBinTreeSet
+        struct ellen_bintree_props {
+            struct key_extractor {
+                void operator()( key_type& dest, key_val const& src ) const
+                {
+                    dest = src.key;
+                }
+            };
+
+            struct less {
+                bool operator()( key_val const& v1, key_val const& v2 ) const
+                {
+                    return key_less()( v1.key, v2.key );
+                }
+                bool operator()( key_type const& k, key_val const& v ) const
+                {
+                    return key_less()( k, v.key );
+                }
+                bool operator()( key_val const& v, key_type const& k ) const
+                {
+                    return key_less()( v.key, k );
+                }
+                bool operator()( key_type const& k1, key_type const& k2 ) const
+                {
+                    return key_less()( k1, k2 );
+                }
+            };
+
+            struct hp_gc {
+                typedef cc::ellen_bintree::node<cds::gc::HP, key_val>               leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+
+            struct ptb_gc {
+                typedef cc::ellen_bintree::node<cds::gc::PTB, key_val>              leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+
+            struct gpi {
+                typedef cc::ellen_bintree::node<rcu_gpi, key_val>                   leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+            struct gpb {
+                typedef cc::ellen_bintree::node<rcu_gpb, key_val>                   leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+            struct gpt {
+                typedef cc::ellen_bintree::node<rcu_gpt, key_val>                   leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+            struct shb {
+                typedef cc::ellen_bintree::node<rcu_shb, key_val>                   leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+            struct sht {
+                typedef cc::ellen_bintree::node<rcu_sht, key_val>                   leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+#endif
+        };
+
+
+        // ***************************************************************************
+        // EllenBinTreeSet - HP
+
+        class traits_EllenBinTreeSet_hp: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_hp > EllenBinTreeSet_hp;
+
+        class traits_EllenBinTreeSet_hp_stat: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+            ,co::stat< cc::ellen_bintree::stat<> >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_hp_stat > EllenBinTreeSet_hp_stat;
+
+        // ***************************************************************************
+        // EllenBinTreeSet - PTB
+
+        class traits_EllenBinTreeSet_ptb: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::ptb_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< cds::gc::PTB, key_type, key_val, traits_EllenBinTreeSet_ptb > EllenBinTreeSet_ptb;
+
+        class traits_EllenBinTreeSet_ptb_stat: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::ptb_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+            ,co::stat< cc::ellen_bintree::stat<> >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< cds::gc::PTB, key_type, key_val, traits_EllenBinTreeSet_ptb_stat > EllenBinTreeSet_ptb_stat;
+
+
+        // ***************************************************************************
+        // EllenBinTreeSet - RCU
+
+        class traits_EllenBinTreeSet_rcu_gpi: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::bounded_update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_rcu_gpi > EllenBinTreeSet_rcu_gpi;
+
+        class traits_EllenBinTreeSet_rcu_gpi_stat: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::bounded_update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+            ,co::stat< cc::ellen_bintree::stat<> >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_rcu_gpi_stat > EllenBinTreeSet_rcu_gpi_stat;
+
+        class traits_EllenBinTreeSet_rcu_gpb: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_rcu_gpb > EllenBinTreeSet_rcu_gpb;
+
+        class traits_EllenBinTreeSet_rcu_gpb_stat: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+            ,co::stat< cc::ellen_bintree::stat<> >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_rcu_gpb_stat > EllenBinTreeSet_rcu_gpb_stat;
+
+        class traits_EllenBinTreeSet_rcu_gpt: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_rcu_gpt > EllenBinTreeSet_rcu_gpt;
+
+        class traits_EllenBinTreeSet_rcu_gpt_stat: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+            ,co::stat< cc::ellen_bintree::stat<> >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_rcu_gpt_stat > EllenBinTreeSet_rcu_gpt_stat;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        class traits_EllenBinTreeSet_rcu_shb: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_rcu_shb > EllenBinTreeSet_rcu_shb;
+
+        class traits_EllenBinTreeSet_rcu_shb_stat: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+            ,co::stat< cc::ellen_bintree::stat<> >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_rcu_shb_stat > EllenBinTreeSet_rcu_shb_stat;
+
+        class traits_EllenBinTreeSet_rcu_sht: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_rcu_sht > EllenBinTreeSet_rcu_sht;
+
+        class traits_EllenBinTreeSet_rcu_sht_stat: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,cc::ellen_bintree::update_desc_allocator<
+                cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
+            >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+            ,co::stat< cc::ellen_bintree::stat<> >
+        >::type
+        {};
+        typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_rcu_sht_stat > EllenBinTreeSet_rcu_sht_stat;
+
+#endif
+
+        // ***************************************************************************
+        // Standard implementations
+
+        typedef StdSet< key_val, less, cds::SpinLock >                  StdSet_Spin;
+        typedef StdSet< key_val, less, lock::NoLock>                    StdSet_NoLock;
+
+        typedef StdHashSet< key_val, hash, less, equal_to, cds::SpinLock >    StdHashSet_Spin;
+        typedef StdHashSet< key_val, hash, less, equal_to, lock::NoLock >     StdHashSet_NoLock;
+
+    };
+
+
+    // *************************************************
+    // print_stat
+    // *************************************************
+
+    template <typename Set>
+    static inline void print_stat( Set const& s )
+    {}
+
+    template <typename GC, typename T, typename Traits>
+    static inline void print_stat( cc::SkipListSet<GC, T, Traits> const& s )
+    {
+        CPPUNIT_MSG( s.statistics() );
+    }
+
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void print_stat( cc::EllenBinTreeSet<GC, Key, T, Traits> const& s )
+    {
+        CPPUNIT_MSG( s.statistics() );
+    }
+
+    template <typename T, typename Traits >
+    static inline void print_stat( cc::CuckooSet< T, Traits > const& s )
+    {
+        CPPUNIT_MSG( s.statistics() << s.mutex_policy_statistics() );
+    }
+
+    template <typename V, CDS_SPEC_OPTIONS10>
+    static inline void print_stat( CuckooStripedSet< V, CDS_OPTIONS10 > const& s )
+    {
+        typedef CuckooStripedSet< V, CDS_OPTIONS10 > set_type;
+        print_stat( static_cast<typename set_type::cuckoo_base_class const&>(s) );
+    }
+
+    template <typename V, CDS_SPEC_OPTIONS10>
+    static inline void print_stat( CuckooRefinableSet< V, CDS_OPTIONS10 > const& s )
+    {
+        typedef CuckooRefinableSet< V, CDS_OPTIONS10 > set_type;
+        print_stat( static_cast<typename set_type::cuckoo_base_class const&>(s) );
+    }
+
+
+
+    //*******************************************************
+    // additional_check
+    //*******************************************************
+
+    template <typename Set>
+    static inline void additional_check( Set& set )
+    {}
+
+    template <typename Set>
+    static inline void additional_cleanup( Set& set )
+    {}
+
+    namespace ellen_bintree_check {
+        static inline void check_stat( cds::intrusive::ellen_bintree::empty_stat const& s )
+        {
+            // Not true for threaded RCU
+            /*
+            CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get(),
+                "m_nAlloc=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
+                << ", m_nFree=" << ellen_bintree_pool::internal_node_counter::m_nFree.get()
+                );
+            */
+        }
+
+        static inline void check_stat( cds::intrusive::ellen_bintree::stat<> const& stat )
+        {
+            CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeCreated == stat.m_nInternalNodeDeleted );
+            CPPUNIT_CHECK_CURRENT( stat.m_nUpdateDescCreated == stat.m_nUpdateDescDeleted );
+            //CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
+            CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == stat.m_nInternalNodeCreated );
+            // true if RCU is not threaded
+            //CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeDeleted == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
+        }
+    }   // namespace ellen_bintree_check
+
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void additional_check( cc::EllenBinTreeSet<GC, Key, T, Traits>& s )
+    {
+        GC::force_dispose();
+        ellen_bintree_check::check_stat( s.statistics() );
+    }
+
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void additional_cleanup( cc::EllenBinTreeSet<GC, Key, T, Traits>& s )
+    {
+        ellen_bintree_pool::internal_node_counter::reset();
+    }
+
+}   // namespace set2
+
+#endif // ifndef _CDSUNIT_SET2_SET_TYPES_H
diff --git a/tests/unit/set2/std_hash_set.h b/tests/unit/set2/std_hash_set.h
new file mode 100644 (file)
index 0000000..49eabe9
--- /dev/null
@@ -0,0 +1,12 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_HASH_SET_H
+#define __CDSUNIT_STD_HASH_SET_H
+
+#if (CDS_COMPILER == CDS_COMPILER_MSVC || CDS_COMPILER == CDS_COMPILER_INTEL) && _MSC_VER == 1500
+#   include "set2/std_hash_set_vc9.h"
+#else
+#   include "set2/std_hash_set_std.h"
+#endif
+
+#endif // #ifndef __CDSUNIT_STD_HASH_SET_H
diff --git a/tests/unit/set2/std_hash_set_std.h b/tests/unit/set2/std_hash_set_std.h
new file mode 100644 (file)
index 0000000..0053c83
--- /dev/null
@@ -0,0 +1,102 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_HASH_SET_STD_H
+#define __CDSUNIT_STD_HASH_SET_STD_H
+
+#include <unordered_set>
+#include <cds/ref.h>
+
+namespace set2 {
+
+    template <typename Value, typename Hash, typename Less, typename EqualTo, typename Lock,
+        class Alloc = typename CDS_DEFAULT_ALLOCATOR::template rebind<Value>::other
+    >
+    class StdHashSet
+        : public std::unordered_set<
+            Value
+            , Hash
+            , EqualTo
+            , Alloc
+        >
+    {
+    public:
+        Lock m_lock;
+        typedef cds::lock::scoped_lock<Lock> AutoLock;
+        typedef std::unordered_set<
+            Value
+            , Hash
+            , EqualTo
+            , Alloc
+        >   base_class;
+    public:
+        typedef typename base_class::value_type value_type;
+
+        StdHashSet( size_t nSetSize, size_t nLoadFactor )
+        {}
+
+        template <typename Key>
+        bool find( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::find( value_type(key) ) != base_class::end();
+        }
+
+        template <typename Key>
+        bool insert( Key const& key )
+        {
+            AutoLock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            return pRet.second;
+        }
+
+        template <typename Key, typename Func>
+        bool insert( Key const& key, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            if ( pRet.second ) {
+                cds::unref(func)( *pRet.first );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename T, typename Func>
+        std::pair<bool, bool> ensure( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            if ( pRet.second ) {
+                cds::unref(func)( true, *pRet.first, key );
+                return std::make_pair( true, true );
+            }
+            else {
+                cds::unref(func)( false, *pRet.first, key );
+                return std::make_pair( true, false );
+            }
+        }
+
+        template <typename Key>
+        bool erase( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::erase( value_type(key) ) != 0;
+        }
+
+        template <typename T, typename Func>
+        bool erase( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            typename base_class::iterator it = base_class::find( value_type(key) );
+            if ( it != base_class::end() ) {
+                cds::unref(func)( *it );
+                return base_class::erase( it ) != base_class::end();
+            }
+            return false;
+        }
+
+        std::ostream& dump( std::ostream& stm ) { return stm; }
+    };
+}   // namespace set2
+
+#endif  // #ifndef __CDSUNIT_STD_HASH_SET_STD_H
diff --git a/tests/unit/set2/std_hash_set_vc9.h b/tests/unit/set2/std_hash_set_vc9.h
new file mode 100644 (file)
index 0000000..91dfa18
--- /dev/null
@@ -0,0 +1,106 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_HASH_SET_VC_H
+#define __CDSUNIT_STD_HASH_SET_VC_H
+
+#include <hash_set>
+//#include <cds/ref.h>
+
+namespace set2 {
+
+    template <typename KeyVal, typename Hash, typename Less>
+    struct hash_less: public stdext::hash_compare< KeyVal, Less >
+    {
+        typedef stdext::hash_compare< KeyVal, Less> base_class;
+        size_t operator()(const KeyVal& kv) const
+        {
+            return Hash()(kv);
+        }
+
+        bool operator()(const KeyVal& kv1, const KeyVal& kv2) const
+        {
+            return base_class::operator()( kv1, kv2 );
+        }
+    };
+
+    template <typename Value, typename Hash, typename Less, typename EqualTo, typename Lock, class Alloc = CDS_DEFAULT_ALLOCATOR>
+    class StdHashSet: public stdext::hash_set<Value, hash_less<Value, Hash, Less >, Alloc>
+    {
+    public:
+        Lock m_lock;
+        typedef cds::lock::scoped_lock<Lock> AutoLock;
+        typedef stdext::hash_set<Value, hash_less<Value, Hash, Less >, Alloc> base_class;
+
+    public:
+        typedef typename base_class::value_type  pair_type;
+
+        StdHashSet( size_t nSetSize, size_t nLoadFactor )
+        {}
+
+        template <typename Key>
+        bool find( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::find( value_type(key) ) != base_class::end();
+        }
+
+        template <typename Key>
+        bool insert( Key const& key )
+        {
+            AutoLock al( m_lock );
+            std::pair<base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            return pRet.second;
+        }
+
+        template <typename Key, typename Func>
+        bool insert( Key const& key, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            if ( pRet.second ) {
+                cds::unref(func)( *pRet.first );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename T, typename Func>
+        std::pair<bool, bool> ensure( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            if ( pRet.second ) {
+                cds::unref(func)( true, *pRet.first, key );
+                return std::make_pair( true, true );
+            }
+            else {
+                cds::unref(func)( false, *pRet.first, key );
+                return std::make_pair( true, false );
+            }
+        }
+
+        template <typename Key>
+        bool erase( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::erase( value_type(key) ) != 0;
+        }
+
+        template <typename T, typename Func>
+        bool erase( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            base_class::iterator it = base_class::find( key );
+            if ( it != base_class::end() ) {
+                cds::unref(func)( *it );
+                return base_class::erase( it ) != base_class::end();
+            }
+            return false;
+        }
+
+
+        std::ostream& dump( std::ostream& stm ) { return stm; }
+    };
+}   // namespace set2
+
+#endif  // #ifndef __CDSUNIT_STD_HASH_SET_VC_H
diff --git a/tests/unit/set2/std_set.h b/tests/unit/set2/std_set.h
new file mode 100644 (file)
index 0000000..7ca8660
--- /dev/null
@@ -0,0 +1,90 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STD_SET_VC_H
+#define __CDSUNIT_STD_SET_VC_H
+
+#include <set>
+#include <cds/ref.h>
+
+namespace set2 {
+    template <typename Value, typename Less, typename Lock,
+        class Alloc = typename CDS_DEFAULT_ALLOCATOR::template rebind<Value>::other
+    >
+    class StdSet: public std::set<Value, Less, Alloc>
+    {
+        Lock m_lock;
+        typedef cds::lock::scoped_lock<Lock> AutoLock;
+        typedef std::set<Value, Less, Alloc> base_class;
+    public:
+        typedef typename base_class::key_type value_type;
+
+        StdSet( size_t nMapSize, size_t nLoadFactor )
+        {}
+
+        template <typename Key>
+        bool find( const Key& key )
+        {
+            value_type v( key );
+            AutoLock al( m_lock );
+            return base_class::find( v ) != base_class::end();
+        }
+
+        bool insert( value_type const& v )
+        {
+            AutoLock al( m_lock );
+            return base_class::insert( v ).second;
+        }
+
+        template <typename Key, typename Func>
+        bool insert( Key const& key, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            if ( pRet.second ) {
+                cds::unref(func)( *pRet.first );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename T, typename Func>
+        std::pair<bool, bool> ensure( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            if ( pRet.second ) {
+                cds::unref(func)( true, *pRet.first, key );
+                return std::make_pair( true, true );
+            }
+            else {
+                cds::unref(func)( false, *pRet.first, key );
+                return std::make_pair( true, false );
+            }
+        }
+
+        template <typename Key>
+        bool erase( const Key& key )
+        {
+            AutoLock al( m_lock );
+            return base_class::erase( value_type(key) ) != 0;
+        }
+
+        template <typename T, typename Func>
+        bool erase( const T& key, Func func )
+        {
+            AutoLock al( m_lock );
+            typename base_class::iterator it = base_class::find( value_type(key) );
+            if ( it != base_class::end() ) {
+                cds::unref(func)( *it );
+
+                base_class::erase( it );
+                return true;
+            }
+            return false;
+        }
+
+        std::ostream& dump( std::ostream& stm ) { return stm; }
+    };
+} // namespace set2
+
+#endif  // #ifndef __CDSUNIT_STD_MAP_VC_H
diff --git a/tests/unit/stack/intrusive_stack_defs.h b/tests/unit/stack/intrusive_stack_defs.h
new file mode 100644 (file)
index 0000000..21a5f7f
--- /dev/null
@@ -0,0 +1,215 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_INTRUSIVE_STACK_DEFS_H
+#define __CDSUNIT_INTRUSIVE_STACK_DEFS_H
+
+#define CDSUNIT_DECLARE_TreiberStack \
+    TEST_CASE( Treiber_HP, cds::intrusive::single_link::node< cds::gc::HP >        ) \
+    TEST_CASE( Treiber_HP_seqcst, cds::intrusive::single_link::node< cds::gc::HP > ) \
+    /*TEST_CASE( Treiber_HP_yield, cds::intrusive::single_link::node< cds::gc::HP >  )*/ \
+    TEST_CASE( Treiber_HP_pause, cds::intrusive::single_link::node< cds::gc::HP >  ) \
+    TEST_CASE( Treiber_HP_exp, cds::intrusive::single_link::node< cds::gc::HP >    ) \
+    TEST_CASE( Treiber_HP_stat, cds::intrusive::single_link::node< cds::gc::HP >   ) \
+    TEST_CASE( Treiber_HRC, cds::intrusive::single_link::node< cds::gc::HRC >       ) \
+    /*TEST_CASE( Treiber_HRC_yield, cds::intrusive::single_link::node< cds::gc::HRC > )*/ \
+    TEST_CASE( Treiber_HRC_pause, cds::intrusive::single_link::node< cds::gc::HRC > ) \
+    TEST_CASE( Treiber_HRC_exp, cds::intrusive::single_link::node< cds::gc::HRC >   ) \
+    TEST_CASE( Treiber_HRC_stat, cds::intrusive::single_link::node< cds::gc::HRC >  ) \
+    TEST_CASE( Treiber_PTB, cds::intrusive::single_link::node< cds::gc::PTB >       ) \
+    /*TEST_CASE( Treiber_PTB_yield, cds::intrusive::single_link::node< cds::gc::PTB > )*/ \
+    TEST_CASE( Treiber_PTB_pause, cds::intrusive::single_link::node< cds::gc::PTB > ) \
+    TEST_CASE( Treiber_PTB_exp, cds::intrusive::single_link::node< cds::gc::PTB >   ) \
+    TEST_CASE( Treiber_PTB_stat, cds::intrusive::single_link::node< cds::gc::PTB >  )
+
+#define CDSUNIT_TEST_TreiberStack \
+    CPPUNIT_TEST( Treiber_HP        ) \
+    CPPUNIT_TEST( Treiber_HP_seqcst ) \
+    /*CPPUNIT_TEST( Treiber_HP_yield  )*/ \
+    CPPUNIT_TEST( Treiber_HP_pause  ) \
+    CPPUNIT_TEST( Treiber_HP_exp    ) \
+    CPPUNIT_TEST( Treiber_HP_stat   ) \
+    CPPUNIT_TEST( Treiber_HRC       ) \
+    /*CPPUNIT_TEST( Treiber_HRC_yield )*/ \
+    /*CPPUNIT_TEST( Treiber_HRC_pause )*/ \
+    /*CPPUNIT_TEST( Treiber_HRC_exp   )*/ \
+    CPPUNIT_TEST( Treiber_HRC_stat  ) \
+    CPPUNIT_TEST( Treiber_PTB       ) \
+    /*CPPUNIT_TEST( Treiber_PTB_yield )*/ \
+    CPPUNIT_TEST( Treiber_PTB_pause ) \
+    CPPUNIT_TEST( Treiber_PTB_exp   ) \
+    CPPUNIT_TEST( Treiber_PTB_stat  )
+
+#define CDSUNIT_DECLARE_EliminationStack \
+    TEST_ELIMINATION( Elimination_HP, cds::intrusive::single_link::node< cds::gc::HP >        ) \
+    TEST_ELIMINATION( Elimination_HP_2ms, cds::intrusive::single_link::node< cds::gc::HP >    ) \
+    TEST_ELIMINATION( Elimination_HP_2ms_stat, cds::intrusive::single_link::node< cds::gc::HP >) \
+    TEST_ELIMINATION( Elimination_HP_5ms, cds::intrusive::single_link::node< cds::gc::HP >    ) \
+    TEST_ELIMINATION( Elimination_HP_5ms_stat, cds::intrusive::single_link::node< cds::gc::HP >) \
+    TEST_ELIMINATION( Elimination_HP_10ms, cds::intrusive::single_link::node< cds::gc::HP >    ) \
+    TEST_ELIMINATION( Elimination_HP_10ms_stat, cds::intrusive::single_link::node< cds::gc::HP >) \
+    TEST_ELIMINATION( Elimination_HP_seqcst, cds::intrusive::single_link::node< cds::gc::HP > ) \
+    /*TEST_ELIMINATION( Elimination_HP_yield, cds::intrusive::single_link::node< cds::gc::HP >  )*/ \
+    TEST_ELIMINATION( Elimination_HP_pause, cds::intrusive::single_link::node< cds::gc::HP >  ) \
+    TEST_ELIMINATION( Elimination_HP_exp, cds::intrusive::single_link::node< cds::gc::HP >    ) \
+    TEST_ELIMINATION( Elimination_HP_stat, cds::intrusive::single_link::node< cds::gc::HP >   ) \
+    TEST_ELIMINATION( Elimination_HP_dyn, cds::intrusive::single_link::node< cds::gc::HP >    ) \
+    TEST_ELIMINATION( Elimination_HP_dyn_stat, cds::intrusive::single_link::node< cds::gc::HP >) \
+    TEST_ELIMINATION( Elimination_HRC, cds::intrusive::single_link::node< cds::gc::HRC >       ) \
+    /*TEST_ELIMINATION( Elimination_HRC_yield, cds::intrusive::single_link::node< cds::gc::HRC > )*/ \
+    TEST_ELIMINATION( Elimination_HRC_pause, cds::intrusive::single_link::node< cds::gc::HRC > ) \
+    TEST_ELIMINATION( Elimination_HRC_exp, cds::intrusive::single_link::node< cds::gc::HRC >   ) \
+    TEST_ELIMINATION( Elimination_HRC_stat, cds::intrusive::single_link::node< cds::gc::HRC >  ) \
+    TEST_ELIMINATION( Elimination_HRC_dyn, cds::intrusive::single_link::node< cds::gc::HRC >   ) \
+    TEST_ELIMINATION( Elimination_HRC_dyn_stat, cds::intrusive::single_link::node< cds::gc::HRC >) \
+    TEST_ELIMINATION( Elimination_PTB, cds::intrusive::single_link::node< cds::gc::PTB >       ) \
+    TEST_ELIMINATION( Elimination_PTB_2ms, cds::intrusive::single_link::node< cds::gc::PTB >    ) \
+    TEST_ELIMINATION( Elimination_PTB_2ms_stat, cds::intrusive::single_link::node< cds::gc::PTB >) \
+    TEST_ELIMINATION( Elimination_PTB_5ms, cds::intrusive::single_link::node< cds::gc::PTB >    ) \
+    TEST_ELIMINATION( Elimination_PTB_5ms_stat, cds::intrusive::single_link::node< cds::gc::PTB >) \
+    TEST_ELIMINATION( Elimination_PTB_10ms, cds::intrusive::single_link::node< cds::gc::PTB >    ) \
+    TEST_ELIMINATION( Elimination_PTB_10ms_stat, cds::intrusive::single_link::node< cds::gc::PTB >) \
+    /*TEST_ELIMINATION( Elimination_PTB_yield, cds::intrusive::single_link::node< cds::gc::PTB > )*/ \
+    TEST_ELIMINATION( Elimination_PTB_pause, cds::intrusive::single_link::node< cds::gc::PTB > ) \
+    TEST_ELIMINATION( Elimination_PTB_exp, cds::intrusive::single_link::node< cds::gc::PTB >   ) \
+    TEST_ELIMINATION( Elimination_PTB_stat, cds::intrusive::single_link::node< cds::gc::PTB >  ) \
+    TEST_ELIMINATION( Elimination_PTB_dyn, cds::intrusive::single_link::node< cds::gc::PTB >   ) \
+    TEST_ELIMINATION( Elimination_PTB_dyn_stat, cds::intrusive::single_link::node< cds::gc::PTB >)
+
+#define CDSUNIT_TEST_EliminationStack \
+    CPPUNIT_TEST( Elimination_HP        ) \
+    CPPUNIT_TEST( Elimination_HP_2ms    ) \
+    CPPUNIT_TEST( Elimination_HP_2ms_stat) \
+    CPPUNIT_TEST( Elimination_HP_5ms    ) \
+    CPPUNIT_TEST( Elimination_HP_5ms_stat) \
+    CPPUNIT_TEST( Elimination_HP_10ms    ) \
+    CPPUNIT_TEST( Elimination_HP_10ms_stat) \
+    CPPUNIT_TEST( Elimination_HP_seqcst ) \
+    /*CPPUNIT_TEST( Elimination_HP_yield  )*/ \
+    CPPUNIT_TEST( Elimination_HP_pause  ) \
+    CPPUNIT_TEST( Elimination_HP_exp    ) \
+    CPPUNIT_TEST( Elimination_HP_stat   ) \
+    CPPUNIT_TEST( Elimination_HP_dyn    ) \
+    CPPUNIT_TEST( Elimination_HP_dyn_stat) \
+    CPPUNIT_TEST( Elimination_HRC       ) \
+    /*CPPUNIT_TEST( Elimination_HRC_yield )*/ \
+    /*CPPUNIT_TEST( Elimination_HRC_pause )*/ \
+    /*CPPUNIT_TEST( Elimination_HRC_exp   )*/ \
+    CPPUNIT_TEST( Elimination_HRC_stat  ) \
+    CPPUNIT_TEST( Elimination_HRC_dyn   ) \
+    CPPUNIT_TEST( Elimination_HRC_dyn_stat) \
+    CPPUNIT_TEST( Elimination_PTB       ) \
+    CPPUNIT_TEST( Elimination_PTB_2ms    ) \
+    CPPUNIT_TEST( Elimination_PTB_2ms_stat) \
+    CPPUNIT_TEST( Elimination_PTB_5ms    ) \
+    CPPUNIT_TEST( Elimination_PTB_5ms_stat) \
+    CPPUNIT_TEST( Elimination_PTB_10ms    ) \
+    CPPUNIT_TEST( Elimination_PTB_10ms_stat) \
+    /*CPPUNIT_TEST( Elimination_PTB_yield )*/ \
+    CPPUNIT_TEST( Elimination_PTB_pause ) \
+    CPPUNIT_TEST( Elimination_PTB_exp   ) \
+    CPPUNIT_TEST( Elimination_PTB_stat  ) \
+    CPPUNIT_TEST( Elimination_PTB_dyn   ) \
+    CPPUNIT_TEST( Elimination_PTB_dyn_stat)
+
+#define CDSUNIT_DECLARE_MichaelDeque \
+    TEST_BOUNDED( MichaelDequeL_HP, cds::intrusive::michael_deque::node<cds::gc::HP>          ) \
+    TEST_BOUNDED( MichaelDequeL_HP_seqcst, cds::intrusive::michael_deque::node<cds::gc::HP>   ) \
+    TEST_BOUNDED( MichaelDequeL_HP_ic, cds::intrusive::michael_deque::node<cds::gc::HP>       ) \
+    TEST_BOUNDED( MichaelDequeL_HP_exp, cds::intrusive::michael_deque::node<cds::gc::HP>      ) \
+    TEST_BOUNDED( MichaelDequeL_HP_yield, cds::intrusive::michael_deque::node<cds::gc::HP>    ) \
+    TEST_BOUNDED( MichaelDequeL_HP_stat, cds::intrusive::michael_deque::node<cds::gc::HP>     ) \
+    TEST_BOUNDED( MichaelDequeL_PTB, cds::intrusive::michael_deque::node<cds::gc::PTB>         ) \
+    TEST_BOUNDED( MichaelDequeL_PTB_seqcst, cds::intrusive::michael_deque::node<cds::gc::PTB>  ) \
+    TEST_BOUNDED( MichaelDequeL_PTB_ic, cds::intrusive::michael_deque::node<cds::gc::PTB>      ) \
+    TEST_BOUNDED( MichaelDequeL_PTB_exp, cds::intrusive::michael_deque::node<cds::gc::PTB>     ) \
+    TEST_BOUNDED( MichaelDequeL_PTB_yield, cds::intrusive::michael_deque::node<cds::gc::PTB>   ) \
+    TEST_BOUNDED( MichaelDequeL_PTB_stat, cds::intrusive::michael_deque::node<cds::gc::PTB>    ) \
+    TEST_BOUNDED( MichaelDequeR_HP, cds::intrusive::michael_deque::node<cds::gc::HP>          ) \
+    TEST_BOUNDED( MichaelDequeR_HP_seqcst, cds::intrusive::michael_deque::node<cds::gc::HP>   ) \
+    TEST_BOUNDED( MichaelDequeR_HP_ic, cds::intrusive::michael_deque::node<cds::gc::HP>       ) \
+    TEST_BOUNDED( MichaelDequeR_HP_exp, cds::intrusive::michael_deque::node<cds::gc::HP>      ) \
+    TEST_BOUNDED( MichaelDequeR_HP_yield, cds::intrusive::michael_deque::node<cds::gc::HP>    ) \
+    TEST_BOUNDED( MichaelDequeR_HP_stat, cds::intrusive::michael_deque::node<cds::gc::HP>     ) \
+    TEST_BOUNDED( MichaelDequeR_PTB, cds::intrusive::michael_deque::node<cds::gc::PTB>         ) \
+    TEST_BOUNDED( MichaelDequeR_PTB_seqcst, cds::intrusive::michael_deque::node<cds::gc::PTB>  ) \
+    TEST_BOUNDED( MichaelDequeR_PTB_ic, cds::intrusive::michael_deque::node<cds::gc::PTB>      ) \
+    TEST_BOUNDED( MichaelDequeR_PTB_exp, cds::intrusive::michael_deque::node<cds::gc::PTB>     ) \
+    TEST_BOUNDED( MichaelDequeR_PTB_yield, cds::intrusive::michael_deque::node<cds::gc::PTB>   ) \
+    TEST_BOUNDED( MichaelDequeR_PTB_stat, cds::intrusive::michael_deque::node<cds::gc::PTB>    )
+
+#define CDSUNIT_TEST_MichaelDeque \
+    CPPUNIT_TEST( MichaelDequeL_HP          ) \
+    /*CPPUNIT_TEST( MichaelDequeL_HP_seqcst   )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_HP_ic       )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_HP_exp      )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_HP_yield    )*/ \
+    CPPUNIT_TEST( MichaelDequeL_HP_stat     ) \
+    CPPUNIT_TEST( MichaelDequeL_PTB         ) \
+    /*CPPUNIT_TEST( MichaelDequeL_PTB_seqcst  )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_PTB_ic      )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_PTB_exp     )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_PTB_yield   )*/ \
+    CPPUNIT_TEST( MichaelDequeL_PTB_stat    ) \
+    CPPUNIT_TEST( MichaelDequeR_HP          ) \
+    /*CPPUNIT_TEST( MichaelDequeR_HP_seqcst   )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_HP_ic       )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_HP_exp      )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_HP_yield    )*/ \
+    CPPUNIT_TEST( MichaelDequeR_HP_stat     ) \
+    CPPUNIT_TEST( MichaelDequeR_PTB         ) \
+    /*CPPUNIT_TEST( MichaelDequeR_PTB_seqcst  )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_PTB_ic      )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_PTB_exp     )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_PTB_yield   )*/ \
+    CPPUNIT_TEST( MichaelDequeR_PTB_stat    )
+
+#define CDSUNIT_DECLARE_FCStack \
+    TEST_FCSTACK( FCStack_slist, boost::intrusive::slist_base_hook<> ) \
+    TEST_FCSTACK( FCStack_slist_stat, boost::intrusive::slist_base_hook<> ) \
+    TEST_FCSTACK( FCStack_slist_elimination, boost::intrusive::slist_base_hook<> ) \
+    TEST_FCSTACK( FCStack_slist_elimination_stat, boost::intrusive::slist_base_hook<> ) \
+    TEST_FCSTACK( FCStack_slist_mutex_stat, boost::intrusive::slist_base_hook<> ) \
+    TEST_FCSTACK( FCStack_slist_mutex_elimination, boost::intrusive::slist_base_hook<> ) \
+    TEST_FCSTACK( FCStack_slist_mutex_elimination_stat, boost::intrusive::slist_base_hook<> ) \
+    TEST_FCSTACK( FCStack_list, boost::intrusive::list_base_hook<> ) \
+    TEST_FCSTACK( FCStack_list_stat, boost::intrusive::list_base_hook<> ) \
+    TEST_FCSTACK( FCStack_list_elimination, boost::intrusive::list_base_hook<> ) \
+    TEST_FCSTACK( FCStack_list_elimination_stat, boost::intrusive::list_base_hook<> ) \
+    TEST_FCSTACK( FCStack_list_mutex_stat, boost::intrusive::list_base_hook<> ) \
+    TEST_FCSTACK( FCStack_list_mutex_elimination, boost::intrusive::list_base_hook<> ) \
+    TEST_FCSTACK( FCStack_list_mutex_elimination_stat, boost::intrusive::list_base_hook<> )
+
+#define CDSUNIT_TEST_FCStack \
+    CPPUNIT_TEST( FCStack_slist ) \
+    CPPUNIT_TEST( FCStack_slist_stat ) \
+    CPPUNIT_TEST( FCStack_slist_elimination ) \
+    CPPUNIT_TEST( FCStack_slist_elimination_stat ) \
+    CPPUNIT_TEST( FCStack_slist_mutex_stat ) \
+    CPPUNIT_TEST( FCStack_slist_mutex_elimination ) \
+    CPPUNIT_TEST( FCStack_slist_mutex_elimination_stat ) \
+    CPPUNIT_TEST( FCStack_list ) \
+    CPPUNIT_TEST( FCStack_list_stat ) \
+    CPPUNIT_TEST( FCStack_list_elimination ) \
+    CPPUNIT_TEST( FCStack_list_elimination_stat ) \
+    CPPUNIT_TEST( FCStack_list_mutex_stat ) \
+    CPPUNIT_TEST( FCStack_list_mutex_elimination ) \
+    CPPUNIT_TEST( FCStack_list_mutex_elimination_stat )
+
+
+#define CDSUNIT_DECLARE_StdStack \
+    TEST_STDSTACK( StdStack_Deque_Mutex  ) \
+    TEST_STDSTACK( StdStack_Deque_Spin   ) \
+    TEST_STDSTACK( StdStack_Vector_Mutex ) \
+    TEST_STDSTACK( StdStack_Vector_Spin  ) \
+    TEST_STDSTACK( StdStack_List_Mutex   ) \
+    TEST_STDSTACK( StdStack_List_Spin    )
+
+#define CDSUNIT_TEST_StdStack \
+    CPPUNIT_TEST( StdStack_Deque_Mutex  ) \
+    CPPUNIT_TEST( StdStack_Deque_Spin   ) \
+    CPPUNIT_TEST( StdStack_Vector_Mutex ) \
+    CPPUNIT_TEST( StdStack_Vector_Spin  ) \
+    CPPUNIT_TEST( StdStack_List_Mutex   ) \
+    CPPUNIT_TEST( StdStack_List_Spin    )
+
+#endif // #ifndef __CDSUNIT_INTRUSIVE_STACK_DEFS_H
diff --git a/tests/unit/stack/intrusive_stack_type.h b/tests/unit/stack/intrusive_stack_type.h
new file mode 100644 (file)
index 0000000..485c443
--- /dev/null
@@ -0,0 +1,684 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_INTRUSIVE_STACK_TYPES_H
+#define __CDSUNIT_INTRUSIVE_STACK_TYPES_H
+
+#include <cds/intrusive/treiber_stack.h>
+#include <cds/intrusive/michael_deque.h>
+#include <cds/intrusive/fcstack.h>
+
+#include <cds/gc/hp.h>
+#include <cds/gc/ptb.h>
+#include <cds/gc/hrc.h>
+
+#include <cds/details/std/mutex.h>
+#include <cds/lock/spinlock.h>
+#include <stack>
+#include <list>
+#include <vector>
+#include <boost/intrusive/list.hpp>
+
+namespace istack {
+
+    namespace details {
+        template <typename GC, typename T, CDS_DECL_OPTIONS10>
+        class MichaelDequeL: public cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10>
+        {
+            typedef cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10> base_class;
+        public:
+            MichaelDequeL( size_t nMaxItemCount )
+                : base_class( (unsigned int) nMaxItemCount, 4 )
+                {}
+
+            bool push( T& v )
+            {
+                return base_class::push_front( v );
+            }
+
+            T * pop()
+            {
+                return base_class::pop_front();
+            }
+        };
+
+        template <typename GC, typename T, CDS_DECL_OPTIONS10>
+        class MichaelDequeR: public cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10>
+        {
+            typedef cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10> base_class;
+        public:
+            MichaelDequeR( size_t nMaxItemCount )
+                : base_class( (unsigned int) nMaxItemCount, 4 )
+            {}
+
+            bool push( T& v )
+            {
+                return base_class::push_back( v );
+            }
+
+            T * pop()
+            {
+                return base_class::pop_back();
+            }
+        };
+
+        template < typename T, typename Stack, typename Lock>
+        class StdStack
+        {
+            Stack   m_Impl;
+            mutable Lock    m_Lock;
+            cds::intrusive::treiber_stack::empty_stat m_stat;
+
+            typedef cds_std::unique_lock<Lock>  unique_lock;
+
+        public:
+            typedef T value_type;
+
+            bool push( T& v )
+            {
+                unique_lock l( m_Lock );
+                m_Impl.push( &v );
+                return true;
+            }
+
+            T * pop()
+            {
+                unique_lock l( m_Lock );
+                if ( !m_Impl.empty() ) {
+                     T * v = m_Impl.top();
+                    m_Impl.pop();
+                    return v;
+                }
+                return NULL;
+            }
+
+            bool empty() const
+            {
+                unique_lock l( m_Lock );
+                return m_Impl.empty();
+            }
+
+            cds::intrusive::treiber_stack::empty_stat const& statistics() const
+            {
+                return m_stat;
+            }
+        };
+    }
+
+    template <typename T>
+    struct Types {
+
+    // TreiberStack
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+        >       Treiber_HP;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        >       Treiber_HP_seqcst;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Treiber_HP_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+        >       Treiber_HRC;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Treiber_HRC_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+        > Treiber_PTB;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Treiber_PTB_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::back_off<cds::backoff::yield>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Treiber_HP_yield;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::back_off<cds::backoff::pause>
+        > Treiber_HP_pause;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > Treiber_HP_exp;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::back_off<cds::backoff::yield>
+        >  Treiber_HRC_yield;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::back_off<cds::backoff::pause>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Treiber_HRC_pause;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > Treiber_HRC_exp;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::back_off<cds::backoff::yield>
+        >  Treiber_PTB_yield;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::back_off<cds::backoff::pause>
+        > Treiber_PTB_pause;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Treiber_PTB_exp;
+
+
+    // Elimination stack
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+        >       Elimination_HP;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
+        >       Elimination_HP_2ms;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_HP_2ms_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
+        >       Elimination_HP_5ms;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_HP_5ms_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
+        >       Elimination_HP_10ms;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_HP_10ms_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        >       Elimination_HP_dyn;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        >       Elimination_HP_seqcst;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_HP_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        >       Elimination_HP_dyn_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::enable_elimination<true>
+        >       Elimination_HRC;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        >       Elimination_HRC_dyn;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_HRC_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        >       Elimination_HRC_dyn_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
+        > Elimination_PTB_2ms;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        > Elimination_PTB_2ms_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
+        > Elimination_PTB_5ms;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        > Elimination_PTB_5ms_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
+        > Elimination_PTB_10ms;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        > Elimination_PTB_10ms_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+        > Elimination_PTB;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        > Elimination_PTB_dyn;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_PTB_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        >       Elimination_PTB_dyn_stat;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::yield>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Elimination_HP_yield;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::pause>
+        > Elimination_HP_pause;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > Elimination_HP_exp;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::yield>
+        >  Elimination_HRC_yield;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::pause>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Elimination_HRC_pause;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > Elimination_HRC_exp;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::yield>
+        >  Elimination_PTB_yield;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::pause>
+        > Elimination_PTB_pause;
+
+        typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Elimination_PTB_exp;
+
+    // FCStack
+        typedef cds::intrusive::FCStack< T > FCStack_slist;
+
+        struct traits_FCStack_stat:
+            public cds::intrusive::fcstack::make_traits<
+                cds::opt::stat< cds::intrusive::fcstack::stat<> >
+            >::type
+        {};
+        struct traits_FCStack_elimination:
+            public cds::intrusive::fcstack::make_traits<
+            cds::opt::enable_elimination< true >
+            >::type
+        {};
+        struct traits_FCStack_elimination_stat:
+            public cds::intrusive::fcstack::make_traits<
+                cds::opt::stat< cds::intrusive::fcstack::stat<> >,
+                cds::opt::enable_elimination< true >
+            >::type
+        {};
+
+        struct traits_FCStack_mutex_stat:
+            public cds::intrusive::fcstack::make_traits<
+                cds::opt::stat< cds::intrusive::fcstack::stat<> >
+                ,cds::opt::lock_type< cds_std::mutex >
+            >::type
+        {};
+        struct traits_FCStack_mutex_elimination:
+            public cds::intrusive::fcstack::make_traits<
+                cds::opt::enable_elimination< true >
+                ,cds::opt::lock_type< cds_std::mutex >
+            >::type
+        {};
+        struct traits_FCStack_mutex_elimination_stat:
+            public cds::intrusive::fcstack::make_traits<
+                cds::opt::stat< cds::intrusive::fcstack::stat<> >
+                ,cds::opt::enable_elimination< true >
+                ,cds::opt::lock_type< cds_std::mutex >
+            >::type
+        {};
+
+        typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_stat > FCStack_slist_stat;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_elimination > FCStack_slist_elimination;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_elimination_stat > FCStack_slist_elimination_stat;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_stat > FCStack_slist_mutex_stat;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_elimination > FCStack_slist_mutex_elimination;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_elimination_stat > FCStack_slist_mutex_elimination_stat;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::list< T > > FCStack_list;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_stat > FCStack_list_stat;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_elimination > FCStack_list_elimination;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_elimination_stat > FCStack_list_elimination_stat;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_stat > FCStack_list_mutex_stat;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_elimination > FCStack_list_mutex_elimination;
+        typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_elimination_stat > FCStack_list_mutex_elimination_stat;
+
+    // MichaelDeque, left side
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+        > MichaelDequeL_HP;
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        > MichaelDequeL_HP_seqcst;
+
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        > MichaelDequeL_HP_ic;
+
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > MichaelDequeL_HP_exp;
+
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::back_off< cds::backoff::yield >
+        > MichaelDequeL_HP_yield;
+
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::stat<cds::intrusive::deque_stat<> >
+        > MichaelDequeL_HP_stat;
+
+
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+        > MichaelDequeL_PTB;
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        > MichaelDequeL_PTB_seqcst;
+
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        > MichaelDequeL_PTB_ic;
+
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > MichaelDequeL_PTB_exp;
+
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::back_off< cds::backoff::yield >
+        > MichaelDequeL_PTB_yield;
+
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::stat<cds::intrusive::michael_deque::stat<> >
+        > MichaelDequeL_PTB_stat;
+
+
+    // MichaelDeque, right side
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+        > MichaelDequeR_HP;
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        > MichaelDequeR_HP_seqcst;
+
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        > MichaelDequeR_HP_ic;
+
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > MichaelDequeR_HP_exp;
+
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
+            ,cds::opt::back_off< cds::backoff::yield >
+        > MichaelDequeR_HP_yield;
+
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
+        > MichaelDequeR_HP_stat;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+        > MichaelDequeR_PTB;
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        > MichaelDequeR_PTB_seqcst;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        > MichaelDequeR_PTB_ic;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > MichaelDequeR_PTB_exp;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::stat< cds::intrusive::deque_stat<> >
+        > MichaelDequeR_PTB_stat;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
+            ,cds::opt::back_off< cds::backoff::yield >
+        > MichaelDequeR_PTB_yield;
+
+
+        // std::stack
+        typedef details::StdStack< T, std::stack< T* >, cds_std::mutex >  StdStack_Deque_Mutex;
+        typedef details::StdStack< T, std::stack< T* >, cds::lock::Spin > StdStack_Deque_Spin;
+        typedef details::StdStack< T, std::stack< T*, std::vector<T*> >, cds_std::mutex >  StdStack_Vector_Mutex;
+        typedef details::StdStack< T, std::stack< T*, std::vector<T*> >, cds::lock::Spin > StdStack_Vector_Spin;
+        typedef details::StdStack< T, std::stack< T*, std::list<T*> >, cds_std::mutex >  StdStack_List_Mutex;
+        typedef details::StdStack< T, std::stack< T*, std::list<T*> >, cds::lock::Spin > StdStack_List_Spin;
+
+    };
+} // namespace istack
+
+namespace std {
+    static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::stat<> const& s )
+    {
+        return o << "\tStatistics:\n"
+            << "\t                    Push: " << s.m_PushCount.get()              << "\n"
+            << "\t                     Pop: " << s.m_PopCount.get()               << "\n"
+            << "\t         Push contention: " << s.m_PushRace.get()               << "\n"
+            << "\t          Pop contention: " << s.m_PopRace.get()                << "\n"
+            << "\t   m_ActivePushCollision: " << s.m_ActivePushCollision.get()    << "\n"
+            << "\t   m_PassivePopCollision: " << s.m_PassivePopCollision.get()    << "\n"
+            << "\t    m_ActivePopCollision: " << s.m_ActivePopCollision.get()     << "\n"
+            << "\t  m_PassivePushCollision: " << s.m_PassivePushCollision.get()   << "\n"
+            << "\t     m_EliminationFailed: " << s.m_EliminationFailed.get()      << "\n";
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::empty_stat const& s )
+    {
+        return o;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::fcstack::empty_stat const& s )
+    {
+        return o;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::fcstack::stat<> const& s )
+    {
+        return o << "\tStatistics:\n"
+            << "\t                    Push: " << s.m_nPush.get()              << "\n"
+            << "\t                     Pop: " << s.m_nPop.get()               << "\n"
+            << "\t               FailedPop: " << s.m_nFailedPop.get()         << "\n"
+            << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
+            << "\tFlat combining statistics:\n"
+            << "\t        Combining factor: " << s.combining_factor()         << "\n"
+            << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
+            << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
+            << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
+            << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
+            << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get()    << "\n"
+            << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
+            << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
+            << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
+            << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
+    }
+
+} // namespace std
+
+#endif // #ifndef __CDSUNIT_INTRUSIVE_STACK_TYPES_H
diff --git a/tests/unit/stack/stack_defs.h b/tests/unit/stack/stack_defs.h
new file mode 100644 (file)
index 0000000..b39e054
--- /dev/null
@@ -0,0 +1,242 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STACK_DEFS_H
+#define __CDSUNIT_STACK_DEFS_H
+
+#define CDSUNIT_DECLARE_TreiberStack \
+    TEST_CASE( Treiber_HP        ) \
+    TEST_CASE( Treiber_HP_seqcst ) \
+    /*TEST_CASE( Treiber_HP_yield  )*/ \
+    TEST_CASE( Treiber_HP_pause  ) \
+    TEST_CASE( Treiber_HP_exp    ) \
+    TEST_CASE( Treiber_HP_stat   ) \
+    /*TEST_CASE( Treiber_HRC       )*/ \
+    /*TEST_CASE( Treiber_HRC_yield )*/ \
+    /*TEST_CASE( Treiber_HRC_pause )*/ \
+    /*TEST_CASE( Treiber_HRC_exp   )*/ \
+    /*TEST_CASE( Treiber_HRC_stat  )*/ \
+    TEST_CASE( Treiber_PTB       ) \
+    /*TEST_CASE( Treiber_PTB_yield )*/ \
+    TEST_CASE( Treiber_PTB_pause ) \
+    TEST_CASE( Treiber_PTB_exp   ) \
+    TEST_CASE( Treiber_PTB_stat  )
+
+#define CDSUNIT_TEST_TreiberStack \
+    CPPUNIT_TEST( Treiber_HP        ) \
+    CPPUNIT_TEST( Treiber_HP_seqcst ) \
+    /*CPPUNIT_TEST( Treiber_HP_yield  )*/ \
+    CPPUNIT_TEST( Treiber_HP_pause  ) \
+    CPPUNIT_TEST( Treiber_HP_exp    ) \
+    CPPUNIT_TEST( Treiber_HP_stat   ) \
+    /*CPPUNIT_TEST( Treiber_HRC       )*/ \
+    /*CPPUNIT_TEST( Treiber_HRC_yield )*/ \
+    /*CPPUNIT_TEST( Treiber_HRC_pause )*/ \
+    /*CPPUNIT_TEST( Treiber_HRC_exp   )*/ \
+    /*CPPUNIT_TEST( Treiber_HRC_stat  )*/ \
+    CPPUNIT_TEST( Treiber_PTB       ) \
+    /*CPPUNIT_TEST( Treiber_PTB_yield )*/ \
+    CPPUNIT_TEST( Treiber_PTB_pause ) \
+    CPPUNIT_TEST( Treiber_PTB_exp   ) \
+    CPPUNIT_TEST( Treiber_PTB_stat  )
+
+#define CDSUNIT_DECLARE_EliminationStack \
+    TEST_ELIMINATION( Elimination_HP        ) \
+    TEST_ELIMINATION( Elimination_HP_2ms    ) \
+    TEST_ELIMINATION( Elimination_HP_2ms_stat) \
+    TEST_ELIMINATION( Elimination_HP_5ms    ) \
+    TEST_ELIMINATION( Elimination_HP_5ms_stat) \
+    TEST_ELIMINATION( Elimination_HP_10ms    ) \
+    TEST_ELIMINATION( Elimination_HP_10ms_stat) \
+    TEST_ELIMINATION( Elimination_HP_seqcst ) \
+    /*TEST_ELIMINATION( Elimination_HP_yield  )*/ \
+    TEST_ELIMINATION( Elimination_HP_pause  ) \
+    TEST_ELIMINATION( Elimination_HP_exp    ) \
+    TEST_ELIMINATION( Elimination_HP_stat   ) \
+    TEST_ELIMINATION( Elimination_HP_dyn    ) \
+    TEST_ELIMINATION( Elimination_HP_dyn_stat) \
+    /*TEST_ELIMINATION( Elimination_HRC       )*/ \
+    /*TEST_ELIMINATION( Elimination_HRC_yield )*/ \
+    /*TEST_ELIMINATION( Elimination_HRC_pause )*/ \
+    /*TEST_ELIMINATION( Elimination_HRC_exp   )*/ \
+    /*TEST_ELIMINATION( Elimination_HRC_stat  )*/ \
+    /*TEST_ELIMINATION( Elimination_HRC_dyn   )*/ \
+    /*TEST_ELIMINATION( Elimination_HRC_dyn_stat)*/ \
+    TEST_ELIMINATION( Elimination_PTB       ) \
+    TEST_ELIMINATION( Elimination_PTB_2ms    ) \
+    TEST_ELIMINATION( Elimination_PTB_2ms_stat) \
+    TEST_ELIMINATION( Elimination_PTB_5ms    ) \
+    TEST_ELIMINATION( Elimination_PTB_5ms_stat) \
+    TEST_ELIMINATION( Elimination_PTB_10ms    ) \
+    TEST_ELIMINATION( Elimination_PTB_10ms_stat) \
+    /*TEST_ELIMINATION( Elimination_PTB_yield )*/ \
+    TEST_ELIMINATION( Elimination_PTB_pause ) \
+    TEST_ELIMINATION( Elimination_PTB_exp   ) \
+    TEST_ELIMINATION( Elimination_PTB_stat  ) \
+    TEST_ELIMINATION( Elimination_PTB_dyn   ) \
+    TEST_ELIMINATION( Elimination_PTB_dyn_stat)
+
+#define CDSUNIT_TEST_EliminationStack \
+    CPPUNIT_TEST( Elimination_HP        ) \
+    CPPUNIT_TEST( Elimination_HP_2ms    ) \
+    CPPUNIT_TEST( Elimination_HP_2ms_stat) \
+    CPPUNIT_TEST( Elimination_HP_5ms    ) \
+    CPPUNIT_TEST( Elimination_HP_5ms_stat) \
+    CPPUNIT_TEST( Elimination_HP_10ms    ) \
+    CPPUNIT_TEST( Elimination_HP_10ms_stat) \
+    CPPUNIT_TEST( Elimination_HP_seqcst ) \
+    /*CPPUNIT_TEST( Elimination_HP_yield  )*/ \
+    CPPUNIT_TEST( Elimination_HP_pause  ) \
+    CPPUNIT_TEST( Elimination_HP_exp    ) \
+    CPPUNIT_TEST( Elimination_HP_stat   ) \
+    CPPUNIT_TEST( Elimination_HP_dyn    ) \
+    CPPUNIT_TEST( Elimination_HP_dyn_stat) \
+    /*CPPUNIT_TEST( Elimination_HRC       )*/ \
+    /*CPPUNIT_TEST( Elimination_HRC_yield )*/ \
+    /*CPPUNIT_TEST( Elimination_HRC_pause )*/ \
+    /*CPPUNIT_TEST( Elimination_HRC_exp   )*/ \
+    /*CPPUNIT_TEST( Elimination_HRC_stat  )*/ \
+    /*CPPUNIT_TEST( Elimination_HRC_dyn   )*/ \
+    /*CPPUNIT_TEST( Elimination_HRC_dyn_stat)*/ \
+    CPPUNIT_TEST( Elimination_PTB       ) \
+    CPPUNIT_TEST( Elimination_PTB_2ms    ) \
+    CPPUNIT_TEST( Elimination_PTB_2ms_stat) \
+    CPPUNIT_TEST( Elimination_PTB_5ms    ) \
+    CPPUNIT_TEST( Elimination_PTB_5ms_stat) \
+    CPPUNIT_TEST( Elimination_PTB_10ms    ) \
+    CPPUNIT_TEST( Elimination_PTB_10ms_stat) \
+    /*CPPUNIT_TEST( Elimination_PTB_yield )*/ \
+    CPPUNIT_TEST( Elimination_PTB_pause ) \
+    CPPUNIT_TEST( Elimination_PTB_exp   ) \
+    CPPUNIT_TEST( Elimination_PTB_stat  ) \
+    CPPUNIT_TEST( Elimination_PTB_dyn   ) \
+    CPPUNIT_TEST( Elimination_PTB_dyn_stat)
+
+#define CDSUNIT_DECLARE_MichaelDeque \
+    TEST_BOUNDED( MichaelDequeL_HP          ) \
+    TEST_BOUNDED( MichaelDequeL_HP_seqcst   ) \
+    TEST_BOUNDED( MichaelDequeL_HP_ic       ) \
+    TEST_BOUNDED( MichaelDequeL_HP_exp      ) \
+    TEST_BOUNDED( MichaelDequeL_HP_yield    ) \
+    TEST_BOUNDED( MichaelDequeL_HP_stat     ) \
+    TEST_BOUNDED( MichaelDequeL_PTB         ) \
+    TEST_BOUNDED( MichaelDequeL_PTB_seqcst  ) \
+    TEST_BOUNDED( MichaelDequeL_PTB_ic      ) \
+    TEST_BOUNDED( MichaelDequeL_PTB_exp     ) \
+    TEST_BOUNDED( MichaelDequeL_PTB_yield   ) \
+    TEST_BOUNDED( MichaelDequeL_PTB_stat    ) \
+    TEST_BOUNDED( MichaelDequeR_HP          ) \
+    TEST_BOUNDED( MichaelDequeR_HP_seqcst   ) \
+    TEST_BOUNDED( MichaelDequeR_HP_ic       ) \
+    TEST_BOUNDED( MichaelDequeR_HP_exp      ) \
+    TEST_BOUNDED( MichaelDequeR_HP_yield    ) \
+    TEST_BOUNDED( MichaelDequeR_HP_stat     ) \
+    TEST_BOUNDED( MichaelDequeR_PTB         ) \
+    TEST_BOUNDED( MichaelDequeR_PTB_seqcst  ) \
+    TEST_BOUNDED( MichaelDequeR_PTB_ic      ) \
+    TEST_BOUNDED( MichaelDequeR_PTB_exp     ) \
+    TEST_BOUNDED( MichaelDequeR_PTB_yield   ) \
+    TEST_BOUNDED( MichaelDequeR_PTB_stat    )
+
+#define CDSUNIT_TEST_MichaelDeque \
+    CPPUNIT_TEST( MichaelDequeL_HP          ) \
+    /*CPPUNIT_TEST( MichaelDequeL_HP_seqcst   )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_HP_ic       )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_HP_exp      )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_HP_yield    )*/ \
+    CPPUNIT_TEST( MichaelDequeL_HP_stat     ) \
+    CPPUNIT_TEST( MichaelDequeL_PTB         ) \
+    /*CPPUNIT_TEST( MichaelDequeL_PTB_seqcst  )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_PTB_ic      )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_PTB_exp     )*/ \
+    /*CPPUNIT_TEST( MichaelDequeL_PTB_yield   )*/ \
+    CPPUNIT_TEST( MichaelDequeL_PTB_stat    ) \
+    CPPUNIT_TEST( MichaelDequeR_HP          ) \
+    /*CPPUNIT_TEST( MichaelDequeR_HP_seqcst   )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_HP_ic       )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_HP_exp      )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_HP_yield    )*/ \
+    CPPUNIT_TEST( MichaelDequeR_HP_stat     ) \
+    CPPUNIT_TEST( MichaelDequeR_PTB         ) \
+    /*CPPUNIT_TEST( MichaelDequeR_PTB_seqcst  )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_PTB_ic      )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_PTB_exp     )*/ \
+    /*CPPUNIT_TEST( MichaelDequeR_PTB_yield   )*/ \
+    CPPUNIT_TEST( MichaelDequeR_PTB_stat    )
+
+#define CDSUNIT_DECLARE_FCStack \
+    TEST_CASE( FCStack_deque ) \
+    TEST_CASE( FCStack_deque_mutex ) \
+    TEST_CASE( FCStack_deque_stat ) \
+    TEST_CASE( FCStack_deque_elimination ) \
+    TEST_CASE( FCStack_deque_elimination_stat ) \
+    TEST_CASE( FCStack_vector ) \
+    TEST_CASE( FCStack_vector_mutex ) \
+    TEST_CASE( FCStack_vector_stat ) \
+    TEST_CASE( FCStack_vector_elimination ) \
+    TEST_CASE( FCStack_vector_elimination_stat ) \
+    TEST_CASE( FCStack_list ) \
+    TEST_CASE( FCStack_list_mutex ) \
+    TEST_CASE( FCStack_list_stat ) \
+    TEST_CASE( FCStack_list_elimination ) \
+    TEST_CASE( FCStack_list_elimination_stat )
+
+#define CDSUNIT_TEST_FCStack \
+    CPPUNIT_TEST( FCStack_deque ) \
+    CPPUNIT_TEST( FCStack_deque_mutex ) \
+    CPPUNIT_TEST( FCStack_deque_stat ) \
+    CPPUNIT_TEST( FCStack_deque_elimination ) \
+    CPPUNIT_TEST( FCStack_deque_elimination_stat ) \
+    CPPUNIT_TEST( FCStack_vector ) \
+    CPPUNIT_TEST( FCStack_vector_mutex ) \
+    CPPUNIT_TEST( FCStack_vector_stat ) \
+    CPPUNIT_TEST( FCStack_vector_elimination ) \
+    CPPUNIT_TEST( FCStack_vector_elimination_stat ) \
+    CPPUNIT_TEST( FCStack_list ) \
+    CPPUNIT_TEST( FCStack_list_mutex ) \
+    CPPUNIT_TEST( FCStack_list_stat ) \
+    CPPUNIT_TEST( FCStack_list_elimination ) \
+    CPPUNIT_TEST( FCStack_list_elimination_stat )
+
+
+#define CDSUNIT_DECLARE_FCDeque \
+    TEST_CASE( FCDequeL_default ) \
+    TEST_CASE( FCDequeL_mutex ) \
+    TEST_CASE( FCDequeL_stat ) \
+    TEST_CASE( FCDequeL_elimination ) \
+    TEST_CASE( FCDequeL_elimination_stat ) \
+    TEST_CASE( FCDequeR_default ) \
+    TEST_CASE( FCDequeR_mutex ) \
+    TEST_CASE( FCDequeR_stat ) \
+    TEST_CASE( FCDequeR_elimination ) \
+    TEST_CASE( FCDequeR_elimination_stat )
+
+#define CDSUNIT_TEST_FCDeque \
+    CPPUNIT_TEST( FCDequeL_default ) \
+    CPPUNIT_TEST( FCDequeL_mutex ) \
+    CPPUNIT_TEST( FCDequeL_stat ) \
+    CPPUNIT_TEST( FCDequeL_elimination ) \
+    CPPUNIT_TEST( FCDequeL_elimination_stat ) \
+    CPPUNIT_TEST( FCDequeR_default ) \
+    CPPUNIT_TEST( FCDequeR_mutex ) \
+    CPPUNIT_TEST( FCDequeR_stat ) \
+    CPPUNIT_TEST( FCDequeR_elimination ) \
+    CPPUNIT_TEST( FCDequeR_elimination_stat )
+
+
+#define CDSUNIT_DECLARE_StdStack \
+    TEST_CASE( StdStack_Deque_Mutex  ) \
+    TEST_CASE( StdStack_Deque_Spin   ) \
+    TEST_CASE( StdStack_Vector_Mutex ) \
+    TEST_CASE( StdStack_Vector_Spin  ) \
+    TEST_CASE( StdStack_List_Mutex   ) \
+    TEST_CASE( StdStack_List_Spin    )
+
+#define CDSUNIT_TEST_StdStack \
+    CPPUNIT_TEST( StdStack_Deque_Mutex  ) \
+    CPPUNIT_TEST( StdStack_Deque_Spin   ) \
+    CPPUNIT_TEST( StdStack_Vector_Mutex ) \
+    CPPUNIT_TEST( StdStack_Vector_Spin  ) \
+    CPPUNIT_TEST( StdStack_List_Mutex   ) \
+    CPPUNIT_TEST( StdStack_List_Spin    )
+
+#endif // #ifndef __CDSUNIT_STACK_DEFS_H
diff --git a/tests/unit/stack/stack_intrusive_pushpop.cpp b/tests/unit/stack/stack_intrusive_pushpop.cpp
new file mode 100644 (file)
index 0000000..c4d6fad
--- /dev/null
@@ -0,0 +1,378 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "stack/intrusive_stack_type.h"
+#include "print_deque_stat.h"
+
+// Multi-threaded stack test for push/pop operation
+namespace istack {
+
+#define TEST_CASE( Q, HOOK ) void Q()          { test_unbounded< Types<SimpleValue<HOOK> >::Q >();   }
+#define TEST_ELIMINATION( Q, HOOK ) void Q()   { test_elimination< Types<SimpleValue<HOOK> >::Q >(); }
+#define TEST_BOUNDED( Q, HOOK ) void Q()       { test_bounded< Types<SimpleValue<HOOK> >::Q >();     }
+#define TEST_FCSTACK( Q, HOOK ) void Q()       { test_fcstack< Types<SimpleValue<HOOK> >::Q >();     }
+#define TEST_STDSTACK( Q ) void Q()            { test_stdstack< Types<SimpleValue<> >::Q >();       }
+
+    namespace {
+        static size_t s_nPushThreadCount = 4;
+        static size_t s_nPopThreadCount = 4;
+        static size_t s_nStackSize = 10000000;
+        static size_t s_nEliminationSize = 4;
+        static bool s_bFCIterative = false;
+        static unsigned int s_nFCCombinePassCount = 64;
+        static unsigned int s_nFCCompactFactor = 1024;
+
+        struct empty {};
+
+        template <typename Base = empty >
+        struct SimpleValue: public Base
+        {
+            size_t      nNo;
+            size_t      nProducer;
+            size_t      nConsumer;
+
+            SimpleValue() {}
+            SimpleValue( size_t n ): nNo(n) {}
+            size_t getNo() const { return  nNo; }
+        };
+
+    } // namespace
+
+    class IntrusiveStack_PushPop: public CppUnitMini::TestCase
+    {
+        CDS_ATOMIC::atomic<size_t>  m_nWorkingProducers;
+        static CDS_CONSTEXPR_CONST size_t c_nValArraySize = 1024;
+        static CDS_CONSTEXPR_CONST size_t c_nBadConsumer = 0xbadc0ffe;
+
+        template <class Stack>
+        class Producer: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Producer( *this );
+            }
+        public:
+            Stack&              m_Stack;
+            size_t              m_nPushError;
+            size_t              m_arrPush[c_nValArraySize];
+
+            // Interval in m_arrValue
+            typename Stack::value_type *       m_pStart;
+            typename Stack::value_type *       m_pEnd;
+
+        public:
+            Producer( CppUnitMini::ThreadPool& pool, Stack& s )
+                : CppUnitMini::TestThread( pool )
+                , m_Stack( s )
+            {}
+            Producer( Producer& src )
+                : CppUnitMini::TestThread( src )
+                , m_Stack( src.m_Stack )
+            {}
+
+            IntrusiveStack_PushPop&  getTest()
+            {
+                return static_cast<IntrusiveStack_PushPop&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPushError = 0;
+                memset( m_arrPush, 0, sizeof(m_arrPush));
+
+                size_t i = 0;
+                for ( typename Stack::value_type * p = m_pStart; p < m_pEnd; ++p, ++i ) {
+                    p->nProducer = m_nThreadNo;
+                    p->nNo = i % c_nValArraySize;
+                    if ( m_Stack.push( *p ))
+                        ++m_arrPush[ p->nNo ];
+                    else
+                        ++m_nPushError;
+                }
+
+                getTest().m_nWorkingProducers.fetch_sub( 1, CDS_ATOMIC::memory_order_release );
+            }
+        };
+
+        template <class Stack>
+        class Consumer: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Consumer( *this );
+            }
+        public:
+            Stack&              m_Stack;
+            size_t              m_nPopCount;
+            size_t              m_nPopEmpty;
+            size_t              m_arrPop[c_nValArraySize];
+            size_t              m_nDirtyPop;
+        public:
+            Consumer( CppUnitMini::ThreadPool& pool, Stack& s )
+                : CppUnitMini::TestThread( pool )
+                , m_Stack( s )
+            {}
+            Consumer( Consumer& src )
+                : CppUnitMini::TestThread( src )
+                , m_Stack( src.m_Stack )
+            {}
+
+            IntrusiveStack_PushPop&  getTest()
+            {
+                return static_cast<IntrusiveStack_PushPop&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPopEmpty = 0;
+                m_nPopCount = 0;
+                m_nDirtyPop = 0;
+                memset( m_arrPop, 0, sizeof(m_arrPop));
+
+                while ( !(getTest().m_nWorkingProducers.load(CDS_ATOMIC::memory_order_acquire) == 0 && m_Stack.empty()) ) {
+                    typename Stack::value_type * p = m_Stack.pop();
+                    if ( p ) {
+                        p->nConsumer = m_nThreadNo;
+                        ++m_nPopCount;
+                        if ( p->nNo < sizeof(m_arrPop)/sizeof(m_arrPop[0]) )
+                            ++m_arrPop[p->nNo];
+                        else
+                            ++m_nDirtyPop;
+                    }
+                    else
+                        ++m_nPopEmpty;
+                }
+            }
+        };
+
+        template <typename T>
+        class value_array
+        {
+            T * m_pArr;
+        public:
+            value_array( size_t nSize )
+                : m_pArr( new T[nSize] )
+            {}
+
+            ~value_array()
+            {
+                delete [] m_pArr;
+            }
+
+            T * get() const { return m_pArr; }
+        };
+
+    protected:
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nPushThreadCount = cfg.getULong("PushThreadCount", 4 );
+            s_nPopThreadCount = cfg.getULong("PopThreadCount", 4 );
+            s_nStackSize = cfg.getULong("StackSize", 1000000 );
+            s_nEliminationSize = cfg.getULong("EliminationSize", 4 );
+            s_bFCIterative = cfg.getBool( "FCIterate", false );
+            s_nFCCombinePassCount = cfg.getUInt( "FCCombinePassCount", 64 );
+            s_nFCCompactFactor = cfg.getUInt( "FCCompactFactor", 1024 );
+        }
+
+        template <class Stack>
+        void analyze( CppUnitMini::ThreadPool& pool, Stack& testStack  )
+        {
+            size_t nPushError = 0;
+            size_t nPopEmpty = 0;
+            size_t nPopCount = 0;
+            size_t arrVal[c_nValArraySize];
+            memset( arrVal, 0, sizeof(arrVal));
+            size_t nDirtyPop = 0;
+
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                CppUnitMini::TestThread * pThread = *it;
+                Producer<Stack> * pPusher = dynamic_cast< Producer<Stack> *>( pThread );
+                if ( pPusher ) {
+                    nPushError += pPusher->m_nPushError;
+                    for ( size_t i = 0; i < sizeof(arrVal)/sizeof(arrVal[0]); ++i )
+                        arrVal[i] += pPusher->m_arrPush[i];
+                }
+                else {
+                    Consumer<Stack> * pPopper = dynamic_cast<Consumer<Stack> *>( pThread );
+                    assert( pPopper );
+                    nPopEmpty += pPopper->m_nPopEmpty;
+                    nPopCount += pPopper->m_nPopCount;
+                    nDirtyPop += pPopper->m_nDirtyPop;
+                    for ( size_t i = 0; i < sizeof(arrVal)/sizeof(arrVal[0]); ++i )
+                        arrVal[i] -= pPopper->m_arrPop[i];
+                }
+            }
+
+            CPPUNIT_MSG( "Push count=" << s_nStackSize
+                << " push error=" << nPushError
+                << " pop count=" << nPopCount
+                << " pop empty=" << nPopEmpty
+                << " dirty pop=" << nDirtyPop
+                );
+            CPPUNIT_CHECK( nPopCount == s_nStackSize );
+            CPPUNIT_CHECK( nDirtyPop == 0 );
+            for ( size_t i = 0; i < sizeof(arrVal)/sizeof(arrVal[0]); ++i ) {
+                CPPUNIT_CHECK_EX( arrVal[i] == 0, "arrVal[" << i << "]=" << long(arrVal[i]) );
+            }
+        }
+
+        template <class Stack>
+        void test( Stack& testStack, value_array<typename Stack::value_type>& arrValue )
+        {
+            m_nWorkingProducers.store( s_nPushThreadCount, CDS_ATOMIC::memory_order_release );
+            size_t const nPushCount = s_nStackSize / s_nPushThreadCount;
+
+            typename Stack::value_type * pValStart = arrValue.get();
+            typename Stack::value_type * pValEnd = pValStart + s_nStackSize;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Producer<Stack>( pool, testStack ), s_nPushThreadCount );
+            {
+                for ( typename Stack::value_type * it = pValStart; it != pValEnd; ++it )
+                    it->nConsumer = c_nBadConsumer;
+
+                typename Stack::value_type * pStart = pValStart;
+                for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                    static_cast<Producer<Stack>* >( *it )->m_pStart = pStart;
+                    pStart += nPushCount;
+                    static_cast<Producer<Stack>* >( *it )->m_pEnd = pStart;
+                }
+            }
+            pool.add( new Consumer<Stack>( pool, testStack ), s_nPopThreadCount );
+
+            CPPUNIT_MSG( "   Push/Pop test, push thread count=" << s_nPushThreadCount
+                << " pop thread count=" << s_nPopThreadCount
+                << " items=" << (nPushCount * s_nPushThreadCount)
+                << "...");
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            s_nStackSize = nPushCount * s_nPushThreadCount;
+
+            {
+                typename Stack::value_type * pEnd = pValStart + s_nStackSize;
+                for ( typename Stack::value_type * it = pValStart; it != pEnd; ++it  )
+                    CPPUNIT_CHECK( it->nConsumer != c_nBadConsumer );
+            }
+
+            analyze( pool, testStack );
+            CPPUNIT_MSG( testStack.statistics() );
+        }
+
+    public:
+        // Unbounded stack test
+        template <class Stack>
+        void test_unbounded()
+        {
+            value_array<typename Stack::value_type> arrValue( s_nStackSize );
+            {
+                Stack testStack;
+                test( testStack, arrValue );
+            }
+            Stack::gc::force_dispose();
+        }
+
+        template <class Stack>
+        void test_fcstack()
+        {
+            if ( s_bFCIterative ) {
+                for (unsigned int nCompactFactor = 1; nCompactFactor <= s_nFCCompactFactor; nCompactFactor *= 2 ) {
+                    for ( unsigned int nPass = 1; nPass <= s_nFCCombinePassCount; nPass *= 2 ) {
+                        CPPUNIT_MSG( "Compact factor=" << nCompactFactor << ", combine pass count=" << nPass );
+                        value_array<typename Stack::value_type> arrValue( s_nStackSize );
+                        Stack testStack( nCompactFactor, nPass );
+                        test( testStack, arrValue );
+                    }
+                }
+            }
+            else {
+                if ( s_nFCCompactFactor && s_nFCCombinePassCount ) {
+                    CPPUNIT_MSG( "Compact factor=" << s_nFCCompactFactor << ", combine pass count=" << s_nFCCombinePassCount );
+                    value_array<typename Stack::value_type> arrValue( s_nStackSize );
+                    Stack testStack( s_nFCCompactFactor, s_nFCCombinePassCount );
+                    test( testStack, arrValue );
+                }
+                else {
+                    value_array<typename Stack::value_type> arrValue( s_nStackSize );
+                    Stack testStack;
+                    test( testStack, arrValue );
+                }
+            }
+        }
+
+        // Unbounded elimination stack test
+        template <class Stack>
+        void test_elimination()
+        {
+            value_array<typename Stack::value_type> arrValue( s_nStackSize );
+            {
+                Stack testStack( s_nEliminationSize );
+                test( testStack, arrValue );
+                check_elimination_stat( testStack.statistics() );
+            }
+            Stack::gc::force_dispose();
+        }
+        void check_elimination_stat( cds::intrusive::treiber_stack::empty_stat const& )
+        {}
+        void check_elimination_stat( cds::intrusive::treiber_stack::stat<> const& s )
+        {
+            CPPUNIT_CHECK( s.m_PushCount.get() + s.m_ActivePushCollision.get() + s.m_PassivePushCollision.get() == s_nStackSize );
+            CPPUNIT_CHECK( s.m_PopCount.get() + s.m_ActivePopCollision.get() + s.m_PassivePopCollision.get() == s_nStackSize );
+            CPPUNIT_CHECK( s.m_PushCount.get() == s.m_PopCount.get() );
+            CPPUNIT_CHECK( s.m_ActivePopCollision.get() == s.m_PassivePushCollision.get() );
+            CPPUNIT_CHECK( s.m_ActivePushCollision.get() == s.m_PassivePopCollision.get() );
+        }
+
+        // Bounded stack test
+        template <class Stack>
+        void test_bounded()
+        {
+            value_array<typename Stack::value_type> arrValue( s_nStackSize );
+            Stack testStack( s_nStackSize );
+            test( testStack, arrValue );
+        }
+
+        template <class Stack>
+        void test_stdstack()
+        {
+            value_array<typename Stack::value_type> arrValue( s_nStackSize );
+            Stack testStack;
+            test( testStack, arrValue );
+        }
+
+    protected:
+#   include "stack/intrusive_stack_defs.h"
+        CDSUNIT_DECLARE_TreiberStack
+        CDSUNIT_DECLARE_EliminationStack
+        CDSUNIT_DECLARE_FCStack
+        CDSUNIT_DECLARE_MichaelDeque
+        CDSUNIT_DECLARE_StdStack
+
+        CPPUNIT_TEST_SUITE(IntrusiveStack_PushPop)
+            CDSUNIT_TEST_TreiberStack
+            CDSUNIT_TEST_EliminationStack
+            CDSUNIT_TEST_FCStack
+            CDSUNIT_TEST_MichaelDeque
+            CDSUNIT_TEST_StdStack
+        CPPUNIT_TEST_SUITE_END();
+    };
+} // namespace istack
+
+CPPUNIT_TEST_SUITE_REGISTRATION(istack::IntrusiveStack_PushPop);
diff --git a/tests/unit/stack/stack_push.cpp b/tests/unit/stack/stack_push.cpp
new file mode 100644 (file)
index 0000000..f0ccc13
--- /dev/null
@@ -0,0 +1,213 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "stack/stack_type.h"
+#include "print_deque_stat.h"
+
+// Multi-threaded stack test for push operation
+namespace stack {
+
+#define TEST_CASE( Q ) void Q()          { test_unbounded< Types<SimpleValue>::Q >(); }
+#define TEST_ELIMINATION( Q ) void Q()   { test_elimination< Types<SimpleValue>::Q >(); }
+#define TEST_BOUNDED( Q ) void Q()       { test_bounded< Types<SimpleValue>::Q >(); }
+
+    namespace {
+        static size_t s_nThreadCount = 8;
+        static size_t s_nStackSize = 10000000;
+        static size_t s_nEliminationSize = 4;
+
+        struct SimpleValue {
+            size_t      nNo;
+            size_t      nThread;
+
+            SimpleValue(): nNo(0), nThread(0) {}
+            SimpleValue( size_t n ): nNo(n), nThread(0) {}
+            size_t getNo() const { return  nNo; }
+        };
+    }
+
+    class Stack_Push: public CppUnitMini::TestCase
+    {
+        template <class Stack>
+        class Thread: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Thread( *this );
+            }
+        public:
+            Stack&              m_Stack;
+            double              m_fTime;
+            size_t              m_nStartItem;
+            size_t              m_nEndItem;
+            size_t              m_nPushError;
+
+        public:
+            Thread( CppUnitMini::ThreadPool& pool, Stack& s )
+                : CppUnitMini::TestThread( pool )
+                , m_Stack( s )
+            {}
+            Thread( Thread& src )
+                : CppUnitMini::TestThread( src )
+                , m_Stack( src.m_Stack )
+            {}
+
+            Stack_Push&  getTest()
+            {
+                return reinterpret_cast<Stack_Push&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_fTime = m_Timer.duration();
+
+                m_nPushError = 0;
+                SimpleValue v;
+                v.nThread = m_nThreadNo;
+                for ( v.nNo = m_nStartItem; v.nNo < m_nEndItem; ++v.nNo ) {
+                    if ( !m_Stack.push( v ))
+                        ++m_nPushError;
+                }
+
+                m_fTime = m_Timer.duration() - m_fTime;
+            }
+        };
+
+    protected:
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nThreadCount = cfg.getULong("ThreadCount", 8 );
+            s_nStackSize = cfg.getULong("StackSize", 10000000 );
+            s_nEliminationSize = cfg.getULong("EliminationSize", 4 );
+        }
+
+        template <class Stack>
+        void analyze( CppUnitMini::ThreadPool& pool, Stack& testStack  )
+        {
+            size_t nThreadItems = s_nStackSize / s_nThreadCount;
+            std::vector<size_t> aThread;
+            aThread.resize(s_nThreadCount);
+
+            double fTime = 0;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Thread<Stack> * pThread = reinterpret_cast<Thread<Stack> *>(*it);
+                fTime += pThread->m_fTime;
+                if ( pThread->m_nPushError != 0 )
+                    CPPUNIT_MSG("     ERROR: thread push error count=" << pThread->m_nPushError );
+                aThread[ pThread->m_nThreadNo] = pThread->m_nEndItem - 1;
+            }
+            CPPUNIT_MSG( "     Duration=" << (fTime / s_nThreadCount) );
+            CPPUNIT_ASSERT( !testStack.empty() )
+
+            size_t * arr = new size_t[ s_nStackSize ];
+            memset(arr, 0, sizeof(arr[0]) * s_nStackSize );
+
+            cds::OS::Timer      timer;
+            CPPUNIT_MSG( "   Pop (single-threaded)..." );
+            size_t nPopped = 0;
+            SimpleValue val;
+            while ( testStack.pop( val )) {
+                nPopped++;
+                ++arr[ val.getNo() ];
+                CPPUNIT_ASSERT( val.nThread < s_nThreadCount);
+                CPPUNIT_ASSERT( aThread[val.nThread] == val.nNo );
+                aThread[val.nThread]--;
+            }
+            CPPUNIT_MSG( "     Duration=" << timer.duration() );
+
+            size_t nTotalItems = nThreadItems * s_nThreadCount;
+            size_t nError = 0;
+            for ( size_t i = 0; i < nTotalItems; ++i ) {
+                if ( arr[i] != 1 ) {
+                    CPPUNIT_MSG( "   ERROR: Item " << i << " has not been pushed" );
+                    CPPUNIT_ASSERT( ++nError > 10 );
+                }
+            }
+
+            delete [] arr;
+        }
+
+        // Unbounded stack test
+        template <class Stack>
+        void test_unbounded()
+        {
+            Stack testStack;
+            test( testStack );
+        }
+
+        // Unbounded elimination stack test
+        template <class Stack>
+        void test_elimination()
+        {
+            Stack testStack( s_nEliminationSize );
+            test( testStack );
+            check_elimination_stat( testStack.statistics() );
+        }
+        void check_elimination_stat( cds::container::treiber_stack::empty_stat const& )
+        {}
+        void check_elimination_stat( cds::container::treiber_stack::stat<> const& s )
+        {
+            CPPUNIT_CHECK( s.m_PushCount.get() == s.m_PopCount.get() );
+        }
+
+        // Bounded stack test
+        template <class Stack>
+        void test_bounded()
+        {
+            Stack testStack( s_nStackSize );
+            test( testStack );
+        }
+
+        template <class Stack>
+        void test( Stack& testStack )
+        {
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Thread<Stack>( pool, testStack ), s_nThreadCount );
+
+            size_t nStart = 0;
+            size_t nThreadItemCount = s_nStackSize / s_nThreadCount;
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                Thread<Stack> * pThread = reinterpret_cast<Thread<Stack> *>(*it);
+                pThread->m_nStartItem = nStart;
+                nStart += nThreadItemCount;
+                pThread->m_nEndItem = nStart;
+            }
+
+            CPPUNIT_MSG( "   Push test, thread count=" << s_nThreadCount
+                << " items=" << (nThreadItemCount * s_nThreadCount)
+                << "...");
+            pool.run();
+
+            analyze( pool, testStack );
+            CPPUNIT_MSG( testStack.statistics() );
+        }
+
+    protected:
+#   include "stack/stack_defs.h"
+        CDSUNIT_DECLARE_TreiberStack
+        CDSUNIT_DECLARE_EliminationStack
+        CDSUNIT_DECLARE_FCStack
+        CDSUNIT_DECLARE_FCDeque
+        CDSUNIT_DECLARE_MichaelDeque
+        CDSUNIT_DECLARE_StdStack
+
+        CPPUNIT_TEST_SUITE(Stack_Push)
+            CDSUNIT_TEST_TreiberStack
+            CDSUNIT_TEST_EliminationStack
+            CDSUNIT_TEST_FCStack
+            CDSUNIT_TEST_FCDeque
+            CDSUNIT_TEST_MichaelDeque
+            CDSUNIT_TEST_StdStack
+        CPPUNIT_TEST_SUITE_END();
+    };
+} // namespace stack
+
+CPPUNIT_TEST_SUITE_REGISTRATION(stack::Stack_Push);
diff --git a/tests/unit/stack/stack_pushpop.cpp b/tests/unit/stack/stack_pushpop.cpp
new file mode 100644 (file)
index 0000000..30ecdf2
--- /dev/null
@@ -0,0 +1,280 @@
+//$$CDS-header$$
+
+#include "cppunit/thread.h"
+#include "stack/stack_type.h"
+#include "print_deque_stat.h"
+
+// Multi-threaded stack test for push/pop operation
+namespace stack {
+
+#define TEST_CASE( Q ) void Q()          { test_unbounded< Types<SimpleValue>::Q >(); }
+#define TEST_ELIMINATION( Q ) void Q()   { test_elimination< Types<SimpleValue>::Q >(); }
+#define TEST_BOUNDED( Q ) void Q()       { test_bounded< Types<SimpleValue>::Q >(); }
+
+    namespace {
+        static size_t s_nPushThreadCount = 4;
+        static size_t s_nPopThreadCount = 4;
+        static size_t s_nStackSize = 1000000;
+        static size_t s_nEliminationSize = 4;
+
+        struct SimpleValue {
+            size_t      nNo;
+            size_t      nThread;
+
+            SimpleValue(): nNo(0), nThread(0) {}
+            SimpleValue( size_t n ): nNo(n), nThread(0) {}
+            size_t getNo() const { return  nNo; }
+        };
+    }
+
+    class Stack_PushPop: public CppUnitMini::TestCase
+    {
+        CDS_ATOMIC::atomic<size_t>  m_nWorkingProducers;
+        static size_t const c_nValArraySize = 1024;
+
+        template <class Stack>
+        class Pusher: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Pusher( *this );
+            }
+        public:
+            Stack&              m_Stack;
+            size_t              m_nItemCount;
+            size_t              m_nPushError;
+            size_t              m_arrPush[c_nValArraySize];
+
+        public:
+            Pusher( CppUnitMini::ThreadPool& pool, Stack& s )
+                : CppUnitMini::TestThread( pool )
+                , m_Stack( s )
+            {}
+            Pusher( Pusher& src )
+                : CppUnitMini::TestThread( src )
+                , m_Stack( src.m_Stack )
+            {}
+
+            Stack_PushPop&  getTest()
+            {
+                return reinterpret_cast<Stack_PushPop&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPushError = 0;
+                memset( m_arrPush, 0, sizeof(m_arrPush));
+
+                SimpleValue v;
+                v.nThread = m_nThreadNo;
+                for ( size_t i = 0; i < m_nItemCount; ++i ) {
+                    v.nNo = i % c_nValArraySize;
+                    if ( m_Stack.push( v ))
+                        ++m_arrPush[v.nNo];
+                    else
+                        ++m_nPushError;
+                }
+
+
+                getTest().m_nWorkingProducers.fetch_sub(1, CDS_ATOMIC::memory_order_release);
+            }
+        };
+
+        template <class Stack>
+        class Popper: public CppUnitMini::TestThread
+        {
+            virtual TestThread *    clone()
+            {
+                return new Popper( *this );
+            }
+        public:
+            Stack&              m_Stack;
+            size_t              m_nPopCount;
+            size_t              m_nPopEmpty;
+            size_t              m_arrPop[c_nValArraySize];
+            size_t              m_nDirtyPop;
+        public:
+            Popper( CppUnitMini::ThreadPool& pool, Stack& s )
+                : CppUnitMini::TestThread( pool )
+                , m_Stack( s )
+            {}
+            Popper( Popper& src )
+                : CppUnitMini::TestThread( src )
+                , m_Stack( src.m_Stack )
+            {}
+
+            Stack_PushPop&  getTest()
+            {
+                return reinterpret_cast<Stack_PushPop&>( m_Pool.m_Test );
+            }
+
+            virtual void init()
+            {
+                cds::threading::Manager::attachThread();
+            }
+            virtual void fini()
+            {
+                cds::threading::Manager::detachThread();
+            }
+
+            virtual void test()
+            {
+                m_nPopEmpty = 0;
+                m_nPopCount = 0;
+                m_nDirtyPop = 0;
+                memset( m_arrPop, 0, sizeof(m_arrPop));
+
+                SimpleValue v;
+                while ( !(getTest().m_nWorkingProducers.load(CDS_ATOMIC::memory_order_acquire) == 0 && m_Stack.empty()) ) {
+                    if ( m_Stack.pop( v )) {
+                        ++m_nPopCount;
+                        if ( v.nNo < sizeof(m_arrPop)/sizeof(m_arrPop[0]) )
+                            ++m_arrPop[v.nNo];
+                        else
+                            ++m_nDirtyPop;
+                    }
+                    else
+                        ++m_nPopEmpty;
+                }
+            }
+        };
+
+    protected:
+        void setUpParams( const CppUnitMini::TestCfg& cfg ) {
+            s_nPushThreadCount = cfg.getULong("PushThreadCount", 4 );
+            s_nPopThreadCount = cfg.getULong("PopThreadCount", 4 );
+            s_nStackSize = cfg.getULong("StackSize", 1000000 );
+            s_nEliminationSize = cfg.getULong("EliminationSize", 4 );
+        }
+
+        template <class Stack>
+        void analyze( CppUnitMini::ThreadPool& pool, Stack& testStack  )
+        {
+            size_t nPushError = 0;
+            size_t nPopEmpty = 0;
+            size_t nPopCount = 0;
+            size_t arrVal[c_nValArraySize];
+            memset( arrVal, 0, sizeof(arrVal));
+            size_t nDirtyPop = 0;
+
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
+                CppUnitMini::TestThread * pThread = *it;
+                Pusher<Stack> * pPusher = dynamic_cast< Pusher<Stack> *>( pThread );
+                if ( pPusher ) {
+                    nPushError += pPusher->m_nPushError;
+                    for ( size_t i = 0; i < sizeof(arrVal)/sizeof(arrVal[0]); ++i )
+                        arrVal[i] += pPusher->m_arrPush[i];
+                }
+                else {
+                    Popper<Stack> * pPopper = dynamic_cast<Popper<Stack> *>( pThread );
+                    assert( pPopper );
+                    nPopEmpty += pPopper->m_nPopEmpty;
+                    nPopCount += pPopper->m_nPopCount;
+                    nDirtyPop += pPopper->m_nDirtyPop;
+                    for ( size_t i = 0; i < sizeof(arrVal)/sizeof(arrVal[0]); ++i )
+                        arrVal[i] -= pPopper->m_arrPop[i];
+                }
+            }
+
+            CPPUNIT_MSG( "Push count=" << s_nStackSize
+                << " push error=" << nPushError
+                << " pop count=" << nPopCount
+                << " pop empty=" << nPopEmpty
+                << " dirty pop=" << nDirtyPop
+                );
+            CPPUNIT_CHECK( nPopCount == s_nStackSize );
+            CPPUNIT_CHECK( nDirtyPop == 0 );
+            for ( size_t i = 0; i < sizeof(arrVal)/sizeof(arrVal[0]); ++i ) {
+                CPPUNIT_CHECK_EX( arrVal[i] == 0, "arrVal[" << i << "]=" << long(arrVal[i]) );
+            }
+        }
+
+        // Unbounded stack test
+        template <class Stack>
+        void test_unbounded()
+        {
+            Stack testStack;
+            test( testStack );
+        }
+
+        // Unbounded elimination stack test
+        template <class Stack>
+        void test_elimination()
+        {
+            Stack testStack( s_nEliminationSize );
+            test( testStack );
+            check_elimination_stat( testStack.statistics() );
+        }
+        void check_elimination_stat( cds::container::treiber_stack::empty_stat const& )
+        {}
+        void check_elimination_stat( cds::container::treiber_stack::stat<> const& s )
+        {
+            CPPUNIT_CHECK( s.m_PushCount.get() + s.m_ActivePushCollision.get() + s.m_PassivePushCollision.get() == s_nStackSize );
+            CPPUNIT_CHECK( s.m_PopCount.get() + s.m_ActivePopCollision.get() + s.m_PassivePopCollision.get() == s_nStackSize );
+            CPPUNIT_CHECK( s.m_PushCount.get() == s.m_PopCount.get() );
+            CPPUNIT_CHECK( s.m_ActivePopCollision.get() == s.m_PassivePushCollision.get() );
+            CPPUNIT_CHECK( s.m_ActivePushCollision.get() == s.m_PassivePopCollision.get() );
+        }
+
+        // Bounded stack test
+        template <class Stack>
+        void test_bounded()
+        {
+            Stack testStack( s_nStackSize );
+            test( testStack );
+        }
+
+        template <class Stack>
+        void test( Stack& testStack )
+        {
+            m_nWorkingProducers.store(s_nPushThreadCount, CDS_ATOMIC::memory_order_release);
+            size_t const nPushCount = s_nStackSize / s_nPushThreadCount;
+
+            CppUnitMini::ThreadPool pool( *this );
+            pool.add( new Pusher<Stack>( pool, testStack ), s_nPushThreadCount );
+            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it )
+                static_cast<Pusher<Stack>* >( *it )->m_nItemCount = nPushCount;
+            pool.add( new Popper<Stack>( pool, testStack ), s_nPopThreadCount );
+
+            CPPUNIT_MSG( "   Push/Pop test, push thread count=" << s_nPushThreadCount
+                << " pop thread count=" << s_nPopThreadCount
+                << " items=" << (nPushCount * s_nPushThreadCount)
+                << "...");
+            pool.run();
+            CPPUNIT_MSG( "   Duration=" << pool.avgDuration() );
+
+            s_nStackSize = nPushCount * s_nPushThreadCount;
+            analyze( pool, testStack );
+            CPPUNIT_MSG( testStack.statistics() );
+        }
+
+    protected:
+#   include "stack/stack_defs.h"
+        CDSUNIT_DECLARE_TreiberStack
+        CDSUNIT_DECLARE_EliminationStack
+        CDSUNIT_DECLARE_FCStack
+        CDSUNIT_DECLARE_FCDeque
+        CDSUNIT_DECLARE_MichaelDeque
+        CDSUNIT_DECLARE_StdStack
+
+        CPPUNIT_TEST_SUITE(Stack_PushPop)
+            CDSUNIT_TEST_TreiberStack
+            CDSUNIT_TEST_EliminationStack
+            CDSUNIT_TEST_FCStack
+            CDSUNIT_TEST_FCDeque
+            CDSUNIT_TEST_MichaelDeque
+            CDSUNIT_TEST_StdStack
+        CPPUNIT_TEST_SUITE_END();
+    };
+} // namespace stack
+
+CPPUNIT_TEST_SUITE_REGISTRATION(stack::Stack_PushPop);
diff --git a/tests/unit/stack/stack_type.h b/tests/unit/stack/stack_type.h
new file mode 100644 (file)
index 0000000..1183c2f
--- /dev/null
@@ -0,0 +1,704 @@
+//$$CDS-header$$
+
+#ifndef __CDSUNIT_STACK_TYPES_H
+#define __CDSUNIT_STACK_TYPES_H
+
+#include <cds/container/treiber_stack.h>
+#include <cds/container/michael_deque.h>
+#include <cds/container/fcstack.h>
+#include <cds/container/fcdeque.h>
+
+#include <cds/gc/hp.h>
+#include <cds/gc/ptb.h>
+#include <cds/gc/hrc.h>
+
+#include <cds/details/std/mutex.h>
+#include <cds/lock/spinlock.h>
+#include <stack>
+#include <list>
+#include <vector>
+
+namespace stack {
+
+    namespace details {
+        template <typename GC, typename T, CDS_DECL_OPTIONS7>
+        class MichaelDequeL: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
+        {
+            typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
+        public:
+            MichaelDequeL( size_t nMaxItemCount )
+                : base_class( (unsigned int) nMaxItemCount, 4 )
+                {}
+
+            bool push( T const& v )
+            {
+                return base_class::push_front( v );
+            }
+
+            bool pop( T& v )
+            {
+                return base_class::pop_front( v );
+            }
+        };
+
+        template <typename GC, typename T, CDS_DECL_OPTIONS7>
+        class MichaelDequeR: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
+        {
+            typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
+        public:
+            MichaelDequeR( size_t nMaxItemCount )
+                : base_class( (unsigned int) nMaxItemCount, 4 )
+            {}
+
+            bool push( T const& v )
+            {
+                return base_class::push_back( v );
+            }
+
+            bool pop( T& v )
+            {
+                return base_class::pop_back( v );
+            }
+        };
+
+        template <typename T, typename Traits=cds::container::fcdeque::type_traits>
+        class FCDequeL: public cds::container::FCDeque<T, std::deque<T>, Traits >
+        {
+            typedef cds::container::FCDeque<T, std::deque<T>, Traits > base_class;
+        public:
+            FCDequeL()
+            {}
+
+            FCDequeL(
+                unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
+                ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
+                )
+                : base_class( nCompactFactor, nCombinePassCount )
+            {}
+
+            bool push( T const& v )
+            {
+                return base_class::push_front( v );
+            }
+
+            bool pop( T& v )
+            {
+                return base_class::pop_front( v );
+            }
+        };
+
+        template <typename T, typename Traits=cds::container::fcdeque::type_traits>
+        class FCDequeR: public cds::container::FCDeque<T, std::deque<T>, Traits >
+        {
+            typedef cds::container::FCDeque<T, std::deque<T>, Traits > base_class;
+        public:
+            FCDequeR()
+            {}
+
+            FCDequeR(
+                unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
+                ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
+                )
+                : base_class( nCompactFactor, nCombinePassCount )
+            {}
+
+            bool push( T const& v )
+            {
+                return base_class::push_back( v );
+            }
+
+            bool pop( T& v )
+            {
+                return base_class::pop_back( v );
+            }
+        };
+
+        template < typename T, typename Stack, typename Lock>
+        class StdStack
+        {
+            Stack   m_Impl;
+            mutable Lock    m_Lock;
+            cds::container::treiber_stack::empty_stat m_stat;
+
+            typedef cds_std::unique_lock<Lock>  unique_lock;
+
+        public:
+            bool push( T const& v )
+            {
+                unique_lock l( m_Lock );
+                m_Impl.push( v );
+                return true;
+            }
+
+            bool pop( T& v )
+            {
+                unique_lock l( m_Lock );
+                if ( !m_Impl.empty() ) {
+                    v = m_Impl.top();
+                    m_Impl.pop();
+                    return true;
+                }
+                return false;
+            }
+
+            bool empty() const
+            {
+                unique_lock l( m_Lock );
+                return m_Impl.empty();
+            }
+
+            cds::container::treiber_stack::empty_stat const& statistics() const
+            {
+                return m_stat;
+            }
+        };
+    }
+
+    template <typename T>
+    struct Types {
+
+    // TreiberStack
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+        >       Treiber_HP;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        >       Treiber_HP_seqcst;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Treiber_HP_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+        >       Treiber_HRC;
+
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Treiber_HRC_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+        > Treiber_PTB;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Treiber_PTB_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::back_off<cds::backoff::yield>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Treiber_HP_yield;
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::back_off<cds::backoff::pause>
+        > Treiber_HP_pause;
+        typedef cds::container::TreiberStack< cds::gc::HP, T,
+            cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > Treiber_HP_exp;
+
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+            ,cds::opt::back_off<cds::backoff::yield>
+        >  Treiber_HRC_yield;
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+            ,cds::opt::back_off<cds::backoff::pause>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Treiber_HRC_pause;
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > Treiber_HRC_exp;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::back_off<cds::backoff::yield>
+        >  Treiber_PTB_yield;
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::back_off<cds::backoff::pause>
+        > Treiber_PTB_pause;
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Treiber_PTB_exp;
+
+
+    // Elimination stack
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+        >       Elimination_HP;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
+        >       Elimination_HP_2ms;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_HP_2ms_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
+        >       Elimination_HP_5ms;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_HP_5ms_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
+        >       Elimination_HP_10ms;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_HP_10ms_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        >       Elimination_HP_dyn;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        >       Elimination_HP_seqcst;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_HP_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        >       Elimination_HP_dyn_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+            ,cds::opt::enable_elimination<true>
+        >       Elimination_HRC;
+
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        >       Elimination_HRC_dyn;
+
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_HRC_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        >       Elimination_HRC_dyn_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
+        > Elimination_PTB_2ms;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        > Elimination_PTB_2ms_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
+        > Elimination_PTB_5ms;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        > Elimination_PTB_5ms_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
+        > Elimination_PTB_10ms;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        > Elimination_PTB_10ms_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+        > Elimination_PTB;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        > Elimination_PTB_dyn;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+        >       Elimination_PTB_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
+            ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
+        >       Elimination_PTB_dyn_stat;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::yield>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Elimination_HP_yield;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::pause>
+        > Elimination_HP_pause;
+
+        typedef cds::container::TreiberStack< cds::gc::HP, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > Elimination_HP_exp;
+
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::yield>
+        >  Elimination_HRC_yield;
+
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::pause>
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Elimination_HRC_pause;
+
+        typedef cds::container::TreiberStack< cds::gc::HRC, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > Elimination_HRC_exp;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::yield>
+        >  Elimination_PTB_yield;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<cds::backoff::pause>
+        > Elimination_PTB_pause;
+
+        typedef cds::container::TreiberStack< cds::gc::PTB, T
+            ,cds::opt::enable_elimination<true>
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+            ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
+        > Elimination_PTB_exp;
+
+    // FCStack
+        typedef cds::container::FCStack< T > FCStack_deque;
+
+        struct traits_FCStack_stat:
+            public cds::container::fcstack::make_traits<
+                cds::opt::stat< cds::container::fcstack::stat<> >
+            >::type
+        {};
+        struct traits_FCStack_elimination:
+            public cds::container::fcstack::make_traits<
+            cds::opt::enable_elimination< true >
+            >::type
+        {};
+        struct traits_FCStack_elimination_stat:
+            public cds::container::fcstack::make_traits<
+                cds::opt::stat< cds::container::fcstack::stat<> >,
+                cds::opt::enable_elimination< true >
+            >::type
+        {};
+        struct traits_FCStack_mutex:
+            public cds::container::fcstack::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        {};
+
+        typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_mutex > FCStack_deque_mutex;
+        typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_stat > FCStack_deque_stat;
+        typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_elimination > FCStack_deque_elimination;
+        typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_elimination_stat > FCStack_deque_elimination_stat;
+        typedef cds::container::FCStack< T, std::stack<T, std::vector<T> > > FCStack_vector;
+        typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_mutex > FCStack_vector_mutex;
+        typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_stat > FCStack_vector_stat;
+        typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_elimination > FCStack_vector_elimination;
+        typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_elimination_stat > FCStack_vector_elimination_stat;
+        typedef cds::container::FCStack< T, std::stack<T, std::list<T> > > FCStack_list;
+        typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_mutex > FCStack_list_mutex;
+        typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_stat > FCStack_list_stat;
+        typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_elimination > FCStack_list_elimination;
+        typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_elimination_stat > FCStack_list_elimination_stat;
+
+   // FCDeque
+        struct traits_FCDeque_stat:
+            public cds::container::fcdeque::make_traits<
+                cds::opt::stat< cds::container::fcdeque::stat<> >
+            >::type
+        {};
+        struct traits_FCDeque_elimination:
+            public cds::container::fcdeque::make_traits<
+                cds::opt::enable_elimination< true >
+            >::type
+        {};
+        struct traits_FCDeque_elimination_stat:
+            public cds::container::fcdeque::make_traits<
+                cds::opt::stat< cds::container::fcdeque::stat<> >,
+                cds::opt::enable_elimination< true >
+            >::type
+        {};
+        struct traits_FCDeque_mutex:
+            public cds::container::fcdeque::make_traits<
+                cds::opt::lock_type< cds_std::mutex >
+            >::type
+        {};
+
+
+        typedef details::FCDequeL< T > FCDequeL_default;
+        typedef details::FCDequeL< T, traits_FCDeque_mutex > FCDequeL_mutex;
+        typedef details::FCDequeL< T, traits_FCDeque_stat > FCDequeL_stat;
+        typedef details::FCDequeL< T, traits_FCDeque_elimination > FCDequeL_elimination;
+        typedef details::FCDequeL< T, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
+
+        typedef details::FCDequeR< T > FCDequeR_default;
+        typedef details::FCDequeR< T, traits_FCDeque_mutex > FCDequeR_mutex;
+        typedef details::FCDequeR< T, traits_FCDeque_stat > FCDequeR_stat;
+        typedef details::FCDequeR< T, traits_FCDeque_elimination > FCDequeR_elimination;
+        typedef details::FCDequeR< T, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
+
+    // MichaelDeque, left side
+        typedef details::MichaelDequeL< cds::gc::HP, T> MichaelDequeL_HP;
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        > MichaelDequeL_HP_seqcst;
+
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        > MichaelDequeL_HP_ic;
+
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > MichaelDequeL_HP_exp;
+
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::opt::back_off< cds::backoff::yield >
+        > MichaelDequeL_HP_yield;
+
+        typedef details::MichaelDequeL< cds::gc::HP, T
+            ,cds::opt::stat<cds::intrusive::deque_stat<> >
+        > MichaelDequeL_HP_stat;
+
+
+        typedef details::MichaelDequeL< cds::gc::PTB, T> MichaelDequeL_PTB;
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        > MichaelDequeL_PTB_seqcst;
+
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        > MichaelDequeL_PTB_ic;
+
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::opt::back_off<
+            cds::backoff::exponential<
+            cds::backoff::pause,
+            cds::backoff::yield
+            >
+            >
+        > MichaelDequeL_PTB_exp;
+
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::opt::back_off< cds::backoff::yield >
+        > MichaelDequeL_PTB_yield;
+
+        typedef details::MichaelDequeL< cds::gc::PTB, T
+            ,cds::opt::stat<cds::intrusive::michael_deque::stat<> >
+        > MichaelDequeL_PTB_stat;
+
+
+    // MichaelDeque, right side
+        typedef details::MichaelDequeR< cds::gc::HP, T> MichaelDequeR_HP;
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        > MichaelDequeR_HP_seqcst;
+
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        > MichaelDequeR_HP_ic;
+
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::opt::back_off<
+            cds::backoff::exponential<
+            cds::backoff::pause,
+            cds::backoff::yield
+            >
+            >
+        > MichaelDequeR_HP_exp;
+
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::opt::back_off< cds::backoff::yield >
+        > MichaelDequeR_HP_yield;
+
+        typedef details::MichaelDequeR< cds::gc::HP, T
+            ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
+        > MichaelDequeR_HP_stat;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, T> MichaelDequeR_PTB;
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
+        > MichaelDequeR_PTB_seqcst;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::opt::item_counter< cds::atomicity::item_counter >
+        > MichaelDequeR_PTB_ic;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::opt::back_off<
+                cds::backoff::exponential<
+                    cds::backoff::pause,
+                    cds::backoff::yield
+                >
+            >
+        > MichaelDequeR_PTB_exp;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::opt::stat< cds::intrusive::deque_stat<> >
+        > MichaelDequeR_PTB_stat;
+
+        typedef details::MichaelDequeR< cds::gc::PTB, T
+            ,cds::opt::back_off< cds::backoff::yield >
+        > MichaelDequeR_PTB_yield;
+
+
+        // std::stack
+        typedef details::StdStack< T, std::stack< T >, cds_std::mutex >  StdStack_Deque_Mutex;
+        typedef details::StdStack< T, std::stack< T >, cds::lock::Spin > StdStack_Deque_Spin;
+        typedef details::StdStack< T, std::stack< T, std::vector<T> >, cds_std::mutex >  StdStack_Vector_Mutex;
+        typedef details::StdStack< T, std::stack< T, std::vector<T> >, cds::lock::Spin > StdStack_Vector_Spin;
+        typedef details::StdStack< T, std::stack< T, std::list<T> >, cds_std::mutex >  StdStack_List_Mutex;
+        typedef details::StdStack< T, std::stack< T, std::list<T> >, cds::lock::Spin > StdStack_List_Spin;
+
+    };
+} // namespace stack
+
+namespace std {
+    static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::stat<> const& s )
+    {
+        return o << "\tStatistics:\n"
+            << "\t                    Push: " << s.m_PushCount.get()              << "\n"
+            << "\t                     Pop: " << s.m_PopCount.get()               << "\n"
+            << "\t         Push contention: " << s.m_PushRace.get()               << "\n"
+            << "\t          Pop contention: " << s.m_PopRace.get()                << "\n"
+            << "\t   m_ActivePushCollision: " << s.m_ActivePushCollision.get()    << "\n"
+            << "\t   m_PassivePopCollision: " << s.m_PassivePopCollision.get()    << "\n"
+            << "\t    m_ActivePopCollision: " << s.m_ActivePopCollision.get()     << "\n"
+            << "\t  m_PassivePushCollision: " << s.m_PassivePushCollision.get()   << "\n"
+            << "\t     m_EliminationFailed: " << s.m_EliminationFailed.get()      << "\n";
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::empty_stat const& s )
+    {
+        return o;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::container::fcstack::empty_stat const& s )
+    {
+        return o;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::container::fcstack::stat<> const& s )
+    {
+        return o << "\tStatistics:\n"
+            << "\t                    Push: " << s.m_nPush.get()              << "\n"
+            << "\t                PushMove: " << s.m_nPushMove.get()          << "\n"
+            << "\t                     Pop: " << s.m_nPop.get()               << "\n"
+            << "\t               FailedPop: " << s.m_nFailedPop.get()         << "\n"
+            << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
+            << "\tFlat combining statistics:\n"
+            << "\t        Combining factor: " << s.combining_factor()         << "\n"
+            << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
+            << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
+            << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
+            << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
+            << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
+            << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
+            << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
+            << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
+            << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
+    {
+        return o;
+    }
+
+    static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
+    {
+        return o << "\tStatistics:\n"
+            << "\t              Push front: " << s.m_nPushFront.get()         << "\n"
+            << "\t         Push front move: " << s.m_nPushFrontMove.get()     << "\n"
+            << "\t               Push back: " << s.m_nPushBack.get()          << "\n"
+            << "\t          Push back move: " << s.m_nPushBackMove.get()      << "\n"
+            << "\t               Pop front: " << s.m_nPopFront.get()          << "\n"
+            << "\t        Failed pop front: " << s.m_nFailedPopFront.get()    << "\n"
+            << "\t                Pop back: " << s.m_nPopBack.get()           << "\n"
+            << "\t         Failed pop back: " << s.m_nFailedPopBack.get()     << "\n"
+            << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
+            << "\tFlat combining statistics:\n"
+            << "\t        Combining factor: " << s.combining_factor()         << "\n"
+            << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
+            << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
+            << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
+            << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
+            << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
+            << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
+            << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
+            << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
+            << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
+    }
+
+} // namespace std
+
+#endif // #ifndef __CDSUNIT_STACK_TYPES_H